プログラムの制御構造 選択・繰り返し

プログラムの制御構造
配列・繰り返し
前回の復習
• 演算子の表の見方
– ans1= 1 < 2 < 3; ans2= 3 > 2 > 1;
– ans1= (1,2,3); ans2 = 1,2,3;
– ans1=1,ans1=2+ans1;
• 選択
– If文、switch文
– 複文(ブロック)
配列
• 配列=変数名と番号を組み合わせた変数
一次元配列
1
2
data[0]
data[1]
int data[4];
data[0]=1;
data[1]=2;
data[2]=3;
data[3]=4;
data[2]
data[3]
添え字(インデックス)は0から始まる!
一次元配列の初期化
int data[]={1,2,3,4};
この場合は省略可能
多次元配列
2次元入配列
int data[4][2];
data[0][0]=1;
data[0][1]=2;
data[1][0]=3;
data[1][1]=4;
data[2][0]=5;
data[2][1]=6;
data[3][0]=7;
data[3][1]=8;
2次元配列の初期化
int data[][2]={{1,2},{3,4},{5,6},{7,8}};
3次元配列
Int data[3][4][2];
data[0][0] data[0][1]
1
2
3
4
6
6
7
8
data[3][0] data[3][1]
プログラムの制御構造
• 繰り返し
– while文
基本の繰り返し
– for文
繰り返し回数が予め決まっている
– do文
実行部分を必ず1回は実行する
while文
while文
while( 制御式)
文
制御式を評価して、真なら文を実行し
while文の先頭に戻る。そうでなけれ
ばwhile文を終了する。
for文
for文
for( 式1 ; 式2 ; 式3 )
文
式1 ;
while (式2 )
{
{文}
式3 ;
}
式1を実行。式2を制御式として
{{文}式3}を文とするwhile文
を実行する。
do文
do文
do
文
while (制御式 )
文
while(制御式 )
文
文を最低一回は実行し、その後は
while文と同じ。
平均点を求める:while文を使ったもの
if(No_of_data >0) {
Average =(double)Total/no_of_data;
コメント(注釈)
printf("Average = %f\n", Average);
}
int main(void)
オブジェクト形式マクロ(マクロ命令)
else {
{
printf("No data !\n");
int Data[N], Count, Total, No_of_data;
}
double Average;
}
#include <stdio.h>
#define N 100 /* 最大答案数 */
こ
こ
を
書
き
換
え
る
Count = 0;
Total = 0;
while(scanf("%d",&Data[Count])!=EOF) {
Total += Data[Count++];
}
No_of_data = Count;
平均点を求める: for文を使ったもの
#include <stdio.h>
#define N 100
int main(void)
{
int Data[N], Count, Total, No_of_data;
double Average;
scanf(“%d”,&No_of_data);
for(count=0,Total=0;count<No_of_data,
count++) {
scanf(“%d”,&Data[Count]);
Total+=Data[Count];
}
if(No_of_data >0) {
Average = (double)Total/No_of_data;
printf("Average = %f\n", Average);
}
else {
printf("No data !\n");
}
}
平均点を求める: do文を使ったもの
#include <stdio.h>
#define N 100
int main(void)
{
int Data[N], Count, Total, No_of_data;
double Average;
scanf(“%d”,&No_of_data);
count=0;
Total=0;
do {
scanf(“%d”,&Data[Count]);
Total+=Data[Count++];
} while (count<No_of_count)
if(No_of_data >0) {
Average = (double)Total/No_of_data;
printf("Average = %f\n", Average);
}
else {
printf("No data !\n");
}
}
繰り返しの制御を途中で変える
•break
breakを含む文の直後に制御を移す
•continue
continueを含む文の最後に空文を仮定し
てそこに制御を移す
•goto
gotoで示されたラベルの付いた文に制御
を移す
break,continue,gotoの流れ
{
{
break;
}
{
continue;
}
break
goto L1;
}
continue
L1: 文
or ;/* 空分*/
goto
0点が入力されるまでの平均を求める
#include <stdio.h>
If(Count >0) {
Average =(double)Total/Count;
printf("Average = %f\n", Average);
#define N 100
int main(void)
{
}
else {
printf("No data !\n");
}
int Data[N], Count, Total, No_of_data;
double Average;
scanf("%d", &No_of_data);
for(Count=0,Total=0;Count<No_of_data;
Count++){
scanf("%d",&Data[Count]);
if(Data[Count]==0)
break;
Total+=Data[Count];
}
}
60点以上の人の平均点
#include <stdio.h>
#define N 100
int main(void)
{
int Data[N], Count, Total, No_of_data;
double Average;
int Subcount;
scanf("%d", &No_of_data);
for(Count=0,Total=0,Subcount=0;Count<No_of_data;
Count++){
scanf("%d",&Data[Count]);
if(Data[Count] < 60)
coutinue;
Total+=Data[Count];
Subcount++;
}
if(Subcount >0) {
Average =(double)Total/Subcount;
printf("Average = %f\n", Average);
}
else {
printf("No data !\n");
}
}
異常な値が入力されたら終了
if(No_of_data >0) {
Average = (double)Total/No_of_data;
printf("Average = %f\n", Average);
}
else {
printf("No data !\n");
}
#include <stdio.h>
#define N 100
int main(void)
{
int Data[N], Count, Total, No_of_data;
double Average;
return(0);
scanf(“%d”,&No_of_data);
for(count=0,Total=0;count<No_of_data,
count++) {
scanf(“%d”,&Data[count]);
if(Data[Count]<0 || Data[Count]>100)
goto Err;
Total+=Data[count];
}
Err: printf(“Invarid data is input !\n”);
}