この回の読者の皆様は「プログラミング未経験」という前提で進めてゆきます。
そのためまず初めに、Visual Studio 2013 使い方を解説します。
但し、早くプログラミングの話を始めたいので、Visual Studio 2013 の入手方法やインストール方法は、今回は解説しません。
別途、機会を改めて解説します。
また、ある程度はプログラミング経験がある方は、第6回、第8回 の頃に再度訪問してみて下さい。
その回では、アルゴリズムをテーマにして記事を書く予定です。(第6回 ユークリッドの互除法、第8回 エラトステネスの篩(予定) )
1.初めてのプログラミング
まず初めに、Visual Studio 2013 の使い方を解説します。
プログラムを保存する場所を確認しておきましょう。
…MyDocumments\VisualStudio¥Projectsの直下に、
プロジェクト毎にフォルダーが作られ、その中にプログラム
が保存されてゆきます。
講座が進んでゆくと、そのフォルダーが増えてしまいます。そうなってくると、
ⅰは、過去にのこの講座で学習したテクニックを、今のプログラムに応用したいと思った時、どのプログラムを参考にして良いのかが分からなくなります。
ⅱは、C言語のプログラム(プロジェクトファイル)のうち、特定のプロジェクトファイルだけをUSBメモリーにコピーしたいときなどには、探して辛いことになります。
そこで、Visual Studio 2013 を使い始める前に、下位のフォルダーを作っておきましょう。このフォルダーの名称は、皆さんの自由です。自由と言われても困ってしまう方は、西暦年を含む 2015_part01 という名称でフォルダーを作成してみて下さい。
下記(次節 1.2.画面表示) のプロジェクトを作成します。Visual Studio 2013 を起動します。操作方法は、[ファイル] メニューから [新規作成] ⇒ [プロジェクト] を選択します。
図1 プロジェクト作成
図2 テンプレート選択
図3 Win32 アプリケーションウィザード(1/2)
この画面は2カ所修正が必要です。
図4 Win32 アプリケーションウィザード(2/2)
この画面で、チェックを2カ所変更します。その理由は、ANSI規格のC言語を記述する為です。
このスタイルが、国家試験で出題されるC言語と同じスタイルです。
「空のプロジェクト」にチェックが無いと、Microsoft社のローカルなC言語のスタイルになります。
また、「Security Development Lifecycle(SDL)チェック」にチェックが有ると、
「1.3.キーボード入力」で学ぶ scanf() 関数がエラーになって使え無くなります。
これらの操作をしておく事により、国家試験の過去問をパソコンに入力して、動作を試してみるというような事が可能になります。
図5 プロジェクトファイル完成
お待たせしました。プログラミングを始めましょう。
画面にメッセージを表示させる、簡単なプログラムです。
「ソリューション エクスプローラー」から、「hello」の「ソースファイル」を右クリックします。ポップアップメニューが立ち上りますので、順に「追加」 ⇒ 「新しい項目」を選択します。
図6 プロジェクトにソースファイルを追加
図7 C++ファイル追加
なぜ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 の選択がベストだと思います。
図8 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 ソースプログラム入力
「ビルド」とは?コンピュータが実行できるファイル形式に変換することです。(「コンパイル」と「リンク」の事です。)
事前にビルドだけ完了させておくには、[ビルド] メニューから [ソリューションのビルド] を選択します。
図10 hello.cppの実行画面
ビルドが上手く行くと、コンソールが立ち上り、「Hello World!」が表示され、カーソルが点滅(ブリンク)した状態になります。実は入力待ちの状態ですので、キーボードの「ENTER」キーを押すとコンソールが閉じてこのプログラムが終了します。
このとき、エラーが発生すると、「ソースコード」のウィンドウの下に「エラー一覧」のウィンドウが表示されます。赤い×の行(か、1つ上の行)に、間違いがないかをよく見てみて下さい。
プロジェクトを終了してください。
[ファイル] メニューから [ソリューションを閉じる] を選択します。
氏名を入力して、挨拶を出力してみましょう。
文字列を使います。
#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回でけで解決します。
図11 name.cppの実行画面(1/2)氏名入力
ビルドが上手く行くと、コンソールが立ち上り、カーソルが点滅(ブリンク)した状態になります。
入力待ちの状態ですので、キーボードから氏名「山田太郎」を入力しました。
図12 name.cppの実行画面(2/2)氏名出力
図11の状態から、キーボードの「ENTER」キーを押すとメッセージ「山田太郎さん、こんにちは。」が表示されます。
もう一度、キーボードの「ENTER」キーを押すと、コンソールが閉じてこのプログラムが終了します。
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);
図13 sum.cppの実行画面
ビルドが上手く行くと、コンソールが立ち上り、カーソルが点滅(ブリンク)した状態になります。
図13の実行画面は、2つの整数として、8 と 5 を入力し、その合計 13 が出力された状態です。
電卓に比べて不便ですが、加算機能をプログラミング出来ました。
キーボードの「ENTER」キーを押すとコンソールが閉じてこのプログラムが終了します。
プログラムは、上から下へ順に実行されて行きます。
これが、コンピュータの動作の大原則です。前節のプログラムも、この大原則に従って、上から下へ順に実行されて行きます。
しかしこれだけでは不都合な場合が有ります。
第2回では「分岐処理」を、第3回では「繰り返し処理」を解説します。
以上の3種類の処理を組み合わせることで、あらゆる処理を記述することができます。
今回は、「分岐処理」も「繰り返し処理」も無かったので、プログラミングをしている感が無かったかもしれません。第2回、第3回に期待して下さい。そして、今回の皆さんの理解度はいかがですか?
A. と答えた方々は、「ふ~ん。」くらいの楽な気分で、暫く読み続けてみて下さい。サンプルプログラムを掲載して、解説して行きますので、どこかのタイミングで「な~んだ!」って、分かってしまった気分になります。今回は、下記の問題は、スルーして下さい。
B. と答えた方々は、下記のProb 1-1 を作成してみて下さい。今回の内容だけで作成できます。次回、解答・解説をします。
C. と答えた方々は、下記のProb 1-2 を作成してみて下さい。今回の内容だけでは作成できません。小数点以下の値がうまく行かない場合は、ネットで調べてみましょう。次回、解答・解説をします。
国語、数学、英語 の3科目の得点を入力し、その合計点を計算するプログラムを作成せよ。入力は、各科目 0 ~ 100 点の範囲の整数である。
国語、数学、英語 の3科目の得点を入力し、その平均点を計算するプログラムを作成せよ。入力は、各科目 0 ~ 100 点の範囲の整数である。
[ヒント]
(1) 平均を求める変数宣言は、下記の様に記述します。
double ave;
(2) 「キャスト」をキーワードにして、検索してみて下さい。
(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冊買ってみようか?というなら、下記 A の書籍はいかがでしょうか。下記 C の書籍も同じ位置づけの書籍です。柴田 望洋氏、林 晴比古氏、お二方とも多くの書籍を執筆されており、高い評価を受けていらっしゃる方々ですので、どちらかを選ばれても間違いないと思います。
ある程度理解が深まり、「今後C言語と関わり続けてゆくかも。」と思えてきたなら、下記 E、F の書籍も一読の価値があります。まず E ですが、「実践」と名が付いている通り、実践的です。ソースコード記述の仕方、デバッグやドキュメント化など、アマチュアがないがしろにしてしまいそうな工程にも触れています。また、翻訳の書籍のわりには読みやすいと思います。
最後に、下記 F の書籍ですが、「C言語のバイブル」です。「K&R」というニックネームも付いています。なんと言ってもC言語を作った張本人のリッチー氏が執筆しました。C言語と関わり続けてゆくなら、読んでおきましょう。翻訳のクオリティ-に問題があり、原書を読むべきという方もいらっしゃいます。その問題点は、誤訳の正誤表がベクターデザインにアップされていますので、これを利用させて頂くことにして、原書は読める人に任せておきましょう。