河原医療大学校 新居浜校は修学支援制度の認定校です。
文字サイズ
  • 標準
  • 拡大
背景色
音声読み上げについて

学科ブログ

SCHOOL BLOG
2015.06.26IT・Webシステム科

『C言語プログラミング 入門講座』 Part1 入門編

第1回 C言語入門

この回の読者の皆様は「プログラミング未経験」という前提で進めてゆきます。
そのためまず初めに、Visual Studio 2013 使い方を解説します。
但し、早くプログラミングの話を始めたいので、Visual Studio 2013 の入手方法やインストール方法は、今回は解説しません。
別途、機会を改めて解説します。

また、ある程度はプログラミング経験がある方は、第6回、第8回 の頃に再度訪問してみて下さい。
その回では、アルゴリズムをテーマにして記事を書く予定です。(第6回 ユークリッドの互除法、第8回 エラトステネスの篩(予定) )

1.初めてのプログラミング

まず初めに、Visual Studio 2013 の使い方を解説します。

 

1.1.Visual Studio 2013 の使い方
(1) フォルダー作成

プログラムを保存する場所を確認しておきましょう。
…MyDocumments\VisualStudio¥Projectsの直下に、
プロジェクト毎にフォルダーが作られ、その中にプログラム
が保存されてゆきます。
講座が進んでゆくと、そのフォルダーが増えてしまいます。そうなってくると、

  1. プログラムを再利用し辛い。
  2. バックアップを取り難い。

ⅰは、過去にのこの講座で学習したテクニックを、今のプログラムに応用したいと思った時、どのプログラムを参考にして良いのかが分からなくなります。

ⅱは、C言語のプログラム(プロジェクトファイル)のうち、特定のプロジェクトファイルだけをUSBメモリーにコピーしたいときなどには、探して辛いことになります。

そこで、Visual Studio 2013 を使い始める前に、下位のフォルダーを作っておきましょう。このフォルダーの名称は、皆さんの自由です。自由と言われても困ってしまう方は、西暦年を含む 2015_part01 という名称でフォルダーを作成してみて下さい。

(2) プロジェクト作成

下記(次節 1.2.画面表示) のプロジェクトを作成します。Visual Studio 2013 を起動します。操作方法は、[ファイル] メニューから [新規作成] ⇒ [プロジェクト] を選択します。

プロジェクト作成の画面

図1 プロジェクト作成

 

テンプレート選択の画面

図2 テンプレート選択

  1. 画面左側の「テンプレート」から、「C++」を選択します。「C」を学習してゆくことに、支障は有りません。
  2. 「Win32 コンソール アプリケーション」を選択します。
  3. このプロジェクトを作成するファルダーを選択します。前述「(1) フォルダー作成」の時に作成したフォルダー「2015_part01」を選択します。直接キー入力も出来ますが、右横の「参照」ボタンを押して、該当のフォルダーを選択することも出来ます。
  4. プロジェクト名称(今回は「hello」)を入力します。
    上記入力を完了したら、画面右下の「Ok」ボタンを押します。

Win32  アプリケーションウィザードの画面(1/2)

図3 Win32 アプリケーションウィザード(1/2)

  1. 「Win32 アプリケーション ウィザード」が起動します。最初の画面では、何もせず「次へ」ボタンを押します。

この画面は2カ所修正が必要です。

Win32  アプリケーションウィザードの画面(2/2)

図4 Win32 アプリケーションウィザード(2/2)

  1. 「空のプロジェクト」にチェックを付けます。
  2. 「Security Development Lifecycle(SDL)チェック」のチェックをはずします。
  3. 「完了」をクリックします。

 

この画面で、チェックを2カ所変更します。その理由は、ANSI規格のC言語を記述する為です。
このスタイルが、国家試験で出題されるC言語と同じスタイルです。

「空のプロジェクト」にチェックが無いと、Microsoft社のローカルなC言語のスタイルになります。

また、「Security Development Lifecycle(SDL)チェック」にチェックが有ると、
「1.3.キーボード入力」で学ぶ scanf() 関数がエラーになって使え無くなります。

これらの操作をしておく事により、国家試験の過去問をパソコンに入力して、動作を試してみるというような事が可能になります。

プロジェクトファイルが正常に作成出来た画面

図5 プロジェクトファイル完成

  1. プロジェクトファイルが正常に作成出来ました。まだプログラムは何も有りませんので、実行もできません。プログラミングはこれからです。

 

1.2.画面表示

お待たせしました。プログラミングを始めましょう。
画面にメッセージを表示させる、簡単なプログラムです。

(1) コンソールアプリを選択

「ソリューション エクスプローラー」から、「hello」の「ソースファイル」を右クリックします。ポップアップメニューが立ち上りますので、順に「追加」 ⇒ 「新しい項目」を選択します。

