C言語 自作サンプルとおススメ参考書

メインメニューに戻る
これからプログラミングを始める方へ
息抜きに、写真で癒し(=^・^=)

【入門編】

環境設定とhellowold(windows)

メモ(あるあるエラー編) 

メモ(エディタ設定編)

簡単な足し算。イヤナヤツ+イヤナヤツ?

バカボンのパパで反対の反対は賛成なのだ掛け算

コロナ詐欺をループでやっつけろ!!

芸能人の結婚への心の準備

【アルゴリズム編】

3リットルと5リットルのバケツで4リットル用意するバケツ問題

最大値最小値(ドラえもんキャラのテストの点数)を求めてみた。

バブルソート(ドラえもんキャラのテストの点数)を作ってみた。

【初級編】

カンタン関数引数戻り値で嫌なヤツの寿命のカウントダウン(^^♪

芸能人のBMIを調べてみた。

二重ループで市松模様を作ってみた。

乱数発生で猫のおみくじを作ってみた

乱数発生でAdoの「うっせぇわ」を繰り返して見た。

文字コードで相性占い

C言語なるほど実験室の整数の除算結果を作ってみた。

西暦を和暦に変換して元号と干支を求める+閏(うるう)年判定

日数計算と曜日求め

【中級編】

ポインタって怖いの?怖くないの??

構造体で新型コロナの昨日の感染者数

構造体連結リストで東京-新潟間の上越新幹線駅名

■C言語使用参考書■

C言語でコンピュータの仕組みを理解する実験プログラムを作りながら目で見て納得出来る本です。
2進数や演算などの50個のそれぞれ独立した実験があり、興味のある実験から作って行けます。特に面白かったのは8章の実行時間に関する実験でした。

基本情報技術者試験の範囲のソートやサーチといった基本のアルゴリズムを実際に作って学べます。C言語とJavaに対応しています。

基本情報技術者試験のアルゴリズムで使う疑似言語は、C言語に近いので、この本で復習しながらサンプルプログラムを作りました。

メインメニューに戻る
これからプログラミングを始める方へ
息抜きに、写真で癒し(=^・^=)

C言語で3リットルと5リットルのバケツで4リットル用意するバケツ問題を作ってみた。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

おはこんばんにちは!!!
うにゃうにゃエンジニアの猫です(=^・^=)mm

タイトルに「C言語」とありますが、プログラミング未経験の方もお楽しみいただけるよう、イラストでアルゴリズムをお伝えしています。
絵が下手すぎて笑えますが、その分見やすさと理解しやすさにこだわりました。

IT企業の入社試験の問題?それともお受験とかで出て来るのでしょうか。
3リットルのバケツと、5リットルのバケツを使って、4リットルの水を用意する問題。

そんなの両方に水を入れて8リットルにして、テキトーに半分ぐらいにすれば4リットル、はい、完了!!!

それではアルゴリズムの勉強にならないので、イラストとC言語を使って、水くみアルゴリズムをやってみたいと思います。

「ピッタリ4リットル」が求まるまで、「または」終了ボタン(キーボードのq)を押すまで後判定のdo whileループが繰り返されます。
コードを書く時は、継続条件になるので、
「ピッタリ4リットル」が求まっていない「かつ」終了ボタンを押していない間が継続、という後判定のdo whileループが繰り返されます。
これ、基本情報技術者試験の復習になりますね。

では、やってみます。

3リットルのバケツが空、5リットルのバケツも空、合計0リットルと言う状態です。
その下に、それぞれのバケツを使うメニュー、バケツの水を移すメニュー、
このプログラムを終了するキーがあります。

図で描くとこんなかんじです。

雑な絵でごめんなさいm(__)m

では、3リットルのバケツに水を汲むので、3リットルのバケツを選びます。

バケツに水を汲むを選びます。

3リットルのバケツに3リットルの水が入りました。

図で描くとこうなります。

以下、水を汲む、捨てるなどをシンプルに書きます。

次に、この3リットルの水を5リットルのバケツに移します。

更に、3リットルのバケツに水を汲みます。

この状態で、3リットルのバケツから5リットルのバケツに水を移すと、
こうなります。

ここで、5リットルのバケツを捨てます。
勿体無い!!けれど、今3リットルに入っている残りの1リットルと3リットルを使って、
4リットルが出来そうです。

この1リットルを大きい方に移します。

ここで、小さい方を 3リットルで満たします。

もうすぐです!!!
もうお気づきの方が殆どですね。
この小さい方を大きい方に移したら、フィニッシュですにゃ(=^・^=)mm

おめでとうメッセージとともに、このアルゴリズムが終わりました。
8回の操作でした。

これでばんざ~~~い、なのですが、逆に5リットルのバケツを先に汲む方法もあり、
その方が少ない手順で済むのでそれもやってみます。

では、大きい方を5リットルで満たします。

次に、5リットルから3リットルのバケツに移します。

ここで、またまたもったいないのですが、小さいバケツを空にします。

大きいバケツから小さいバケツに移します。

5リットルのバケツを満たします。

最後に、5リットルのバケツから3リットルのバケツに水を移します。
ここで1リットル減るので、残り4リットル、完成です!!

6回の操作でした。

プログラムはコチラになります。

コードはコチラになります。

#include <stdio.h>

int main(){

int big=0; //5リットルのバケツ
int small=0; //3リットルのバケツ
int x=0; //それぞれのバケツの注水可能な量
char s[20]; //キー入力した文字列
char menu; //選択メニュー

printf(“3リットルバケツ:【%d】リットル\n5リットルバケツ:【%d】リットル\n”,small,big);
printf(“合計【%d】リットル\n—————————-\n\n”,small+big);

//3リットルと5リットルのバケツを使うループ。 4リットルが求まるまでor[q]が押されるまで
do{

//メニューの選択
printf(“3リットルのバケツを使う>>>[s]\n5リットルのバケツを使う>>>[b]\n”);
printf(“3リットルのバケツから5リットルに移す>>>[m]\n5リットルのバケツから3リットルに移す>>>[n]\nq:終了する\n\n>>>>>”);
gets(s);
menu=s[0];

//3リットルのバケツを使う
if(menu==’s’){
printf(“3リットルのバケツに水を汲む>>>[i]\n3リットルのバケツを空にする>>>[o]\n>>>>>”);
gets(s);
menu=s[0];
if(menu==’i’){
small=3;
}
if(menu==’o’){
small=0;
}
}

//5リットルのバケツを使う
if(menu==’b’){
printf(“5リットルのバケツに水を汲む>>>[i]\n5リットルのバケツを空にする>>>[o]\n>>>>>”);
gets(s);
menu=s[0];
if(menu==’i’){
big=5;
}
if(menu==’o’){
big=0;
}
}

//3リットルのバケツけら5リットルのバケツに移す
if(menu ==’m’){
printf(“3リットルのバケツを5リットルのバケツに移す\n”);

//もしも5リットルのバケツに3リットル以上入っていて、空いている分が2リットル以下の場合
if(big>=3){


//5リットルのバケツの量が3リットルより少ない場合
x=5-big;


//5リットルのバケツの空き量
big+=small;
small-=x;
}
else{
big+=small;
small=0;
}
}

//5リットルのバケツから3リットルのバケツに移す
if(menu==’n’){
printf(“5リットルのバケツを3リットルのバケツに移す\n”);
x=3-small; //3リットルのバケツの空き量
if(big3){
small=3;
}

//3リットルのバケツが空になった時
if(small<0){ small=0; }


//5リットルのバケツが溢れた時 if(big>5){
big=5;
}

//5リットルのバケツが空になった時
if(big<0){
big=0;
}

printf(“\n3リットルバケツ:【%d】リットル\n5リットルバケツ:【%d】リットル\n”,small,big);
printf(“合計【%d】リットル\n—————————-\n\n”,small+big);

//終了条件は、4リットル求まった、「または」[q]を押したということは、
//継続条件は、4リットル求まっていない「かつ」[q]を押していないとなることに注意
}while(big!=4 && menu!=’q’);
//入力ループおしまい

if(big==4){
printf(“3リットルバケツ:【%d】リットル\n5リットルバケツ:【%d】リットル\n合計【%d】リットル\n\nおめでとう(=^・^=)!!\n”,small,big,small+big);
}

return 0;
}

長くなってしまいましたが、読んでくださってありがとうございました。
あなたのことを愛しています(=^・^=)mm

このバケツ問題はアルゴリズムを考えるのにとても大事になって来ます。

アルゴリズムの勉強になった参考書2冊

このプログラムを作成するのにヒントになった参考書

です。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

C言語 乱数発生プログラムで「うっせぇわ!!(Ado)」

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

おはこんばんにちは!!!
うにゃうにゃエンジニアの猫です(=^・^=)mm

クローゼットの中から生まれた女子高生シンガー?Adoさんのデビュー曲「うっせぇわ」

この曲コロナが終息したら、カラオケボックスで歌ってみたいと思っている、43歳です。
自粛ストレスをぶちまけたくて、『生活必需品購入』の途中にあった交差点の所で歌っていましたが人がいたので途中で止めました。

この歌の「うっせぇわ」と言う所を使ってC言語によるプロうグラミングをして見たいと思います。
内容は、「うっせぇ、うっせぇ」を繰り返す回数を1から10までの乱数にします。
その1から10までのランダムな数を、【うっせぇポイント】とします。
乱数はおみくじプログラムで良く用いられますね。
関連記事はこちら
C言語で「ねこ」おみくじを作ってみた

【うっせぇポイント】が7以上だったら「おめでとう」メッセージも表示させるようにして、ゲーム的な要素も加えました。
では、実行結果です。

うっせぇポイントを【4】ゲットしました!!

次に、7以上目指して。

うっせぇポイントをMAX【10】ゲットしました!!
「おめでとうメッセージ」も出ています。

あの、だからなんだんだっ!とか言わないで下さいね。
自分の勉強のアウトプットしながらどなたかのお役に立てたらと思って作っています。

ではプログラムです。

関数Ado

メイン関数

コードはコチラになります。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void Ado(int num){
printf(“正しさとは、\n愚かさとは\nそれが何か\n見せつけてやる!!!!\n\n”);
printf(“…中略…\nはぁぁぁぁぁぁぁぁぁっ!\n\n”);
for(int i=1;i<=num;i++){
printf(“うっせぇ、うっせぇ、 ・・・%dポイント付与(=^・^=)\n”,i);
}
printf(“うっせぇわ!\n\n”);
}

int main(void){
srand((unsigned int)time(NULL));
int num; num=rand()%10+1; Ado(num);
printf(“あなたは”うっせぇポイント”を【%dポイント】ゲットしました!!\n”,num);
if(num>=7){
printf(“%dポイント達成、おめでとうございます(=^・^=)mm。。。\n”,num);
}
return 0;
}

ちなみに、この本で勉強している時にひらめきました。
勉強に戻ります。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

最後まで読んで下さってありがとうございました。
あなたを愛しています(=^・^=)

C言語なるほど実験室の整数の除算結果を作ってみた。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

この記事を書いている今(令和3年2月11日建国記念日でお休み。)令和2年度(令和3年1月)に受験した、基本情報技術者試験の結果待ちをしています。
それで、待っている時間と次のステップまでの間を利用して、独習ゼミの講師の矢沢久雄先生が書かれた、
「コンピュータのしくみがよくわかる! C言語プログラミング なるほど実験室」という本で勉強しています。

10進数や2進数、文字コードなどの実験を通しながらC言語でのプログラミングを学んでいっています。
C言語の学習サイトのpaizaラーニングを終えたら(だいたい理解出来たら)この本はプログラミング初心者でも十分読めますし、
基本情報技術者試験の復習にもなります。

それで、第3章の演算に関する実験、80ページのOne Pointに、整数データの除算で、
整数データであっても、剰余を10倍して除算を繰り返せば小数点以下の値を求めることができる、興味があれば、キー入力した2つの整数データの除算結果を作ってみて下さいとありましたので、こういうの好きだから作ってみました。

面白かったです。
条件として、

1、剰余が0になるまで剰余を10倍にして繰り返す
2、同じ剰余が出現したら循環小数だから「…」
3、小数点以下最大20桁まで

という制限を設けて作ってみました。

フローチャートはコチラになります。

割り算の結果21桁(整数も含めて)を格納する配列を用意しました。
この配列の初期化を忘れて、なんでなんでなんで???????????????ってなっていました( ;∀;)

除算は後判定のwhileループを使っています。
先ほどの条件1と3を繰返しの条件にしています。

演算結果はまず整数部を出力して、小数点以下は配列に商を入れた分まで出力します。
小数点第一位の所で「.」を出力するようにしています。

ではまず、7÷2を求めてみます。

これは、7を2で割ると、商が3で剰余が1になります。
商の3を配列に入れます。配列の要素を次にインクリメントして、
余りの1に10を掛け、それを被除数にして除算を実行します。
それを剰余が0になるまで繰り返しました。

次に、10÷5を求めてみます。

それから循環小数になる10÷3を求めてみます。

最後に被除数の方が除数より小さい、2÷8を求めてみます。

ではプログラムです。

コードはコチラになります。

#include <stdio.h>
int main(){
int a,b,quotient; //被除数、除数、商
int pos=0; //配列の位置
int res; //剰余
//商を格納する配列。整数の分もあるので21個のサイズ
int quo[21]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//整数データをキー入力する
printf(“被除数(割られる数)=”);
scanf(“%d”,&a);
printf(“除数 (割る数)=”);
scanf(“%d”,&b);
printf(“\n%d ÷ %d の除算結果・・・(=^・^=)mm。。。\n”,a,b);
//除算を行う。剰余が0になるまで剰余を10倍して除算を繰り返す
do{
quotient=a/b;
res=a%b;
quo[pos]=quotient;
pos++;
a=res*10;
}while(res!=0 && pos<=21); //演算結果を表示する for(int i=0;i<=pos-1;i++){ if(i==1){ printf(“.”); } if(i>=2 && (quo[i-1]==quo[i])){
printf(“…”);} //小数点第2位以降、同じ剰余が出現の循環小数を「…」表示
else {
printf(“%d”,quo[i]);
}
}
return 0;
}

