プログラミング基礎覚え書き⑥(配列とデータの格納)

 ゴールデンウィーク第二部突入・・・!あと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;

プログラミング基礎覚え書き⑤(高度な繰り返し文do~while)

 こんばんは。第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文はネスト構造の多重ブロックからも一気にワープできるので、便利な場合もあるらしい。リレミトとルーラ的な。

プログラミング基礎覚え書き④(条件演算子と繰り返し文for)

参考文献:高橋麻奈著『やさしいC第5版』

論理演算子
コンピュータサイエンス入門でやったやつ。C言語でコードを書く場合は以下の記号を使う。

||(論理和)
AまたはB。

&&(論理積)
AかつB。

!(論理否定)
Aではない。

条件演算子
「変数 = (条件式) ? 条件が真のときに入れる値 : 条件が偽のときに入れる値 ;」で、if文を使わなくても場合分けをすることができる。

大人と子どもで料金が異なる場合のコード
ロープウェイの運賃は12歳未満なら子ども料金が適用されるというケース。

#include

int main(void)
{
int age,fee; //※feeは運賃という意味の英単語。

printf("年齢: ");
scanf("%d",&age);

fee = (age<12) ? 300:600; //12歳未満の運賃は300円、それ以外は600円という条件式。
printf("\nロープウェイ運賃は%d円です。\n",fee);

return 0;
}

携帯電話のパケット代を求めるコード
基本料は1パケット0.05円なのだが、上限額が月5000円までと決まっている場合。

#include

int main(void)
{
double packet,fee;

printf("パケット数: ");
scanf("%lf",&packet);

fee = 0.05 * packet;
fee = (fee>5000.0) ? 5000.0 : fee; //5000円以上の場合は請求額5000円で変わらず、5000円未満は0.05×パケット数で求めるという条件演算子。

printf("\n通信料は%.0f円です。\n",fee);

return 0;
}

たくさん買うとお得になるコード
リンゴの値段は1個50円だが、4個以上買うと1割引、7個以上は2割引になるという設定。

#include

int main(void)
{
int n,fee;

printf("リンゴの個数: ");
scanf("%d",&n);

fee = 50 * n;
fee = n<=3 ? fee:(4<=n && n<=6? fee*9/10 : fee*8/10); //1割引は(本来の料金×9/10)として計算。

printf("\n料金は%d円です。\n",fee);

return 0;
}

for文
繰り返し処理を行うための構文。
文法的には、for(初期化の式1; 繰り返すかどうかを判断する式2; 継続処理の式3) {繰り返したい処理;} という形になる。イメージとしては高校数学に出てくるシグマとかに似ている。

Hello World!を50回繰り返すコード
コピペを50回分繰り返すのも大変なのでfor文を用いる。
しかし、このHello World!ってなんなんだろうな。コンピュータの授業だと、いつも最初にやらさせられるけど、「キミもこのコンピュータの世界に生まれたんだね、おめでとう」、みたいななんかバカにされてる感じがして、別にほかの言葉でもいいと思うんだけどね。ハローワールドくらいわかるよバカやろうとか。

#include

int main(void)
{
int i = 1;
for(i = 1; i <=50; i++)
//初項は1で(i = 1)、そのあと1ずつ増やしていって(i++)、iが50まで行ったらおしまい(i <=50)という意味。

{printf("Hello World!\n");} //繰り返したい処理

return 0;
}

身長から適正体重を3回繰り返して調べるコード
課題の意味がよくわからなくて手こずったやつ。
適正体重(kg)は、身長(m)×身長(m)×22なので、式さえ定義すればいい。
ややこしいのは、結局ユーザーに3回身長を入力させるため、scanfの行もfor文の{}の中に組み込むというところ。

#include

int main(void)
{

double l,kg; //身長と適正体重の変数の宣言。
int i; //繰り返し回数の変数の宣言。

for(i=1; i<=3; i++)
{

printf("身長を入力\n");
scanf("%lf",&l);

printf("身長:%f\n",l);

kg=l*l*22;
printf("適正体重:%f\n",kg);

}

return 0;
}

1から入力された値までの奇数の和を求めて出力するコード
ただし、0やマイナスの数が入力された場合は合計値を0と表示すること。
いよいよ中かっこだらけで、どれがどの中かっことセットになっているか、わからなくなってきました。
かなり難しいが、テキストの155ページに答えが載っていた・・・

