C言語のプログラミング (4)

コンピュータ基礎実験 第9回
コンピュータープログラミング
(C言語)(6)
1.条件分岐2(switch文、復習)
2.繰り返し処理(while文、for文)
条件分岐2(復習、switch、case文)
多重分岐(3重以上)には、switch、case文を使
います
多重分岐は、2重分岐の多段化でも可能ですが、
見づらく、switch、case文のほうが見やすくなる
場合があります。
どちらを使っても結果は同じです。見やすい(慣
れている)方を使ってください。
switch、case文
switch 文
switch (式){
case 定数1: 文1;
break;
case 定数2: 文2;
break;
…………..
default: 文;
}
式の値が
定数1と等しければ 文1を実行
定数2と等しければ 文2を実行
…….
それ以外なら 文 を実行
(注) 1.case 1 など のあとにコロン(:)が必要.
2.breakに出会うとswitch{}から抜ける.breakがないとそれ以下の文を実行する.
3.どれとも一致しなければdefault (省略することも可能)
3
前回発展課題8-6:
知りたい年月日がその年の元日(これを第1日目とする)から数えて
何日目で,大晦日まで何日残っているかを計算するプログラムを作
成せよ.ただし,考えている年がうるう年であるか,そうでないかに
より計算を区別するものとする..( ex8-6.c )
4
前回発展課題8-6その1:ex8-6-1.c
#include <stdio.h>
switch(month){
case 1: days=day; rest=m12-days;
break;
case 2: days=m1+day; rest=m12-days;
break;
case 3: days=m2+day; rest=m12-days;
break;
case 4: days=m3+day; rest=m12-days;
break;
case 5: days=m4+day; rest=m12-days;
break;
case 6: days=m5+day; rest=m12-days;
break;
case 7: days=m6+day; rest=m12-days;
break;
case 8: days=m7+day; rest=m12-days;
break;
case 9: days=m8+day; rest=m12-days;
break;
case 10: days=m9+day; rest=m12-days;
break;
case 11: days=m10+day; rest=m12-days;
break;
case 12: days=m11+day; rest=m12-days;
break;
}
printf("%d日目です。あと%d日残っています。\n",days,rest);
return 0;
int is_leap_year(int year);
int main(void)
{
int year, month, day;
int days, rest;
int ly;
int m1=31, m2=59, m3=90, m4=120, m5=151,
m6=181;
int m7=212, m8=243, m9=273, m10=304,
m11=334, m12=365;
printf("西暦 月 日を入力: ");
scanf("%d %d %d", &year, &month, &day);
ly=is_leap_year(year);
m2+=ly; m3+=ly; m4+=ly; m5+=ly;
m6+=ly; m7+=ly; m8+=ly; m9+=ly;
m10+=ly; m11+=ly; m12+=ly;
}
「m2+=ly;」⇔「m2=m2+ly;」
5
前回発展課題8-6その2:ex8-6-2.c
#include <stdio.h>
int is_leap_year(int year)
{
/* うるう年なら1、そうでなければ0を返す */
int m1,m2,m3;
m1=year%400; /* 0なら400で割りきれる */
m2=year%4; /* 0なら4で割りきれる */
m3=year%100; /* 0なら100で割りきれる */
if(m1==0 || (m2==0 && m3!=0)){
printf(“うるう年です\n");
return 1;
}
else{
printf("うるう年ではありません\n");
return 0;
}
}
6
繰り返し処理
コンピュータでは、少しずつ条件を変えながら同
じ処理を繰り返す状況がよくでてきます。
前回「電卓プログラム2」でも、別の計算を続け
てやりたいとき、いちいちプログラムを起動する
のは面倒です。
C言語では、繰り返し処理を行うために「for文」、
「while文」が用意されています。
「繰り返し」は「ループ」とも呼ばれます
繰り返し1:「for」
ある初期値を与え、それがある条件を満たして
いる間、同じ処理を繰り返すには、「for文」を用
います。
for (初期値の式; 条件式; ループの終わりに実行する式){
文
}
変数に初期値を与え、条件を満たしている場合には「文」を実行する。
「文」を実行した後、「ループの終わりに実行する式」を実行し、条件を
満たしているか→「文」の実行を繰り返す。
例題1:ex9-1.c
■ for文〜ある操作を,指定した回数だけ繰り返すコマンド
例題9-1:
[実行例]
つぎのプログラムを実行せよ.
/* ex. 9-1 */
#include <stdio.h>
int main (void)
{
int i;
for(i=1; i<=10; i++){
printf(" A B C \n");
}
return 0;
変数iの値を1増やして
i=1からi=10まで実行
「i++;」⇔「i=i+1;」(インクリメント)
表示したい文字列
}
基本構造
for(式1; 式2; 式3)
繰り返す文
式1は,繰り返し操作の初期値
式2は,条件式で,これを満たせば
繰り返しの操作を実行する
式3は繰り返しの回数を制御
例題2:ex9-2.c
「for文」の入れ子
課題6-1: つぎのプログラムを実行し,結果を比較せよ.
/* ex. 9-2 */
#include <stdio.h>
int main (void)
{
int i,j;
/* ex. 9-2a */
#include <stdio.h>
int main (void)
{
int i,j;
for(i=1;i<=10;i++){
for(j=1; j<=10;j++){
printf(”AB ");
}
printf(" \n");
}
return 0;
}
for(i=1;i<=10;i++){
for(j=1; j<=i; j++){
printf("AB ");
}
printf(" \n");
}
return 0;
}
■ for文の基本構造
for(式1; 式2; 式3){
繰り返す文1;
繰り返す文2;
………… ;
}
式1は,繰り返し操作の初期値
式2は,条件式で,これを満たせば
繰り返しの操作を実行する
式3は繰り返しの回数を制御
例題9-3:
整数 nを入力し,1からnまでの
和を計算するプログラムの例.
 ex9-3.c
n
S º åk
/* ex.9-3 */
n
#include <stdio.h>
k=1
int main (void)
{
int i,n,wa;
printf("1からnまでの和?--> nを入力し
て下さい.\n");
scanf("%d",&n);
wa=0;
for(i=1; i<=n; i++){
wa=wa+i;
}
printf(" 和は %d です. \n", wa);
return 0;
}
11
配列
「繰り返し処理」とともに用いると、非常に便利な
機能が「配列」という機能です。
「配列」は、ベクトルや行列の成分のように、複
数の数字の組み合わせを「添え字」を用いて表
す「変数」(数字を記録する箱)のセットです。
a[0]、a[1]、a[2]…のようにカギ括弧を使う。添え字は0から
b[0][0]、b[0][1]…: 添え字が2変数
C[0][0][0]、c[0][0][1]…:添え字が3変数
例題9-4「for文」と配列:ex9-4.c
前回課題「何日めかプログラム」の改訂版(ex8-6-1.c ex8-6-2.c)
#include <stdio.h>
int is_leap_year(int year);
int main(void)
{
要素数13
int year, month, day;
m[12]
int days, rest;
m[0]
int ly, i;
int m[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};
#include <stdio.h>
int is_leap_year(int year)
{
/* うるう年なら1、そうでなければ0を返す */
int m1,m2,m3;
m1=year%400; /* 0なら400で割りきれる */
m2=year%4; /* 0なら4で割りきれる */
m3=year%100; /* 0なら100で割りきれる */
if(m1==0 || (m2==0 && m3!=0)){
printf(“うるう年です\n");
return 1;
}
else{
printf("うるう年ではありません\n");
return 0;
}
printf("西暦 月 日を入力: ");
scanf("%d %d %d", &year, &month, &day);
ly=is_leap_year(year);
繰り返し
for(i=2; i<=12; i++){
「for文」
m[i]+=ly;
}
days=m[month-1]+day; rest=m[12]-days;
printf("%d日目です。あと%d日残っています\n",days,rest);
return 0;
}
短くなった!
}
13
2
課題9-5: n項目までの奇数の和1+3+5+7…はn に等しい。 n項目ま
での奇数の和を計算するプログラムを「for文」を用いて作成し、
n=1, 10, 50, 100の場合についてこのことを確認せよ。
( ex9-5.c)
課題9-6:自然対数の底e(=2.71828…)は次の無限級数で与えられる。

1 1 1 1
1
1
e   



1 1 2 1 3  2 1 4  3  2 1
i 0 i!
上の無限級数の初めのn項目までを計算するプログラムを作成せよ。
このとき、小数点以下10桁(”%.10f”)で出力せよ。
(→ ex9-6.c)
WEB上でeの値を調べ、n=1, 5, 10, 20について自分のプログラムで
計算し、収束する様子を確認せよ。(double変数を使用せよ)
注)「0!=」1です。
14
繰り返し2:「while」
特に初期を与えずに、ある与えられた条件を満
たしている間、同じ処理を繰り返すには、「while
文」を用います。
「while文」は第一回目の処理を「必ず行うか」ま
たは「行わない場合もある」かで、「while文」と
「do ~ while文」の2種があります。
■ while 文
while (式){
文
}
式が
「真」であるあいだ,文 を繰り返し実行する.
(文を実行する前に式を評価するので
初めに式が「偽」であれば1回も実行されない)
■ do 〜 while 文
do{
文
} while (式);
式が
「真」であるあいだ,文 を繰り返し実行する.
(文を実行した後で式を評価するので
初めに式が「偽」でも必ず1回は
実行される)お尻の「;」を忘れるな!
16
例題9-7: 電卓プログラム1(ex8-2.c)の改造(while文)
2実数a, bを入力し、その後、1-4の整数を入力し、1なら和、2なら
差、3なら積、4なら商を表示し、その後1を入力すればもう一度、そ
れ以外では終了するするプログラムを作れ( ex9-7.c )
#include <stdio.h>
int main(void)
{
float a,b;
int c, d=1;
while(d==1){
printf("2つの実数a, bを入力してくださ
い: ");
scanf("%f %f",&a,&b);
printf(" a=%f, b=%f\n",a,b);
printf("計算を入力(1:和、2:差、3:積、4:
商): ");
scanf("%d",&c);
switch(c){
case 1: printf("%f+%f=%f\n",a,b,a+b);
break;
case 2: printf("%f-%f=%f\n",a,b,a-b);
break;
case 3: printf("%f*%f=%f\n",a,b,a*b);
break;
case 4: printf("%f/%f=%f\n",a,b,a/b);
break;
default: printf("入力が間違っています
\n");
}
printf(”もう一度->1、終了->1以外: ”);
scanf(”%d”, &d);
}
return 0;
}
17
例題9-8: 電卓プログラム2(ex8-3.c)の改造(do~while文)
「12.3 + 45.6」の様に数学の表記を入力すると、表記に応じて和、
差、積、商を何度でも計算するプログラムを作れ。数字と演算子の
間はスペースで区切るとし、演算子としては「+」「-」「*」「/」の4つが
あり、演算子の部分に「s」が入力されると計算せずに終了するとす
る。( ex9-8.c )
#include <stdio.h>
switch(c){
case '+': printf("%f\n",a+b);
break;
case '-': printf("%f\n",a-b);
break;
case '*': printf("%f\n",a*b);
break;
case '/': printf("%f\n",a/b);
break;
case 's':
break;
default: printf("入力が間違っています\n");
}
}while(c != 's');
return 0;
int main(void)
{
float a,b;
char c;
do{
printf("計算式を入力(例 123.5 + 43.21): ");
scanf("%f %c %f",&a,&c,&b);
}
18
■ 「for文」 と 「while文」 の関係
初期
条件判断
for (式1; 式2; 式3){
文
}
再初期化
式1;
while (式2){
文
式3;
}
19
課題9-9:
整数 nを入力し,n項目までの奇数の和を計算するプログラム(ex95.cではforを使って書いた)を,whileを使って書き直せ.
( ex9-9.c )
発展課題9-10:
キーボードから入力された、複数の正の実数について最大値と最小
値を求めるプログラムを作成せよ. ただし,データに0が入った
ら入力を終了するものとする.
( ex9-10.c )
20
実習結果のレポート
• 3つのソースファイル「ex9-5.c」、「ex9-6.c」、
「ex9-9.c」を添付ファイルにしてメールを送って
ください。
• 宛先: [email protected]
• 件名:コンピューター基礎実験9
• 本文:感想および一言
21