1
C言語Ⅰの復習
・条件判定
(if, 条件式)
・ループ(for[二重まで], while, do)
・配列(1次元、2次元)
・トレース
©Jun Usuki 2006 2if文(aとbの大きい方を表示)
int a, b;printf(“整数a:”); scanf(“%d”, &a); printf(“整数b:”); scanf(“%d”, &b);
//①2つのif文で表現する場合 間違えやすい→ どっちに = をつける?
if( a>=b ) printf(“大きい方は%d¥n”, a); if( b > a ) printf(“大きい方は%d¥n”, b); //②1つのif文で表現する場合
if( a>=b ) printf(“大きい方は%d¥n”, a); else printf(“大きい方は%d¥n”, b);
©Jun Usuki 2006
3
if文 と else if文 による条件分岐
n が 0以上 100以下 の値をとる整数とするとき、nを入力すると 90以上の場合 ・・・・・・・S と表示する 80以上90未満の場合・・・ A と表示する 70以上80未満の場合・・・ B と表示する 60以上70未満の場合・・・ C と表示する その他の場合 ・・・・・・・X と表示する と表示するプログラムを次の2通りで作成せよ。
(a)if文だけでプログラミング (else文を使わない)
(b)else if文を使ってプログラミング
条件式では○○以上という表現のみ使う(未満は使わない) ©Jun Usuki 2006
4
解答例:if文 と else if文 による条件分岐
#include <stdio.h>int main(void){ int n;
printf(“0以上100以下の整数値を入力してください:”); scanf(“%d”, &n);
//ここに異なる解答(a)や(b)が入る。
return 0; }
(a)if文だけでプログラミング (else文を使わない) if( n>= 90 ) printf(“S¥n”); if( n>= 80 && n <90 ) printf(“A¥n”); if( n>= 70 && n <80 ) printf(“B¥n”); if( n>= 60 && n <70 ) printf(“C¥n”); if( n <60 ) printf(“X¥n”);
©Jun Usuki 2006
5
解答例:
if文 と else if文 による条件分岐
#include <stdio.h>int main(void){ int n;
printf(“0以上100以下の整数値を入力してください:”); scanf(“%d”, &n);
//ここに異なる解答(a)や(b)が入る。 return 0; } (b)else if文を使ってプログラミング 条件式では○○以上という表現のみ使う(未満は使わない) if( n>= 90 ) printf(“S¥n”);
else if( n>= 80 ) printf(“A¥n”); else if( n>= 70 ) printf(“B¥n”); else if( n>= 60 ) printf(“C¥n”);
else printf(“X¥n”); ©Jun Usuki 2006 6
switch文による条件分岐
整数nをキーボードから入力し、 nが1のとき 「おはよう」 と表示して終了 nが2のとき 「こんにちは」 と表示して終了 nが3のとき 「こんばんは」 と表示して終了 それ以外のとき 「おやすみなさい」 と表示して終了 するプログラムを作成せよ。 ©Jun Usuki 20067
解答例:
switch文による条件分岐
#include <stdio.h>int main(void){ int n;
printf(“整数値を入力してください:”); scanf(“%d”, &n);
return 0; }
switch( n ){
case 1: printf(“おはよう¥n”); break; case 2: printf(“こんにちは¥n”); break; case 3: printf(“こんばんは¥n”); break; default: printf(“おやすみなさい¥n”); } ©Jun Usuki 2006 8
for文による繰り返し
(a)10から20までの整数値をすべて表示
(b-1)10から20までの偶数の中で、
3の倍数以外の値をすべて表示
(ただし、 条件式を2つ 使うこと) (b-2)10から20までの偶数の中で、
3の倍数以外の値をすべて表示
(ただし、 条件式は1つだけ 使うこと:for文を工夫する) ©Jun Usuki 2006 9解答例:for文による繰り返し
(a)10から20までの整数値をすべて表示 #include <stdio.h> int main(void){ int n; for(n=10;n<=20;n++){ printf(“%3d¥n”, n); } return 0; } ©Jun Usuki 2006 10解答例:for文による繰り返し
(b-1)10から20までの偶数の中で、 3の倍数以外の値をすべて表示 (ただし、 条件式を2つ 使うこと) #include <stdio.h> int main(void){ int n; for( n=10; n<=20; n++ ){if((n%2)==0 && (n%3)!=0) printf(“%3d¥n”, n); } return 0; } ©Jun Usuki 2006 11
解答例:for文による繰り返し
(b-2)10から20までの偶数の中で、 3の倍数以外の値をすべて表示 (ただし、 条件式は1つだけ 使うこと:for文を工夫!) #include <stdio.h> int main(void){ int n; for( n=10; n<=20;n+=2){ if(n%3!=0) printf(“%3d¥n”, n); } return 0; } ©Jun Usuki 2006 12for文の特殊な使い方(1)
#include <stdio.h> int main(void){ int x=0, s=0; printf("Test 1¥n"); for( ; s!=12; x+=2){ s+=x; printf(" s=%d¥n", s); } return 0; } #include <stdio.h> int main(void){ int y=0, s=0; printf("Test 2¥n"); for( ; s<12 ; y+=2){ s+=y; printf(" s=%d¥n", s); } return 0; } ©Jun Usuki 200613
for文の特殊な使い方(2)
#include <stdio.h> int main(void){ int z=1; printf("1を入力しEnterキーを押す。 これを繰り返してください。¥n"); printf("他の整数値を入力しても良いですが、 記号や文字は入力しないでください。¥n"); for( ; z==1 ; ){ scanf("%d",&z); printf("入力した数値は[%d]です。¥n",z); } return 0; } ©Jun Usuki 2006 14for文の特殊な使い方(3:文字列の知識が必要)
#include <stdio.h>#include <conio.h>//getch()用
int main(void){ char ch='y'; printf("yだけ押し続けてください¥n"); for( ; ch==' y' ; ){ ch=getch(); //scanf("%c",&ch); getchar(); printf("入力文字は[%c]です。¥n",ch); } return 0; } ©Jun Usuki 2006 C言語1 の範囲外 15
while文による繰り返し
(a)
0以下の値がキーボード入力される間は
「負」と表示するプログラム。
(b)
0以下、または 5以上が入力される間は
「×」を表示するプログラム。
(c)
(b)を用い、switch文の例題において、
n=1,2,3,4以外 の数値 が入力されている間は
繰り返しキーボード入力を要求するプログラム。
©Jun Usuki 2006 16解答例:
while文による繰り返し
#include <stdio.h> int main(void){ int n; scanf(“%d”, &n); while( n<=0 ){ printf(“負¥n”); scanf(“%d”, &n); } return 0; } (a)0以下の値がキーボード入力される間は 「負」と表示するプログラム。 ©Jun Usuki 2006 17解答例:
while文による繰り返し
#include <stdio.h> int main(void){ int n; scanf(“%d”, &n); while( n<=0 || n>=5 ){ printf(“×¥n”); scanf(“%d”, &n); } return 0; } (b)0以下、または 5以上が入力される間は 「×」を表示するプログラム。 ©Jun Usuki 2006 18解答例:
while文による繰り返し
#include <stdio.h> int main(void){ switch( n ){case 1: printf(“おはよう¥n”); break; case 2: printf(“こんにちは¥n”); break; case 3: printf(“こんばんは¥n”); break; default: printf(“おやすみなさい¥n”); } return 0; } (c)nに1~4以外 の整数値 が入力 されている間は繰り返しキー ボード入力を要求するプログラム。 int n= -1; while(n<=0 || n>=5){ // ← !(n>0 && n<=4)でもよい printf(“整数値を入力してください:”); scanf(“%d”, &n); } ©Jun Usuki 2006
19
do文とwhile文の違い
while文のプログラム(a)を do文に書き換えて実行(負の値と正の値を入力してみる)すると? #include <stdio.h> int main(void){ int n; scanf(“%d”, &n); do { printf(“負¥n”); scanf(“%d”, &n); } while( n<=0 ); return 0; } #include <stdio.h> int main(void){ int n; scanf(“%d”, &n); while( n<=0 ){ printf(“負¥n”); scanf(“%d”, &n); } return 0; } ©Jun Usuki 2006 20do文とwhile文による繰り返し
(検討)以下の2つのプログラム(1から読み込んだ整数値までを加算し、 その結果を表示)について次の値を入力実行し、 do文とwhile文の違いを考えよ。 入力値:1, 0, -1 #include <stdio.h> int main(void){int i=1, sum=0, x;
printf("整数値を入力してください:"); scanf("%d",&x); while( i <= x ){ sum+=i; i++; } printf("0から%dまでの合計は%dです。¥n", x, sum ); return 0; } do{ sum+=i; i++; }while( i<=x ); ©Jun Usuki 2006 21
x に -1 を代入した場合をトレース
#include <stdio.h> int main(void){int i=1, sum=0, x;
printf("整数値を入力してください:"); scanf("%d",&x); while( i <= x ){ sum+=i; i++; } printf("0から%dまでの合計は%dです。¥n", x, sum ); return 0; } do{ sum+=i; i++; }while( i<=x ); while文の場合 start loop1 i 1 なし sum 0 なし x -1 なし do文の場合
start loop1 loop2
i 1 2 なし
sum 0 1 なし
x -1 -1 なし
©Jun Usuki 2006
22
for, do, while文の確認練習
(c-2)
while文を使って、
2のn乗を求めるプログラム。
©Jun Usuki 2006
23
for, do, while文の確認練習
(c-2)
while文を使って、2のn乗を求めるプログラム。
#include <stdio.h> int main(void){ int i=0, n, x=1; printf("2の何乗を求めますか?:"); scanf("%d",&n); while(i<n){ x*=2; i++; } printf("2のn乗は%dです¥n", x); return 0; } ©Jun Usuki 2006 24for文による2重ループの練習
(問)
九九を以下のようにすべて表示する。
例:
1
2
3
4
5
6
7
8
9
2
4
6
8
10
12
14
16
18
3
6
9
12
15
18
21
24
27
…
…
9
18
27
36
45
54
63
72
81
©Jun Usuki 200625
for文による2重ループの練習
(問)
九九をすべて表示する。
#include <stdio.h> int main(void){ int y, x, ans; for(y=1; y<10; y++){for(x=1; x<10; x++){ ans =y*x; printf("%3d", ans ); } printf("¥n"); } return 0; } ©Jun Usuki 2006 26
1次元配列の確認練習
以下の気温をtemp[7]変数に入力し・・・ (a)28度以上の気温をすべて表示する(while文)。 (b)7日間の平均気温を求める(for文) 。 (c)気温の最小値を求める。 ※ 変数の型は適当と思われるものを考えること。日
月
火
水
木
金
土
132℃
230℃
328℃
421℃
523℃
626℃
725℃
右上の数値:日付 ©Jun Usuki 2006 271次元配列の確認練習
以下の気温を
temp[7]変数に入力し・・・
(a)
28度以上の気温をすべて表示する(while文)
#include <stdio.h> int main(void){ int i, temp[7]; for( i=0; i<7; i++){printf("%d日の気温:",i+1);scanf("%d",&temp[i]); }
i=0; printf("28℃以上の気温:"); while(i<7){
if(temp[i]>=28) printf(" %d",temp[i]);
i++; } printf("¥n"); return 0; } ©Jun Usuki 2006 28
1次元配列の確認練習
以下の気温を
temp[7]変数に入力し・・・
(b)
7日間の平均気温を求める(for文)
#include <stdio.h> int main(void){int i, temp[7], sum=0; for( i=0; i<7; i++ ){
printf("%d日の気温:", i+1); scanf("%d", &temp[i]); }
for( i=0; i<7; i++ ){
sum+=temp[i]; // ここは sum=sum+temp[i]; でも良い }
printf("平均気温は%f℃です。¥n",(double)sum/7 ); return 0; } ©Jun Usuki 2006 29
1次元配列の確認練習
以下の気温を
temp[7]変数に入力し・・・
(c)
気温の最小値を求める
#include <stdio.h> int main(void){int i, temp[7], min=99; //99でなくとも良い for( i=0; i<7; i++ ){
printf("%d日の気温:", i+1); scanf("%d", &temp[i]); }
for(i=0; i<7; i++){
if(min > temp[i]) min=temp[i];
} printf("最も低い気温は%d℃です。¥n",min); return 0; } ©Jun Usuki 2006 30
2次元配列の確認練習
以下のカレンダーについて、 最初の7日の気温を 変数temp[2][7]の宣言時に初期設定し、 のこりの7日の気温を 手入力する。 その後、曜日毎の平均気温を変数week[7]に格納・表示せよ。 ※ 変数の型は適当と思われるものを考えること。日
月
火
水
木
金
土
132℃
230℃
328℃
421℃
523℃
626℃
725℃
827℃
926℃
1026℃
1125℃
1230℃
1329℃
1431℃
右上の数値:日付 ©Jun Usuki 200631
2次元配列の確認練習
最初の7日の気温を変数temp[2][7]に初期設定し、のこり7日を 手入力する。曜日毎の平均気温を変数week[7]に格納・表示。 #include <stdio.h> int main(void){ int i, temp[2][7]={32,30,28,21,23,26,25}; double week[7];for( i=0; i<7; i++ ){
printf("%d日の気温:", i+8); scanf("%d", &temp[1][i]); }
printf("平均気温は:"); for(i=0; i<7; i++){
week[i] =(double)( temp[0][i] + temp[1][i] ) / 2; printf(" %4.1f℃", week[i] ); } printf("¥n"); return 0; } ©Jun Usuki 2006 32
関数の練習
1
(引数なし、戻り値なし)(問)
func1()関数
を作成し、次の
main関数内を
func1()関数の呼び出しとreturn 0; のみにせよ。
#include <stdio.h>
int main( void ){
int i;
for( i=1; i<10; i++ ){
printf("%3d", i );
}
printf("¥n");
return 0;
}
int main( void ){
func1( );
return 0;
}
©Jun Usuki 2006 33関数の練習
1
(引数なし、戻り値なし)(問)
func1()関数
を作成し、次の
main関数内を
func1()関数の呼び出しとreturn 0; のみにせよ。
#include <stdio.h>
void func1( void );
int main(void){
func1( );
return 0;
}
void func1( void ){
int i;
for( i=1; i<10; i++ ){
printf("%3d", i );
}
printf("¥n");
}
©Jun Usuki 2006 34関数の練習
2
(引数あり、戻り値なし)(問)
次の
赤文字部分
を
func2()関数として作成せよ。
#include <stdio.h>
int main( void ){
int i
, j;
printf(“1-9の整数を入力してください:”);
scanf(“%d”, &j);
for( i=1; i<10; i++ ){
printf("%3d", j*i );
}
printf("¥n");
return 0;
}
©Jun Usuki 2006 C言語1 の範囲外 35関数の練習
2
(引数あり、戻り値なし)(問)
次の
赤文字部分
を
func2()関数として作成せよ。
#include <stdio.h>
void func2( int k );
int main( void ){
int j;
printf(“1-9の・・・:”);
scanf(“%d”, &j);
func2( j );
return 0;
}
void func2( int k ) {
int i;
for( i=1; i<10; i++ ){
printf("%3d", k*i );
}
printf("¥n");
}
©Jun Usuki 2006 C言語1 の範囲外 36関数の練習
3
(引数あり、戻り値あり)(問)
次の
赤文字部分
を
func3()関数として作成せよ。
#include <stdio.h>
int main(void){
int i
, j,
sum=0
;
printf(“1-9の整数を入力してください:”);
scanf(“%d”, &j);
for( i=1; i<10; i++ ){
printf("%3d", j*i ); sum+=j*i;
}
printf("¥n");
printf(“sum=%d¥n”,sum);
return 0;
}
©Jun Usuki 2006 C言語1 の範囲外37
関数の練習
3
(引数あり、戻り値あり)(問)
次の
赤文字部分
を
func3()関数として作成せよ。
#include <stdio.h>
int func3( int k );
int main( void ){
int j,
sum2
;
printf(“1-9の・・・:”);
scanf(“%d”, &j);
sum2 = func3( j );
printf(“
sum2
=%d¥n”,
sum2
);
return 0;
}
int func3( int k ){
int i, sum = 0;
for( i=1; i<10; i++ ){
printf("%3d", k*i );
sum += k*i ; }
printf("¥n");
return sum;
}
©Jun Usuki 2006 C言語1 の範囲外 38関数の練習
4
(1次元配列の受け渡し、引数戻り値不要)(問)
次の
赤文字部分
を
func4()関数として作成せよ。
#include <stdio.h>
int main(void){
double a[5]={ 1.0, 2.0, 3.0, 4.0, 5.0 };
int i;
for( i=0; i<5; i++ ){ a[i] = a[i]*2; }
for( i=0; i<5; i++){
printf(“a[%d]=%4.1f¥n”, i, a[i]);
}
return 0;
}
©Jun Usuki 2006 C言語1 の範囲外 39関数の練習
4
(1次元配列の受け渡し、引数戻り値不要)(問)
次の
赤文字部分
を
func4()関数として作成せよ。
#include <stdio.h>
void func4( double x[5] );
int main( void ){
double a[5] = { 1.0, 2.0, 3.0, 4.0, 5.0 };
int i;
func4( a );
for( i=0; i<5; i++ ){ printf(“a[%d]=%4.1f¥n”, i, a[i]); }
return 0;
}
void func4( double x[5] ){
int i;
for( i=1; i<5; i++ ){ x[i] = x[i] * 2; }
}
©Jun Usuki 2006 C言語1 の範囲外 40関数の練習
5
(2次元配列の受け渡し、引数戻り値不要)(問)
次の
赤文字部分
を
func5()関数として作成せよ。
#include <stdio.h>
int main( void ){
int
a[2][3] = { {1, 2, 3}, {4, 5, 6} },
y,
x
;
for( y=0; y<2; y++ ){
for( x=0; x<3; x++ ){ a[y][x] = a[y][x] * 2; } }
for( y=0; y<2; y++ ){
for( x=0; x<3; x++ ){ printf(“%3d”, a[y][x]); }
printf(“¥n”);
}
return 0;
}
©Jun Usuki 2006 C言語1 の範囲外 41関数の練習
5
(2次元配列の受け渡し、引数戻り値不要)(問)
次の
赤文字部分
を
func5()関数として作成せよ。
#include <stdio.h> void func5( int b[2][3] ); int main( void ){int a[2][3]={ {1, 2, 3}, {4, 5, 6} }, y, x; func5( a );
for( y=0; y<2; y++ ){
for( x=0; x<3; x++ ){ printf(“%3d”, a[y][x]); } printf(“¥n”); }
return 0;
} void func5( int b[2][3] ){
int y, x;
for( y=0; y<2; y++ ){
for( x=0; x<3; x++ ){ b[y][x] = b[y][x] * 2; } }
}
©Jun Usuki 2006
C言語1