#include

int main(void)
{

int i,n,sum=0; //繰り返し回数iと、入力された値nと、奇数の和のsumを宣言

for(i=1; i<=n; i=i+2)
//初項は1で(i=1)、偶数は抜かすから一つ飛ばしで足していって(i=i+2)、nまで行ったらおしまい(i<=n)という意味。

{

printf("入力値:\n");
scanf("%d",&n);

if(n>0) //入力された数値がプラスの数ならば1~nまでの奇数を全て足す。
{

sum +=i ;
printf("1~%dまでの合計値は%dです。\n",sum);

}

else
{printf("合計値:0\n");} //0やマイナスの数が入力された場合は合計値を0と表示する。

}

return 0;
}

繰り返し回数を入力して決められるコード
繰り返す回数をnum回として、num回まで繰り返したら処理終了としている。

#include

int main(void)
{
int num,i;

printf("いくつ「Hello World!」を出力しますか?\n");
scanf("%d",&num);

for(i=1; i<=num; i++)
{printf("Hello World!\n");}

return 0;
}

4つの整数の最小値と最大値を求めるコード
テキストに載っていない恐るべき課題。
最小値は、それぞれの整数とminを比べて、minよりも小さければそれが最小値という決め方をさせている。

#include

int main(void)
{
int i,n,min,max;

n=0;
max=-10000;
min=10000;

for(i=1; i<=4; i++)
{
printf("整数:");
scanf("%d",&n);

if(min > n) //その数がminより小さいかどうかを調べている
min = n;

if(max < n) //その数がmaxより大きいかどうかを調べている
max = n;
}

printf("最小値は%dです。\n", min);
printf("最大値は%dです。\n", max);

return 0;
}

1から入力された値までの奇数の和を求めて出力するコード
ただし、0やマイナスの数が入力された場合は合計値を0と表示するということなので、この合計値が0になる場合(nが0以下)を先にif文ではけさせてしまう。
それ以外をelse文の{}に入れて、この中でfor文を作る。

#include

int main(void)
{
int i,n,sum;
sum=0;

scanf("%d",&n);
printf("入力値:%d\n",n);

if(n<=0)
{
printf("\n合計値:0\n");
}

else
{
for(i= 1; i<= n; i=i+2) //初項1、1つ飛ばしに増えて、nまで行ったらおしまい
{ sum=sum+i; } //※sum+=iでも多分大丈夫。
}

printf("合計値:%d\n",sum);

return 0;
}

プログラミング基礎覚え書き③(条件文ifとswitch)

 条件に応じてルートを変える二つの構文をまとめました。この二つの構文は、本当にキャラがかぶっていて憎らしいほどややこしい。個人的にはifの方がわかりやすいかなあ。

参考文献:高橋麻奈著『やさしいC第5版』

if文
もし○○だったら・・・という条件を与えて、その条件のもと真偽を判定する文。
今までのコードは、各行のおしりにセミコロン;を付けることが多かったが、なぜかif分のおしりにはセミコロン;をつけない。超トラップ。

60点以上なら合格、60点未満なら不合格と判定するコード
if文のところだけはセミコロンをつけないようにする。

#include

int main(void) {

int score;

printf("点数を入力\n");
scanf("%d",&score);

if(score>=60)
printf("合格");

if(score<60)
printf("不合格");

return 0;
}

入力された整数が偶数か奇数かを判定するコード
2で割った余りが0か1かで判断する。パリティピーポー(※3度目)。

#include

int main(void)
{
int num;

printf("整数を入力\n");
scanf("%d", &num);

if(num%2==1)
printf("%dは奇数です\n",num);

if(num%2==0)
printf("%dは偶数です\n",num);

return 0;
}

入れ子(ネスト)構造のif文
イメージとしては二次試験まである感じ。対象を絞り込む事が出来る。
授業の例だと、男性の大人だけ持ち物に髭剃りが追加されるようになっている。

#include

int main(void) {
int gender,age;

printf("性別を整数で入力(男:1,女:2): ");
scanf("%d",&gender);
printf("年齢を入力: ");
scanf("%d",&age);

printf("持ち物は着替えハブラシ");
if (gender==1) {
if (age>=20) {
printf("髭剃り");
}
}
printf("です.\n");

return 0;
}