ご精読ありがとうございました。
制限時間があったとしたら、2時間かかってしまってオーバーだと思うので、もっと早く作れるように頑張ります。

また、FEの試験勉強中はアルゴリズム対策としてこちらの本を使っていました。

迷ったららこれ。

実際に作ってみたい人はこっちも。
JavaとC言語(読者特典のダウンロード)

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

C言語で芸能人のBMIを求めてみた

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

この記事は
・武田真治さん
・内山信二さん(あっぱれさんま大先生の内山くん)
・京本大我さん(SixTONES。ストーンズと読む)
のファンの方、TVで見たことがある方、プログラミングに興味のある方、
ダイエットしなきゃと思っている方に
もしかしたらお役立て出来るかもしれません。

以前JavaでBMIを求めるプログラムを作ってみました。
この時は関数や引数についてイマイチ理解していなかった時。
その後たっぷり勉強頑張って、今度はC言語でリメイクして見ました。

BMIの計算式は、体重(kg)÷身長の二乗(m2)です。
18.5より小さかったら痩せすぎ、25までだったら普通、それ以上はめたぼっちです。

BMIが高い芸能人の方から順にプログラミングを実行していきます。

内山信二さんの身長と体重を入力します。
参考HP

次に武田真治さんのBMIを求めます。
参考HP

