C言語を始めよう。

C-language
Narc Neac ARithmetic Compiler
入出力・制御の基礎
C言語を始めよう。
まずは、計算だけをしても、結果を見れなければ意味がないので、文字や数
字を表示する方法を教えましょう^^・・・とその前に
#include <stdio.h>
これは「standard I/O」の略で、OSの機能を使いますよという宣言
void main(void)
{
printf(“WELCOME TO THE K3!”);
}
void main(void)
{
なんたらかんたら
}
という部分は決まりなので、絶対に書きます。これは仕様なので、理由はありませんよ^^
この「{」と「}」の間にプログラムを書くわけですが、基本的にプログラムは「{」から「}」に
流れるように実行されていきます。つまり、この例では「printf(“WELCOME”);」という指令を
したあとは「}」に到達してしまいますから、プログラムは終了します。まずはプログラムの流
れから。
詳細printf()
printf(“WELCOME TO THE K3!”);
みなさんは関数というものをしっていますよね??
高校などで教えてもらうf(x)などです。あれはXという数字をf()という関数に与え
るとある規則によって変換された数字が帰ってくるというものですよね。
それと同じようにprintf()という関数は”WELCOME”という文字を渡すと、数を返
すのではなく、モニタに表示してくれるというものなのです。
また、このような書き方もできます。
printf(“NUMBER=%d”,1000);
今度は、関数に渡す数(引数)が二つになりましたね。これは%dというところに二
つ目の引数である1000をいれて表示してくれます。結果は
>NUMBER=1000
となります。試してみましょう。
詳細printf() 2
では、もう少し、詳しく。先ほどの
printf(“NUMBER=%d”,1000);
は、1000を表示した。でも、これでは常に1000しか表示できないよね?
もし、
a=500;
printf(“NUMBER=%d”,a);
a=200;
printf(“NUMBER=%d”,a);
このように適当な数を放り込める「箱のようなa」があれば、柔軟に数字を表示で
きそうだね。このようなaを「変数a」という。その名の通り「変更ができる数」なの
ですね^^
もうひとつ気になることがあるでしょう。それは「%dって何」だと思います。まず、%~は「そこが
他の引数に置き換わる」という意味です。そして「d」はDecimal(10進数)の略で、「後ろの引数
を10進数でここの位置に表示」というのが%dです。
ほかにも、16進数を表示する%x,文字を表示する%cなどがあります。
変数の概念
最初の方で、複雑な計算はどこかにその値をメモしておかなければならない、と
書きましたが、まさにそのとおりで、C言語ではそれらを「変数」と呼びます。
10
a = 10;
a という変数に10という数字を入れる。
a
b = a;
b
a
aという変数の内容(数字)をbという変数に入れる。
変数の宣言
変数を使用する際、気をつけなければならないのは、「変数の宣言」である。
変数を演算するまえに(使用するまえに)プログラマは「ここではaという変数を数字
を扱うために使いますよ~」などと高らかに宣言しなければなりません。
変数というのは「箱」と考えることができますが、すべてが同じ形ではありません。
大きい箱から、小さい箱などさまざまです。それは、入る内容が違うからです。小さ
な数字、大きな数字、文字、少数などはすべて大きさが異なり、変数はそれにあっ
た形をしていなければなりません。
宣言の例
int a;
Int とはintegerの略で、簡単に言うと数字です。数字用の「a」という変数を使
うことを宣言する。
char moji;
char とはcharacterの略で、文字です。文字用の「moji」という変数を使うことを
宣言する。(別に変数はどんな名前でもいいですよ~。あ、数字はだめね(^^
では、計算してみよう。
では実際にプログラムの例を紹介しよう。細かいことは各自確認してもらいたい。
#include <stdio.h>
void main(void)
{
int a,b,c;
a=5;
b=3;
c=0;
c=(a+b)*b+(a+5b)*a;
printf(“RES = %d”,c);
}
気づいた人もいるかもしれないが、すべて行(一文)の最後には「;」を入れることとなっている。
これを忘れると、エラーの原因となることもあるので、注意。
変数の初期化
変数を宣言するのは、わかった。では、このようなことをしたらどうなるだろうか。
#include <stdio.h>
void main(void)
{
int a;
printf(“a is %d”,a);
}
勘違いしやすいが、「宣言したらみんな最初は0である」などと考えてはいけない。
なぜなら、宣言によって確保される(すこし意味が違うんだけど)メモリ空間には、
以前そこを使っていた誰かの数字(もしくは命令)が残っているからである。そこ
で、プログラマは「初期化」を行う必要がある。初期化は宣言したあと「a =0;」とし
てもいいが、宣言に組み込むこともできる。
int a=0;
printf(“ a is %d”,a);
注)初期化は別に0でなくてもいい
四則演算+α
• a = a + 1;
加算
• a = a - 1;
減算
• a = a * 1;
掛け算
• a = a / 1;
割り算
• a = a % 1;
余り(aを1で割った余り)
• a++;
a = a + 1と同じ意味
• a--;
a = a - 1と同じ意味
「計算の手順」の補足
先ほど、計算の手順のはなしや、「{」から「}」に流れるようになどと書いたが、プロ
グラミングの便利なところは、それだけではない。プログラミングでは、分岐、繰り返
しという機能がある。図をみてもらいたい。
分岐
繰り返し
いろんな処理
A は偶数か?
YES
NO
i は10以上か?
YES
NO
この図はiが10以下
の間、繰り返すという
意味
これらを使うことにより、人間にとっての「機械的計算」はコンピューターがササッっと
やってくれる。
例)1から100までの数字を足すプログラムは分岐と繰り返しどっちを使うべきか?
分岐1
例)入力した文字が偶数だったら「この文字は偶数です」、奇数だったら「この文字
は奇数です」と表示するプログラム
#include <stdio.h>
void main(void)
{
int input;
scanf(“%d”,&input);
/*文字の入力。口頭で解説?*/
if(input % 2 == 0){
printf(“この数字は偶数です”);
}else{
printf(“この数字は奇数です”);
}
}
分岐2
今の例で、使ったのは「if」文といい、名前の通りif(もしも)である。
If(a == b){
}
括弧の中に、条件が入る。上の場合、「もしもaがbと等しいならば、{}内を実行」を
意味する。注意する点は、「==」である。「=」と書いてしまうとうまく動かない。別に、
「等しいとき」以外にも条件はあるので、乗せようと思う。
A == B
もしAがBに等しいなら
A<B
もしAがB未満なら
A <= B
もしAがB以下なら
A>B
もしAがBより大きいなら
A >= B
もしAがB以上なら
A !=0
もしAとBが等しくなけれ
ば
分岐3
では、if文の詳細。
If(a == b){
printf(“a ==b”);
}else if(a <b){
printf(“a < b”);
}else{
printf(“??”);
}
このようにif文はたくさん連ねる(?)ことができる。日本語でいうのならば「もし、
aとbが等しいなら、もしそうではなくaはb未満ならば、それ以外は・・・」という感
じである。
ここで重要なのは、a == bだったとする。すると上のプログラムでは「a == b」
と表示をする。そのあとは、a<bであるか、などをしらべないで、else{}の下に
移動してしまう。この動きはとても重要で、プログラムを少し組めばわかるとお
もう^^
繰り返し1
繰り返しはとても興味深く、プログラムの世界が広くなるでしょう^^。まずは例題から。
例)1から100までの数字を加算するプログラム
#include <stdio.h>
Void main(void)
{
int i;
int ans=0;
for(i=1;i<=100;i++){
ans = ans + i;
}
printf(“RES = %d”,ans);
}
For文の中に先ほどの条件の演算子が入っているのがわかると思う。また、i++と書
いてあるから、iがどんどん足されていくのかな?と予想できるだろうか^^
繰り返し2
For文の詳細。
for( i = 1 ; i <= 100 ; i++){ }
一項目: 初期化(ここでは、iを初期化)
二項目: 条件式、これを満たしている間{}間をループ
三項目: ステップ、再初期化(ループのたびに実行される)
また、日本語で説明すると「i が1から100まで1刻みでくりかえし」となる。
For分は、繰り返す回数が決まっているときなどに多用される。他にも、
while()文などがあるが、それは参考書で調べるなどして、自分で勉強し
てみてください。参考書の見方も重要ですからね。
課題
では問題。九九を以下のように表示するプログラムを書きなさい。
123456789
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
できればfor文をしっかりと使ってください。
改行は 「printf(“\n”);」
課題の答え
#include <stdio.h>
void main(void)
{
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=9;j++)printf("%d ",i*j);
printf("\n");
}
}
これはどうでしょうか?For文の中にfor文がありますね^^これは良く使う手
なので、覚えておきましょう。
SCANF
~ とりあえず、数字の入力 ~
Scanf()は、ユーザーからの入力を待ってくれる命令です。scanf()をプログラムに
混ぜると、実行時に、ユーザーがエンターを押すまで、停止します。そして、エン
ターを押すと、実行が再開するわけです。
scanf(“%d”,&input);
これの意味は、『ユーザーが入力した数値(もしくは文字列)を%d、すなわち、10進数で、
「input」という名前の変数に入れる』という意味。数字を入力するだけだったら、このほかに書
きようが無い。変数の名前が変わるぐらいです。
また、scanfとprintfのfはフォーマット(format)のfなので、入力にもフォーマットを使える。たと
えば、
Scanf(“%d %d %d”,&a,&b,&c);
とすれば、ユーザーが
10 20 30 [enter]
とすれば、三つの数字が三つの変数に入るということである。でも当分はひとつの数字だけ
を入力できればいいので、上の(黄色)のような書き方を覚えておけばよい。
SCANFの罠
Scanf(“%d”,&a);
Scanf(“%d”,&a);
このようにscanf()を連続して書いた場合、うまく動かないことが多い。
Scanf()はエンター自体は読み込んでいないため、そのエンターが次の
scanf()でのエンターとして実行されてしまう。(つまり、二つ目のscanf()は
何も入力されずに終わってしまう。そこで、ねんのため、このような呪文を唱
える。
Scanf(“%d”,&a);
(void)getchar();
Scanf(“%d”,&a);
(void)getchar();
で、OK。詳細は参考書に任せる。
おぉ、入力と出力、制御も終わった!
おぉ!C言語の基本が結構おわったぞ!!!
これまでの命令を見返してみよう。
If(a == b){ …………}
For(i=0;i<100;i++){……………….}
Printf(“NUM = %d\n”,a);
Scanf(“%d”,&input);
これで、数字に関する計算のプログラムはできるようになったよ。
たとえば、入力する数値をNとすると、1~Nまで加算していくプログラムとか、
作れそうな気がするでしょ??では、いろいろなプログラム例をみて、プログ
ラムを理解する練習をしよう。
細かい調節
exit(0);
これが実行されると、そのまま終了する。エラーのときはexit(1)と書くのが通説
これを使うときは、#include <stdlib.h>を追加して書く
break;
これはループ中でしか使えない。ループ中にこれが使われると、強制的にルー
プから、抜け出すことができる。素数のプログラムでは、それを利用している。
シグマを計算するプログラム
Main(void)
{
int input=0;
int i=0;
int ans=0;
printf(“Please Input The Number :”);
scanf(“%d”,&input);
if(input <=0){
printf(“ERROR! %d is not Realnumber!\n\a”,input);
}else{
for(i=1;i<=input;i++){
ans = ans + i;
}
printf(“Result is %d\n”,ans);
}
}
入力した数字が素数か?
Main(void)
{
int i=0;
int input=0;
printf(“NUMBER?>”);
scanf(“%d”,&input);
if(input <= 0){
printf(“ERROR!\n\a”);
exit(1);
}
for(i=1;i<=input;i++){
if(input % I ==0){
break;
}
}
if(i>input){
printf(“THIS IS SOSU\n”);
}else
printf(“THIS IS NOT SOSU\n”);
}
}
課題
入力された数字の約数をすべて表示するプログラムを書きなさい。