平成21春 問12 アセンブラ のプログラミング(コメント付き)

この記事では、過去問のアセンブラの問題に載っているプログラムを実際に自分の環境で作成して動かすのに使ったコードと、トレースのノートを掲載しています。
この記事を通してアセンブラだけでなくアルゴリズムのトレース力向上にもお役立て下さい。

アセンブラ過去問プログラミング
アセンブラ自作サンプルへ
基本情報技術者試験トップへ
令和2年度(令和3年1月合格報告)

基本情報技術者試験がコロナで中止や延期になり、中々プログラミングのスキルも身に付かずに悶々としていたので、思い切って過去問を頼りにプログラミングをして見ることにしました。第一回は平成21年春の問題です。

プログラムMULSは、被乗数(かけ「られる」数)32ビットと、乗数(かける数)16ビットの計算をして、その結果である積32ビットを返します。
被乗数と乗数のどっちがどっちか分からなくなりそうなので、被乗数のラベルをかけ「られる」数から、RARERU、乗数をKERU、積をSEKIと名付けてプログラミングしました。GR1にはRARERUの先頭アドレス、GR2にはRERUそのもの、GR3にはSEKIの先頭アドレスを設定しています。

具体例として、被乗数RARERUの上位語には16進数で「2」、下位語には16進数で「6」、乗数KERUには16進数「3」とします。
プログラミングの名前はH21SMULSとします。

プログラミングは下記になります。
シミュレーターと過去問を解くまでの勉強に使った参考書はこちらです

<<プログラミング>>
H21SMULS START
RPUSH
LAD GR1,RARERU ;かけ「られる」数の先頭アドレスをGR1
LD GR2,KERU ;かける数自体をGR2
LAD GR3,SEKI ;積の先頭アドレスをGR3
LAD GR6,0 ;積 上位語の初期化
LAD GR7,0 ;積 下位語の初期化
LD GR4,0,GR1 ;被乗数 上位語の取出し
LD GR5,1,GR1 ;被乗数 下位語の取出し
LP SRL GR2,1 ;乗数を1ビット右にシフト
JOV ADD32 ;「a」最下位桁がゼロかどうかで分岐する
JZE FIN ;全部乗数が0だったら押しマシ
JUMP NEXT ;加算処理をスキップ(下位桁が0だった場合)
ADD32 ADDL GR6,GR4 ;被乗数の上位語を足す
ADDL GR7,GR5 ;被乗数の下位語を足す
JOV ADJ1 ;「b」下位語の加算で桁上りした場合に分岐
JUMP NEXT ;下位語の桁上げが無いので桁上げ処理をスキップ
ADJ1 ADDL GR6,=1 ;桁上げ処理(下位桁オーバーフローで上位桁へ)
NEXT SLL GR4,1 ;被乗数の上位語を1ビット左にシフト
SLL GR5,1 ;「c」被乗数の下位語を1ビット左にシフト
JOV ADJ32 ;左シフトによって桁上りした下位語の分を上位語へ
JUMP LP ;次の計算処理へ
ADJ32 OR GR4,=1 ;上位語に下位語からの桁上りを足しこむ
JUMP LP ;次の計算処理へ
FIN ST GR6,0,GR3 ;乗算結果(上位語)の格納
ST GR7,1,GR3 ;乗算結果(下位語)の格納
RPOP
RET
RARERU DC #2
DC #6
KERU DC #3
SEKI DS 2
END

それでは動かして見ます。


GR1、GR2、GR3にそれぞれ被乗数先頭アドレス、乗数、積の先頭アドレスが入り、
GR4に被乗数の上位語、GR5に被乗数の下位語、GR6、GR7に積の値のゼロによる初期化が入りました。

ループ1回目
GR2が1ビット右シフトしました。また、OFが1なので、オーバーフローしました。

GR6、GR7に被乗数の上位語下位語が足されました。

GR4、GR5に被乗数が左に1ビットされて2倍になりました。

ループ2回目

GR2に乗数が右に1ビットされ、OF、ZFが1になりました。

GR6、GR7に被乗数の上位語下位語とシフトした分が足されました。

GR4、GR5に被乗数が左に1ビットされて2倍になりました。

ループ3回目
ゼロフラグが1になりました。

では次に、プログラム2のMULを作ります。
名前をH21SMULにします。

プログラムMULは、被乗数(かけ「られる」数)32ビットと、乗数(かける数)32ビットの計算をして、その結果である積32ビットを返します。
被乗数のラベルをかけ「られる」数から、RARERU2、
乗数をKERU2、積をSEKI2と名付けてプログラミングしました。
GR1にはRARERU2の先頭アドレス、GR2にはRERU2の先頭アドレス、GR3にはSEKI2の先頭アドレスを設定しています。
また、領域SVは、計算結果の退避につかいます。

具体例として、被乗数RARERU2の上位語には16進数で「2」、下位語には16進数で「6」、乗数KERU2には上位語「3」、下位語「5」とします。
プログラミングの名前はH21SMULとします。

プログラミングは下記になります。
先ほどのH21SMULSを副プログラムとして呼び出して使用します。
その際の渡す値は主プログラムから渡されるので、副プログラムの方は消しました。

<<プログラミング>>
H21SMUL START
RPUSH
LAD GR1,RARERU2 ;かけ「られる」数の先頭アドレスをGR1
LAD GR2,KERU2 ;かける数自体をGR2
LAD GR3,SEKI2 ;積の先頭アドレスをGR3
PUSH 0,GR3 ;積の上位語のアドレスをスタックに積む
PUSH 0,GR2 ;乗数の上位語のアドレスをスタックに積む
LD GR2,1,GR2 ;乗数の下位語を読み込む
CALL H21SMULS ;プログラム1を呼ぶ 被乗数×乗数下位語→積A
POP GR2 ;スタックから乗数の先頭アドレスを取り出す
LD GR2,0,GR2 ;「d」乗数の上位語を読み込む
LAD GR3,SV ;結果(積B)の格納先として作業領域SVの先頭アドレスを設定
CALL H21SMULS ;プログラム1を呼ぶ 被乗数×乗数上位語→積B
LD GR6,1,GR3 ;「e」積Bの下位語であるSV+1の値を読み込む
POP GR3 ;積Aの上位語のアドレスを取り出す
ADDL GR6,0,GR3 ;積Aの上位語と積Bの下位語を加算
ST GR6,0,GR3 ;加算結果をGR3に格納
RPOP
RET
SV DS 2 ;積Bの2語分(結果退避用)
RARERU2 DC #2 ;被乗数(かけられる数)上位語
DC #6 ;被乗数(かけられる数)下位語
KERU2 DC #3 ;乗数(かける数)上位語
DC #5 ;乗数(かける数)下位語
SEKI2 DS 2 ;積の2語分


