このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。
プログラム例 4 を改造して次を表示するプログラムを作りなさい。
プログラム例 4
#include <stdio.h>
main(){
int i,j;
for(i=0;i<10;i++){
for(j=0;j<10;j++){
printf("○");
}
printf("\n");
}
}
○○○○○ ○○○○ ○○○ ○○ ○
プログラム例4 では一番内側の j の for 文は○を書くだけで、その後、改行 を出力します。 つまり、j の for 文で一行の印刷される内容を決めています。 そして、i の for 文で複数の行を印刷しています。 一行目は i=0, 二行目は i=1 と順に i の値が増えます。
演習では 5 行印刷しますので、 i の値は 0 から 4 まで増えることになりま す。 そして、i=0 の時は 5 個の○を印刷します。 i=1 の時は 4 個、i=2 の時は 3 個、i=3 の 時は 2 個、i=4 の時は 1 個印刷します。 つまり、 j の for 文での最終の値は i が増えるにつれ 5,4,3,2,1 と減る必 要があります。ここから最終の値と i を足すと 5 になるということがわかり ます。よって最終の値は 5-i と表せます。 従って、下記のプログラムにより目的の図形が表示できることになります。
#include <stdio.h>
main(){
int i,j;
for(i=0;i<5;i++){
for(j=0;j<5-i;j++){
printf("○");
}
printf("\n");
}
}
○ ○○○ ○○○○○ ○○○○○○○
この図形の場合、注意しなければならないのは、○を書く前に空白を書く必要 があるということです。 従って、○を書く for 文の前に空白を書く for 文を追加します。 追加したものは次の通りです。
以下は単純に空白を書いてから○を書くようにコピーしただけのもの。このま までは動きません。
#include <stdio.h>
main(){
int i,j;
for(i=0;i<5;i++){
for(j=0;j<5-i;j++){
printf(" ");
}
for(j=0;j<5-i;j++){
printf("○");
}
printf("\n");
}
}
さて、ここで、各行でいくつ空白と○を書く必要があるかをまとめます。
表にすると次のようになります。
i の値 | 空白の数 | ○の数 | |
---|---|---|---|
一行目 | 0 | 3 | 1 |
二行目 | 1 | 2 | 3 |
三行目 | 2 | 1 | 5 |
四行目 | 3 | 0 | 7 |
完成版
#include <stdio.h>
main(){
int i,j;
for(i=0;i<4;i++){
for(j=0;j<3-i;j++){
printf(" ");
}
for(j=0;j<2*i+1;j++){
printf("○");
}
printf("\n");
}
}
○○○○○ ○ ○ ○ ○ ○ ○ ○○○○○一行目と最後の行(i=0, 4)は、他の行と異なります。 一行目と最後の行は ○○○○○ を、 他の行は ○ ○ を出力します。 単純に考えれば、次のようにすれば上の図形を印刷できます。
#include <stdio.h>
main(){
int i,j;
for(i=0;i<4;i++){
if((i==0)||(i==4)){
printf("○○○○○\n");
}else{
printf("○ ○\n");
}
}
枠のサイズをあらかじめ #define size 5
などと与えて printf
文の中は一文字しか書かないようにもできますが、複雑になりますので、ここ
では省略します。
i=i+1
のような構文は、変数を一つ増やします。
特定の条件の時、この構文を実行することにより、その条件が何回起きたが数
えることができます。
例えば次のプログラムでは、配列変数中の偶数の数を数えることができます。
#include <stdio.h>
#define N 5;
main(){
int a[N]={5, 2, 6, 3, 1};
int i,k;
k=0
for(i=0;i<N;i++){
printf("%d ",a[i]);
if((a[i]%2)==0){
k++;
}
}
printf("の中に偶数は %d 個\n",k);
}
データの列の最後に、データの終りを示す特別な値を入れることを考えます。 すると、プログラムはデータの数を知らなくてもデータの終りがわかります。 その結果、あらかじめデータの数がわからなくてもデータを全て読むことがで きます。 このようなデータの終りを示す特別な値を「番兵」と呼びます。 ここでは番兵を使った処理を学びます。
配列変数 a[] で最後に番兵がある場合、プログラムは次のようになります。
#include <stdio.h>
main(){
int a[]={xx,xx,xx,番兵};
int i,j;
for(i=0;a[i]!=番兵;i++){
a[i] に関する処理
}
}
これを利用して、番兵を -1 、正の値を持つ配列変数の値を全て出力するプロ グラムは次のように書きます。
#include <stdio.h>
main(){
int a[]={5, 2, 6, 3, 1, -1};
int i;
for(i=0;a[i]!=-1;i++){
printf("%d\n",a[i]);
}
}
以下の問題を解決するプログラムを書きなさい。 但し、与える変数は次の 2 つとし、プログラムはその行以外の変更なしに動 くようにしなさい。
int a[]={5, 2, 6, 3, 1, -1};
int a[]={10, 1, 3, 6, 4, 9, -1};