武田真治さんと言えば男も惚れる美ボディーです。
彼の筋肉美に嫉妬したのか、コロナとインフルエンザの感染についていろいろと憶測されていた方もいらっしゃったようですが、
それはこちらのサイトをご覧下さい。
参考HP
武田さんに対してそういうことを言っている方は、もっと身体を鍛えましょうよ!!

最後にSixTONESの京本大我さんのBMIを求めます。
私と同年代のオジサン、オバサンたち、SixTONESと書いて「シックストーンズ」と読んだら、若い子に笑われます。
「ストーンズ」と読みます。
参考HP

プログラムはコチラになります。

条件分岐の関数hantei

main関数

コードはコチラになります。

#include <stdio.h>
#include <math.h>

void hantei(double bmi){
char *msg[50];
if(bmi<18.5){
*msg=”いっぱいご飯を食べようね(=^・^=)”;
}
else if(bmi<25.0){
*msg=”その調子(^^♪”;
}
else{
*msg=”脱!めたぼっち( ;∀;) 腰痛に気を付けてねm(=^・^=)m”;
}
printf(“%s”,*msg);
}

int main(void){
char buf[100];
char yourname[20];
double high,weight,h2,bmi;
printf(“あなたのお名前は?= “);
fgets(buf,sizeof(buf),stdin);
sscanf(buf,”%s”,yourname);
printf(“%sさんの身長は?(例189.4)= “,yourname);
scanf(“%lf”,&high);
high/=100;
printf(“%sさんの体重は(例65.8)= “,yourname);
scanf(“%lf”,&weight);
h2=pow(high,2.0);
bmi=weight/h2;
printf(“%sさんのBMIは、%0.1fです。”,yourname,bmi);
hantei(bmi);
}

C言語参考サイト
【C言語入門】pow関数でべき乗計算(累乗、二乗、ルート、平方根)
【C言語】printf文で桁数指定をする方法

最後まで読んで下さってありがとうございました。
愛しています(=^・^=)

参考図書
基本情報技術者試験のアルゴリズムでお世話になった本

C言語の入門講座を終えた今のインプット本
基本情報技術者試験の復習にもなります。
C言語を使ってコンピュータの仕組みが理解出来る実験プログラムがあり、
50の実験がそれぞれ独立しているので、短編小説を読んでいる様に読めてコードを入力して動作させています。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

C言語 ドラえもんキャラの点数をバブルソートで並び替え(降順)を作ってみた。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

おはこんばんにちは!!!
うにゃうにゃエンジニアの猫です(=^・^=)mm

バブルソートを使って、スネ夫、のび太、出木杉くん、ジャイアン、しずかちゃんの点数を高い方から(降順)バブルソートを使って並び替えます。
バブルソートは配列の後ろから前後の値を見比べて必要であれば交換して、先頭から値が決定していきます。

スネ夫72点、のび太0点、出木杉君100点、ジャイアン23点、しずかちゃん95点だとします。
最大値に並び替えると、100→95→72→23→0になります。
この最初に配列のインデックス0の所に出木杉君の100、次は1の位置にしずかちゃん、2の位置にスネ夫君…と決定する位置は移っていきます。
この決定位置を表す変数を「kime」とします。

降順のバブルソートの場合、「72,0,100,23,95」は、後ろの95点と23点を比べて、大きい方が前になるように交換していきます。
比較の為に見ている位置は後ろから前に向かっていきます。
この見ている所を変数「mite」とします。

また、値を交換する為の作業領域をtmpとします。

では、実行結果です。

点線の上が並び替える前の配列の状態、下がバブルソートで降順にソートをした後の配列の状態です。

プログラムはこちらになります。

並び替え関数Narabikae

表示関数Hyouji

main関数

コードはコチラです。

#include <stdio.h>
//点数を並び替える
void Narabekae(int score[]){
int kime; //配列の先頭からの確定位置
int mite; //後ろから前へ向かって見ているインデックス
int tmp; //入れ替えの為の作業領域
for(kime=0;kime<5;kime++){ for(mite=4;mite>kime;mite–){
if(score[mite]>score[mite-1]){ //「>」の向きを返ると昇順
tmp=score[mite];
score[mite]=score[mite-1];
score[mite-1]=tmp;
}
}
}
}
//点数を表示する
void Hyouji(int score[]){
printf(“————————————\n”);
for(int i=0;i<5;i++){
printf(“[%d点] “,score[i]);
}
printf(“\n”);
}
int main(){
//スネ夫、のび太、出木杉、ジャイアン、しずかの点数の配列
int score[]={72,0,100,23,95};
Hyouji(score);
Narabekae(score);
Hyouji(score);
}

参考図書
基本情報技術者試験のアルゴリズムでお世話になった本

C言語の入門講座を終えた今のインプット本
基本情報技術者試験の復習にもなります。
C言語を使ってコンピュータの仕組みが理解出来る実験プログラムがあり、
50の実験がそれぞれ独立しているので、短編小説を読んでいる様に読めてコードを入力して動作させています。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

最後まで読んで下さってありがとうございました。
愛しています(=^・^=)mm

C言語で最大値最小値(ドラえもんキャラのテストの点数)を求めてみた。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

おはこんばんにちは!!!
うにゃうにゃエンジニアの猫です(=^・^=)mm

国民的アニメ「ドラえもん」のキャラクターの点数を使って、最大値(出木杉君の点数。最高点)と、最小値(のび太くんの点数。最低点)を求めてみます。

点数は「スネ夫、のび太、出木杉くん、ジャイアン、しずかちゃん」の点数の順番で配列 int score[]={72,0,100,23,95};を使います。

関数Dekisugiで最高点を求めます。
仮の最高点を先頭のスネ夫の点数にして、その点数より大きい点数があれば仮の最高点Maxを更新します。

関数Nobitaで最低点を求めます。
仮の最低点を先頭のスネ夫の点数にして、その点数より小さい点数があれば仮の最低点Minを更新します。

関数Dekisugiと、Nobitaは、main関数から呼び出します。
それらの関数内で表示も行っているので戻り値はありません。

引数として、main関数で定義した5人の点数の配列を渡します。

では、実行結果です。

プログラムはこちらになります。

関数Dekisugi

関数Nobita

main関数

コードはコチラです。

#include <stdio.h>
//最高点を求めて表示する関数Dekisugi
void Dekisugi(int score[]){
int Max=score[0];
for(int i=1;i<5;i++){ if(score[i]>Max){
Max=score[i];
}
}
printf(“最高点:%d点!!さすがだね!!\n”,Max);
}
//最低点を求めて表示する関数Nobita
void Nobita(int score[]){
int Min=score[0];
for(int i=1;i<5;i++){
if(score[i]<Min){ //ここを変更すると最小値を求める処理になる
Min=score[i];
}
}
printf(“最低点:%d点( ;∀;) 裏山に隠そう・・・。\n”,Min);
}
int main(){
//スネ夫、のび太、出木杉、ジャイアン、しずかの点数の配列
int score[]={72,0,100,23,95};
Dekisugi(score);
Nobita(score);
}

最後まで読んで下さってありがとうございました。
愛しています(=^・^=)mm

参考図書
基本情報技術者試験のアルゴリズムでお世話になった本


C言語の入門講座を終えた今のインプット本
基本情報技術者試験の復習にもなります。
C言語を使ってコンピュータの仕組みが理解出来る実験プログラムがあり、
50の実験がそれぞれ独立しているので、短編小説を読んでいる様に読めてコードを入力して動作させています。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

C言語 二重ループ市松模様を作ってみた。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

おはこんばんにちは!!!
うにゃうにゃエンジニアの猫です(=^・^=)mm

今年2021年、新型コロナウイルスで延期になったオリンピックはどうなることやらですが、
C言語で市松模様を作ってみたいと思います。
市松模様は互い違いに色が塗ってある模様なので、多重ループ(二重ループ)を使って表します。

簡単に図を書来ます。

この図を見ると、ある規則に気づきました。
色が塗ってあるところは、i=0ではj=0,2,4,6,8…
と、iが偶数の所ではjも偶数になっていて、
i=1では色が塗ってあるjはj=1,3,5,7と基数になっています。

つまり、iとj共に偶数 または iとj共に奇数 だったら塗る、
そうでなければ白ということになります。

剰余演算子を使っています。%で表すと、
偶数でしたら%2であまりがゼロ、基数でしたら%2であまりが1です。

これをC言語で書く場合は、
「i%2==0 AND j%2==0」OR 「i%2==1 AND j%2==1」
なので、ANDを&&、ORを||と書いて、

「(i%2==0 && j%2==0) || (i%2==1 && j%2==1))」