H21SMULS
RPUSH
LAD GR6,0 ;積 上位語の初期化
LAD GR7,0 ;積 下位語の初期化
LD GR4,0,GR1 ;被乗数 上位語の取出し
LD GR5,1,GR1 ;被乗数 下位語の取出し
LP SRL GR2,1 ;乗数を1ビット右にシフト
JOV ADD32 ;「a」最下位桁がゼロかどうかで分岐する
JZE FIN ;全部乗数が0だったら押しマシ
JUMP NEXT ;加算処理をスキップ(下位桁が0だった場合)
ADD32 ADDL GR6,GR4 ;被乗数の上位語を足す
ADDL GR7,GR5 ;被乗数の下位語を足す
JOV ADJ1 ;「b」下位語の加算で桁上りした場合に分岐
JUMP NEXT ;下位語の桁上げが無いので桁上げ処理をスキップ
ADJ1 ADDL GR6,=1 ;桁上げ処理(下位桁オーバーフローで上位桁へ)
NEXT SLL GR4,1 ;被乗数の上位語を1ビット左にシフト
SLL GR5,1 ;「c」被乗数の下位語を1ビット左にシフト
JOV ADJ32 ;左シフトによって桁上りした下位語の分を上位語へ
JUMP LP ;次の計算処理へ
ADJ32 OR GR4,=1 ;上位語に下位語からの桁上りを足しこむ
JUMP LP ;次の計算処理へ
FIN ST GR6,0,GR3 ;乗算結果(上位語)の格納
ST GR7,1,GR3 ;乗算結果(下位語)の格納
RPOP
RET
END

それでは動かして見ます。
GR1、GR2、GR3にそれぞれ被乗数、乗数、積のアドレスが入りました。

スタックにGR3、GR2にそれぞれ設定したアドレスが積まれました。

GR2に乗数(かける数)の下位語である「5」が入りました。

副プログラムMULSを呼び出しました。

GR6、GR7が積の計算結果の初期化されました。

GR4、GR5に被乗数の上位語、下位語が入りました。

下位語積Aのループ1回目
GR2に乗数かける数が右シフトされました。

GR6、GR7に、計算結果が加算されました。

GR4、GR5で被乗数かけられる数の上位語、下位語が左シフトされました。

下位語積Aのループ2回目

GR2が右シフトされました。
下位桁が0なので、加算はスキップします。

GR4、GR5が左シフトされました。

下位語積Aのループ3回目
GR2で乗数が右シフトしました。
オーバーフローしたので、下位桁が1です。

GR6、GR7で、積の計算結果に加算されました。

GR4、GR5で被乗数(かけられる数)をシフトします。

呼び出し元に戻ります。
GR2に、乗数(かける数)の上位語(先頭)アドレスが入ります。

GR2に乗数の上位語が入ります。

GR3に計算結果退避領域の先頭アドレスが入ります。

副プログラムが呼び出されました。

以下、重複はなるべく避けてトレースします。

上位語積Bのループ1回目

乗数が右シフトされました。


計算結果が加算されました。

被乗数が左シフトされました。

上位語積Bのループ2回目
乗数が右シフトされました。

計算結果に足しこまれました。

被乗数が左シフトされました。

呼び出し元に戻りました。

GR6にGR3(積Bの計算結果)の下位語が入りました。

GR3にSEKI2の先頭アドレス(積Aの計算結果上位語を指す)が入りました。

GR6に演算結果が求められました。

では、トレースに使ったノートです。

シミュレーターと過去問を解くまでの勉強に使った参考書はこちらです

アセンブラ過去問プログラミング
アセンブラ自作サンプルへ
基本情報技術者試験トップへ
息抜きに、写真で癒し(=^・^=)

C言語 文字コードで相性占い

子どもの頃、電卓を使って好きな子との相性を占いする遊びをしました。
「あ」が「1」、「い」が「2」・・・・というふうに50音と対応する数字を割り当てて、それを2り続けて行って、最初に100以下になった所が好きな人と自分との相性という、相性占いの遊びです。

これ、やったことある人いますか??

では、それをC言語を使って、文字コードでやってみたいと思います。
太郎さんの「T」、花子さんの「H」でやってみます。
標準入力する時は、「T,H」と入力します。
シフトJISコードの文字コードは、「A」を41、「B」を42・・・・として16進数で割り当てていきます。
太郎さんの「T」は「54」、花子さんの「H」は「48」です。
それを足すと「9C」になり、それを10進数で表すと「156」です。
この数字を2で割って行って、最初に100%以下になる所の数字を相性診断に使います。

こちらが太郎さんと花子さんの相性です。

では、プログラムになります。

#include <stdio.h>
int main(){


//イニシャルの文字コード用
char yourname;
char oaite;
int sum;
double aishou;

//あなたのイニシャルの文字コード
printf(“あなたのイニシャルとお相手のイニシャルを\n[,]で区切って入力してください\n例:A,B—>”);
scanf(“%c,%c”,&yourname,&oaite);

//あなたのイニシャルの文字と文字コードを表示する
printf(“あなたのイニシャル[%c]の文字コードは[%02X]です。\n\n”,yourname,yourname);

//お相手のイニシャルの文字と文字コードを表示する
printf(“お相手のイニシャル[%c]の文字コードは[%02X]です。\n\n”,oaite,oaite);

//2人のイニシャルの文字コードの合計
sum=yourname+oaite;
printf(“合算値は16進数で[%02X]で、10進数で[%d]です。\n”,sum,sum);

//相性診断
printf(“2人の相性を計算します。\n”);
aishou=sum;
while(aishou>100){
aishou/=2;
}
printf(“2人の相性は、[%.2f]パーセントです!!お幸せに!\n”,aishou);
return 0;
}