入力された整数を分類するコード
「3の倍数」「3の倍数+1」「3の倍数+2」の3パターンに分類するためには、入力された整数を3で割って、その余り(懐かしのモジュラス)で判断するようにすればいい。
このコードも入れ子構造になっているのに注意。
まず、モジュラスを定義する大きな{}の中に、3つの{}(余り0の場合と、余り1の場合と、余り2の場合)が入っているようにしないとコンパイルできない(数学と違ってブロックの区切りがすべて中かっこなのでややこしい)。
そして、そもそも3で割れない場合(整数が3未満)はelse文ではじいている。

#include

int main(void) {

int n;
int mod;
scanf("%d", &n);

if (n > 2)
{
mod = n % 3;

if (mod == 0)
{ printf("%dは3の倍数\n", n); }

else if (mod == 1)
{ printf("%dは3の倍数+1\n", n); }

else if (mod == 2)
{ printf("%dは3の倍数+2\n", n); }

}

else
{
printf("%dは3未満\n",n);
}
return 0;
}

テストの点数によって成績をつけるコード
まず100点満点のテストなので点数がマイナスだったり100点を超える場合はエラーとする。
そのあと優>良>可>不可の順にelse if文でマトリョーシカ的に削ぎ落としていく。

#include

int main(void)
{

int n; //点数(数字)の変数を宣言
char *c; //成績(文字)の変数を宣言

scanf("%d", &n);

if(0>n || n>100) printf("\n入力エラー\n"); //ありえない点数

else{
if(n>=80)c="優"; //80点以上
else if(n>=65)c="良"; //65点以上80点未満
else if(n>=50)c="可"; //50点以上65点未満
else c="不可"; //50点未満

printf("\n成績:%s\n",c);
}

return 0;
}

善玉と悪玉のコレステロールの値を判定するコード
善玉コレステロールの正常値は 40以上、悪玉コレステロールの正常値は 70以上 140以下らしい。ちなみに私のコレステロール値はどちらも少ない。それはそれでどうなのだろうか。

#include

int main(void)
{
int zen,aku;

printf("善玉コレステロールの値を入力");
scanf("%d",&zen);

if(40<=zen)

{printf("善玉コレステロールは正常です。\n");}

else
{printf("善玉コレステロールは異常です。\n");}


printf("悪玉コレステロールの値を入力: ");
scanf("%d",&aku);

if(aku>=70 && aku<=140)
{printf("悪玉コレステロールは正常です。\n");}

else
{printf("悪玉コレステロールは異常です。\n");}

return 0;
}

switch文
if文と同じように、条件によって処理をコントロールできる文。
複数のケース(case)を任意に設定し、それ以外の入力があった場合はデフォルトということで、その他の処理としてまとめることができる。
注意点としては、case文ではセミコロン;ではなくコロン:をつけること、それぞれのケースのコードの最後にbreak;を入れないと、全ケースが表示されるバグが起きるということである。

年号をアルファベットから文字に変換するコード
M→明治、T→大正、S→昭和、H→平成に変換する設定。

#include

int main(void)
{

int res;
char ans;

printf("大文字のアルファベット一文字を入力\n");

scanf("%c", &res);

switch(res)
{

case 'M': //※セミコロンなのに注意!
printf("明治\n");
break; //※break文がないとバグるので注意!

case 'T':
printf("大正\n");
break;

case 'S':
printf("昭和\n");
break;

case 'H':
printf("平成\n");
break;

default: //どのケースにも当てはまらない場合
printf("エラー\n");
break;

}

return 0;
}

電卓のコード
数字1(num1)、演算子(op)、数字2(num2)の順に入力し、その計算結果(result)を返す。

#include

int main(void) {
int num1, num2, result;
char op;

printf("式:");
scanf ("%d %c %d", &num1, &op , &num2);

switch (op) {
case '+':
result = num1 + num2;
break;

case '-':
result = num1 - num2;
break;

case '*':
result = num1 * num2;
break;

case '/':
result = num1 / num2;
break;

case '%':
result = num1 % num2;
break;

default:
printf("エラー\n");
break;

}

printf("\n %d%c%dの結果:%d\n", num1,op,num2,result);

return 0;
}

入力された整数が偶数か奇数かを判定するコード(switch文バージョン)
2で割った余りが0か1かで判断する。パリティピーポー(※4度目)。

#include