になります。
この条件が当てはまる所を■、当てはまらない所を□としてコードを組んでみました。

実行してみると、このようになりました。

プログラムはコチラになります。

#include <stdio.h>
void ichimatsu(int i,int j){
if((i%2==0 && j%2==0) || (i%2==1 && j%2==1)){
printf(“■”);
}else{
printf(“□”);
}
}
int main(void){
for(int i=0;i<10;i++){
for(int j=0;j<20;j++){
ichimatsu(i,j);
}
printf(“\n”);
}
}

最後まで読んで下さってありがとうございました。
愛してます(=^・^=)mm

参考図書
基本情報技術者試験のアルゴリズムでお世話になった本

C言語の入門講座を終えた今のインプット本
基本情報技術者試験の復習にもなります。
C言語を使ってコンピュータの仕組みが理解出来る実験プログラムがあり、
50の実験がそれぞれ独立しているので、短編小説を読んでいる様に読めてコードを入力して動作させています。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

C言語構造体連結リストで東京-新潟間上越新幹線駅名を表示

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

おはこんばんにちは!
うにゃうにゃエンジニアの猫です(=^・^=)

C言語のラスボス??でしょうか。構造体とかポインタ、

連結リストをやり始めて( ;∀;)です。
そこで、好きな女優・グラビア・モデルで活躍する馬場ふみかさんのご出身の新潟から東京までの駅名を使った、上越新幹線のリストを作って勉強しようと思います。