このプログラムを作るのに参考にした本です。

風呂グラミング(入浴剤紹介)

メインメニューへ
これからプログラミングをはじめる方へ
プログラミングと資格
自己紹介

この記事で紹介している入浴剤は

・入浴剤にはちょっとこだわりたい方
・頑張っている人のご褒美
・自粛疲れのリフレッシュ
・受験生
・プログラマー

に向けて、オススメ入浴剤を紹介しています。



プログラミングをやっていて困りごとは、エラーが出ること、そして、アイディアが浮かぶ時と浮かばない時があることです。
煮詰まった時には私はお風呂に入ります。

本当はパソコンを持って日本全国の温泉旅館に泊まってプログラミングと写真漬けの日々を過ごしたいのですが、流石に現実的ではありません。
では、どうしたらそれに近いことが出来るのか考えたところ、ネットで入浴剤を購入することに致しました。

プログラミングを快適に行うには健康である必要がある。
健康には風呂が大事。リラックス出来る。

という訳で、入浴剤を紹介します。

まずはこれ。

■ 北見ハッカ通商 入浴剤Sel de Menthe(セル・デ・メンタ) ■

風呂の色はマイルドでミルキーなブルーです。
ハッカの香りもマイルドなので、10月に入って肌寒くなった今の時期にも
ゆっくり温まりながらリフレッシュできます。
気分爽快なので、これはプログラマだけでなく、受験生にもおススメします(=^・^=)

この入浴剤で、北見ハッカ通商さんのファンになりました。
ハッカ油や馬油(ミントクリーム)などをこちらのページで紹介しています。
ハッカ愛からハッカー!?

続いては、本格的な入浴剤!!
■ アース製薬 温素 柚子の香り 15包 入浴剤 ■

アルカリ性のお湯でお湯の色は無色透明です。
入浴中はゆずの柔らかい香りに癒され、入力後は身体がポカポカします。
特に寒い冬の時期、冷え性、肩コリに悩む方におススメ。
アルカリ性のお湯なので、ヌルヌルっとした感じが少しあり、
湯上りはお肌が滑らかです。
プログラマは勿論、働く女性の頑張ったご褒美にも良いのかも。

■ アース製薬 アルカリ温泉成分 温素 琥珀の湯(とろさら美肌湯)600グラム ■

※浴槽がやや滑りやすくなります。
琥珀色のお湯で、植物がたっぷり入った和漢の上品な甘さのある香りがします。
トロっとした感じのアルカリ性のお湯です。
疲労回復の効果があります。
睡眠のことで悩んでいる方におススメのお風呂です。

メインメニューへ
これからプログラミングをはじめる方へ
プログラマこそストレッチ(子ども&大人向け)
自己紹介

C言語で芸能人の結婚について心の準備をしておく

石原さとみさんが一般男性の方と結婚しましたね。
私はそのことを知って、「おめでとう」、「お幸せに!!」って思います。

すみません、完全に他人ごとですよね。
もしも私が応援している推しが結婚したらどうしよう、って思ってファンとして心の準備することにいたしました。

早速、C言語を使って心の準備を致します。

配列jyunbiは5個の要素を持つchar型配列です。
要素は[0]-[4]です。この5つの中に、推しがもしも結婚したらファンとしてどうやって心の準備をしようか、
そのストックを入れます。

そして、ループで要素0から5未満(4まで)を取り出して表示させました。

実行結果です。

プログラムです。

#include <stdio.h>
int main(){


char *jyunbi[5]; //心の準備のストック用配列
//配列に準備しておくことを格納する
jyunbi[0]=”そのお相手にはプレッシャーがかかる”;
jyunbi[1]=”ファンを敵に回すかも!?”;
jyunbi[2]=”家にある推しの写真はワガハイのものにゃ”;
jyunbi[3]=”その写真を使って妄想できる”;
jyunbi[4]=”妄想をこれでもかってぐらいに爆発させる!!”;

//ループで配列の要素を取り出して表示させる
for(int i=0;i<5;i++){
printf(“%d.%s\n”,i+1,jyunbi[i]);
}

}

C言語を学んでいる方にはお子さまもいるので表現はだいぶ気を付けました。
というか抑えました。
う~~~~ん、これぐらいだったら大丈夫かな??

推しの方、いつもお世話になっております。
本当にありがとうございます。
具体的に何でお世話になっているかと申しますと、仕事しながらプログラミングや資格の勉強は、好きでやっていることとは言え集中力がぐらつくことがあります。
そういう時に好きな芸能人の方って本当に支えになるなって思うんです。

今まで体調を崩したりで勉強しか取り柄が無い私が勉強出来ずに困っていたこともあるので、自分の人生の残りの時間を全て投じてでも後れを取り戻します!!
何かお礼出来ることがあれば良いのですが、色々可能性を考えながら恩返ししたいです。

C言語メモ(設定編)

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

C言語のエディタで、Visual Studio Codeを入れたのですが、字が小さくて、老眼が入っている身にはシンドイとおもっていました。
どこでズーム出来るんだろうと悩んでいた所、左下の歯車マークをクリックして、
Setting、Commonly Usedの真ん中へんでFont Sizeの所を20にした所、老眼でも読める様になりました( ;∀;)

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

C言語メモ(エラー編)

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

C言語を始めて早速エラーのお祭りが到来しましたので、それを書き留めておこうと思います。

エディタ、コンパイラ、パスを通すといった設定を終えて初めてのhello world。
しかしdirコマンドでファイルはあるのに何故かコンパイラする時にエラーになってしまう…。
ファイルが無い?無いはずないじゃん( ;∀;)と思って、パスを通すのが出来て無かったのかも…。などと悩んでいたら、

は!!
英語力!!
の問題でした。