プロジェクトにソースファイルを追加する画面

図6 プロジェクトにソースファイルを追加

 

C++ファイルを追加する画面

図7 C++ファイル追加

  1. 「C++ファイル」 を選択します。
  2. 「hello」と打ち直してみましょう。
  3. 「追加」を選択します。

 

なぜC++で良いのか?

・C言語に対して、C++は上位互換性が有ります。C言語をプログラミングする事に対して、支障がありません。

・Visual Studio 2013 に、純粋なC言語の開発環境がありません。

ここまで書くと、「だったら、C言語に特化した、もっと良い開発環境があるのではないか?」という疑問が生じるかもしれません。

しかし私は次のように考えて、Visual Studio 2013 を選択しました。

(1) C#を使えば、コンソールアプリケーションではなく、Windows アプリケーションを簡単に作れる。今はC言語を使うが、将来的にC#やC++を使うかもしれない。

(2) Visual Studio 2015 がリリースされたら、C++で、アップルのストアアプリも、アンドロイドアプリも作れる。

Microsoft社Webサイト『Visual Studio 2015 Preview の新機能』の記事より引用

「 Android、iOS、および Windows デバイス向けのクロスプラットフォーム コードを構築できます。」

現時点では、Visual Studio 2013 の選択がベストだと思います。

hello.cppが作成された直後の画面

図8 hello.cppが作成された直後

  1. 前述(11)で変更した「hello.cpp」が作成され、入力出来る状態になりました。
  2. 「ソリューション エクスプローラー」にも「hello.cpp」が作成され、このプロジェクトに追加されていることが確認出来ます。

 


#include <stdio.h>

void main(void)
{
    printf("Hello World\n");
    getchar();
}

リスト1-1 hello.cpp

 


1行目:#include <stdio.h>
	stdio.h は、標準入出力のヘッダーファイルです。
	stdio は standerd input output の事です。
	printf() や、次の「1.3.キーボード入力」で使う scanf() を
	使用する際に必要です。
	しばらくの間、毎回これを付けます。
2行目:空行
	有っても無くても、どちらでも良い行です。
	見やすいと思って、空行を作りました。
3行目:void main(void)
	プログラムに1つだけ、main が必要です。main関数と言います。
	しばらくの間、毎回これです。
4行目:{
	ブロックの始まりを意味します。
	プログラムの意味のあるいくつかの行をまとめたものをブロックと言います。
5行目:printf("Hello World\n");
	画面に出力する関数です。
	f が余分な感じがしますが、これは format の f です。
	次の「1.3.キーボード入力」では format の機能を使います。
	また、\n は改行を意味します。
	行末はセミコロンです。コロンではありません。
6行目:grtchar();
	この行は、本質的には不要ですが、無いと5行目の printf() 実行後、
	コンソールウィンドウがすぐに閉じてしまいます。
	何が表示されたかを確認出来ません。
	この行末もセミコロンです。
7行目:}
	ブロックの終わりを意味します。

「リスト1-1」を入力します。全て半角英数字のモードで入力して下さい。また、{ } のなかの2行が右にずれていますが、これも大事なことです。キーボードの[TAB]キーを1回押して、行の先頭を揃えて下さい。

ソースプログラムを入力した画面

図9 ソースプログラム入力

  1. プログラムの入力が完了したら、右向き三角形の「ローカル Windows デバッガー」をクリックします。
    「ビルドしますか?」というメッセージが出たら「Yes」をクリックします。

「ビルド」とは?コンピュータが実行できるファイル形式に変換することです。(「コンパイル」と「リンク」の事です。)
事前にビルドだけ完了させておくには、[ビルド] メニューから [ソリューションのビルド] を選択します。

 

hello.cppの実行画面

図10 hello.cppの実行画面

ビルドが上手く行くと、コンソールが立ち上り、「Hello World!」が表示され、カーソルが点滅(ブリンク)した状態になります。実は入力待ちの状態ですので、キーボードの「ENTER」キーを押すとコンソールが閉じてこのプログラムが終了します。

このとき、エラーが発生すると、「ソースコード」のウィンドウの下に「エラー一覧」のウィンドウが表示されます。赤い×の行(か、1つ上の行)に、間違いがないかをよく見てみて下さい。

 

プロジェクトを終了してください。

[ファイル] メニューから [ソリューションを閉じる] を選択します。

 

1.3.キーボード入力
(1) scanf() 関数を使う例題

氏名を入力して、挨拶を出力してみましょう。
文字列を使います。


#include <stdio.h>

void main(void)
{
    char name[20];

    scanf("%s", name);
    printf("%sさん、こんにちは。\n" ,name);

    fflush(stdin);
    getchar();
}

リスト1-2 name.cpp

 