私が東京から新潟に遊びに行くイメージで作ります。
上越新幹線の駅名を6つ選びました。

駅名、ポインタ(次の駅を指し示す)を構造体で定義します。
まずは上越新幹線がの駅を調べてみます。

1.東京
2.大宮
3.高崎
4.浦佐
5.燕三条
6.新潟

上越新幹線の路線はコチラから

この6つの駅に次の駅の場所を示すポインタを付けて表示して見ます。
このリストは駅名と次の駅のポインタがこのような図で表せます。

ポインタを逆向きにすると、新潟から東京に帰る駅の順番で逆向きに表示できます。

ではC言語でコードを書いて実行してみます。

実行結果です。

最後にコードはこのようになります。

最後までご覧頂きありがとうございました。
引き続きC言語の最後のレッスンを頑張ります。
もしも分からなくなったら、前に戻って勉強します(=^・^=)mm

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

C言語で日数計算と曜日求め

メインメニューへ
C言語環境設定からHelloWorldまで
これからプログラミングをはじめる方へ
基本情報技術者試験トップ
自己紹介
息抜きに、写真で癒し

おはこんばんにちは!
うにゃうにゃエンジニアの猫です(=^・^=)

今日はC言語で、ある日付から別の日付まで何日あるのかカウントするプログラムと、
それを利用して曜日を求めるプログラムを作ってみました。
良かったら使って下さいにゃっ!