皆さん、間違い探しです。

Hello World
Hallo World

そりゃ、ファイルも無い訳だ。

C言語と言えば#include
これも間違い探しです。

#include <stdio.h>
#include <studio.h>

あとは、IF文の文法ミス。
もしもフラグが1の時
if(flg==1){
処理
}
とすべきところを
if(flg=1){
処理
}
としてしまいました。
なんでflgが2の時の処理が出来ないの!!って、そりゃそうだ。

代入じゃん!!
これじゃあ永遠に2の時の処理にならないって。

この記事では私がやらかした、マヌケなエラーについて書き留めます。

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

プログラマこそストレッチ!(子ども向けと大人向け)

メインメニューへ
これからプログラミングをはじめる方へ
プログラミングと資格
息抜きに(=^・^=)写真で癒し
自己紹介

2020年にプログラミング教育が始まってからますます大人も子供もプログラミングに熱中なのは良い事ですが、その一方で、座りっぱなしになり、腰に負担をかけてしまうこともあります。
今日は整体に行ってきました。そこでストレッチの話が出たので、YouTube動画を探して見ました。

私はラジオは東京FMを聴いていて、スイッチマンこと青山剛さんという方のことを知って、子ども向けのストレッチをやってみました。
背が伸びて足が速くなって頭も良くなるので、このストレッチをやったらキミは女の子にモテモテになるかも!?

主にこの2つの動画をやっています。

あと、今年のお盆休みに私はぎっくり腰をやってしまいました。そこで吉田先生という方のnoteと動画を見ています。

皆さま長時間座りっぱなしだと思うので、タイマーを付けて時々ストレッチやってみてください。
ぎっくり腰にはお気を付けて、快適にプログラミングを楽しんで下さい。
発達障害の過集中とも相まって座りっぱなしになりそうなので記事にしました。

プログラミングはデスクワークなので、私は40分間タイマーをかけて、ストレッチをして、腰痛の予防をしています。
一般的なキッチンタイマーですと、分をセットする時にもかなりの音が鳴りますので、私は学習用のタイマーを使って、時間になったらアラームが鳴るのみのタイマーを選びました。

プログラミングだけでなく、テレワークなどでデスクワークも増えていて腰に負担がかかるので、私は骨盤ベルトを利用しています。
「骨盤整隊カシャーン」というベルトで、巻き付けてマジックテープで止めて、両脇の調整ストラップをカシャーンと引っ張って、強力に骨盤を固定出来るので、プログラミング時の疲労が半減しました。

サイズはMとLがあります。

Mサイズ

Lサイズ

メインメニューへ
これからプログラミングをはじめる方へ
プログラミングと資格
息抜きに(=^・^=)写真で癒し
自己紹介

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

この記事を読むことによって、

・標準入力
・IFによる分岐
・Whileループ
・Forループ
・代入演算子-=


の理解が深まります。
また、C言語でのコードの後に、 Pythonのコードも追記致しました。
最後に参考書(C言語とPython)の紹介をさせて頂きます。

サイトマップはこちらから

C言語自作サンプル集へ
Python自作サンプル集へ
これからプログラミングを学ぶ方へ
基本情報技術者試験トップへ
自己紹介

新型コロナに便乗した詐欺師をやっつけるプログラムを作って行きます。
詐欺師の最初のHPは300です。
まずは、プレイヤーの勇者が詐欺師と戦う為に、武器を選ぶプログラムを書いて行きます。

勇者は武器を下記の2つの内から1つ選んで攻撃します。
1:「バズーカ砲」 2:「うんこ」
【バズーカ砲】の攻撃力は【20】で、【うんこ】の攻撃力は【40】です。

#include <stdio.h>

int main()
{

    //武器の番号
    int weapon_no;

    //武器の名称
    char *weapon;
    
    //武器の破壊力
    int attack;

    //武器を選択するコード
    printf("武器は何を使いますか?---> 1:バズーカ砲 2:うんこ\n");
    scanf("%d",&weapon_no);
    
    if(weapon_no==1){
        weapon="バズーカ砲";
        attack=20;
    }else{
        weapon="うんこ";
        attack=40;
    }
    
    printf("勇者が選んだ武器は【%s】で、攻撃力は【%d】です。",weapon,attack);
    
}


ここでは勇者が武器に「2」の:【うんこ】を選んで、1回の戦闘で詐欺師に【40】のダメージを与えられるという設定で進めて行きます。

ループのコードです。

#include <stdio.h>

int main()
{

    //武器の番号
    int weapon_no;

    //武器の名称
    char *weapon;
    
    //武器の破壊力
    int attack;

    //武器を選択するコード
    printf("武器は何を使いますか?---> 1:バズーカ砲 2:うんこ\n");
    scanf("%d",&weapon_no);
    
    if(weapon_no==1){
        weapon="バズーカ砲";
        attack=20;
    }else{
        weapon="うんこ";
        attack=40;
    }
    
    printf("勇者が選んだ武器は【%s】で、攻撃力は【%d】です。\n",weapon,attack);
    
    
    //詐欺師の初期のHP
    int SAGI_HP=300;
    
    //whileループで詐欺師の残りHPが150以上の条件で攻撃を行う
    while(SAGI_HP>=150){
        printf("詐欺師の残りHP:【%d】\n",SAGI_HP);
        printf("勇者は詐欺師に【%d】のダメージを与えた!!\n",attack);
        SAGI_HP-=attack; //ここで詐欺師のHPが減る演算子「-=」を使用
    }
    
}

詐欺師の残りHPが180になって、ループ内で40のダメージを受けてHPが140になるとwhileループの条件を満たさなくなって、ループを抜けます。
そこで勇者はお腹が減ったので、もぐもぐタイムで食事を摂ります。

もぐもぐタイムで食べられるのは、「1:もしもバーガー」で勇者の攻撃力が【50】になり、「2:ばななっとうパン」で攻撃力が【75】になります。

コードはこの様に追記します。

#include <stdio.h>

