7
プログラミング 第07回
プログラミング
05/31 5限にはじまります。
本日の教材は、大久保のページにあります。
Googleで、「静岡県立大 大久保のページ」で検索。
[大久保のページTOP]をクリック。
[授業関係]→[プログラミング]とリンクを辿る。
~s-okubo/prog21/ にある、
0006.txt
を、自分のホームの
~/prog21/report/ 以下にコピーしておいてください。
先週の復習と回答例
前回のお話一覧
浮動小数点数とfloat, double。
配列:
int
配列名[個数] で宣言。
配列名[番号] で参照したりする。
個数個まで使える。
配列名[0]から配列名[番号- 1]
例:
int x[10];
x[0]からx[9] まで使える。
演習
1:
s0006a.c#include<stdio.h>
int main(void){
int x[4];
x[2]=2;
x[3]=x[2];
x[0]=x[3]+x[2];
x[1]=x[0]*x[2];
printf("%d %d %d %d¥n",x[0], x[1] , x[2] , x[3]);
}
#include<stdio.h>
int main(void){
int x[4];
x[2]=2;
x[3]=x[2];
x[0]=x[3]+x[2];
x[1]=x[0]*x[2];
printf("%d %d %d %d¥n",x[0], x[1] , x[2] , x[3]);
}
2 2 2 2
? x[2]
2 8
4
?
?
?
? x[1]
x[0] x[3]
? ?
? ?
? 2
4 2
それぞれの行が実行されたとき、
変数の値がどうなるか、記入する。
0006.txtに答える
演習
2
以下のプログラムを0006a.cとして作成しなさい。
1. int型の配列x を、サイズ100で宣言する。
2.
キーボードからint型の値を3つ読み込み、x[10]と
x[20]とx[30]に保存する。3.
以下の計算式を実数として行った結果を、表示す る。式中のx[10]やx[20]は、配列の値の意味。
302010 32 x
x x 1,2,3と入力したら、
1.6666になるはず。
演習
2:
0006a.c#include<stdio.h>
#include<math.h>
int main(void){
int x[100];
scanf("%d%d%d",&x[10],&x[20],&x[30]);
printf("%f¥n",
pow(x[10],2.0/3.0) +(double)x[20]/x[30]);
}
#include<stdio.h>
#include<math.h>
int main(void){
int x[100];
scanf("%d%d%d",&x[10],&x[20],&x[30]);
printf("%f¥n",
pow(x[10],2.0/3.0) +(double)x[20]/x[30]);
}
2/3だけだと、int型に
なり、0になってしまう。
x[20]/x[30]だけだと、
int型になってしまう。
演習
2の補足
2/3だと、int型/int型になるので、結果が0になる。
(double)2/3 とか2.0/3 とか2/3.0 とかにする。
x[20]/x[30] だと、int型/int型になるので、結果もint
型になる。
(double)x[20]/x[30]
(1.0*x[20])/(1.0*x[30])
演習
3
以下のプログラムを0006b.cとして作成しなさい。
1. int型、float型、double型が、それぞれ何バイト使
用するかを表示する。
また、それぞれのバイト数を、0006.txtに答えなさい。
演習
3:
0006b.c#include<stdio.h>
int main(void){
printf("int¥t: %u¥n",sizeof(int));
printf("float¥t: %u¥n",sizeof(float));
printf("double¥t: %u¥n",sizeof(double));
}
#include<stdio.h>
int main(void){
printf("int¥t: %u¥n",sizeof(int));
printf("float¥t: %u¥n",sizeof(float));
printf("double¥t: %u¥n",sizeof(double));
}
int : 4
float : 4 double : 8
実行結果
¥tは、見栄えの
ために入れたタ ブ文字です。
float
と
doubleの補足
IEEE 754で決められているのは、以下の通り
32bit単精度浮動小数点の場合
符号部:1bit
指数部:8bit
仮数部:23bit
64bit倍精度浮動小数点の場合
符号部:1bit
指数部:11bit
仮数部:52bit
0006.txt
の
%3%から
%5% %3% 変数xのアドレスを表示するprintfを書け。
printf("%p¥n",&x);
%4% 配列xの先頭のアドレスを表示するprintfを書け。
printf("%p¥n", x);
printf("%p¥n", &x[0]);
%5% 配列xの4番目の要素x[4]のアドレスを表示する
printfを書け・
printf("%p¥n",&x[4]);
変数名に
&配列名自体がアドレス
配列名自体がアドレス
0006.txt
の
%6%から
%7% %6% ワークディレクトリを、1つ上の階層に変更するシ
ェルのコマンドを書け。
cd ..
%7% ワークディレクトリを、自分のホームに変更する
シェルのコマンドを書け。
cd
もしくは
cd ~構造化プログラミングと 構成要素
構造化プログラミング
全体の処理を、複数のサブルーチンの組み合わ せとして記述するプログラミング手法。
構造化プログラミングでは、処理は上から順番に 実行されていく。
プログラムの流れは、基本的に次の3つしかない。
1.
順次:順番に実行していく
2.
分岐:条件に従って、行う処理内容を変える。
3.
反復:ある条件が満たされている間、繰り返す。
構造化プログラミングのメリット
全体の処理を、複数のサブルーチンの組み合わせと して記述できるので、書く際にわかりやすい。
順次・分岐・反復しかないため、人間がプログラムの 処理の流れを追うときに、わかりやすい。
略
int main(void){
int i;
for(i=0;i<10;i++) printf("%d¥n",i);
if(i==10)
printf("%d¥n",i);
} 略
int main(void){
int i;
for(i=0;i<10;i++) printf("%d¥n",i);
if(i==10)
printf("%d¥n",i);
}
10 for i=0 to 10 20 print i 30 next i 40 end 50 goto 10
60 if i=10 then 70 else 40 70 print i
10 for i=0 to 10 20 print i 30 next i 40 end 50 goto 10
60 if i=10 then 70 else 40 70 print i
構造化プログラミングの場合の例 構造化プログラミング以外の場合の例
基本的に、
上から下に 流れる
上から下に 流れるとは 限らない
C
言語における分岐、反復
C言語におけて、分岐・反復を行うには、次のような制
御命令を使用する。
反復:
for
while
分岐:
if
switch
順次・分岐・反復の枠に入らない
gotoもあるが、普通 は使用しない。
for(式1;式2;式3){
文 }
for
以下のように実行される
1.
式1を行う。
2.
式2を評価した結果が 真であるなら3に進む。
偽ならfor文を終了する。
3.
文を実行する。
4.
式3を行い、2に戻る。
break があると、そこからfor
の外までジャンプする。
式2 式1
文 式3 Yes
No
演習
1:
for#include<stdio.h>
int main(void){
int i,x;
x=0;
for(i=0;i<4;i++){
x=x+i;
}
printf("%d %d ¥n",i,x);
}
#include<stdio.h>
int main(void){
int i,x;
x=0;
for(i=0;i<4;i++){
x=x+i;
}
printf("%d %d ¥n",i,x);
} 01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
どのように処理が流れていくかを 表に書きましょう。
それぞれの行が実行されたとき、
変数の値がどうなるか、表に書き ましょう。
i x i x i x i x i x
0007.txtに答える s0007a.c
演習
1:
for#include<stdio.h>
int main(void){
int i,x;
x=0;
for(i=0;i<4;i++){
x=x+i;
}
printf("%d %d ¥n",i,x);
}
#include<stdio.h>
int main(void){
int i,x;
x=0;
for(i=0;i<4;i++){
x=x+i;
}
printf("%d %d ¥n",i,x);
} 01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
どのように処理が流れていくかを 表に書きましょう。
それぞれの行が実行されたとき、
変数の値がどうなるか、表に書き ましょう。
i x
? 0 0 0 0 0 0 0 1 0
i x
1 0 1 1 2 1
i x
2 1 2 3 3 3
i x
3 3 3 6 4 6
i x
4 6
while( 式 ){
文 }
while
以下の様に実行される。
1.
式を評価する。結果が、
真なら2に進む。
偽ならwhileを終了する。
2.
文を実行する。
3. 1に戻る。
文中にbreak があると、
while を終了する。
式1 文 Yes
No
演習
2:
while#include<stdio.h>
int main(void){
int i,x;
i=1;
x=1;
while(i<5){
x*=i;
i++;
}
printf("%d %d ¥n",i,x);
}
#include<stdio.h>
int main(void){
int i,x;
i=1;
x=1;
while(i<5){
x*=i;
i++;
}
printf("%d %d ¥n",i,x);
} 01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
i x i x i x i x i x i x
どのように処理が流れていく かを表に書きましょう。
それぞれの行が実行された とき、変数の値がどうなるか、
表に書きましょう。
0007.txtに答える s0007b.c
演習
2:
while#include<stdio.h>
int main(void){
int i,x;
i=1;
x=1;
while(i<5){
x*=i;
i++;
}
printf("%d %d ¥n",i,x);
}
#include<stdio.h>
int main(void){
int i,x;
i=1;
x=1;
while(i<5){
x*=i;
i++;
}
printf("%d %d ¥n",i,x);
} 01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
どのように処理が流れていく かを表に書きましょう。
それぞれの行が実行された とき、変数の値がどうなるか、
表に書きましょう。
i x 1 ? 1 1 1 1 1 1 2 1
i x
2 1 2 2 3 2
i x
3 2 3 6 4 6
i x
4 6 4 24 5 24
i x
5 24 i x
if(式1){
文1 }else{
文2 }
if
~
else
次のように実行される。
1.
式1を評価する。結果が、
真である場合、2に進む。
偽である場合、3に進む。
2.
文1を実行し、4に進む。
3.
文2を実行し、4に進む。
4. if文を終了する。
else 以降は省略しても良い。
式1 文1 Yes
No
文2
演習
3:
if#include<stdio.h>
int main(void){
int i,t;
for(i=0;i<4;i++){
if(i%2){
printf("%d is odd ¥n",i);
}else{
printf("%d is even ¥n",i);
} } }
#include<stdio.h>
int main(void){
int i,t;
for(i=0;i<4;i++){
if(i%2){
printf("%d is odd ¥n",i);
}else{
printf("%d is even ¥n",i);
} } } 01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
どのように処理が流れていくか を表に書きましょう。
それぞれの行が実行されたとき、
変数の値がどうなるか、表に書 きましょう。
i i i i i
0007.txtに答える s0007c.c
演習
3:
if#include<stdio.h>
int main(void){
int i,t;
for(i=0;i<4;i++){
if(i%2){
printf("%d is odd ¥n",i);
}else{
printf("%d is even ¥n",i);
} } }
#include<stdio.h>
int main(void){
int i,t;
for(i=0;i<4;i++){
if(i%2){
printf("%d is odd ¥n",i);
}else{
printf("%d is even ¥n",i);
} } } 01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
どのように処理が流れていくかを 表に書きましょう。
それぞれの行が実行されたとき、
変数の値がどうなるか、
表に書きましょう。
i 0 0
0 1
i
1 1 2
i 2
2 3
i
3 3 4
i 4
その他のこと
forやwhileの
ループ中、
break があると、
繰り返しが中止 される。
#include<stdio.h>
int main(void){
int i,t;
for(i=0;i<4;i++){
if(i%2){
printf("%d is odd ¥n",i);
}else{
break;
} } }
#include<stdio.h>
int main(void){
int i,t;
for(i=0;i<4;i++){
if(i%2){
printf("%d is odd ¥n",i);
}else{
break;
} } } 01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
実行されると ループ終了
ブロック
#include<stdio.h>
int main(void){
int i,t;
for(i=0;i<4;i++){
if(i%2){
printf("%d is even ¥n",i);
printf("-> %d is even ¥n",i);
}else
printf("%d is odd ¥n",i);
} }
#include<stdio.h>
int main(void){
int i,t;
for(i=0;i<4;i++){
if(i%2){
printf("%d is even ¥n",i);
printf("-> %d is even ¥n",i);
}else
printf("%d is odd ¥n",i);
} } 01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
命令が1文の場合、
{}は無くても良い
命令が2文以上の場合、
{}が必須 s0007d.c
演習
4:
for#include<stdio.h>
int main(void){
int x,y,z;
x=0;
y=2;
for(z=1;z<3;z++){
x=z;
y=x*y;
} }
#include<stdio.h>
int main(void){
int x,y,z;
x=0;
y=2;
for(z=1;z<3;z++){
x=z;
y=x*y;
} } 01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
y
x z x y z x y z
0007.txtに答える
s0007a.c
演習
5
以下のプログラムを0007a.cとして作成しなさい。
1.
キーボードから10回値を読み込む。読み込んだ毎
に、それぞれの値が偶数ならeven、奇数ならoddと
出力する。
演習
5:ヒント
1
まず、実際に実行される順を考える。
1.
キーボードから1文字読み込む。
2.
値が偶数が奇数かを判断する。
3.
偶数ならeven、奇数ならoddと出力する。
4.
キーボードから1文字読み込む。
5.
値が偶数が奇数かを判断する。
6.
偶数ならeven、奇数ならoddと出力する。
7.
キーボードから1文字読み込む。
8.
値が偶数が奇数かを判断する。
9.
偶数ならeven、奇数ならoddと出力する。
繰り返しに なっている
演習
5:ヒント
2
とうことは、以下のような構造で書ける。
1.
以下を10回繰り返す
1.
キーボードから1文字読み込む。
2.
値が偶数が奇数かを判断する。
偶数ならevenと出力する。
奇数ならoddと出力する。
forかwhile scanf
if~else
今日の回収
演習1から5を行いなさい。
0007.txtの質問に答えなさい。
回収するファイルは、以下の通りです。
0007.txt、0007a.c
今後の予定
構造化プログラミング2(配列とfor文)
既存の関数の利用2:疑似乱数
関数の自作