5行目:char name[20];
	文字列の変数を宣言しています。
	変数というのは、コンピューターのメモリーの一部に名前を付けて、プログラムから使えるようにします。
	ココでは、name という変数名を付けました。char というのは、character で「文字」の事です。
	[20] が付いているので、半角英数字で20文字分です。
	(本当は 19 文字分ですが、詳しくは『第7回 配列』で解説します。)
7行目:scanf("%s", name);
	コンピューターに、キー入力するときこの関数を使います。
	入力したデータは name という変数に格納されます。
	%s は文字列の時に使います。
8行目:printf("%sさん、こんにちは。\n" ,name);  
	scanfで入力した変数の内容を出力します。
	ココでも %s は文字列の時に使います。\n は画面で改行します。
10行目:fflush(stdin); 
	この行は、本質的には不要ですが、無いと8行目の printf() 実行後、
	コンソールウィンドウがすぐに閉じてしまいます。
	何が表示されたかを確認出来ません。
	リスト1-1 の時は、11行目:grtchar(); で解決出来ていました。
	今回上手く行かないのは何故でしょうか?
	scanf()でキー入力したので、11行目のgetchar() 1個では上手く行きません。
11行目:grtchar();
	リスト1-1 の時と同じですが、これだけでは止まってくれません。
	理由は、scanf() を使ったからです。
	対策としては、この grtchar(); を2回書いても解決します。
	今回は、これの前に fflush(stdin); を実行しているので、
	grtchar(); 1回でけで解決します。

 

name.cppの実行画面(1/2)

図11 name.cppの実行画面(1/2)氏名入力

ビルドが上手く行くと、コンソールが立ち上り、カーソルが点滅(ブリンク)した状態になります。
入力待ちの状態ですので、キーボードから氏名「山田太郎」を入力しました。

 

name.cppの実行画面(2/2)

図12 name.cppの実行画面(2/2)氏名出力

図11の状態から、キーボードの「ENTER」キーを押すとメッセージ「山田太郎さん、こんにちは。」が表示されます。
もう一度、キーボードの「ENTER」キーを押すと、コンソールが閉じてこのプログラムが終了します。

 

(2) 整数の変数を使う例題

2つの数を入力して、その和を出力するプログラムです。


#include <stdio.h>

void main(void)
{
    int sum, a, b;

    printf("1つめの数を入力して下さい。:");
    scanf("%d", &a);
    printf("2つめの数を入力して下さい。:");
    scanf("%d", &b);
    
    sum = a + b;
    printf("合計 = %d\n", sum);

    fflush(stdin);
    getchar();
}

リスト1-3 sum.cpp

 


5行目:int sum, a, b;
	int というのは、integer の事で、整数の意味です。
	ココでは、sum, a, b という3つの変数を宣言しています。
8行目:scanf("%d", &a); 
	コンピューターに、キー入力するときこの関数を使います。
	入力したデータは a という変数に格納されます。
	%d は整数の時に使います。
	(厳密には、10進数の整数です。)
	リスト1-1 の時は、& の記号はありませんでしたが、ココでは必要です。
12行目:sum = a + b;
	a と b の和を sum に代入します。
	= の記号は、代入を表します。等しいという意味ではありません。
13行目:printf("合計  = %d\n", sum); 

sum.cppの実行画面

図13 sum.cppの実行画面

ビルドが上手く行くと、コンソールが立ち上り、カーソルが点滅(ブリンク)した状態になります。
図13の実行画面は、2つの整数として、8 と 5 を入力し、その合計 13 が出力された状態です。
電卓に比べて不便ですが、加算機能をプログラミング出来ました。
キーボードの「ENTER」キーを押すとコンソールが閉じてこのプログラムが終了します。

 

1.4.順次処理

プログラムは、上から下へ順に実行されて行きます。
これが、コンピュータの動作の大原則です。前節のプログラムも、この大原則に従って、上から下へ順に実行されて行きます。
しかしこれだけでは不都合な場合が有ります。
第2回では「分岐処理」を、第3回では「繰り返し処理」を解説します。
以上の3種類の処理を組み合わせることで、あらゆる処理を記述することができます。

 

1.5.演習問題

今回は、「分岐処理」も「繰り返し処理」も無かったので、プログラミングをしている感が無かったかもしれません。第2回、第3回に期待して下さい。そして、今回の皆さんの理解度はいかがですか?

  1. 難しかった。
  2. 何とか分かった。
  3. 簡単だった。

A. と答えた方々は、「ふ~ん。」くらいの楽な気分で、暫く読み続けてみて下さい。サンプルプログラムを掲載して、解説して行きますので、どこかのタイミングで「な~んだ!」って、分かってしまった気分になります。今回は、下記の問題は、スルーして下さい。

B. と答えた方々は、下記のProb 1-1 を作成してみて下さい。今回の内容だけで作成できます。次回、解答・解説をします。