int main()
{

    //武器の番号
    int weapon_no;

    //武器の名称
    char *weapon;
    
    //武器の破壊力
    int attack;

    //武器を選択するコード
    printf("武器は何を使いますか?---> 1:バズーカ砲 2:うんこ\n");
    scanf("%d",&weapon_no);
    
    if(weapon_no==1){
        weapon="バズーカ砲";
        attack=20;
    }else{
        weapon="うんこ";
        attack=40;
    }
    
    printf("勇者が選んだ武器は【%s】で、攻撃力は【%d】です。\n",weapon,attack);
    
    
    //詐欺師の初期のHP
    int SAGI_HP=300;
    
    //whileループで詐欺師の残りHPが150以上の条件で攻撃を行う
    while(SAGI_HP>=150){
        printf("詐欺師の残りHP:【%d】\n",SAGI_HP);
        printf("勇者は詐欺師に【%d】のダメージを与えた!!\n",attack);
        SAGI_HP-=attack; //ここで詐欺師のHPが減る演算子「-=」を使用
    }
    printf("詐欺師は瀕死です!!でも、勇者も腹が減ったのでちょっと休む\n\n");
    printf("何食べる??--->1:もしもバーガー 2:ばななっとうパン\n");
    
    int food_no;//食べ物の番号
    char *food;//食べ物
    int powerup;//もぐもぐタイム後の勇者の攻撃力
    
    scanf("%d",&food_no);
    
    if(food_no==1){
        food="もしもバーガー";
        powerup=50;
    }else{
        food="ばななっとうパン";
        powerup=75;
    }
    
    printf("勇者は【%s】を食べて、攻撃力が【%d】にUPした!!",food,powerup);   
}

ここでは、勇者が「もしもバーガー」を選んで攻撃力が増したという設定で進めます。
勇者が休んでいた間、詐欺師も休んでいたので、HPが140から150に回復してしまいました。

では、戦闘再開です。今度はForループで詐欺師HPの初期値が150で、HPが0以上をループの条件にして、詐欺師をやっつけて世界に平和が戻るコードと実行結果を掲載します。

#include <stdio.h>

int main()
{

    //武器の番号
    int weapon_no;

    //武器の名称
    char *weapon;
    
    //武器の破壊力
    int attack;

    //武器を選択するコード
    printf("武器は何を使いますか?---> 1:バズーカ砲 2:うんこ\n");
    scanf("%d",&weapon_no);
    
    if(weapon_no==1){
        weapon="バズーカ砲";
        attack=20;
    }else{
        weapon="うんこ";
        attack=40;
    }
    
    printf("勇者が選んだ武器は【%s】で、攻撃力は【%d】です。\n",weapon,attack);
    
    
    //詐欺師の初期のHP
    int SAGI_HP=300;
    
    //whileループで詐欺師の残りHPが150以上の条件で攻撃を行う
    while(SAGI_HP>=150){
        printf("詐欺師の残りHP:【%d】\n",SAGI_HP);
        printf("勇者は詐欺師に【%d】のダメージを与えた!!\n",attack);
        SAGI_HP-=attack; //ここで詐欺師のHPが減る演算子「-=」を使用
    }
    printf("詐欺師は瀕死です!!でも、勇者も腹が減ったのでちょっと休む\n\n");
    printf("何食べる??--->1:もしもバーガー 2:ばななっとうパン\n");
    
    int food_no;//食べ物の番号
    char *food;//食べ物
    int powerup;//もぐもぐタイム後の勇者の攻撃力
    
    scanf("%d",&food_no);
    
    if(food_no==1){
        food="もしもバーガー";
        powerup=50;
    }else{
        food="ばななっとうパン";
        powerup=75;
    }
    
    printf("勇者は【%s】を食べて、攻撃力が【%d】にUPした!!\n\n",food,powerup);
    
    for(SAGI_HP=150;SAGI_HP>0;SAGI_HP-=powerup){
        printf("詐欺師の残りHP:【%d】\n",SAGI_HP);
        printf("勇者は詐欺師に【%d】のダメージを与えた!!\n",powerup);
    }
    
    printf("\n詐欺師の残りHP:【%d】\n",SAGI_HP);
    printf("勇者は詐欺師をやっつけた!!世界が平和になった!!");
      
}

勇者が「もしもバーガー」を食べたことにより、攻撃力が50にパワーアップします。
今度は瀕死の詐欺師に50ずつダメージを与えます。
そしてついに!勇者は詐欺師をやっつけて、世界を救いました。

<<Python>>

では、Pythonでも同様にコードを書いて行きます。
Pythonでは、ワクチンがwhileループでデルタ株をやっつけた後、Forループでオミクロンと戦うという設定です。

※ プログラミングの練習の為の例題であり、医学的根拠は全くございません ※

デルタ株が現れ、あなたのワクチン接種済みの回数を標準入力を使って入力するコードと結果です。

print('デルタ株が現れた!!')
delta_hp=300 #デルタ株のHP

#ワクチン接種回数の標準入力
print('ワクチン接種回数は? 1:1回目  2:2回目--->',end='')
num=int(input())

#1回目と2回目のパワー
if num==1:
    msg='1回目接種済み'
elif num==2:
    msg='2回目接種済み'
else:
    print('[1]か[2]を入力して下さい。')

if num==1 or num==2:
    print('あなたはワクチン【'+msg+'です。】')

「1」を入力した場合

「2」を入力した場合

「テキトーな数」を入力した場合

この様に分岐が出来ました。
ここからwhileループで「デルタ株」をやっつけます。

ワクチン1回目の攻撃力を50、2回目接種では攻撃力70でデルタ株と戦います。
whileループを使う点での注意点は、初期値(デルタ株のHP=300)を設定することと、無限ループにならないために、ループを抜ける様演算を行うことです。

今回は、whileループの条件がデルタ株のHPが0より大きかったらループを回すので、その条件を満たしている間はループを繰り返し、HPが0またはマイナスになったらループを抜けます。

しかし、デルタ株のHPの減算を行わなければ永遠にループを抜けられない無限ループになってしまいます。

これらを踏まえてコードを掲載します。

print('\nデルタ株が現れた!!')
delta_hp=300 #←デルタ株のHPの初期値を設定

