前回の練習問題の解答例
#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 (初期化式; 条件; 増減式) {
処理;
}
初期化式と増減式は代入文、条件は論理式で書く。
処理の順番:
- 初期化式(初回だけ実行される)
- 条件による判定
- 括弧{ }内の処理の実行
- 増減式
---ここまでが1回目---
- 条件による判定
- 括弧{ }内の処理の実行
- 増減式
---ここまでが2回目---
・・・
(条件が満たされる限り繰り返す)
・・・
--------n回目--------
- 条件が満たされなかったら括弧{ }に進まず終了
同じ処理の繰り返し
「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辺の長さが測定されているものとする。
- 三角形の個数を繰り返し回数にする
- 三角形の個数と辺の長さはキーボードから入力する
- ヘロンの公式で三角形の面積を求め、合計面積を計算する