その年の1月1日からの日数を計算します。
それには月ごとの日数の配列を作って利用しています。
例えば1月だったら+0、2月だったら+31…と加算日数が配列に入っています。
C言語は配列の要素が0から始まる為、配列の先頭の要素はダミーとして0が入っています。

開始日と終了日を年、月、日ごとに入力して、開始日が3月より前だったら、または終了日が3月以降だったら、
閏(うるう)年かどうか調べて、閏年だったら日付を1つ増やすように計算します。

開始日と終了日の年の差×365とうるう年の調整をして日数を求めました。
では実行して見ます。

今日は2021年(令和3年)1月23日です。
1年前の2020年1月23日までの日数を求めます。
2020年はうるう年で、2月29日が含まれるので、その分加算され、365+1で366日になります。

では、私が生れた1977年5月19日から今日までの日数を調べます。

うわぁぁぁ、こんなに生きているんだ。もっと1日1日丁寧に生きないと!!

ここまでのプログラミングのコードです。

#include <stdio.h>
//ここで引き算している
int hikizan(int start,int goal){
return goal-start;
}


//うるう年かどうかの判定をしている
int isLeapYear(int uruyear){
if((uruyear%4==0 && uruyear%100!=0) || uruyear%400==0){
return 1;
}else{
return 0;
}
}