#ワクチン接種回数の標準入力
print('ワクチン接種回数は? 1:1回目  2:2回目--->',end='')
num=int(input())

#1回目と2回目のパワー
if num==1:
    attack=50
    msg='1回目接種済み'
elif num==2:
    attack=70
    msg='2回目接種済み'
else:
    print('[1]か[2]を入力して下さい。')

if num==1 or num==2:
    print('あなたはワクチン【'+msg+'です。】\n')
    
    while delta_hp>0:
        print('現在のデルタ株のHP:'+str(delta_hp))
        delta_hp-=attack  #←ここで代入演算子を使って減算しているので無限ループを避けられる。
        print('--------------------')

    print('\n<<ループを抜けた>>')
    print('現在のデルタ株のHP:【'+str(delta_hp)+'】')
    print('デルタ株をやっつけた!!\n')

ワクチンの接種回数が1回の場合の実行結果

デルタ株のHPが50ずつ減って、ループの継続条件である「>0」を満たさなくなり、ループを抜けてデルタ株をやっつけました。

ワクチンの接種回数が2回の場合の実行結果

デルタ株のHPが70ずつ減って、ループの継続条件である「>0」を満たさなくなり、ループを抜けてデルタ株をやっつけました。

次にラスボス「オミクロン」が現れます。
今度はForループで戦います。
オミクロンのHPの初期値を1000とします。
ワクチン3回目を接種する場合は攻撃力200で、接種しない場合は攻撃力30でオミクロンと戦います。

コード及び、私は3回目も接種予定なので、打つと選択した実行結果を掲載します。

print('\nデルタ株が現れた!!')
delta_hp=300 #←デルタ株のHPの初期値を設定

#ワクチン接種回数の標準入力
print('ワクチン接種回数は? 1:1回目  2:2回目--->',end='')
num=int(input())

#1回目と2回目のパワー
if num==1:
    attack=50
    msg='1回目接種済み'
elif num==2:
    attack=70
    msg='2回目接種済み'
else:
    print('[1]か[2]を入力して下さい。')

if num==1 or num==2:
    print('あなたはワクチン【'+msg+'です。】\n')

    #whileループでデルタ株と戦う
    while delta_hp>0:
        print('現在のデルタ株のHP:'+str(delta_hp))
        delta_hp-=attack  #←ここで代入演算子を使って減算しているので無限ループを避けられる。
        print('--------------------')

    print('\n<<ループを抜けた>>')
    print('現在のデルタ株のHP:【'+str(delta_hp)+'】')
    print('デルタ株をやっつけた!!\n')

#オミクロンとの戦いの幕開け。標準入力
print('\nオミクロンが現れた!!')
print('3回目接種は? 1:打つ予定  2:打たない--->',end='')
num2=int(input())

#3回目接種の分岐
if num2==1:
    attack2=200
    msg2='あなたは3回目接種予定です。'
elif num2==2:
    attack2=30
    msg2='あなたは3回目は打たない予定です。'
else:
    print('[1]または[2]を入力して下さい。')


if num2==1 or num2==2:
    print('【'+msg2+'】\n')
    #Forループでオミクロンと戦う
    for omicron_HP in range(1000,-100,-attack2):
        print('現在のオミクロンHP:【'+str(omicron_HP)+'】')
        print('--------------------')
        if omicron_HP<0:
            break

    print('\n<<<ループを抜けた>>>')
    print('現在のオミクロンHP:【'+str(omicron_HP)+'】')
    print('オミクロンをやっつけた!!\n')

このプログラミングみたいにコロナ詐欺もデルタ株もオミクロンもやっつけられたらなぁ・・・。

新型コロナに便乗した詐欺師が各地で多発しています。
金銭や個人情報を盗み出したり、なんでそんな詐欺をするような人間がのうのうと生きているのかと思うと、非常に腹立たしいです。
また、デルタ株やオミクロンもです。

そこで、何かできないかと思い、C言語とPythonのループを使って詐欺師・オミクロンをやっつけることにしました。

警視庁のホームページです。
デルタ株についてと、オミクロンについてです。

■ C言語使用参考書 ■

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

基本情報技術者試験の範囲のユークリッドの互除法・線形探索・二分探索・ループ・挿入法・連結リスト・二分木・再帰・ハッシュによる探索・クイックソートなどの基本のアルゴリズムをトレースしながら実際に作って学べます。C言語とJavaに対応しています。書籍ではJavaで多くが記載されていますが、C言語のコードはダウンロードサービスから入手して使いました。
私は電子書籍、Kindle版で購入したので、「検索」から「ダウンロード」とキーワードを入力して、C言語のコードを入手して勉強しました。

基本情報技術者試験のアルゴリズムで使う疑似言語はC言語に近いので、この本で紹介されているアルゴリズムを実際に作って自分の環境で動かして学びました。
そのお陰もあって、基本情報技術者試験の配点の上がったアルゴリズムは88%の正答率を取得し、事務職のプログラミング未経験ながら、FEに一発合格致しました。
ご興味のある方は、当ブログの基本情報技術者試験トップページも併せてご覧下さい。

■ Python使用参考書 ■

じっくり丁寧にPythonを学びたい方向けの書籍を紹介します。
Pythonを基礎から中級程度まで丁寧に学びたい方におすすめの書籍です。
まずはpaizaラーニングなどの学習コンテンツで1〜2巡(苦手な所は納得がいくまで何巡でも)してからこの本で学ぶと、自分の学習状況をブログなどでアウトプット出来るようになり、また、エラーなどの不明点を調べられる力もついていきます。

サイトマップはこちらから

C言語自作サンプル集へ
Python自作サンプル集へ
これからプログラミングを学ぶ方へ
基本情報技術者試験トップへ
自己紹介

(=^x^=) 

C言語で、バカボンのパパ「反対」の「反対」は「賛成」なのだ!乗算(掛け算)

この記事では、C言語でシンプルな乗算(掛け算)の練習を通して、int や charといった型、IFによる分岐、標準入力の使い方と関数についてを学べます。
(同じ処理でのPythonのコードも掲載しています。)

