前回の練習問題の解答例

#include <stdio.h>

int main(void)
{
	int year;
	
	printf("西暦:");
	scanf("%d",&year);
	
	if (year%4==0 && year%100!=0 || year%400==0) {
		printf("閏年\n");
	} else {
		printf("平年\n");
	}
	return 0;
}
scanf関数で整数型変数yearに西暦を代入している。 if文と else文を組み合わせて、「閏年」と表示するprintf関数か「平年」と表示するprintf関数のどちらかを実行する。 if文の丸括弧( )内には閏年の条件を論理式で書く。 西暦が「4で割り切れる」かつ「100で割り切れない」ならば閏年だが、「400で割り切れる」ならば他の条件がどうであろうと必ず閏年である。 合わせると、
西暦が「4で割り切れる」かつ「100で割り切れない」、または「400で割り切れる」
となる。これは整数の剰余を使って表すことができて、
year%4==0 && year%100!=0 || year%400==0
となる。論理積が論理和より優先されることを考えても、丸括弧を付ける必要はなくて、このままでよい。

繰り返し処理

繰り返し処理とは、同じ文を何度も繰り返し実行する処理のことである。ループとも言う。 C言語ではfor文、while文、do〜while文で繰り返し処理を制御するが、この授業ではdo〜while文は扱わない。
今回はfor文の使い方を学ぶ。

for文の書き方


書き方:
	for (初期化式; 条件; 増減式) {
		処理;
	}

初期化式と増減式は代入文、条件は論理式で書く。


処理の順番:

同じ処理の繰り返し

「hello, world」と10回表示するプログラム:
#include <stdio.h>

int main(void)
{
	int counter;
		
	for (counter=1; counter<=10; counter++) {
		printf("hello, world\n");
	}
	return 0;
}
このプログラムでは、繰り返し回数を数えるために整数型変数counterを使っている。 繰り返し回数を数えるための変数をループカウンターという。

ループカウンターを処理に利用する

n回目のループで「n回目」と表示するプログラム:
#include <stdio.h>

int main(void)
{
	int counter;
		
	for (counter=1; counter<=10; counter++) {
		printf("%d回目\n",counter);
	}
	return 0;
}


繰り返し処理を利用して合計を計算する

キーボードから入力された10個の数値を合計するプログラム:
#include <stdio.h>

int main(void)
{
	int counter;
	int num, sum;
		
	sum=0;
	for (counter=1; counter<=10; counter++) {
		printf("%d個目の数値:",counter);
		scanf("%d",&num);
		sum=sum+num;
	}
	printf("合計は%dです。\n",sum);
	return 0;
}
「sum=sum+num」は、右辺で1つ前までの数値の合計「sum」を参照し、それに今回の数値「num」を加えることで、今回までの数値の合計を求めており、それを左辺の変数sumに代入している。 しかし、ループ1回目の右辺のsumにはまだ何の数値も代入されておらず、このままでは代入文より前に変数sumを参照してしまう。 そこで、for文の前に「sum=0」という代入文が必要となる。

繰り返し回数をキーボードから入力する

キーボードから数値を入力し、1からその数値までの和を求めるプログラム:
#include <stdio.h>

int main(void)
{
	int counter;
	int iter, sum;
		
	printf("整数:");
	scanf("%d",&iter);
		
	sum=0;
	for (counter=1; counter<=iter; counter++) {
		sum=sum+counter;
	}
	printf("1から%dまでの合計は%dです。\n",iter,sum);
	return 0;
}


複雑な条件で繰り返す

数列「-2 1 4 7 10 13 16 19 22 25」を表示するプログラム:
#include <stdio.h>

int main(void)
{
	int counter;
		
	for (counter=-2; counter<=25; counter=counter+3) {
		printf("%d ",counter);
	}
	printf("\n");
	return 0;
}


繰り返し処理と条件分岐を組み合わせる

1〜300の整数のうち、2でも3でも7でも割り切れる数値だけを表示するプログラム:
#include <stdio.h>

int main(void)
{
	int counter;
		
	printf("1〜300の整数のうち、2でも3でも7でも割り切れるのは、");
	for (counter=1; counter<=300; counter++) {
		if (counter%2==0 && counter%3==0 && counter%7==0) {
			printf("%d ",counter);
		}
	}
	printf("です。\n");
	return 0;
}


練習問題

n個の三角形の面積の合計を求めるプログラムを作りなさい。すべての三角形の3辺の長さが測定されているものとする。