プログラミング演習2004

第7回目 [6月1日、H.16(‘04)]
繰り返し構造(for文)と
増(減)・複合代入演算子
本日のメニュー
1)前回の課題について
2)前回の宿題について
3)for文 と 増減・複合代入演算子
4)課題
PE04-07.ppt
前回の課題 ファイル名は en6-****.c
教科書の各演習を順に処理するプログラムを
作成せよ。
(1)演習3-9、演習3-10(53頁)、
演習3-11、演習3-12(57頁)
(2)List4-2、4-3(62,63頁)を理解してか
ら演習4-1、演習4-2(65頁)、List4-7
(68頁)を理解してから演習4-6(96頁)
提出はいつもと同様、リスト印刷とファイル転送
ファイル名の **** は学籍番号の二桁目と下3桁
例:学生番号 034987 ならば xxx-3987.c
int a, b, c;
puts("024222 朝日太郎");
puts("三つの整数を入力してください");
printf("整数A:"); scanf("%d", &a);
printf("整数B:"); scanf("%d", &b);
printf("整数C:"); scanf("%d", &c);
if ( a==b && b==c )
puts("三つの値は等しいです。");
else
if ( a==b || b==c || c==a )
puts("二つの値が等しいです。");
else
puts("三つの値は異なります。");
課題:演習3-9について
・3つの値が等しいかどうかをチェックする場合
(いずれの場合もコンパイルエラーにはならない)
→ if( a == b == c ) とは書けない
if ( a==b && b==c ) と書く必要がある
→ if ( a==b && b==c && c==a ) 冗長
→ if ( a = b = c ) とは書けない
式 b=c の値
a,b,cが共に 3 の時
を a に代入
a == b == c の評価
a = b = c の評価
1(true) == c p.177
= は右結合 c の値をb に代入
0(false) == は左結合 式の値にもなる
課題:演習3-10について
◎2数 a, b の差が 11 以上か 10 以下かを判定
・ a-b が –11 以下 または 11以上
if(( a-b <= -11 ) || ( a-b >= 11 ))
・ a-b が –10 以上 かつ 10以下
if(( a-b >= -10 ) && ( a-b <= 10 ))
・ if ( a > b ) d = a-b;
delse
= (a>b) ? a-b:
b-a;
d = b-a;
-11
11
if ( d >= 11 ) ・・・
-10 0 10
・ d = a – b;
if ( d < 0 ) d = -d; 課題では、
if ( d >= 11 ) ・・・
論理ORを使うこと
課題:演習3-11について
if ( no % 2 )
puts("その数は奇数です。");
else
puts("その数は偶数です。");
no % 2 の値が
1 つまり true
0 なら false
switch ( no % 2 ) {
case 0 : puts("その数は偶数です。"); break;
case 1 : puts("その数は奇数です。"); break;
}
no % 2 の値が
0 の時 case 0 に移り、
1 の時 case 1 に移る。
課題:演習3-12について
if ( month >= 3 && month <= 5 )
puts("春です。");
・・・・・・
else if ( month == 1 || month ==2
|| month == 12 )
puts("冬です。");
else
puts("そんな月はありませんよ!!\a");
case の後ろには
必ず空白
switch ( month ) {
case 3: case 4: case 5 :
puts("春です。"); break;
・・・・・
case 1: case 2: case 12 :
puts("冬です。"); break;
default: puts("そんな月はありませんよ!!\a");}
課題:演習4-1について
do {
printf("非負整数を入力:");
scanf("%d", &num);
if (num < 0) puts("負値を入力しない");
} while ( num < 0 );
printf("%dを逆から読むと", num);
printf("その数を逆から読むと");
do {
printf("%d", num % 10);
num = num / 10;
} while ( num > 0 );
puts("です。");
課題:演習4-2について
do {
printf("非負整数を入力:");
scanf("%d", &num);
if (num < 0) puts("負値を入力しない");
} while ( num < 0 );
printf("%dは", num);
num の値
dig = 0;
は作り替え
do {
られている
num = num / 10;
dig = dig + 1;
} while ( num > 0 );
printf("%d桁です。\n",
dig);
printf("%dは%d桁です。\n",
printf("%d桁です。\n",
dig);
num, dig);
課題:演習4-6について
printf("整数を入力:");
scanf("%d", &no);
if ( no > 0 ) {
while ( no >= 0 ) {
printf("%d", no); no = no – 1;
no--;
putchar(
)は
}
文字定数(一文字)
putchar('\n');
を出力する関数
}
文字定数はシングルクォーテイション
で文字を囲む <=> 文字列 "・・・"
課題:その他
・ case文の書き方
→ case の後ろにスペース(空白)が無い
コンパイルエラーにはなない、しかし、実行結果が
おかしくなる。case の後ろには空白を入れよう!
・題意に沿わないプログラム
→ 論理OR演算子を利用しない(演習3-11)
→ 論理式の間違い(演習3-11)
→ 以上、以下、未満などの使い方
「10以上です」と「10以下です」:10の時?
→ 正の値が入力されても改行されない(演習4-6)
前回の宿題
ファイル名:hw6-****.{c, exe}
正の整数を入力していき、 data ? 30
0(ゼロ) 又は負の整数が data ? 54
入力されるまでに入力さ data ? 16
data ? –1
れた正の整数について、
最大値は 54 です。
次の値を順に出力せよ 最小値は 16 です。
1) 最大値 2) 最小値 個数は 3 個です。
平均値は 33.33 です。
3) 個数
4) 平均値
• 締め切り: 5月29日(土) 午後1時
• リストの提出は、オープン利用室のレポート入れ
• aucopy でのファイル転送フォルダーは、
[森下伊三男]-[プログラミング演習]
int main(void) {
int a, m, max, min, cnt
cnt;= 0 ;
double ave, sum;
sum = 0.0;
max,minに
cnt = 0; sum = 0.0;
初期値を与える
printf("data ?"); scanf("%d",&a);
if ( a > 0 ) { max = a; min = a; }
while (a > 0) {
if ( a < min ) min = a;
else if ( a > max ) max = a;
sum = sum + a;
cnt = cnt + 1;
printf("data ?"); scanf("%d",&a);
}
if (cnt != 0) {
ave = sum/cnt;
printf("最大値は %d です。\n",max);
printf("最小値は %d です。\n",min);
printf("個数は %d 個です。\n",cnt);
printf("平均値は %5.2f です。\n",
ave);
} else {
puts("入力データ数はゼロです。");
puts("最大値,最小値,平均はありません");
}
return(0);
}
宿題について
・一番先に、0又は負の値が入力された場合に対応
していない。 → 実行時エラーとなるものが多い
(ゼロでの割り算)
・最後に入力する0又は負の値も入力個数や合計、
最大値、最小値の対象として計算に加えている。
・入力した値の符号判断を複数の場所で行っている
→ 論理に無駄が有る
・平均を求める式の場所 → 繰り返しの外でよい
・max, min への初期値の与え方、与え忘れ
→ 最小値がいつもゼロ、システムに依存する
・宿題提出者数が少ない
今回の課題
教科書の各演習を順に処理するプログラ
ムを作成せよ。
・演習4-3(65頁)、
・演習4-9、演習4-10(71頁)、
・演習4-13、演習4-14(77頁)
提出はいつもと同様、リスト印刷とファイル転送
ファイル名は en7-****.c
ファイル名の **** は学籍番号の二桁目と下3桁
例:学生番号 034987 ならば xxx-3987.c
今回の宿題 ファイル名は hw7-****.c
◎ n を入力し、n以下のnを入力? 30
30 以下の
次の値を順に出力せよ。
偶数の和は 240 です。
1)偶数の和
3の倍数の和は 165 です。
約数は、
2) 3の倍数の和
1 2 3 5 6 10 15 30
3) 全ての約数の値 約数の個数は 8 個です。
4) 約数の個数と合計約数の和は 72 です。
• 締め切り: 6月5日(土) 午後1時
• リストの提出は、オープン利用室のレポート入れ
• aucopy でのファイル転送フォルダーは、
[森下伊三男]-[プログラミング演習]