int main(void)
{

int num,mod;

printf("整数を入力\n");
scanf("%d", &num);

mod=num%2;

switch (mod)

{
case 1:
printf("%dは、奇数です\n");
break;

case 0:
printf("%dは、偶数です\n");
break;

default:
printf("エラー\n");
break;
}

return 0;
}

整数を入力し、その値に対応する季節を表示するコード(caseのまとめ方)
3か4か5が入力されたら全部春と表示するというように、複数のケースをまとめたい場合は、単純に並べて書いちゃって大丈夫らしい。


#include

int main(void)
{
int num;

printf("整数:\n");
scanf("%d", &num);

switch(num)
{

case 3:
case 4:
case 5: //並べちゃうだけでコンパイルできる。
printf("春\n");
break; //※break文がないとバグるので注意!

case 6:
case 7:
case 8:
printf("夏\n");
break;

case 9:
case 10:
case 11:
printf("秋\n");
break;

case 12:
case 1:
case 2:
printf("冬\n");
break;

default: //どのケースにも当てはまらない場合
printf("?\n");
break;

}
return 0;
}

プログラミング基礎覚え書き②(式と演算)

 ゴールデンウィーク突入!この千載一遇のチャンスでC言語を全クリする!!しかし、毎年思うんだけど、年度が始まってすぐ来るんだよな、ゴールデンウィーク・・・できればまだまだ頑張れるから、6月くらいまで繰り越しておきたいよね(^_^;)連休は超嬉しいけど、発進してすぐエンスト的な感じというか。だから5月病になるんだろうな(あと年度始めは学費払うから行楽にあてる金がない)。
 いや、でもしっかり休むけどね。最近気温のアップダウンがえげつなかったし・・・

 あ、あと今気づいたんだけど、ブログの仕様なのか、コード冒頭(include文)に必ず書かなければならない<stdio.h>が記事には表示されないので、本ブログのコードはその部分を書き足さないと機能しません!(´;ω;`)

参考文献:高橋麻奈著『やさしいC第5版』

式と演算
コンピュータは0で数字を割ると実行時にエラーとなりプログラムが停止するという最悪の事態になる。

四則演算の演算子は以下のとおり。
足し算:2+3 こたえ5
引き算:3-2 こたえ1
掛け算:2*2 こたえ4
割り算:6/3 こたえ2
割り算の余り:11%2 こたえ1


入力された二つの小数を使って四則演算するコード
小数なのでdouble型で宣言する。
入力時は%lfだが、出力時は小数点以下何桁まで出すか指定するのに注意(小数点以下3桁は%.3f)。

#include

int main(void)
{
double num1,num2,sum,hiku,kake,wari;

printf("実数1を入力\n");
scanf("%lf",&num1);

printf("実数2を入力\n");
scanf("%lf",&num2);


printf("%.3f+%.3f=%.3f\n",num1,num2,num1+num2);


printf("%.3f-%.3f=%.3f\n",num1,num2,num1-num2);


printf("%.3f*%.3f=%.3f\n",num1,num2,num1*num2);


printf("%.3f/%.3f=%.3f\n",num1,num2,num1/num2);


return 0;
}

三角形の面積を求めるコード
小数(厳密には浮動小数点数)の値で求めているので、変数はdoubleを用いる。
また小数を出力する場合は%dではなく、%fを用いる。
また%とfのあいだに.3などと数字を入れると、小数点以下3桁までで表示を打ち切ることができる。

#include

int main(void)
{
double teihen,takasa,menseki; //底辺、高さ、面積という3つの変数を宣言。

teihen=6.0;
takasa=3.0;
menseki=teihen*takasa/2; //数値、もしくは数式を代入。

printf("%f\n",menseki); // 出力。

return 0;
}

入力された半径から円の円周や面積を求めるコード

#include

int main(void) {

double r,c,s;

printf("円の半径を入力\n");
scanf("%lf",&r);

c=r*2*3.142;
printf("円  周=%.3f\n",c);

s=r*r*3.142;
printf("円の面積=%.3f\n",s);

return 0;
}

セルシウス温度をファーレンハイト温度に変換するコード
物理学概論が懐かしい・・・華氏(F)=(9÷5)×摂氏(C)+32なので・・・

#include

int main(void)
{

double C,F;

printf("摂氏を入力");

scanf("%lf",&C);

F=(9.0/5.0)*C+32.0;

printf("華氏になおすと%.2f",F);

return 0;
}

BMI指数を計算するコード
BMI=体重÷(身長×身長)であり、さらに身長はセンチではなくメートルに換算しないといけないため、単位を合わせるために分子を100×100倍する。

#include

int main(void)
{
double h,w,BMI;

printf("身長を入力\n");
scanf("%lf", &h);

printf("体重を入力\n");
scanf("%lf", &w);

BMI=w*10000/(h*h);

printf("%f\n",BMI);

return 0;
}

定期テストの平均点を求めるコード
テストの点数は整数(int型で宣言する)だが、平均点は小数(double型で宣言する)になるのでそこに注意する。

#include

int main(void)
{

int J,M,E,All;
double Av;

printf("国語の点数を入力\n");
scanf("%d", &J);

printf("数学の点数を入力\n");
scanf("%d", &M);

printf("英語の点数を入力\n");
scanf("%d", &E);

All=J+M+E;

printf("三科目合計=%d\n", All);

Av=All/3.0;
printf("三科目平均=%.2f\n",Av);

return 0;
}

2の平方根を計算する漸化式のコード
同じ計算を何度も繰り返すと、ちょっとずつ正確な値に収束していくタイプの計算。
Xに2を加えた数をXで割り、その数を更に2で割ることを繰り返すと、ヒトヨヒトヨニヒトミゴロに接近する。

#include

int main(void)
{
double x = 1.0;

x = (x + 2.0 / x) / 2.0;
printf("x=%.18f\n",x);
x = (x + 2.0 / x) / 2.0;
printf("x=%.18f\n",x);
x = (x + 2.0 / x) / 2.0;
printf("x=%.18f\n",x);
x = (x + 2.0 / x) / 2.0;
printf("x=%.18f\n",x);
x = (x + 2.0 / x) / 2.0;
printf("x=%.18f\n",x);
x = (x + 2.0 / x) / 2.0;
printf("x=%.18f\n",x);

return 0;
}

シフト演算子
ビットの桁の位置位置を左右にずらす(シフトする)ことができる演算子。
変数<<1 は変数を2倍(2の1乗)
変数<<3 は変数を8倍 (2の3乗)することができる。

#include

int main(void)
{
int num;
printf("整数を入力:");
scanf("%d", &num);

printf("入力値の10倍は:%d\n", (num<<1) + (num<<3));
// ※(num<<1)=2倍と(num<<3)=8倍を足して10倍にしている。

return 0;
}

ライフゲーム
イギリスの数学者コンウェイが1970年代に考案し、一時期流行ったシミュレーションプログラム。
オセロ盤のひとつのマスをセル(細胞)として、周囲のセルの状況によってそのセルの生死が決定するというルール。50行ほどの単純なコードだが、各セルは時間経過によってまるで生き物のようなアクティブな振る舞いをする。

命題
正しい(トゥルー)か誤り(フォールス)かが明確な文(平叙文)や式のこと。
日本の首都は東京である、みたいな○×クイズ的な文が命題と考えて良い。
疑問文や感嘆文、命令文といった曖昧な奴はダメ。

関係演算子
左辺と右辺の関係を表す演算子。
①== 左辺と右辺は等しい。
②!= 左辺と右辺は等しくない。
③> 左辺は右辺よりも大きい。
④>= 左辺は右辺よりも大きいか等しい。
⑤< 左辺は右辺よりも小さい。
⑥<= 左辺は右辺よりも小さいか等しい。


10+20は30かどうかを判定するコード
正しかったら1、誤りだったら0として表示される。

#include

int main(void) {

int i,j,k,l,m;

printf("整数iを入力\n");
scanf("%d" ,&i);

printf("整数iを入力\n");
scanf("%d" ,&j);

printf("整数iを入力\n");
scanf("%d" ,&k);

l=(i+j == k);
printf("条件式: 10+20 == 30 の値は%dです\n",l);

m=(i+j != k);
printf("条件式: 10+20 != 30 の値は%dです\n",m);

return 0;
}
Calendar
<< September 2020 >>
SunMonTueWedThuFriSat
  12345
6789101112
13141516171819
20212223242526
27282930
search this site.
tags
archives
recent comment
recent trackback
others
にほんブログ村 科学ブログへ にほんブログ村 科学ブログ 恐竜へ カウンター
admin
  • 管理者ページ
  • 記事を書く
  • ログアウト

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275