具体例として使うのは、「バカボンのパパ」の名セリフでです。
正の数を「賛成」、負の数を「反対」とします。
例えば「-3(反対)」 ×「 -5(反対)」でしたら、答えはプラスの15になるので、「反対の反対は賛成なのだ」と表示されるように致します。

サイトマップはこちらから

C言語自作サンプル集へ
Python自作サンプル集へ
これからプログラミングを学ぶ方へ
基本情報技術者試験トップへ
自己紹介

まずはC言語でコードを掲載し、その後でコードの処理を解説します。

#include <stdio.h>
int main(void){

    int num1;  //最初の数
    
    char *sign1; //最初の数の符号
    
    printf("最初の数を入力=\n"); 
    scanf("%d",&num1);      //標準入力
    
    if(num1>0){
        sign1="賛成";
    }else{
        sign1="反対";
    }
    printf("最初の数%dは「%s」なのだ!\n",num1,sign1);
    }

最初の数num1は数値なのでint型を、最初の数が「賛成」か「反対」かの結果を入れる変数は、文字なのでsign1はchar型を使っています。

数値の入力に、scanfによる標準入力を使っています。

その後のIFによる分岐で、入力した数が正の数か負の数かの結果をsign1に入れています。

最後にprintfで、入力した数値と正か負かの判定結果を表示しています。

同様に次の数、計算結果のコードを記述します。

#include <stdio.h>

int main()
{

int num1; //最初の数
int num2; //次の数
int ans; //計算結果
char *sign1;//最初の数が賛成か反対かを格納する
char *sign2;//次の数が賛成か反対かを格納する
char *sign3;//掛け算の計算結果が賛成か反対かを格納する 

printf("最初の数を入力=");//キー入力 
scanf("%d",&num1); 
if(num1>0){ sign1="賛成";
 }else{ sign1="反対"; 
}
 printf("最初の数%dは「%s」なのだ!\n",num1,sign1);

 
 printf("次の数を入力=");//キー入力 
scanf("%d",&num2); 
if(num2>0){ 
sign2="賛成"; }else{ sign2="反対"
; } 
printf("次の数%dは「%s」なのだ!\n",num2,sign2); 

ans=num1*num2;
if(ans>0){
sign3="賛成";
}else{
sign3="反対";
}
printf("計算結果%dは「%s」の\n「%s」は「%s」なのだ!\n",ans,sign1,sign2,sign3);

}

では、実行してみます。
最初の数に-3、次の数に-5を入れます。
かけるとプラス15になりますので、反対の反対は賛成になりました。

ただ、これでも動きますけれど、IF文による「賛成」・「反対」の分岐が3ヶ所も出てきて冗長なので、関数にまとめました。
また、変数の宣言のintの所も1行にまとめました。

そのコードがこちらです。

#include <stdio.h>

//賛成か反対かの判定をするIF文の関数
char *judge(int x){
    char *msg;
    
    if(x>0){
        msg="賛成";
    }else{
        msg="反対";
    }
    
    return msg;
}


int main()
{

//最初の数と次の数と掛け算の計算結果
int num1,num2,ans;


//最初の数のキー入力
printf("最初の数を入力="); 
scanf("%d",&num1); 

//最初の数のIF文判定関数を呼び出してsign1に「賛成」or「反対」の戻り値を入れる
char *sign1=judge(num1);
printf("最初の数%dは「%s」なのだ!\n",num1,sign1);


//次の数のキー入力
printf("次の数を入力="); 
scanf("%d",&num2); 

//次の数のIF文判定関数を呼び出してsign2に「賛成」or「反対」の戻り値を入れる
char *sign2=judge(num2);
printf("次の数%dは「%s」なのだ!\n",num2,sign2);

//乗算の演算とIF文判定関数を呼び出し
ans=num1*num2;

//計算結果のIF文判定関数を呼び出してsign3に「賛成」or「反対」の戻り値を入れる
char *sign3=judge(ans);

printf("計算結果%dは「%s」の\n「%s」は「%s」なのだ!\n",ans,sign1,sign2,sign3);


}

では、同じ内容をPythonを使って書いて行きます。
コードと実行結果です。

#IF文で正の数だったら「賛成」、負の数だったら「反対」と分岐させる関数
def judge(x):
    if x>0:
        sign='賛成'
    else:
        sign='反対'
    return sign


#標準入力で最初の数と次の数を入力する
print('最初の数を入力して下さい--->',end='')
num1=int(input())
print('次の数を入力して下さい--->',end='')
num2=int(input())

#乗算の計算をする
ans=num1*num2

#「賛成」か「反対」か分岐する関数を呼び出す
sign1=judge(num1)
sign2=judge(num2)
sign3=judge(ans)

print('最初の数「'+str(num1)+'」は【'+sign1+'】なのだ!')
print('次の数「'+str(num2)+'」は【'+sign2+'】なのだ!')
print('計算結果【'+str(ans)+'】は、「'+sign1+'」の「'+sign2+'」は'+'【'+sign3+'】なのだ!!')

バカボンを懐かしむ人と言えば40歳以上??30歳以上でしょうか。
結構年配になってからプログラミングを始めたいという方には、面白い例題かもしれません。

赤塚不二夫先生の有名なマンガ「天才バカボン」のバカボンのパパは、
といえば、「反対の反対は賛成なのだ!」が名セリフだと思います。
老子についてバカボンのパパと一緒に学ぶ本の紹介を致します。

(=^x^=) ここまで、ご精読ありがとうございました。
最後にお世話になった、C言語とアルゴリズムとPythonの参考書の紹介をさせて頂きます。

■ C言語使用参考書 ■

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

基本情報技術者試験の範囲のユークリッドの互除法・線形探索・二分探索・ループ・挿入法・連結リスト・二分木・再帰・ハッシュによる探索・クイックソートなどの基本のアルゴリズムをトレースしながら実際に作って学べます。C言語とJavaに対応しています。書籍ではJavaで多くが記載されていますが、C言語のコードはダウンロードサービスから入手して使いました。
私は電子書籍、Kindle版で購入したので、「検索」から「ダウンロード」とキーワードを入力して、C言語のコードを入手して勉強しました。

