代入

a=13

と書くと、aという変数名がついた箱の中に13という値が記録される。C言語と数学の違うところは、式文の最後に「;」をつけることと、変数の型を意識しなければいけない点である。

キャスト

キャストは、変数もしくは定数の前につけることで型の変換を行う。

(型)変数 (型)定数

例えば、(int)nと書くと、nはその場だけ整数型になる。

 

型変換を伴う代入の問題点

小さな幅の型から大きな幅の型に代入するのは問題ないが、大きな型から小さな型へ代入する場合は、まったく異なる数値に変化する可能性がある。また、符号付きと符号なしの変数どうしでも値が変わるおそれがある。

 

練習問題3.1 値の入れ替え

代入を使って、変数aとbの内容を壊さずに、入れ替えるプログラムを完成せよ。ただし、変数aとb以外に作業用として変数wを用いることとする。

#include <stdio.h>

void main(void)

{

              int a,b,w;

              a=10;

              b=20;

              printf(“\na=%d”,a);

              printf(“\nb=%d”,b);

              /*入れ替え*/

()

(イ)

(ウ)

              printf(“\na=%d”,a);

              printf(“\nb=%d”,b);

}

 

<実行結果>

a=10

b=20

a=20

b=10

解答

(ア)w = a;

(イ)a = b;

(ウ)b = w;

 

 

 

 

 

 

解説 変数waの値を入れる。この段階で変数aにはaの値が入っている。次に、変数aに変数bの値を入れる。最後に変数bにwの値を入れる。この結果aにはbの値、bにはaの値が入ることになる。プログラムの基本なので身に付けよう。


例題3.1 キーボードからの入力

キーボードからの入力(標準入力)を取り込むのに便利なものに、scanfという関数がある。例えば、コマンドプロンプト上で自分の名前を打ち込んだら次の行にこんにちは誰々さんと表示するプログラムを考えてみよう。ちょっと難しい。

 

実行例

          

考え方

キーボードから入力した文字列を保存するには、配列name[ ]を用いる。この段階では配列が何か分からない人が殆どあるが、文字列は配列に入れるんだと理解すればよい。また、取り込むときに、配列名nameの前に&は付けない。詳しい説明は6章および8章を参照のこと では、プログラムを書いてみよう。

 

解答

#include <stdio.h>

int main()

{

char name[8]; /*name[8]nameという箱に8つの文字を入れる場所を確保*/

printf(“名前はなんですか ?\n”);

scanf(“%s”, name); //この場合は&を書かない。

printf(“こんにちは%sさん”,name);

}

 

この例題では、名前をコマンドラインから入力した。それに対して、次の例題では表示させるものをコマンドライン引数として使う。

Cのmain関数はmain(int argc, char *argv[])と書け、最初のint argcは引数の個数を表し、char *argv[]は引数となる文字列を意味する。第1引数はargv[1]となる。

例題3.2 コマンドライン引数

自分の名前を引数として打ち込んだら次の行にこんにちは誰々さんと表示するプログラムを考えてみよう。

 

実行例

          

考え方

main(int args, char *argv[])において第1引数、横田は、argv[1]に代入される。では、プログラムを書いてみよう。

 

解答

#include <stdio.h>

void main(int argc, char *argv[])

{

printf(“こんにちは%sさん”,argv[1]);

}

argv[0]には、このプログラムのディレクトリが入る。

 

scanfの書式

scanfの書式制御文字一覧

名称

文字

意味

備考

負記号

左詰めを指定

省略可

出力幅1

整数

文字列の桁数の最小値を指定

省略可

出力幅2

整数

浮動小数点の場合には小数点以下の桁数

省略可

修飾子

 

引数の型d,i,o,u,xを修飾し引数がshort

省略不可

d,i,o,u,xを修飾し引数がlong

e,f,gを修飾し引数がdouble

L

e,f,gを修飾し引数がlong double

引数の型

 

 

d,i,o,x

10進数、10進数、8進数、16進数

省略不可

u

符号なし10進数

c

1文字

s

文字列および文字配列

e,f,g

浮動小数点

p

ポインタ値

 

キャッチ

 scanfを用いるときによく起きるエラーは引数の前に&を忘れることである。ただし、引数が配列の場合は&を付けない。詳しいことはポインタの章で説明する。引数の前の&はアドレスを意味しており、初学者には分かりづらいので、CのバイブルRKの本ではgetcharを用いている。1文字づつ文の最後まで読み込むには

int c;

while(c = getchar( ) != EOF)

と書けばよい。EOFend of fileの略である。

 

練習問題3.2 次のプログラムで、出力時に値が変化する可能性があるのはどれか。

1  #include <stdio.h>

2  void main(void)

3  {

4            int i,j;

5            long l;

6            float f;

7            double d;

8            scanf(“%d”,&i);

9            scanf(“%ld”,&l);

10          scanf(“%f”,&f);

11          scanf(“%lf”,&d);

12          j=1;

13          i=(int)l;

14          l=(long)f;

15          f=(float)l;

16          l=(long)i;

17          i=j;

18          printf(“%d %ld %f”,i,l,f);

19       }

20        

解答 long型のlは、13行目でint型のiに強制変換して代入された後、16行目でlong型に戻されるが、13行目で桁数が落ちる可能性がある。float型のfは、14行目でlong型のlに強制変換して代入された後、15行目でfloat型に戻されるが、14行目で小数部分が落ちる可能性がある。

 

練習問題3.3 次のプログラムを実行した結果を数値で答えよ。

<プログラム>

#include <stdio.h>

void main(void)

{

              int a,b;

              a=9;

              b=2;

              printf(“a/bの結果=%d\n”,a/b); /*整数どうしの割り算を行うと、結果は整数で表

される。*/

              printf(“a%%bの結果=%d\n”,a%b); /* a%baをbで割ったあまりを出す*./

}

解答 a/bの結果=4、a%bの結果=1

a,bint型のとき、a/bは整数の商を表す。a%bはあまりを表す。

C入門 / 次の章