int main(void)
{
//日付の開始日、終了日の変数
int yearstart,yeargoal,yeardif; //開始年、終了年、終了年-開始年
int monthstart,monthgoal; //開始月、終了月
int daystart,daygoal; //開始日付け、終了日付け
int uruFlg; //うるう年の判定フラグ
int count=0; //うるう年の回数
//月の配列。その年の1月1日からの日数
int tukihi[]={0,0,31,59,90,120,151,181,212,243,273,304,334};

//開始日の入力
printf(“開始日の年を入力してください。開始の年:yearstart=”);
scanf(“%d”,&yearstart);
printf(“開始日の月を入力してください。開始の月:monthstart=”);
scanf(“%d”,&monthstart);
printf(“開始日の日を入力してください。開始の日:daystart=”);
scanf(“%d”,&daystart);
printf(“——————————————-\n”);

//終了日の入力
printf(“終了日の年を入力してください。\n※開始日以降の日付を入力してください※\n終了の年:yeargoal=”);
scanf(“%d”,&yeargoal);
printf(“終了日の月を入力してください。終了の月:monthgoal=”);
scanf(“%d”,&monthgoal);
printf(“終了日の日を入力してください。終了の日:daygoal=”);
scanf(“%d”,&daygoal);

//もしも開始日>終了日だったら
if(daystart>daygoal){
printf(“終了日を開始日以降の日付にしてやり直して下さい。\n”);
return 0;
}
printf(“\n”);

//その年の1月1日からの日数
daystart+=tukihi[monthstart];
daygoal+=tukihi[monthgoal];

//開始年と終了年の差は何年あるか
yeardif=hikizan(yearstart,yeargoal);
//開始日の月が3月より前だったらその年が閏(うるう)年かチェックする
if(monthstart<3){ uruFlg=isLeapYear(yearstart); if(uruFlg==1){ daystart–; } }


//終了日の月が3月以降だったらその年が閏(うるう)年かチェックして、前の年の判定の順準備をする if(monthgoal>=3){
uruFlg=isLeapYear(yeargoal);
if(uruFlg==1){
daygoal++;
}
}
yeargoal–; //終了日の前年のうるう年判定をする準備