C. と答えた方々は、下記のProb 1-2 を作成してみて下さい。今回の内容だけでは作成できません。小数点以下の値がうまく行かない場合は、ネットで調べてみましょう。次回、解答・解説をします。

 Prob 1-1

国語、数学、英語 の3科目の得点を入力し、その合計点を計算するプログラムを作成せよ。入力は、各科目 0 ~ 100 点の範囲の整数である。

 

 Prob 1-2

国語、数学、英語 の3科目の得点を入力し、その平均点を計算するプログラムを作成せよ。入力は、各科目 0 ~ 100 点の範囲の整数である。

[ヒント]
(1) 平均を求める変数宣言は、下記の様に記述します。
double ave;
(2) 「キャスト」をキーワードにして、検索してみて下さい。

 

1.6.なぜコンソールアプリか?

(1) Windowsアプリを作るなら、C#が適していると思います。あえてC言語で挑まなくても。と言うよりも、C言語で作るのは難しい。
Windowsアプリを作るなら、C#で楽しくプログラミングしたい。

(2) プログラミング入門という設定なので、Windowsアプリを作成するとプログラミングの本質を学んでいるのか?
Windowsの特性を学んでいるのか?の区別が難しい。

(3) 基本情報 午後問題の言語選択
前向きな選択肢として、一般には Java か C言語 かの二択になると思います。
あえてC言語の良いところだけを述べてみます。
1つ目は、リスト構造のプログラミングです。C言語は、新しく領域を確保し、ポインターで繋いでゆかなくてはなりません。
Javaは、その面倒くさいところをクラスで提供されており、プログラマーは配列感覚でリスト構造を扱えます。
つまりC言語は、コンピューターのハードウェアを意識して、自己責任で全てプログラミングする感じです。
Javaでクラスを使っても、もちろん自己責任ですが、クラスの内部でどう処理されているかは、知る由がありません。
(C言語も printf()関数の中身までは知らないので、100%分かっているとは言えませんけど。)
2つ目は、Java 8のリリースです。
とても良くなりました。ついこの前まで 5 とか 7 とかだったのに。何処まで進化するのでしょう。
どこかのタイミングで少しだけかじっておいて、必要になった時、ガッツリで良いのではないでしょうか?
PHPもC#も、メジャーな言語は進化し続けています。

(4) 次節「1.7.参考文献」で紹介している書籍のサンプルコードが、そのまま実行可能である。
この4番目の理由は積極的な理由ではありません。コンソールアプリでも大丈夫という理由です。
コンピューター関連の書籍は回転が早く、陳腐化したマイナーな技術に関しては、書店から書籍が消えてしまいます。
それを考えると、驚くことに、『新・明解C言語入門編』は2015年版が出版さました。(・・・ほぼ自虐ネタでした。)

 

1.7.参考文献

何か1冊買ってみようか?というなら、下記 A の書籍はいかがでしょうか。下記 C の書籍も同じ位置づけの書籍です。柴田 望洋氏、林 晴比古氏、お二方とも多くの書籍を執筆されており、高い評価を受けていらっしゃる方々ですので、どちらかを選ばれても間違いないと思います。

ある程度理解が深まり、「今後C言語と関わり続けてゆくかも。」と思えてきたなら、下記 E、F の書籍も一読の価値があります。まず E ですが、「実践」と名が付いている通り、実践的です。ソースコード記述の仕方、デバッグやドキュメント化など、アマチュアがないがしろにしてしまいそうな工程にも触れています。また、翻訳の書籍のわりには読みやすいと思います。

最後に、下記 F の書籍ですが、「C言語のバイブル」です。「K&R」というニックネームも付いています。なんと言ってもC言語を作った張本人のリッチー氏が執筆しました。C言語と関わり続けてゆくなら、読んでおきましょう。翻訳のクオリティ-に問題があり、原書を読むべきという方もいらっしゃいます。その問題点は、誤訳の正誤表がベクターデザインにアップされていますので、これを利用させて頂くことにして、原書は読める人に任せておきましょう。

  1. 新・明解C言語入門編 柴田 望洋(著)
    SBクリエイティブ株式会社 (2014/8/13)
  2. 新・明解C言語中級編 柴田 望洋(著)
    SBクリエイティブ株式会社 (2015/5/27)
  3. 新・C言語入門 ビギナー編 林 晴比古(著)
    SBクリエイティブ株式会社 新訂版 (2003/12)
  4. 新・C言語入門 シニア編 林 晴比古(著)
    SBクリエイティブ株式会社 新訂版 (2004/02)
  5. C実践プログラミング 第3版 Steve Oualline(著)
    望月 康司 (監訳) オライリー・ジャパン 第3版 (1998/6/15)
  6. プログラミング言語C 第2版 B.W.カーニハン、D.M.リッチー(共著)
    石田 晴久 (翻訳) 共立出版 第2版 (1989/6/15)