基本情報技術者試験のアルゴリズムで使う疑似言語はC言語に近いので、この本で紹介されているアルゴリズムを実際に作って自分の環境で動かして学びました。
そのお陰もあって、基本情報技術者試験の配点の上がったアルゴリズムは88%の正答率を取得し、事務職のプログラミング未経験ながら、FEに一発合格致しました。
ご興味のある方は、当ブログの基本情報技術者試験トップページも併せてご覧下さい。

■ Python使用参考書 ■

じっくり丁寧にPythonを学びたい方向けの書籍を紹介します。
Pythonを基礎から中級程度まで丁寧に学びたい方におすすめの書籍です。
まずはpaizaラーニングなどの学習コンテンツで1〜2巡(苦手な所は納得がいくまで何巡でも)してからこの本で学ぶと、自分の学習状況をブログなどでアウトプット出来るようになり、また、エラーなどの不明点を調べられる力もついていきます。

サイトマップはこちらから

C言語自作サンプル集へ
Python自作サンプル集へ
これからプログラミングを学ぶ方へ
基本情報技術者試験トップへ
自己紹介

(=^x^=) 

C言語で簡単な足し算。イヤナヤツ+イヤナヤツ=ミナゴロシ!?

この記事を読むことで、C言語を始めたばかりで、さっきHelloWorldの出力が出来たので、今度は何か計算させてみようかな、と思われた方のプログラミングの演習にお役立て頂けます。
簡単な一桁の足し算から、18782(イヤナヤツ)+18782(イヤナヤツ)=37564(ミナゴロシ)といった、少し複雑な計算にも挑戦して行きます。
(*2すればもっと簡単ですね。それは関数を使ってコードを買いて行きます。)
また、 Pythonのコードも掲載しています。

サイトマップはこちらから

C言語自作サンプル集へ
Python自作サンプル集へ
これからプログラミングを学ぶ方へ
基本情報技術者試験トップへ
自己紹介

では、早速簡単な足し算での計算を始めて行きます。
標準入力で、num1に3、num2に5をキー入力して足し算をすると、計算結果のansに8が入るようにします。
そのコードがこちらです。

#include <stdio.h>

int main()
{
    //加算する2つの数と計算結果を定義
    int num1,num2;
    int ans;
    
    //標準入力でnum1,num2を取り込む
    printf("最初の数を入力=");
    scanf("%d",&num1);
    
    printf("次の数を入力=");
    scanf("%d",&num2);
    
    //加算して結果を表示する
    ans=num1+num2;
    printf("計算結果は%dです。",ans);
    
}

では、「トリビアの泉」という番組で紹介された例で計算をしてみます。
18782(イヤナヤツ)+18782(イヤナヤツ)=37564(ミナゴロシ)の計算をしてみます。

実行結果です。
そうするとこうなりました。

これは掛け算でも2倍にして出来そうですね。
そのコードです。

#include <stdio.h>

int main()
{
    //倍にしたい数とその計算結果
    int num;
    int ans;
    
    //標準入力でnumを取り込む
    printf("最初の数を入力=");
    scanf("%d",&num);
    
    //加算して結果を表示する
    ans=num*2;
    printf("計算結果は%dです。",ans);
    
}

この計算は、だいぶ前に放送されていた「トリビアの泉」という番組で、学生さんから投稿されたトリビアを具体例としてC言語で使った演算をしてみました。

では、 Pythonではどの様に書くのか掲載いたします。
加算のコードです。

#加算に使う数を標準入力
print('最初の数を入力--->>>',end='')
num1=int(input())
print('次の数を入力--->>>',end='')
num2=int(input())

#加算の計算処理と出力
ans=num1+num2
print('計算結果は【'+str(ans)+'】です。')

最初の数と次の数に5と7を入れた場合の実行結果。

18782+18782=37564の計算

掛け算にした場合のコード

#加算に使う数を標準入力
print('2倍にする数を入力--->>>',end='')
num=int(input())

#乗算の計算処理と出力
ans=num*2
print('2倍にした計算結果は【'+str(ans)+'】です。')

(=^x^=) ここまで、ご精読ありがとうございました。
最後にお世話になった、C言語とアルゴリズムとPythonの参考書の紹介をさせて頂きます。

■ C言語使用参考書 ■

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

基本情報技術者試験の範囲のユークリッドの互除法・線形探索・二分探索・ループ・挿入法・連結リスト・二分木・再帰・ハッシュによる探索・クイックソートなどの基本のアルゴリズムをトレースしながら実際に作って学べます。C言語とJavaに対応しています。書籍ではJavaで多くが記載されていますが、C言語のコードはダウンロードサービスから入手して使いました。
私は電子書籍、Kindle版で購入したので、「検索」から「ダウンロード」とキーワードを入力して、C言語のコードを入手して勉強しました。

基本情報技術者試験のアルゴリズムで使う疑似言語はC言語に近いので、この本で紹介されているアルゴリズムを実際に作って自分の環境で動かして学びました。
そのお陰もあって、基本情報技術者試験の配点の上がったアルゴリズムは88%の正答率を取得し、事務職のプログラミング未経験ながら、FEに一発合格致しました。
ご興味のある方は、当ブログの基本情報技術者試験トップページも併せてご覧下さい。

■ Python使用参考書 ■

じっくり丁寧にPythonを学びたい方向けの書籍を紹介します。
Pythonを基礎から中級程度まで丁寧に学びたい方におすすめの書籍です。
まずはpaizaラーニングなどの学習コンテンツで1〜2巡(苦手な所は納得がいくまで何巡でも)してからこの本で学ぶと、自分の学習状況をブログなどでアウトプット出来るようになり、また、エラーなどの不明点を調べられる力もついていきます。

サイトマップはこちらから

C言語自作サンプル集へ
Python自作サンプル集へ
これからプログラミングを学ぶ方へ
基本情報技術者試験トップへ
自己紹介

(=^x^=) 

モバイルバージョンを終了