2018-05-04 21:40:20 (7 years ago)
リポDで頑張っているけど、本当に辛い。なんかレヴィ=ストロースみたいなやつ出てきた(´;ω;`)
参考文献:高橋麻奈著『やさしいC第5版』
構造体(struct構文)
文字型や数値型などの異なるデータ型の変数を、まとめてひとつの型として定義したもの。
これを使うと、車という構造体に、セダンやカローラのデータを入れたりと、図鑑的なデータベースが作れる。
メンバー
構造体の中に定義した変数はメンバーと呼ばれる。
構造体名 .(ドット) メンバー=そのメンバーに格納したい値 ;
でメンバーのデータを操作することができる。
名前、年齢、性別の3つのメンバーを持つ構造体Person
ただし性別は、男性=M、女性=Fと一文字に置き換える。
#include
struct Person //構造体personと3つのメンバーの宣言
{
char name[100];
int age;
char gender;
};
int main(void)
{
struct Person p1;
printf("名前を入力:");
scanf("%s", p1.name); //文字列では&はいらない!
printf("年齢を入力:");
scanf("%d", &p1.age);
printf("性別を入力:");
scanf("\n%c",&p1.gender); //一文字だけの場合は%c
printf
("{name=%s, age=%d, gender=%c}\n",p1.name,p1.age,p1.gender);
return 0;
}
書名、価格、ページ数の3つのメンバーを持つ構造体Book
聖書のデータを入れているんだけど、聖書って定価は1365円もするんだな・・・だいたい教会の人が「クイアラタメヨ!」ってタダでくれるからな(^_^;)
#include
typedef struct book
{
char title[ 20 ];
int value, pages;
} Book;
int main(void) {
Book book1 = { "Bible", 1365, 687 };
printf( "{title=%s,Value=%d,pages=%d}", book1.title, book1.value, book1.pages );
return 0;
}
3冊の書籍のデータを格納する構造体Book
さらにさっきの構造体のコードを改造して、3冊の本のデータを入力し、構造体の配列に格納できるようにしたもの。
typedef struct Book {
char title[100];
int value;
int pages;
} Book;
#include
int main(void){
Book p1[3];
int i;
for(i=0;i<3;i++){
printf("%d冊目タイトル\n",i+1);
scanf( "%s", p1[i].title );
printf("%d冊目ページ数\n",i+1);
scanf( "%d", &p1[i].pages );
printf("%d冊目価格\n",i+1);
scanf( "%d", &p1[i].value );
}
for(i=0;i<3;i++){
printf("{title=%s,value=%d,pages=%d}\n",
p1[i].title,p1[i].pages,p1[i].value);
}
return 0;
}
typedef構文
構造体の型名を短縮するために用いるキーワード。簡単に説明すると、構造体名にあだ名をつける感じ。
typedef 型名 識別子; の順で記述する。
typedef struct Car{
int num;
double gus;
}Car;
と書くと、struct Carという長い構造体名が、以降はCarだけで済むようになる。
構造体Personをさらにまとめる構造体Couple
構造体のネスト文を作る。
#include
//構造体struct Personをtypedef構文で構造体名をPersonに短縮。
typedef struct Person
{
char name[100];
int age;
char gender;
}Person;
//構造体struct Coupleをtypedef構文で構造体名をCoupleに短縮。さらに構造体personを構造体Coupleの中に取り込み。
typedef struct Couple
{
Person boy;
Person girl;
}Couple;
int main(void)
{
Person Ichiro = {"Ichiro",20,'M'};
Person hanako = {"Hanako",19,'F'};
Couple c1;
c1.boy = Ichiro;
c1.girl = hanako;
printf("Couple:\n");
printf(" boy:{name=%s, age=%d, gender=%c}\n",
c1.boy.name, c1.boy.age, c1.boy.gender);
printf(" girl:{name=%s, age=%d, gender=%c}\n",
c1.girl.name, c1.girl.age, c1.girl.gender);
return 0;
}
sizeof構文
データの大きさ(サイズ)を何バイトか計算する構文。
構造体のサイズは各メンバーのサイズの合計値か、それ以上となる(無駄なメモリの隙間パディングができることが多いため)。
#include
#define NUM 100 //☚マクロのこの数字(配列の要素数)を変えることでサイズも変わっていく。
typedef struct Person {
char name[NUM];
int age;
char gender;
} Person;
int main(void)
{
printf("%d, %d\n",NUM,sizeof(Person)); //Person構造体のサイズを計算したものを表示。
return 0;
}
構造体の配列のソート
任意のメンバー(ここでは年齢)でソートする。
#include
typedef struct Person {
char name[100];
int age;
char gender;
} Person;
int main(void)
{
int i,j;
Person tmp;
Person test[3] = { {"Ichiro",20,'M'},
{"Jiro",21,'M'},
{"Hanako",19,'F'} };
for(i=0; i<2; i++)
{
for(j=i+1; j<3; j++)
{if(test[i].age > test[j].age)
{
tmp = test[i];
test[i] = test[j]; //この3行が君の名は。
test[j] = tmp;
}
}
}
for(i=0; i<3; i++)
{
printf("{name=%s, age=%d, gender=%c}\n",
test[i].name, test[i].age, test[i].gender );
}
return 0;
}
2018-05-04 14:11:03 (7 years ago)
参考文献:高橋麻奈著『やさしいC第5版』
多次元配列
複数の次元のある配列。例えばエクセルのような表は縦と横の二次元に広がる二次元配列。
作り方は、要素数の[ ]をもうひとつ作ればOK。
○×ゲームの模様を描く二次元配列
先生の専門がセルオートマトンだからか、ソースコードでお絵かきをする課題が多い。そして辛い。
これを描く。
+-+-+-+-+
|x| |o| |
+-+-+-+-+
| |o| |x|
+-+-+-+-+
| | |o| |
+-+-+-+-+
|o|x|o|x|
+-+-+-+-+
#include
int main(void)
{
int ar[4][4] = { { -1, 0, 1, 0 },
{ 0, 1, 0, -1 },
{ 0, 0, 1, 0 },
{ 1, -1, 1, -1 }
};
int i,j;
printf("+-+-+-+-+\n");
for(i=0; i < 4; i++){
printf("|");
for(j=0; j < 4; j++){
printf(ar[i][j]==1?"o":ar[i][j]==-1?"x":" ");
//○か×か半角スペースかの場合分け(配列の要素が1のところは「o」、-1のところは「x」、0のところは「半角空白」)。
printf("|");
}
printf("\n+-+-+-+-+\n");
}
return 0;
}
九九を表示する二次元配列
二次元配列a[ ][ ]と、かける数とかけられる数を表す変数nとmを宣言する。
表示例
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 ...以下略
#include
int main(void) {
int n,m,a[9][9];
for(n=0;n<9;n++)
{for(m=0;m<9;m++){a[n][m]=(n+1)*(m+1);}}
for(n=0;n<9;n++)
{for(m=0;m<9;m++)printf("%3d",a[n][m]);
printf("\n");
}
return 0;
}
NULL文字
無効、価値がないという意味。
'\0'というエスケープシーケンスで記述する。
文字列を扱う配列をつくる場合は、要素数は最低でも文字数+1にして、最後の箱に文字列の最後を認識するためのNULL文字を格納しなければならない。
char str[6];
str[0] ='H';
str[1] ='e';
str[2] ='l';
str[3] ='l';
str[4] ='o';
str[5] ='\0'; ☚NULL文字。
文字列を扱う2つの配列を連結するコード
手順は以下の3つ。
①配列str1を、' \0 ' になる前まで 配列str3の先頭から格納する。
②配列str2を、' \0 ' になる前まで 配列str3の続きから格納する。
③配列str3の最後に ' \0 ' を入れる。
#include
int main(void)
{
char str1[15] = "Hello ";
char str2[15] = "World!";
char str3[30];
int i,j;
//手順①
NULL文字になるまで一文字ずつstr3に格納しろという意味。
for(i=0; str1[i]!='\0'; i++)
{str3[i] = str1[i];}
//手順②
NULL文字になるまで一文字ずつstr3の続き(str3[i+j])に格納しろという意味。
for(j=0; str2[j]!='\0'; j++)
{str3[i+j] = str2[j];}
//手順③
str3の最後のi+j番目の箱はNULL文字'\0'が入っているよという意味。
str3[i+j] = '\0';
printf("%s\n",str3);
return 0;
}
文字列の入力
お馴染みのscanfを使うのだが、文字列の場合は変数名(str)の前になぜか&をつけない。
char str[100];
printf("文字列を入力してください。\n");
scanf("%s",str); //&がないのに注意!
printf("入力した文字列は%sです。\n",str)
入力された文字列中の英小文字を英大文字に変換するコード
文字にはそれぞれ文字コードが割り振られており、英語の小文字は文字コードで97から122までで、これらの文字コードから32を引くと対応する大文字の文字コードになるらしい。
#include
int main(void)
{
int i;
char str[256];
printf("文字列を入力してください。\n");
scanf("%s",str);
for(i=0; str[i]!='\0'; i++)
{
if(97<=str[i] && str[i]<=122){printf("%c",str[i]-32);} //文字コード97~122なら32を引いて大文字にする。
else{printf("%c",str[i]);} //文字コード97~122以外ならそのまま。
}
printf("\n");
return 0;
}
文字列の長さを求めて表示するコード
繰り返し文forを使って、文字配列の先頭から1文字ずつ数えていき、NULL文字 '\0' まで行ったら繰り返しを終了するように記述する。
#include
int main(void) {
char str[15] = "Hello";
int i,count=0;
for(i=0;str[i]!='\0';i++){count++;}
printf("文字列の長さは%dです\n",count);
return 0;
}
2018-05-04 10:56:37 (7 years ago)
参考文献:高橋麻奈著『やさしいC第5版』
マクロ
プログラムのコンパイル前に置き換えを行う機能のこと。
配列の要素の数や繰り返し回数が変更された場合、一括で変更することができる。
#define マクロ名 置換する文字列
といったようにプリプロセッサ命令から記述する。
例えば、
#define NUM 5
と、マクロを書くと、そのコードにあるNUMはすべて数字の5に置き換わる。
つまり、コード冒頭にマクロを記述すると、ある文字列を他の文字列に置き換えたくなったとき、コードにある対象の文字列を自分ですべて探し出すこともなく、自動的に置き換えることができる。
特定回数入力された整数の中での最大値を出力するコード
マクロを冒頭に宣言しているので、このNUMの値(入力回数)を好きに変えることができる(課題では入力回数は3に設定)。
マクロのNUMと、入力回数iと、入力された整数の値test[i]がこんがらがってくるけど、ちゃんとコンパイルできるっぽい。
#include
#define NUM 3
int main(void)
{
int i,max=-100000;
int test[NUM];
printf("%d個の整数を入力して下さい。\n",NUM);
for(i=0; i < NUM; i++)
//NUMは配列の要素数として設定されているので、入力回数iはi<=numにしなくてもよい(要素数は0からカウントされるので1少なくずれる!)。
{
printf("整数:");
scanf("%d", &test[i]);
}
for(i=0; i < NUM; i++)
{
if(max < test[i])
max = test[i];
}
printf("%d個の整数の最大値は%dです。\n",NUM,max);
return 0;
}
特定回数入力された整数の中での合計値と平均値を出力するコード
合計値を求める計算式がどうしてもできなかったので、∑的なやつ諦めて、すげえ単純なコードにしてしまった。
#include
#define NUM 3
int main(void)
{
int i,All;
int test[NUM];
printf("%d個の整数を入力して下さい。\n",NUM);
for(i=0; i < NUM; i++)
{
printf("整数:");
scanf("%d", &test[i]);
All = test[0]+test[1]+test[2]; //☚ギブアップした部分。※All=All+test[i];でも行けた。
}
printf("合計:%d\n",All);
printf("平均:%.2lf\n",(double)All/3);
return 0;
}
ソート
複数のデータをある規則に従って順番に並び替えること。
昇順(アセンディングソート)は小さい順もしくは古い順。降順(ディセンディングソート)は大きい順もしくは新しい順。
入力された整数を昇順に並び変えて出力するコード
①入力、②ソート、③出力という三部構成になっている。
#include
#define NUM 10
int main(void) {
int i,j,num,count=0;
int test[NUM];
//①入力編
while(1){
printf("整数を入力(負の数を入力すると終了):");
scanf("%d", &num);
if(num < 0)
break;
test[count] = num;
//入力された値NUMを[ ]の中に代入。
count++;
//さらに入力された値の回数をカウント。
}
//②ソート編
入力された複数の整数のうち、2つ(iとj)を取り出して比べっこするようになっている。
iは、最初から最後の一個手前までの数。
jは、2番目から最後までの数。
この2つの変数を順に比べていき、jよりもiの整数の方が大きかった場合は、iとjの整数を前前前世的に入れ替えさせる。
for(i=0; i < count-1; i++)
{
for(j=i+1; j < count; j++)
{
if(test[j] < test[i])
{
num = test[j];
test[j] = test[i]; //この3行が君の名は。
test[i] = num;
}
}
}
//③出力編
for(i=0; i < count; i++)
{printf("%d ",test[i]);} //スペースを入れないと、すべての数字がくっつく!
printf("\n");
return 0;
}
2018-05-03 13:58:39 (7 years ago)
ゴールデンウィーク第二部突入・・・!あと4日でC言語の課題をすべて終わらせないといけないんだけど、ひとつの単元を仕上げるのに何時間もかかるようになってきて、いよいよ厳しくなってきた。ふんじゃねーよ。
まず、使う構文が増えた上に、効果がかぶっている奴が多くて、なのに課題では「この構文を使うこと」と指定してくるところ。ふんじゃねーよ。特にwhile文。ふんじゃねーよ。お前いらねえよ。for文で済むわ。
次に、テキストは分かりやすくて、本当に“やさしい”のだが、本文に載っているソースコードがあまりにもやさしすぎて(かつ例が少ない)、テキストの例をいじくるだけじゃ課題のコードがいよいよ書けなくなってきたこと。
ふんじゃねーよ!(´;ω;`)
参考文献:高橋麻奈著『やさしいC第5版』
配列(array)
アレイ。大量のデータを一括記憶する方法。学年全員のテストの点数など、同じようなデータを複数の箱に収めるようなイメージ。
変数と同様に、配列も名前をつけて宣言する。その際、使う箱の数(要素数)も宣言する。
int arrayA[5]; //5つの要素を使う「アレイA」という名前の配列。
このように配列を宣言すると、
arrayA[0]
arrayA[1]
arrayA[2]
arrayA[3]
arrayA[4]
と、指定した数だけ箱が用意される。※0からカウントされるのに注意。
箱の各ナンバーは添字(インデックス)と言う。
また指定した箱の数を超えるコード(箱が5個しかないのに50個目の箱のデータを開けようとするなど)を書いてしまうと、コンピュータが暴走する可能性がある。
配列の各要素を取り出して出力するコード
for文などの繰返し文を用いる。
int test[5]
int i;
test[0]
test[1]
test[2]
test[3]
test[4]
for(i=0;i<5;i++)
{
printf("%d番目の人の点数は%dです。\n",i+1,test[i]); //インデックスの数は要素数より1少ないのでi+1というように補正してあげる。
}
配列順を逆にするコード
for文の()の中の条件式を変える。
#include
int main(void)
{
int test[5];
int i;
test[0]=1;
test[1]=2;
test[2]=3;
test[3]=4;
test[4]=5;
for(i=4;i>=0;i=i-1) //test[4]の箱から初めて、1つずつ数を減らして行けという意味。
{
printf("test[%d]=%d \n",i+1,test[i]);
}
return 0;
}
コンパイルすると
test[5]=5
test[4]=4
test[3]=3
test[2]=2
test[1]=1
フィボナッチ数列を10番目まで順に表示する配列コード
花びらや葉っぱのつき方など、自然界によく見られるパターン。
フィボナッチ数列は0番目と1番目だけが規則違反をしておりどちらも1なので、それをまずはじめに指定してしまう。
#include
int main(void)
{
int i;
int fib[10]; //配列フィボの宣言
fib[0] = 1;
fib[1] = 1; //2つの例外を指定。
for(i = 2; i <= 9; i++) //それ以外の場合の求め方を指定。
{
fib[i] = fib[i-2] + fib[i-1]; //フィボナッチ数列は1つ前の数と2つ前の数の和。
}
for(i=0; i<10; i++) //0~9までの10個のインデックスを表示させる。
{
printf("fib[%d]=%d \n", i,fib[i]);
}
return 0;
}
コンパイルすると
fib[0]=1
fib[1]=1
fib[2]=2
fib[3]=3
fib[4]=5
fib[5]=8
fib[6]=13
fib[7]=21
fib[8]=34
fib[9]=55
整数を順番に入力し、負の数が入力されたら、それまでに入力された正の整数を、 入力された順番とは逆に全角空白で区切って出力するコード
すごいイジワルな問題だと思う。こんなコード使うことあるのかっていう。
ちなみにwhile(1)という文は、いわゆる無限ループの構文で、{}の中に脱出口(break)を作ってやる必要がある。
#include
int main(void){
int i,num,count=0;
int test[10];
while(1) //入力された値が0より下じゃない限り、整数を入力させ続けろという意味。
{
printf("整数:");
scanf("%d", &num);
if(num<0)break;
test[count]=num;
count++;
}
for(i=count-1; i>=0; i--)
//初項は最大カウントから(ただしカウントを止めた最後の負数は合計しないので-1で調整)
{
printf("%d ",test[i]); //全角スペースに注意!
}
printf("\n");
return 0;
}
入力された得点を入力順に配列に保存し、その入力順を学生番号と考えて、学生番号に対応する得点を表示するコード
いよいよ複雑なコードが出てきた。すごい難しかった。
この授業ってクリアするとほかの学生のコードも見れるんだけど、解答例もいろいろあって何が正しいのかがわからない。
自分のコードも絶対おかしい気がするけど、なぜかクリアになった。
とりあえず、テキストの187ページをパクって、入力された値を配列に格納する変数iと、格納された値を出力する変数oを、別にしてコードを書いてみた。
ただ、おそらく先生が望んでいるのは、マイナスの点数が入力されるというエラーが起きるまで、半永久的に学籍番号を増やし続けるようなコードだと思う。
ただ、そうなると配列の宣言時に箱の数が確定せず、[ ]の中も小難しい式になりそうなので、なんとなく5個でごまかした。
#include
int main(void) {
int score[5];
int i; //配列に入力するための変数
int o; //配列から出力するための変数
printf("得点を入力してください。\n");
for(i=0;i<5;i++) //入力回数条件。
{
scanf("%d",&score[i]);
if(score[i]<0){break;} //0点未満の点数が入るとエラーということで強制終了。
}
for(o=0; o<5; o++) //出力回数条件。
{printf("学籍番号:%d \n %d点です。\n",o+1,score[o]);
}
return 0;
}
先生の模範解答
やはり難しかったのかVTRで正解のコードを見せていた(基本的には講義でそういうコーナーはない)。オレの2時間を返せ(´;ω;`)
#include
int main(void) {
int i,num,count=0;
int test[100]; //とりあえず上限を100にしていた。
while(1)
{
printf("得点を入力してください。\n");
scanf("%d", &num);
if(num==-1)break; //0点未満の点数が入るとエラーということで強制終了。
test[count]=num;
count++;
}
printf("\n");
while(1)
{
printf("学籍番号:");
scanf("%d", &num);
if (num<=0 || num >count)break;
//学籍番号が0以下だったり、学生数(カウント)よりも多いとエラーで強制終了。
printf("%d点です。\n",test[num-1]);
}
return 0;
}
配列に格納された10個の整数の最小値、最大値を求めて表示するコード
配列に入っている10個の数はあらかじめ設定されている。
その10個の配列をひとつずつ比べていくようにfor文の条件を作る。
#include
int main(void) {
int i;
int max=-1000000; //最大値として使える最小の数を宣言。
int min=1000000; //最小値として使える最大の数を宣言。
int array[10] = { -4,15,0,82,7,-5,12,2,72,-81 };
for(i=0; i<10; i++) //配列のある10個の数をひとつずつ検証するという意味。
{
if(max < array[i])
max = array[i];
if(min > array[i])
min = array[i];
}
printf("最大値は%dで、最小値は%dです。\n",max,min);
return 0;
}
第1種定形外通常郵便物の重さを入力すると料金が出力されるコード
重さと料金の配列をそれぞれ作り、連動させる。
50gまで 120円
100gまで 140円
150gまで 200円
250gまで 240円
500gまで 390円
1000gまで 580円
2000gまで 850円
4000gまで 1150円
#include
int main(void) {
int i,w;
int weight[8]={50,100,150,250,500,1000,2000,4000};
int fee[8]={120,140,200,240,390,580,850,1150};
printf("郵便物の重さ(g):");
scanf("%d", &w);
for(i=0; i<8; i++)
{
if(w<=weight[i]) //配列にある重さ以下の数字なら料金を教えてあげるという意味。
{
printf("料金は%dです。\n",fee[i]);
break;
}
}
return 0;
}
テストの点数の度数分布表
マイナスの点数が入力されるというエラーがない限り、エンドレスに集計するという仕様。
複雑なネストになっておりすごい難しい。先生の模範解答を見ても無理。
それぞれの点数を10段階の階級にふるい分け、さらにその階級の度数をカウントしなければならない。
度数分布
0~ 10: 2
11~ 20: 0
21~ 30: 1
31~ 40: 0
41~ 50: 0
51~ 60: 2
61~ 70: 0
71~ 80: 3
81~ 90: 1
91~100: 1
#include
int main(void) {
int i; //度数
int num; //点数
int test[10] = {0}; //10個の配列を初期化。
while(1) {
printf("点数(0-100):\n"); //無限ループを作りユーザーはエンドレスに点数入力。
scanf("%d", &num);
if(num < 0) break; //ただマイナスの点数を入力した場合はループ脱出。
for(i=0; i<10; i++)
{if(num <= 10*(i+1)){test[i]++; break;} }
//入力された点数を階級ごとにふるい分け、さらに度数をカウントする肝の部分。
例えば、0~10点は階級i=0にふるい分けなければならないため、10*(i+1)のiに0を代入した値=10と点数numを比較して、それ以下なら階級0としてカウントされるようになっている。
逆に、10を超えた点数ならば、iに今度は1を代入した値=20と点数numを比較、それでもまだ大きい場合はiにさらに2を代入して・・・と比較する階級をどんどん上げてやるという仕組みになっている。こんなん書けるか。
}
printf(" 0~ 10:%d\n",test[0]);
for(i=1; i<10; i++)
{printf("%3d~%3d: %d \n",10*i+1, 10*i+10, test[i] );}
return 0;
2018-05-01 20:10:30 (7 years ago)
こんばんは。第10単元から突然難しくなるC言語・・・!というか、構文がありすぎるんじゃ。英文法の授業か、これは。ふんじゃねーよ。
参考文献:高橋麻奈著『やさしいC第5版』
while文
whileは「~~である限り」という意味。
for文と同じく、指定した文を繰り返す構文。for文との違いは、あらかじめ繰り返す条件を設定し、その条件を満たす限り作業を繰り返すという点(試験に合格するまで試験を受け続ける、といったような)。
10回まで「n回目の繰り返しです。」という文章を繰り返すコード
whileの次の()の中に条件を記述する。
#include
int main(void)
{
int i=1;
while (i<=10)
{
printf("%d回目の繰り返しです。\n",i);
i++;
}
printf("繰り返しが終わりました。\n");
return 0;
}
1~100まで数を足し続けた値を出力するコード
whileのとなりのnを別の値にすれば、1000まででも10000まででも足せる。
#include
int main(void)
{
int n=1, sum=0;
while(n<=100) //100までで繰り返し終了という意味
{
sum+=n++; //※+=は加算した値をsumに代入しろという意味。
}
printf("%d\n",sum);
return 0;
}
do~while文
ブロックの最後に指定した条件を満たす限り、ブロック内の処理を順番通りに繰り返すという繰り返し構文。
do{文1
文2
・・・
}while(条件);
といった感じに記述する。
この構文が普通のwhile文と大きく異なる点は、条件がブロックの最後にあるので、条件を判断する前にとりあえず一度目はブロック内の処理を行うという点である。
1~100までの数字の合計を出力するdo~while文
繰り返しをやめさせる条件は、最後の一回を足したあとに100回行ったか確認させても((++n)<=100)、まだ100回行っていないことを確認してから最後の1回を足させても良い((n++)<100)。
#include
int main(void)
{
int n=1, sum=0;
do{
sum=sum+n;
}while((++n)<=100); //while((n++)<100)でもOK
printf("合計=%d\n",sum);
return 0;
}
0が入力されるまで入力された数を足し続けるdo~while文
!=は≠と同じ意味。
#include
int main(void)
{
int num,sum;
do{
scanf("%d",&num);
sum=sum+num;
}while(num!= 0); //numに0が入力されない限り繰り返し!
printf("合計は%dです\n",sum);
return 0;
}
ネスト文
再び登場。マトリョーシカ構造になっているコードのこと。
これを駆使すると、掛け算九九の9×9の表を表示させることもできる。
#include
int main(void)
{
int tate,yoko;
for(tate=1;tate<=9;tate++) //縦に9段できるまで段を増やせ
{
for(yoko=1;yoko<=9;yoko++) //横に9列できるまで列を増やせ
{printf("%3d ",tate*yoko);} //縦横9×9になるまで縦と横をかけろ
printf("\n");
}
return 0;
}
模様を描くネスト文
掛け算九九の表を作るのと同じ要領。
#include
int main(void)
{
int tate,yoko;
for (tate=0;tate<5;tate++)
{
for (yoko=0;yoko<5;yoko++)
{
if(tate != yoko)printf("*"); //縦と横の値が違う場合は全て*にする!
else
printf("#"); //そうじゃない場合(縦と横の値が同じ)は#にする!
}
printf("\n");
}
return 0;
}
コンパイルすると
#****
*#***
**#**
***#*
****#
break文
繰り返し処理を強制終了し、その繰り返し処理を記述するブロックから脱出する文。
for文でもなんでもいいが、繰り返し処理のブロックにbreakを入れると、その行を読んだ時点で繰り返し処理は中断となる。
continue文
残りの繰り返し処理を割愛し、繰り返し処理の先頭位置にまで処理をリセットしてしまう文。
ただし、for文のiのカウントまではリセットできないのに注意(できたら無限ループだが)。
go to文
処理の手順(逐次処理)を強制変更し、識別子がある場所にまでジャンプする文。
コードがたいへん読みにくくなることから、テキストではあまり使用しないほうがいいと書かれている。
だが、先生によれば、指定したブロックからしか脱出できないbreak文と異なり、go to文はネスト構造の多重ブロックからも一気にワープできるので、便利な場合もあるらしい。リレミトとルーラ的な。