//終了日の前年から開始日の年までうるう年か調べる
for(int i=yeargoal;yeargoal>yearstart;yeargoal–)
{
uruFlg=isLeapYear(yeargoal);
if(uruFlg==1){
count++;
}
}
daygoal+=365*yeardif+count-daystart; //日数計算
printf(“%d日です。\n”,daygoal);
}

では、上のプログラムを利用して、曜日を求めてみます。
基準日は1970年1月1日とします。その日は木曜日なので、日数差を7で割った余りが0なら木曜日、
1なら金曜日…と配列に入力して曜日を調べます。


今日2021年1月23日は土曜日ですので、ちゃんと求まりました。

では、馬場ふみかさんが生れた1995年(平成7年)6月21日は何曜日か調べます。


水曜日ですね。

良かったちゃんと動いていた。
では、このプログラムのコードです。


#include <stdio.h>
//ここで引き算している
int hikizan(int start,int goal){
return goal-start;
}


//うるう年かどうかの判定をしている
int isLeapYear(int uruyear){
if((uruyear%4==0 && uruyear%100!=0) || uruyear%400==0){
return 1;
}else{
return 0;
}
}

//曜日を求める
int youbihantei(int nanyou){
return nanyou%7;
}
int main(void)
{

//日付の開始日、終了日の変数
int yearstart,yeargoal,yeardif; //開始年、終了年、終了年-開始年
int monthstart,monthgoal; //開始月、終了月
int daystart,daygoal; //開始日付け、終了日付け
int uruFlg; //うるう年の判定フラグ
int count=0; //うるう年の回数
int week; //曜日を表す配列の添え字

//月の配列
int tukihi[]={0,0,31,59,90,120,151,181,212,243,273,304,334};

//開始日(基準の日を1970年1月1日とする)
yearstart=1970;
monthstart=1;
daystart=1;

//曜日の配列。基準日との日数差を7で割った余りが0になるのが木曜日
char youbi[]={“木”,”金”,”土”,”日”,”月”,”火”,”水”};

printf(“年を入力してください。年:yeargoal=”); scanf(“%d”,&yeargoal); printf(“月を入力してください。月:monthgoal=”); scanf(“%d”,&monthgoal);
printf(“日を入力してください。日:daysgoal=”);
scanf(“%d”,&daygoal); printf(“\n”); //その年の1月1日からの日数 daygoal+=tukihi[monthgoal]; //開始年と終了年の差 yeardif=hikizan(yearstart,yeargoal); //終了日の月が3月以降だったらその

年が閏(うるう)年かチェックする if(monthgoal>=3){ uruFlg=isLeapYear(yeargoal); if(uruFlg==1){ daygoal++; } } yeargoal–; //終了日の前年から1971年までうるう年か調べる for(int i=yeargoal;yeargoal>yearstart;yeargoal–) { uruFlg=isLeapYear(yeargoal); if(uruFlg==1){ count++; } } daygoal+=365yeardif+count-daystart;
week=youbihantei(daygoal);

if(yeargoal<1970){
printf(“1970年1月1日以降の日付を入力してください。\n”);
}else{
printf(“%s曜日です。\n”,youbi[week]);
}
}

ご精読ありがとうございました(=^・^=)mm

メインメニューへ
C言語環境設定からHelloWorldまで
これからプログラミングをはじめる方へ
基本情報技術者試験トップ
自己紹介
息抜きに、写真で癒し