C言語入門5~選択構造、if文、else、switch-case文による多岐分岐

超初心者が1年がかりでのんびり続けて来た、C言語のプログラミング入門。さすがにそろそろ、高校の教科書『新情報技術基礎』(コロナ社)の終わりが近づいて来た。問題の答となるプログラミング例がほぼ書かれてるので、自分なりに少しアレンジしたプログラムを作りながら練習。

  

利用してるありがたいサイトは、プログラミング用の「環境」をネットで無料で提供してくれてる、paiza.io。自分で環境を構築する作業は何度も失敗してるので、またいずれ。構築の説明はあちこちにあるけど、自分のPCで試すとなかなか説明の通りにならない。JAVAは何かが足りないとか言われて導入できず。Visual BASICは重すぎて断念。

        

今日使ったのは、教科書の第5章・C言語によるプログラミング、第5節。選択構造(p.135~140)。6ページとはいえ、少しずつ難しくなって来たので、精神的に疲れる。おまけに、前の話は次々と忘れて行くので、再び調べるのも時間がかかる。

    

選択構造とは要するに、場合分けの仕組みのこと。「もし何々なら・・・、そうでなければ~~~」とか、「この場合は・・・、その場合は~~~、あの場合は***」とか。選択や反復がない、一番シンプルな流れだ。一応、7年前にQuick BASICを使って記事を書いてるが、ほとんど覚えてない。

   

  

     ☆     ☆     ☆

ではまず、例題5.8。点数を1つ入力して、もし70点以上なら「合格」、そうでなければ「不合格」と表示するプログラム。

      

211120a

  

If(  )で条件文「tensuu >= 70」を書いた後、基本的には{  }で処理(命令文)を書くけど、処理が1つだけなら{  }は省略可能。私はこの{  }とか、プログラミングに多用する記号が苦手になってるので、上では省いてる。;(セミコロン)も本当は打ちたくない。

   

ただ、「以上」を「>=」と書くのは、普通の記号の「≧」を左右に2分割するだけなので、あまり抵抗ない。「等しい」を「==」と書くのも、何とか我慢の範囲内。入力しやすいし、意味も明らかなので。

     

211120b

  

点数として80を入力して実行すると、合格と表示された。2行に分けて表示する方法はしばらく後で発見。教科書はそうなってないので、考えてなかった。

      

211120c

  

  

      ☆     ☆     ☆

続いて、問10(1)。整数を1つ入力して、もし2で割った余りが0なら「偶数」、そうでなければ「奇数」と表示するプログラム。

  

表示するものをprintf(  )で指定、入力するものをscanf(  )で指定するのも、少し慣れて来た。普段はほとんど使わない二重引用符も、ようやく少し馴染んで来た感じか。整数の割り算の余りは、「%」という記号で計算。

           

211120d

   

14を入力して実行すると、「偶数」と表示された。

   

211120e

   

この環境だと、入力と出力を同時に見ることができないのが玉にキズ。もしかすると設定でどうにか出来るのかも。

       

211120f

  

  

     ☆     ☆     ☆

さらに、問10(2)。三つの整数値を入力して、最大値を表示するプログラム。最初に入力した数を暫定的に最大として、もし、次に入力した数がそれより大きければ、次に入力した数の方を新たな最大にする手続き。こうした、少しずつ比較するパターンは、小学生向けのプログラミング問題集でも出て来てた。

      

211120g

   

25、10、50を入力すると、確かに50という最大値が表示される。

   

211120h

      

211120i

   

  

     ☆     ☆     ☆

少しだけ変えて、4つの整数値の中から最小値を表示するプログラムも自分で作成。25、10、50、80を入力すると、確かに最小値10が表示された。

      

211120m

  

変数にn4を加えて、最大値maxの代わりに最小値minを導入して、ifの条件文の不等号の向きを逆にするだけ。

   

   

      ☆     ☆     ☆

次は、3つ以上の方向に分かれる「多岐分岐」(たきぶんき)。合成語の意味はすぐ分かるけど、4文字の一まとまりとしては聞いたことのない日本語だ。条件は、if、else if(前の条件とは違って、もし・・・、という意味)、else(それら以外の時)で表す。

      

ここでは、2次方程式 ax²+bx+c=0 の実数解を求めてる。もし判別式d=b²-4acが0より大きいのなら、異なる2つの実数解。もしd=0なら、1つの重解。それら以外(つまりd<0)なら、「解なし」と表示。

  

実数や数学の関数sqrt(平方根の計算:スクエア・ルート)を使うし、命令も少し長くなるから、ここまでの問題より難しい。2行目に「#include <math.h>」と書いて、5行目の変数の型はfloatにして、入力の型は%fにする。

        

211120n

  

高校数学でお馴染みの係数、a=1、b=-5、c=6を入力すると、「解は 3.000000 2.000000」と表示された。普通に「解は 2 3」とか表示させたいけど、とりあえず保留。

      

211120o   

   

211120p

   

その代わり、解の公式の分母の数を、2.0ではなく、2にしてみたら、大丈夫だった。係数として、a=1、b=4、c=4を入力すると、表示された答は重解-2.000000。

      

211120q

   

   

      ☆     ☆     ☆

最後に、もっときっちり並列的に多岐分岐を行う、switch-case(スウィッチ・ケース)文の問題。例題5.10。

  

相手が日本語を示す番号1を入力した場合は、「こんにちは。」と出力。英語を示す番号2を入力した場合は、「Hello!」と出力。フランス語を示す番号3を入力した場合は、「Bonjour!」(ボン・ジュール)と出力。ちなみに教科書の3番目は、ドイツ語「Guten Tag」(グーテン・ターク)になってたから、私が変更した。

      

211120r

   

switch(変数){case 変数}・・・break(ひとまず終わり)の形で、3つ以上の場合を並列的に分ける。「それ以外」のようなオマケ的な扱いは目立たなくて、最後の「default」の所のみ(ここではbreakは不要)。多様性とか対等性、中立性、共存が叫ばれる今の時代だと、特に重要だろう。 

      

211120s

  

2と入力して英語を指定すると、「Hello!」と出力された。ここでようやく、最後の出力で改行する方法を発見。前半のprintfの最後で、(”? /n”)としておけばいい。キーボードによっては、「/n」ではなく、「¥n」。

      

211120t

   

  

     ☆     ☆     ☆

最後に、switch-case文ではなく、if else文で同じ処理をプログラムすると、成功した。やはり、実質よりも、形とか外見の問題が大きい構文なのか。

       

211120u

   

というわけで、あと2回くらいだから、出来れば年内に終わらせたい。それでは今日はこの辺で。。☆彡

    

        (計 2608字)

| | | コメント (0)

将棋AIも採用、ミニ・マックス法の無駄を省いた α β(アルファ・ベータ)法と α 値、β 値の具体例の解説

将棋界では、19歳の天才・藤井聡太四冠の勢いが止まらない。彼の強さを説明する時、よく持ち出されるのが、AIとか、ディープ・ラーニングという話だが、普通のメディア情報だと、そうした言葉だけ使って、中身を説明してないものがほとんどになってる。

   

まだAIも、全ての変化は読み切れないので、途中で読みを打ち切って、一方がどれだけ有利・不利なのか、形勢判断することになる。途中でどのように形勢判断するのか? どのように評価値を計算するのか?

   

ある1つの局面だけを取り出して、先は読まずに、その時点だけでどう評価するのかについては、特殊なソフト(評価関数)が色々あるようで、そこはとりあえずスルーしとこう。

   

今回は、先を少し読んだ上で、今現在の評価値を出す方法、コンピューター手続き(アルゴリズム)について解説してみる。あちこちに説明があるが、導く途中のプロセスが書かれてないものや、言葉の意味(ミニ、マックス、α値、β値)を具体的にハッキリ示してないものがほとんどだった。

   

そんな中で、最も役に立ったのはいつものように、英語版ウィキペディアの説明(minimax、αβ pruning)。特に、図やアニメは明らかに優れてる。他に、補助的に役立ったのは、近大の石水隆氏のpdfファイルだった

    

    

        ☆     ☆     ☆

下は英語版ウィキのαβ簡略化法の図だが、これを用いて、元になってるミニマックス戦略から説明する。

    

将棋、碁、チェス、オセロなど、1対1のボードゲームだと、一方がどれか1手を選んで指して、それに対して、相手がいくつかの選択肢から選んで応じる形になる。その変化を樹形図(ツリー)として示したのが下図。グレー(灰色)の意味は、しばらく後で説明。

        

211118a

    

一番上の自分の手番では、3つの選択肢(丸印)があって、これから自分が最善の手を選ぶ。そのそれぞれに対して、相手には2つの選択肢(四角印)がある。一番下に並んでるのはすべて、自分の側に対する評価値。相手は当然、この値から出来る限り低いものを選ぼうとするはず。

  

ちなみに将棋の最初の局面なら、下のような変化をまとめてることになる。自分には、7六歩、2六歩、5六歩という3つの選択肢がある。そのそれぞれに対して、相手には、8四歩、3四歩という選択肢がある。

   

211118b

   

   

     ☆     ☆     ☆

211118c

  

さて、相手としては、自分(私)の評価値を下げたいから、最も低い値(ミニマム)になる選択肢を選ぶと考える。例えば上図の左端だと、評価値5と6の変化があるから、相手は5の選択肢を選ぶ。以下、同様で、それぞれの相手の手番における自分の評価値がまず決まる。

   

上図で、下から2段目の薄い黄色のエリアには、左から、5、4、3、6、6、7、5、8、6という値が並んでる。これは、私がその直前に選んだそれぞれの選択肢(丸印)に対する評価値ということになる。自分(私)は当然、それらの中から、なるべく大きい値(マックス)を選ぶ

   

211118d

  

だから、上図のように、下から3段目の私の手番では、私が大きい値の選択肢を選んだと考えてる。左端の分岐点なら、5と4の内、5になる選択肢を選んだということ。右端なら、8と6だから、8になる選択肢を選んだ。

   

この時点で、下から2段目の薄い青緑のエリアには、左から、5、3、6、7、5、8という値が並んでる。これは、相手のそれぞれの選択肢に対応する、自分(私)の評価値ということ。

  

ちなみに、それぞれの点(局面)は、英語でカタカナ英語でノード(node)と呼ばれてる。普通は分岐点のことだが、決着がついた最後の局面は分岐点ではないし、指し手が1つしかない時も分岐点にはならない。

   

   

     ☆     ☆     ☆

相手はまた、自分(私)の値を低くする選択肢を採用すると考えると、下図のようになる。中央の変化だと、6と7だから、小さい6になる選択肢を取る。

   

211118e

   

最後に、自分は、3、6、5と並ぶ数字から、一番大きい6になる中央の選択肢を選べばよい。したがって、最初(一番上)の時点での評価値は、6ということになる。自分の指し手を青い線、相手の指し手を黄色の線で示した。自分の2回目の指し手は2通りあって、どちらでも同じ評価になってる。

  

211118f

  

なお、相手だけが間違えた場合は、評価値は9まで上がる可能性がある(6から一番下の段まで下りた時の、最大の値)。一方、上図の場合は、自分が間違えたとしても、最悪の評価値は6(上側の6から一番下の段まで下りた時の、最小の値)。

   

   

      ☆     ☆     ☆

上のような方法が、ミニマックス戦略。相手は、自分(私)の評価を最小(ミニ)にすると考えて、自分は評価を最大(マックス)にすると考える方法。ちょっと難しい言い方だと、自分の最悪の損害を、最小化する戦略。歴史的には、一般的なゲーム理論やナッシュ均衡まで遡るらしい。

  

もちろん、実際の人間がそのような最善の判断をするかどうかは分からないし、そもそも一番下の段の評価値が正しいとも限らない。AIも最後の終局・投了まで読み切ってるわけではないし、人間との形勢判断の違いも大きい。

   

とにかく、そうしたミニマックス法から、無駄な読みを取り除く(prune:プルーン)方法が現在、使われてるらしい。α値、β値というものを使うから、英語だと αβ pruning。日本語だと αβ 法が普通の言い方だけど、意味的には αβ簡略化法ということだ。

  

  

      ☆     ☆     ☆

AIは左から右へと計算していくと仮定。まず、左下の枝分かれを見てみよう。

   

211118g2

   

相手の手番である下から二段目で、左端に、自分の評価値としてまず5が出てる(赤丸)。この時点では、これがα値。その上の段階で、自分は、この5より小さい値は選ばないはず。

   

ところが、右へと計算していくと、一番下の段が4となった時点で、その上側の評価値も4になる。この後、上のグレー(灰色)の値が何であっても、すぐ上の値は4以下になる。相手はなるべく小さい値を選ぶから。

  

α値と同じ段の右側に、α未満の値が出た瞬間、その後の下側の計算はもう不要になる。自分(私)はその直前の段階で、α値の選択肢を選ぶ方が得だから。したがって、上の枝分かれだと、自分は下から二段目の左側の5の選択肢を選ぶことが決定する。赤い斜線の右下は計算不要でカット。

   

211118h

   

同様に、中央の枝分かれでも、赤線の右下は計算不要で省略される。下図を参照。ここでのα値は、とりあえず6(下から二段目の左側)。右下の灰色のマス目の値が何であっても、すぐ上の値は6以下だから、自分の選択肢の値は6と決定。

          

211118i2

  

ただし、この場合は2通りの変化が同点になってる。これは将棋AIでも見られる現象。

   

   

      ☆     ☆     ☆

最後に、β値については、この樹形図だとたまたま役に立ってない。

   

211118j

  

上図で、下から二段目の自分の手番において、左端にまず5と出てる。これが最初の時点でのβ値で、これより大きい値が同じ段の右側に出たら、その後の下側はカットされるが、β値より小さい3が出たので、何もカットされてない。

  

中央の枝分かれは、そこでのβ値6より大きな値が出てるが、その後にカットされるべき選択肢がないので、たまたま役に立たない。右端の枝分かれは、β値5によるカットを使う前に、上から二段目のα値(ここでは6)が働いて、下側の3段が丸ごとカットされてしまう。

  

211118k

   

   

     ☆     ☆     ☆

仮に、右側の枝分かれの5の代わりに7とすれば、下図のように、β値を上回る値が出た後の下側のカット(省略)が生じる。

    

211118l

   

それにしても、もともと一番下の段の評価値が間違っていたら、ミニマックス法もαβ法も意味が無くなってしまうはず。今後、その辺りも調べてみたいが、将棋だけでも1通りではないから大変かも。

  

ともあれ、今日のところはこの辺で。。☆彡

    

       (計 3134字)

| | | コメント (0)

C言語入門4~変数の入力と計算、型指定子 int(整数型)、float(実数型)、順次構造

先日、約1年ぶりにアプリで復習した後、今日は高校の教科書『新情報技術基礎』(コロナ社)を使用。答のプログラミング例がほぼ書かれてる問題で、自分なりに少しアレンジしたプログラムを作って練習した。

  

利用したのはネットで無料で環境を提供してくれてる、paiza.io。ありがたいサイトに感謝。自分で環境構築を行う作業は何度も失敗してるので、またいずれ。自分のPCで試すと、なかなか説明の通りにならないのだ。

   

今日使ったのは、第5章・C言語によるプログラミングの第4節。変数と順次構造(p.130~134)。5ページしか進まなかったのは、何度も間違えたり考え込んだりしたから。既に前の箇所に書かれてた内容は、あらためて説明してくれないから、自分で前のページに戻って復習する必要がある。

  

順次構造とは難しげな用語だが、要するに順番に次々と進む仕組みのこと。選択や反復がない、一番シンプルな流れだ。選択や反復については一応、7年前にQuick BASICを使って記事を書いてるが、ほとんど覚えてない。

   

  

     ☆     ☆     ☆

211028a

   

まず、例題5.6(5章の6問目)。長方形の縦と横の長さを整数で入力して、面積を整数で出力するプログラム。上図は、教科書に載ってるものとほぼ同じで、面積を s と書く代わりに、そのまま menseki としたもの。もちろん、縦×横。

   

4行目の先頭の「int」が整数型の指定子で、変数 tate、yoko、menseki が整数だと宣言してる。私が苦手なのが6行目の入力設定。%dと%dの間にコンマがないのが引っかかるし、カッコの前半だけ引用符に入ってるのも分かりにくいし、その右の変数名に & が付いてるのもなじめない。

  

5行目で、改行を表す「逆スラッシュ+n」を入れてるが、教科書には付いてない。たぶん、同じC言語の中にも、細かい違いがあるということだろう。

    

211028b

   

下の「入力」という所をクリックして、半角スペースを挟んで、半角数字の 7 と 9 を入力。「実行」すると、確かに面積 63 が表示された。

         

211028c

   

  

      ☆     ☆     ☆

211028d

   

続いて、円の半径を入力して、面積を出力するプログラム。円周率3.14×半径×半径。半径を表す変数は、そのまま hankei 。面積は menseki。ちなみに教科書は、r と s になってる。

  

これは円周率が小数だから、変数は実数型の指定子 float を使って宣言(4行目)。なるべく教科書を見ずに入力したら、何度もコンパイル・エラーが表示されて、挫折しそうになった。半径を入力する6行目で、hankei の前の & を忘れてたのだ。エラー表示の英語はもっと分かりにくい書き方だったので、意味が分からなかった。

  

半径 5 を入力して実行すると、出力は 78.500000。確かに、3.14×5×5の値になってる。

    

   

     ☆     ☆     ☆

211028e

  

3問目は、問7。上底(じょうてい)、下底(かてい)、高さを入力して、台形の面積を計算するプログラム。(上底+下底)×高さ÷2。

  

教科書だと、30、20、10 を入力するだけだから、答は (30+20)×10÷2=250。整数型でもいいはずだけど、面積の答は 250.000000 と与えられてるから、実数型(この教科書では float)を宣言。÷2が入ってるし、小数になることが多いからか。ちなみに、この教科書では、より詳しくて実用的な実数の型指定子、double は使ってない。

  

この3問目でようやく、わりとスラッと書けたから、気を良くして次へ。

    

    

      ☆     ☆     ☆

211028f

  

4問目は、整数どうしの割り算(除算)を行った時の、商と余りに関する問題(例題5.7)。与えられた金額を、10円玉と5円玉と1円玉を使って、なるべく少ない枚数で作りたい。要するに、なるべく10円玉を使って、次になるべく5円玉を使えばいい。変数は、ここではそのまま、kingaku、coin10、coin5、coin1。

      

まず、金額を10で割った商が、10円玉の枚数。ここでは 47 円だから、/10 の計算結果 4 を使って、10円玉は4 枚。次は、その割り算の余り(ここでは 7)を 5 で割ればいいから、余りを出す記号 % を使って、coin5=(kingaku%)/5 。そのまた余りが1円玉だから、coin1=(kingaku%10)%5 。

   

211028l

    

ちなみに教科書のプログラムは、最初に10で割った後、金額を変更する形になってる(上図)。私は不自然だと感じるけど、なるべく単純な計算式にしたかったということか、あるいは勉強のためか。

  

とにかく、47 円を入力して「実行」すると、10円玉 4 枚、5円玉 1 枚、1円玉 2 枚が出力された。

       

211028g

  

  

     ☆     ☆     ☆

211028h

  

最後、5問目は、総秒数(全体の秒数)を入力して、何時間何分何秒かを表示するプログラム(問9)。これも、私と教科書とで発想が違ってた。

  

上が教科書のやり方で、まず秒数(second)を 60 で割って、分(minute)を出す。その割り算の余りが、新たな秒。さらに、分を 60 で割って、時間(hour)を求め、その割り算の余りを新たな分として定義し直してる。確かに、3670を入力すると、1時間1分10秒と出力される。

            

211028i

  

しかし、私なら下のように書く。これなら、分の定義変更が無くて1行少ないし、日本語の順番(時間、分、秒)に求める形になる。式がほんの少し複雑になるだけ。

       

211028j

   

なお、最後に試しに型指定子を実数型の float に変えてみたら、余りの計算の行2つにバツ印が付いてしまった。なるほど、商と余りという計算は、整数型のものなのか。このコンパイル・エラーはわりと分かりやすい英語表示になってた。second%3600 の % は不適当だという警告。

          

211028k

    

ちょっと思い出したから、なるべく早めに先に進みたいと思ってる。今日のところはこの辺で。。☆彡

    

          (計 2344字)

| | | コメント (0)

超初心者によるC言語入門3~情報系学科の大学生が1年生向けに作った学習アプリ『Study-C』で復習

また、ずいぶん時間が空いてしまった (^^ゞ 1本目の記事を書いたのが、20年10月24日。2本目の記事は21年1月12日。それからの9ヶ月間、C言語も含めて、プログラミングにはほとんど触れてない。先月、数学の未解決問題「コラッツ予想」の記事を書いた時、BASICにちょっとだけ触れた程度。

    

どうも、イップスというか、身体と心が固まって動かなくなってしまうのだ。数学や文系の話なら、難しくても拒否反応はあんまし無いから、やっぱりプログラミング独特の性質が壁になってる。

   

今回、久々に高校の情報の教科書を開いたものの、無味乾燥でシンプルな記述を読む気がしなかったので、App Storeを拝見。「C言語」で検索すると、トップに表示されたのが、「Study-C」という学習サポートアプリ。iOS専用なのか、AndroidスマホでPlay Storeを探すと出て来なかった。

      

211016a

   

サイズも軽くて、評価も高いけど、これは確か去年、インストールしてすぐ使わなくなった覚えがある。別のサイトのpaizaを実行環境にすることを勧めてたから、そっちに移って、このアプリは放置プレイになってた。

   

今日、あらためて最初からマジメに見て行くと、なかなか親切でフレンドリーで読みやすい(個人の感想♪)。大学院生が作ったのかな・・と思ってたら、情報系の学科の大学生だった(2年前?の当初は)。しかも、同じ情報系の大学1年生をターゲットにしてるとのこと。

       

単なる超初心者にはどうかと思ったけど、今のところは大丈夫。このまま一気にラストまで行きたいけど、今まで続いた試しはない♪ 高校の教科書もまだ序盤だし、昔、別の教科書でBASICをやってた時も、惜しい所で挫折してしまった。教科書が行方不明になったのだ♪ まあ、その程度の扱いということか。。

  

  

     ☆     ☆     ☆

211016b

  

上が最初の目次の画面。はじめに、始めよう!C言語、C言語ドリル、コラム。まん中の2章が中心的内容。ただ、超初心者にとっては、下のような実行環境の話に好感を抱いた。

       

211016c

    

プログラムの実行環境を作る、環境構築が、わかりづらく面倒臭い。まさに、その通り! あるあるで、私も何度も書いて来た。他の言語でも、そのスタート地点でいきなり躓いて来た。しかし、この製作者が挫折したのは中学生の時。さすがに早い。私だと、数学と将棋とテレビアニメにハマってた頃か。ランニングもたまに1人でやってた。

    

ちなみに、この製作者が勧めてた環境は、EasyIDEC。検索するとメジャーらしいけど、逆に批判の言葉もあちこちに出て来た。今でも更新し続けてるみたいだし、いずれ使ってみようと思う。最初の紹介を読んだ限りだと、ちょっとクセがあるようだ。まあ、マニアック・ブロガーの私が言うのも何だけど♪

   

    

      ☆     ☆     ☆

211016d

   

で、第2章(または第2部)の、始めよう!C言語。最初はおなじみの「Hello World!」。キー入力ではなく、単なる並べ替え問題なのに、いきなり私は失敗。コンパイラ・エラーが表示されてしまった。

        

211016e

    

Hello Worldをくるむ二重引用符の中に「\n」を入れるのに、右外に出してしまったのだ。ホント、コンピューターは融通が利かないね♪ そもそも、この改行の \n。意味も必要性も分かりにくいし(特に最後の\n)、逆スラッシュが入力できないこともあるのでイラついてしまう。

          

211016f

   

言い訳やボヤキはともかく、やり直して、「正解です!!」。アプリは教科書と違って、正解だと言ってくれるから嬉しい。誉め言葉が付いてると、もっと嬉しくなる♪ 大人になると、褒められる機会が滅多にないもんで。

   

   

     ☆     ☆     ☆ 

続いて、足し算の答を表示するプログラム。まだまだ、完全な復習の話に過ぎないけど、完全に忘れてる♪ ちなみに冒頭の「printf.c」というのは、C言語で書いた、printf(表示機能)のソースプログラムという意味らしい。

   

と言っても、ソースプログラムというものがまたモヤモヤしてしまうけど。以下のプログラム画面を表示するためのプログラムという意味かな? C++(シー・プラプラ)のものだと、右端の拡張子の部分にppが付いて、printf.cpp とかになるようだ。

    

211016g

    

この「%d」も好きになれないし、記述子とか、フォーマット指定子という特殊な用語も苦手 (^^ゞ それならむしろ、英単語の decimal (10進数)の方がスッと受け入れられる。

       

211016h

   

printf("%d,%d\n", 3+4, 5);  このプログラムの実行結果を答えよ。これは、7,5 だろう。直感的に♪ いや、本のアイコンを押すと、解説に戻ることも可能。

    

211016i

  

Hello\n と改行して、printf("World!!\n"); と下に書き足すと、HelloとWorldが2行で表示されると。ちゃんと6行目に、「//最後に\nを付けてね」とヒントを挿入してくれてる♪

    

211016j

    

  

     ☆     ☆     ☆

そして、いよいよ変数の登場。

    

211016k

   

整数型のaという名前の変数を宣言せよ。定義とか導入ではなく、宣言ね♪ 選択パネルが下にあるから、int a; と並べ替えるだけ。その下の a=1; は働かず。int は、整数を表す英単語 integer の略語。日本語で「整」と入力するプログラミング言語は無いのかね?

       

211016l

   

画面に4と表示させるプログラムを完成させよ。 int a; の次の6行目に、a=4; と入力するだけ。この右端にいちいち付けるセミコロンも、省略するプログラムは無いのかね?

       

211016m

  

上は、変数の宣言と、数値の代入を同時に4つ行ったプログラム。a=1, b=2, c=3, dの4つを導入して、さらに result (計算結果)も宣言。最後に、d=b; と定義・・ではなく代入して、result = a + b + c + d; の表示。1+2+3+2 だから result=8と表示される。

   

一応、上のプログラムだけ、paizaで自分で入力。確かに正しく出力された。

  

211016o

   

   

      ☆     ☆     ☆

211016n

   

早くも最後に、いきなり整数の計算式で、result = 6/2*(1+2) 。これはウチでも前に記事にした気がする、有名問題。6÷2(1+2)=6÷6=1と答えるのが、典型的な誤答だけど、式そのものがおかしいという異論もある。6÷2(1+2) という式の書き方は見ないから。

     

このプログラムでは、アスタリスクを入れて 2*(1+2) としてあるから、6÷2×(1+2) という計算。答(出力結果)は9。

   

あぁ、こんな初歩的レベルでもう時間切れになってしまった (^^ゞ 次はもう来年か♪ いや、今月中にまたプログラミング記事を書きたいと思う。こんな所で手間取ってるようでは時代に取り残されてしまうのだ。ではまた。。☆彡

     

       (計 2706字)

| | | コメント (0)

未解決問題「コラッツ予想」と確認用プログラミング(BASIC)~2011センター試験・数学ⅡB

たまに忘れた頃にプログラミング記事を書こうとすると、いつも最初の入口で引っかかる。コード入力して実行する、環境を作れないのだ。

          

今回だと、(少し前の?)高校数学で使われてた言語、BASIC(ベーシック)を使う環境がなかなか見つからない。今さら古過ぎるということか? 1つ前のPCにはインストールしてたけど、今のPCに新たにインストールするのも面倒。

   

そこで最初に試したのが、iOSアプリの Learn BASIC Programming。スイスイ使えていいと思ってたら、「ある数を超えない最大の整数」を表す INT 関数が使えないようで(?)、エラー表示が出る。解決策も発見できず。

     

次に試したのが、パソコンのブラウザで使えるはずのウェブ上のサービス、Quite BASIC。これはなぜか、コードの1行目の「INPUT N」が読めないとか言って来た。

    

これだけでもう、大量の時間とエネルギーを使い果たしたので、とりあえず自分でプログラムを書いて実行するのは断念。与えられたコードの画像を利用するだけにしよう。

☆追記: 翌朝、PCに十進BASICをインストールして成功。この記事の末尾にプログラムの画像を挿入した。)

   

   

     ☆     ☆     ☆

今回の記事のキッカケは、ネットで見かけた数学の懸賞金問題。1937年に数学者コラッツが提示した「コラッツ予想」(Collatz conjecture)に、日本のベンチャー企業から1億2000万円の懸賞金がかけられたとのこと。下の写真は英語版ウィキペディアより

  

210910b

     

それは7月の話だが、昨日は別の「ブレイクスルー賞」で、日本人2人がそれぞれ賞金300万ドル(3億3000万円)を獲得したニュースが流れてた。数学部門では、京都大学の望月拓郎教授(ABC予想関連の望月氏とは別人)。

   

望月拓郎氏の研究内容は、少しだけ調べてみた所だと、意味不明な言葉・概念が並んでいて、残念ながら全く理解不能。

   

それに対して、コラッツ予想は小学3年生くらいでも分かるし、計算実験で楽しめるはず。

   

 「どんな正の整数でも、偶数なら2で割る、奇数なら3倍して1を足す、という操作を繰り返せば、必ず1に到達するだろう。

   

  

     ☆     ☆     ☆

実際に試してみると、意外なほど長いプロセスになることもある。例えば、7なら、7→22→11→34→17→52→26→13→40→20→10→5→16→8→4→2→1。操作数は16回。

  

英語版ウィキペディアによると、2020年頃の段階では、10の20乗を超える所までコンピューター計算で確認されてるらしい。

     

ちょっと似た話なら、何度か聞いた気がする。例えば、6年前の人気ドラマ『デート』第9話では、「どんな数字も各位の2乗を足すと1か89になる」というコネタが挿入されてた

     

直感的には、コラッツ予想は簡単に示せそうな気もするが、提示から84年も経つのに未解決。ただ、ネットのあちこちに、センター試験に出題されたという情報があったので、すぐ問題ファイルを手に入れて解いてみた。

  

それが数学ⅡBの選択問題で、プログラミング関連。私が見た範囲では、どのサイトも、プログラミングの部分を飛ばして最初の導入だけ紹介してたので、ここでは本題のプログラミングも扱う。

    

   

     ☆     ☆     ☆

それでは、2011年のセンター試験問題を見てみよう。「日本の学校」HPよりダウンロードさせて頂いた

  

210910a

   

210910c

    

まず、簡単な(1)を解いてみる。

  

 6→3→10→5→16→8→4→2→1

 ∴ F(6)=(6から始めて1が得られるまでの操作回数)=8 ・・・アの答

  

 11→34→17→52→26→13→40→20→10→5→16→8→4→2→1

 ∴ F(11)=(11から始めて1が得られるまでの操作回数)=14 ・・・イの答

   

   

     ☆     ☆     ☆

この先は、環境作りの失敗で時間も無くなったので、穴埋めや選択肢を飛ばして、直ちに正解のプログラムを見てみよう。

   

210910e

210910d

  

     ☆     ☆     ☆

まず、最初の100番の行で、調べる自然数Nをインプット。問題(1)なら、6とか11。

   

次に110行で、Iという変数を用意して、最初はNの値をそのまま代入。操作が進むと、Iは変化していく。

  

一方、120行で、Cという変数(回数のカウント用)も用意して、最初は0を代入。1回の操作ごとに、+1で回数を増やしていく。

  

130行からが実質的な操作。まず、I=1なら、直ちに210行まで飛んで、F(1)=1と表示。

  

140行と150行は、もし「Iが偶数」なら2で割ったものをIとする、という条件を、「INT(I/2)×2=I」と書いてる。

  

これは、Iが奇数だと成り立たない。例えばI=3の時、INT(3/2)×2=1×2=2になって、条件を満たさず、180行に進むことになる。

  

160行は、1回の操作ごとに、回数Cに1を加える操作。170行は、「もし」という条件の終了。

  

180行は、1でもないし偶数でもない奇数Iに対して、3倍して1を加える操作。

  

190行で、回数1を加えた後、200行で130行までバックする。I=1になったら終了。

  

210行で、結果の表示。F(N)=C。NとCはここまでに登場した変数の値で、他は単なるアルファベットの文字とカッコの記号。

  

220行で、すべて終了。

   

   

     ☆     ☆     ☆

さらに、ある自然数M以下の自然数Nのうち、F(N)≦10となるすべてのNについて、F(N)の値を出力するプログラムへと書き換える。

   

最初と最後の辺りだけ少し変更して(下の青枠)、次のコードが正解。101行のFOR TO文で、N=1からMまでの実行を宣言。211行のNEXT Nで、次の数Nの操作へと進んで行く。PRINT(表示)は、C≦10の時だけ(210行)。

         

210910f

210911g2

   

これによって、次の8行が表示される(はず)。改行は省略。

 F(1)=0 F(2)=1 F(3)=7 F(4)=2 F(5)=5 F(6)=8 F(8)=3 F(10)=6

  

よって、210行の PRINT文が実行される回数は8 ・・・サの答

  

後で実際にプログラミングしてみる予定。とりあえず今日のところはこの辺で。。☆彡

  

  

P.S. 翌朝、2つとも自分で書いて、実行。この問題の説明通りに表示された。

   

210910h

  

210910i

    

      (計 2512字)

| | | コメント (0)

大学入学共通テスト2025年「情報」サンプル問題・第2問の解説~比例代表制選挙の当選者決定プログラム

朝日新聞の21年3月25日・朝刊に、令和7年度(2025年)大学入学共通テスト新科目の解説やサンプル問題例などが載ってた。

   

全体が長過ぎるので、とりあえず「情報」(必修科目・情報Ⅰの範囲)の問題だけ読むと、適度な難しさと量で第2問(抜粋)だけだったし、身近な選挙の話だから、ブログ記事を書くことを決定。

  

ところが、大学入試センターでも確認すると、朝日には無かった第2問の後半が載ってて難しく感じてしまった。私は情報Ⅰの科目内容を知らないから当たり前かも知れないが、これを数十万人の受験生(大部分は高校3年生)が短い時間で解答できるのか?

     

数年前の新テストのサンプルでもあったことだけど、本物の試験までにはレベルが下げられるだろうし、説明ももう少し丁寧になると思う。とにかく問題と解き方を見てみよう。単なる紹介や解説だけでなく、個人的な感想・意見も加える。問題文は長過ぎるので、コピペさせて頂いた。

    

  

     ☆     ☆     ☆

210331a-t

  

210331b-t

    

   

比例代表式選挙の獲得議席は、得票数に正確に比例させることは(ほとんど)出来ない。ごく簡単な例だと、議席数1の選挙区で、A党が3票、B党が2票だった時、正確に比例させると、0.6議席と0.4議席になってしまう。

  

実際の選挙だと、議席数は0以上の整数でなければならないので、正確な比例ではなく、大まかな比例を目指す方式が必要になる。日本では基本的にドント方式。私は昔、簡単な説明を読んだ気がするけど、完全に忘れてた。

  

問題の「基準得票数」とは、1議席が何票分かというより、何票で1議席とれるかと考えた方が分かりやすいと思う。合計3480票で6議席だから、580票で1議席とれる。この580が、下のプログラムでは kizyunsuu (基準数)と書かれてる。

      

配列 Tomei [i] は、i番目の党名の列。それぞれの要素は、例えば Tomei [0] ならA党。Tomei [1] ならB党。

  

配列 Tokuhyo [i] は、i番目の得票数の列。例えば Tokuhyo [2] なら、2番目のC党の得票数。ここでは、1440。

     

    

     ☆     ☆     ☆

210331c

   

sousuu という変数は、「得票数の総数」を表す。上のプログラムだと、(03)(05)(06)に従って、初期値0に4つの党の得票数を1つずつ足して行くことで求めてる。

  

1本の数式にまとめると、最終的に4つとも足し終えた後では、

sousuu=0+1200+660+1440+180=3480

    

giseki (議席)は選挙区ごとに決まった定数で、ここでは。他の選挙区では他の数値をとり得る。

  

よって、 kizyunsuu (基準数)= sousuu / giseki = 3480/6=580

  

後は、各党ごとに表示して行けば、下の枠内のようにモニター表示される。

  

  

     ☆     ☆     ☆   

210331d-t

    

  

単純な比例配分だと、それぞれの獲得議席数は無限小数になる可能性が高いし、小数点以下の切り上げ、四捨五入、切り捨て、いずれも(あまり)上手く行かない。そこで、先生が登場。

   

     

210331e-t

   

210331f-t

    

  

配列 Hikaku [i] は、獲得議席を1つずつ決める時に比較する数字の列。最初はどのi(つまり、どの党)でも、得票数そのものだが、1議席とると2で割り、2議席とると3で割る。どんどん小さくなるので、他の党にも議席獲得のチャンスが広がる。

  

配列 Tosen [i] は、i番目の党の当選数(=獲得議席数)。4党の合計が6になるまで、1回の比較ごとに、どれかが1ずつ増えていく。例えば、今回の比較ではD党が最大だから、D党の Tosen [3] が1増えるとか。

   

    

     ☆     ☆     ☆

210331g-t

   

210331h-a-t

    

  

最初、 Tosen (当選数)が0,0,0,0の状態からスタート。1回目の比較では、Hikaku [2] (つまりC党の数)が最大。よって、maxi(最大値を与えるi、つまり党番号)は2。よって、C党の当選数を表すTosen [2] が1増えて、Tosen には0,0,1,0と並ぶ。

   

2回目の比較では、C党だけ2で割った票数になって、Hikaku は1200,660,720,180と並ぶ。Hikaku [0] (つまりA党の数)が最大だから、maxiは0。よって、A党の当選数を表す Tosen [0] が1増えて、Tosen には1,0,1,0と並ぶ。以下、同様。

  

朝日新聞はこの問2までしか掲載してなかった。次の問3が私には難しくて、解きにくかったのだ。

     

   

     ☆     ☆     ☆

210331i-t

   

210331j-a-t

  

  

tosenkei は、その時点での当選者の合計。初期値0からスタートして、1ずつ増えて、議席数6に到達したら終了。つまり、tosenkei がgiseki (議席)6より小さい間は、比較して当選者を決めていく操作が繰り返される。

   

私はここまではすぐ理解できたけど、プログラムの(09)~(13)がなかなか分からなかった。「max」という新たな変数と、前に出て来てた「maxi」との違いがピンと来なかったし、そもそも何を繰り返し行ってるのかも分からない。

  

しばらく考えて、各回ごとに比較する4つの数字の中で最大の数値(max)を少しずつ探す作業だと分かった。まず、maxの初期値0からスタート。0< Hikaku [0] (つまり0<1200) だから、max=Hikaku [0]=1200。maxi は0(A党の党番号)。

  

次に、1200< Hikaku [1](つまり1200<660)ではないから、max も maxi も変化せず。さらに、1200< Hikaku [2] (つまり1200<1440)だから、max = Hikaku [2]=1440。maxi は2に変化。最後は、maxi は2のまま。

  

だから、プログラム(14)によって、Tosen [maxi](つまり Tosen [2]) は1増える。tosenkei(当選者数の合計)も1増加。

   

そして、Hikaku [maki] (つまり Hikaku [2])は、Tokuhyo [maxi] / (Tosen [maxi] +1)へと減少。つまり、Tokuhyo [2] / (Tosen [2] +1)へと減少。要するに、1人当選したC党の票数を1+1(つまり2)で割ってる。小数点以下は「切り捨て」関数で捨てる。

   

   

210331k-t

  

210331l-a-t

     

210331mthumb

   

  

最後は、各党の候補者数が足りなくなった場合への細かい配慮で一通りの完成。各回の比較で、最大値を探す時、候補者数が足りてる党の数値だけをチェックする。

  

普通に考えるなら、 (その党の候補者数)>(その時点のその党の当選者数) 。

不等号の使い方を少し変えると、 (その党の候補者数)≧(その時点のその党の当選者数)+1

  

候補者数の配列 Koho を追加で導入して、

 Koho [i] >= Tosen [i] +1

  

上の式をプログラムの(11)行に「and」で付加すればよい。最後の設問の選択肢では、≧ と< を混ぜてるから、受験生は迷ったり間違えたりする可能性が高い。まあ、最後を難しくするのはありがちな問題作成だし、OKだろう。

  

  

     ☆     ☆     ☆

これで、残る問題点は、そもそも議席数に対して立候補者数の合計が足りない時だけだろうか? 他にも何か細かいバグ(欠陥)がこのプログラムに含まれてるのかも。

    

この問題を自分で考えてる時、すぐに、比較する数値が同じになったら番号が小さい党が有利で不公平だと思ったけど、問題の一番最後にちゃんと説明してあった。

   

プログラムとの関連は分からないけど、選挙の最後にくじ引きの抽選を行ったというニュースは見覚えがある。そもそも選挙などやらずに、単なるくじ引きでいいという政治思想もあるくらいだから、許容範囲だろう。

  

運も実力の内。天の声、天命。というわけで、今日の天命(テンメイ)のブログ記事は終了♪ ではまた。。☆彡

   

      (計 3090字)

| | | コメント (0)

超初心者によるC言語入門2~答のケタ数指定、ルート(平方根)、三角関数、二次方程式の解の公式

フーッ。。 約3ヶ月ぶり、まだ2回目の超初心者は、準備だけでもう疲れ切った (^^ゞ ちなみに前回の記事はこちら。

  

 超初心者によるC言語入門、無料のオンライン・コンパイラ探しが困難、paiza(パイザ)がいいかも♪

  

まず、教科書『新情報技術基礎』(コロナ社)が見当たらない。って言うか、よりによって「コロナ」社か・・(^^ゞ 続いて、プログラミングするための環境作りでまた時間を取られてしまった。

  

前回、ネットのオンライン授業サイトPaiza(パイザ)を使ったのは何となく覚えてたけど、タブレットでまたC言語のアプリを探してみたのだ。1つ、良さげなのがあったからインストールしたら、環境はPaizaその他を使えとのこと(笑)。先に言って欲しいね。

  

で、Paizaラーニングにアクセスしても、全く覚えてないから、前回の自分のブログ記事で復習。勉強になる良い記事♪ マジメな話、普通のサイトや本に書いてない事まで書いてるから、私自身にとってはツボだった。とにかく、ここまでで1時間以上かかってしまった。。

   

   

     ☆     ☆     ☆

忘れてるから、ちょっとバックして、やり直そう。5章、C言語によるプログラミング3節、式と計算

  

問3半径が10の円の円周の長さを計算し、出力するプログラムを作成しなさい。(p.126)

   

円周率3.14が小数だから、等号(=)の右に書く「変換指定子」は、%f。数値の入力は、無理やり小数の形にして、2.0×3.14×10.0。いわゆる、2πr(ニ・パイ・アール)。

     

210112a2

       

何回、エンターキーを押してもダメ。そうそう。モニターの右側に隠れるように「コードの入力」ボタンがあるのを忘れてた。

  

210112l2

   

210112b

   

成功。既に1回、行の最後のセミコロンを忘れてエラー表示が出てしまった (^^ゞ 面倒くさっ。。 等号の記号は全角で入力してもいいのか。

  

あと、「return0;」は消しても大丈夫。さらに、10.0じゃなくて、整数10の入力でも大丈夫だった。2.0と3.14が小数だからかね?

  

小数点以下の00000もジャマだけど、深く考えないことにして先に進もうか。あっ!、小難しい説明があった♪ 例えば、変換指定子を「%5.2f」とすると、全体で5ケタ(小数点も1ケタと計算)になって、小数点以下が2ケタになると。確かに、実行すると、「62.80」と出力された♪

   

210112c2    

    

     ☆     ☆     ☆

続いて、例題5.4底辺の長さ4、高さ3の直角三角形の斜辺の長さを計算して出力するプログラム

   

3×3+4×4のルート(√)の計算だけど、結果はピッタシ5だから、無理数にはならないと。

     

ルート計算(平方根:square root)の関数「sqrt()」を使いたいから、上側に「#include <math.h>を挿入する必要がある。こんなの、省略できないのかね?

  

210112d 

     

210112e

   

教科書は結果のケタ数を指定してないけど、私は「%3.1f」として、全体3ケタ、小数点以下1ケタに設定。ちゃんと5.0が出力された。しかし、これも自動で判断してやってくれないかね?(^^ゞ

   

   

     ☆     ☆     ☆

次は三角関数。例題5.5sin30°、cos30°、tan30°を計算して出力するプログラム

    

sin()、cos()、tan()を使用。普通の度数表示の角30°を、高校数学用のラジアン表示の角に直して計算するから、角度の30に3.14を掛けて180で割る。いわゆる、π/180(180分のパイ)。

  

結果の数字は、全体5ケタ、小数点以下3ケタに指定するために、「%5.3f」と入力。

   

210112g

   

210112h

  

答えは合ってるけど、なぜか5行目に「コンパイル・エラー」の警告マークが付いてしまった。無料使用だから、エンジニアへの質問はできない♪ 教科書のままの入力なんだけど、なぜ?

  

210112i

  

5行目のスペースの入力が2ヶ所おかしいってこと? 私が全角スペースを入れたとかいうことかね? あっ、半角スペースに変えたら警告が消えた! 全角スペースは良くないのか。一応、結果は出力されるけど?  

    

   

     ☆     ☆     ☆

早くも最後は、二次方程式の解。問5x²+4x+3=0の解を公式で求めて

 解1=-1.000000

 解2=-3.000000

と出力するプログラム

   

二次方程式の解の公式の複合±を、+と-の2つに分離。解1はプラスで、{-b+√(b²-4ac)}/2a。解2はマイナスで、{-b-√(b²-4ac)}/2aとすると。

   

210112j

   

210112k

  

結果は全体8ケタ、小数点以下6ケタに設定。なぜか教科書は、ケタ数設定なしになってた。答を改行で2段にするから、変換指定子%8.6fの直後に、改行の記号「\n」を入れると。

    

本当は「¥n」だけど、なぜか円マークじゃなくて逆スラッシュになる。これは気にしなくていいらしい。

   

  

     ☆     ☆     ☆

方程式を入力するだけですぐ答が出るようにプログラミングしたいけど、まだ超初心者には敷居が高すぎてパス。

   

こんな遅いペースの進み方だと、この教科書だけで人生が終わるかも♪ それでは、また明日。。☆彡

    

        (計 2030字)

| | | コメント (0)

超初心者によるC言語入門、無料のオンライン・コンパイラ探しが困難、paiza(パイザ)がいいかも♪

もう、ドッと疲れた。。(^^ゞ 要するに、日本人が1人でたまにやるだけだから、何かと上手く行かないんだろうな。英語だらけ、大量の専門用語、トラブル続出。。

  

小学生向けのプログラミング記事を除いて、9ヶ月ぶりにプログラミング記事を書こうと思って選んだのが、名前だけは昔から度々聞いてるC言語。フツー過ぎて無意識の内に避けてたのか、過去15年間のブログでもほとんど触れてない。たった2回、言葉を出してるだけ。

    

今回は、工業高校の現行の教科書『新情報技術基礎』(コロナ社、非課税1496円)を利用して、一から始めようとしたけど、一(イチ)じゃなくて0(ゼロ)から始める必要があった。そもそも、C言語を扱える「開発環境」の準備に苦労したのだ。

   

201024a

      

     ☆     ☆     ☆

昔、高校数学の教科書でBASICを扱った時にも思ったけど、教科書はやっぱり学校で使うように出来てる。教えてくれる先生と環境が揃ってるのを前提にしてるのだ。

  

内容はかなり丁寧に書かれてるけど、私には引っかかる事だらけ。こう書けば正解、という具体例はあっても、「そう書かなかったらどうなのか?」、「別の正解は?」といった話がほとんど書かれてないから、結局は自分で試行錯誤するしかない。スペース(空白)や特殊な文字列の有無、改行の必要性など。

  

201024q

      

教科書・第5章、「C言語によるプログラミング」は、最初の2ページで大量の専門用語を簡単に並べた後、すぐにプログラミング開始。入力したプログラムを機械語に変換してコンピューターに理解させるための、「コンパイラ」(compiler)と呼ばれるソフト(またはアプリ)をどうするのかは書いてない。

   

本当のビギナーにとって、これが最大の難関だろう。情報は溢れ返ってるけど、分かりにくい説明が多いし、自分の端末でやってみると上手く行かないことが多いのだ。

   

   

     ☆     ☆     ☆

C言語ではなくJAVAなら、学習用コンパイラのiPadアプリを1月に手に入れてるけど、C言語で似たアプリはすぐには見当たらない(本当はあるんだろうけど)。

  

そこで、最近は放置プレイだけど前にしばらく使ってた学習アプリ、「Progate」(プロゲート)を使おうとしたら、パスワードを忘れてログイン不能 (^^ゞ 再発行で何とかログインすると、C言語のコースは無かった(笑)

    

仕方ないから、マイクロソフトの Visual Basic をダウンロード&インストールしようとしたら、重い、重い。よく分からないまま軽めのセットを選択しても7GB以上(!)で、あまりの遅さに中止。知らない人間がちょっと勉強するだけなのに、こんな苦労が必要なはずはない。

   

代わりにオンラインですぐ使える無料コンパイラを探すと、当然(?)海外サイトだらけで、動かなかったり、カーソルが逆向きに動いて(笑)入力が大変だったり、フィッシングで「おめでとうございます。当選!」みたいな表示が出たり (^^ゞ

  

この苦労を考えると案外、フツーにプログラミングのスクールに通う方が安上がりで手っ取り早いかも♪ しかし、小市民は無料で自宅で1人で頑張るのであった。時間の方が勿体ないんだけど。。

   

   

     ☆     ☆     ☆

失敗につぐ失敗で諦めかけた時に、ようやく良さげなサイトを発見。paiza(パイザ)ラーニング。「パイザ」は、通行証とかパスポートって意味で使ってる言葉だと思う。

  

以前のプロゲートと同じで、基本的には有料契約に誘い込む学習サイトだけど、無料の登録なしでも、超初心者の練習くらいは出来るようだ。萌え系の可愛い女の子キャラもお手伝いしてくれる♪

  

201024b

  

ここでは、コンパイラのことを、「オンライン・エディタ」と読んでる。女の子のすぐ右側だから、気分的に「入力」しやすい♪ 文字の入力ね。

  

無意味な見出しを除いて、教科書の通りに入力すると、「成功」! ちゃんと、「今日は (改行) 快晴です」と表示された。画面の一番下の、スクロールしないと見えない場所に(笑)。最初、気付かなかったほど。

    

201024c

   

201024d 

  

1行目の「#include <stdio.h>」で、stdio.hというファイルを読み込む(インクルードする)。2行目の「int main(void)」は、メインの関数(要するに命令)で、intは「戻り値」の型を指し、(void)は引数がないことを指すらしいけど、とりあえず意味不明♪

   

3行目からが実質的な指示で、「printf」で表示。二重引用符(ダブルクォーテーション)「"  "」で挟むと、そのままの文字が表示されると。日本語もOK。各行の最後のセミコロンを忘れると、次の行まで続く命令だと誤解される。

  

サイトにとっては、有料会員になってもらうのが成功か♪ 試しにクリックしてみると、「日本e-learning大賞 会長賞」☆

  

201024e

   

さらにクリックすると、12ヶ月で税込7200円か。安いね。まあでも、サブスクは使わなくてもどんどんお金を失うからな。アマゾン・プライムみたいに♪ またそれか! いや、最近、全く使ってないもんで。無理して買い物するのも妙な話だし、動画視聴は時間を取られるし。

   

   

     ☆     ☆     ☆

話を戻すと、コンパイラ探しと同じくらい時間を使うハメになったのが、改行を示す「¥n」の入力。これ、いくら頑張っても「\n」になってしまう。半角の円マークが、半角の逆スラッシュになるのだ。

  

パソコンのキーボード設定はちゃんと「日本語キーボード(106/109キー)」になってる。どうも、半角の円マークと半角の逆スラッシュは同じコードのようだけど、同じ右上のキーを押しても、場合によって「¥」が入力されたり「\」が入力されたりするのだ。

  

ちなみにこの管理画面では「\」になるから、「¥」は環境依存の文字として「えん」から変換して入力してる。それぞれの読者の端末でどう表示されるのかは知らない♪ 

  

円マークの無いプログラムだけ練習しようかと思ったけど、教科書のその後を読んでも円マークが登場。結局、パイザのサイトだと、逆スラッシュのまま「\n」と入力すれば良かった。気にしないで、無視♪

      

これがダメなサイトもあるのだ。もちろん(?)、環境依存文字もエラー。温厚で寛容な私もそこでイラついて、精神的パワーを浪費してしまった。

   

    

    ☆     ☆     ☆

201024f

   

さっきの入力を少し変えて、改行を減らして、「\n」を消してみると、「今日は快晴です」と一続きで出力された。なるほど、スペースさえ入らないわけね。

  

ちなみに、最後「return 0」のスペースを省略して「return0」と入力すると、エラーになった。こうゆうのがイヤなのだ。スペースや改行は、必要な時と必要でない時の区別をしにくい。

  

  

教科書の次は、面積の計算。というより、実際は単なる整数の掛け算。20×40

  

201024g

  

201024h

   

4行目の「/n」は省略してもいいけど、「%d」は省略不可。「値を10進数の整数値として扱う」という意味の「変換指定子」とのこと。

  

教科書のその後にある体積の計算(整数の掛け算10×20×30)も同時に書いてみたら、成功した。ちょっと調子が出て来たかも♪ 2行の命令なら、1行目だけ「\n」で改行すればいいのか。

    

201024i 

  

201024j

  

ちなみに命令部分の1行目の「\n」も消してみたら、改行が無くなって、「面積=800体積=6000」と表示された。スペースさえ入らないから、これはダメ。

  

  

     ☆     ☆     ☆

最後は、教科書・問2。「底辺の長さが4で高さが50の三角形の面積を計算し、実行するプログラムを作成しなさい」。わざと改行を減らして短く書いてみたけど、ちゃんと成功した。底辺×高さ÷2の「÷2」は、「/2」と入力するだけ。

   

201024k

   

201024l

  

実は最初、「0.5*4*50」と書いたら失敗。そうか、小数はダメなわけね。今後の研究課題としよう♪ またそれか!

 

あっ、例題5・3の球の体積だと、円周率3.14を掛けるから、整数じゃなくて実数の変換指定子「%f」を使ってた。半径6の球の体積

   

201024m

   

201024n

   

それなら、いつも%fでいいんじゃないの?、と思うけど、「現象には必ず理由がある」byガリレオ湯川♪ 何か、意味があるんだろうね。

   

あっ、実数扱いだと入力も無理やり小数にしなきゃいけないのか。面倒くさい。問4、200Ωと300Ωの抵抗の並列接続による合成抵抗の計算。指示された(下手な)数式を使うと、こうなると。何か、もっとラクに入力する技があるんだろうけど。無駄な小数点のおかげで、式も見にくい。

      

201024o

  

201024p

    

答は、いわゆる「和分の積」、200×300/(200+300)だから、60000/500=120オーム。当然、元の2つの抵抗値より小さくなる。1行目と2行目の正確な理解や、最後のreturn 0の理解は、また今度。

   

   

     ☆     ☆     ☆

フーッ。。 これでC言語もマスターしたから、次はもうC++か(笑)。シープラプラって可愛い呼び名だけは昔から知ってるのだ。記号は、エラー表示に見えるけど♪

      

それにしても、やっぱり最初の「環境構築」が一番大変だなと、あらためて痛感。自分のパソコンだと故障が怖いから、職場で試そうかな♪ コラコラ! ではまた明日。。☆彡

   

   

  

cf. 超初心者によるC言語入門2~答のケタ数指定、ルート(平方根)、三角関数、二次方程式の解の公式

    

      (計 3664字)

    (追記49字 ; 合計4713字)

| | | コメント (0)

小学校『5、6年のプログラミング ドリル』問題と解き方4、アルゴリズム、移り変わり図

この3ヶ月で、小学生向けの学習参考書『5、6年の楽しいプログラミング ドリルの王様』(新興出版社)について、問題と解き方を紹介する記事を3本書きました。

   

1本目の記事へのリンクはここです。2本目へのリンクはここです。3本目へのリンクはここです。

  

今日はそれらの続きとして、4本目の記事を書きます。はじめの2回で大まかな説明はしてるので、今回もすぐ問題に行きます。問題文の書き方は少し変えてます。

   

   

   ☆    ☆    ☆

では、第1問。ドリルの52ページの問題、「25 コンピュータの考え方②」。

  

問② そうたさんは、カード型の鍵(かぎ、キー)を使って、部屋に入ろうとしています。カードの読み取り機は、次の通りに、ドアを開けるか開けないかの判断をします。

  

1.カードの番号(横に並んだ13ケタの数)を読み取る。  2.左から1、3、5、7、9、11、13番目の数字を上に書いて、足し算する。また、左から2、4、6、8、10、12番目の数を下に書いて、足し算する

  

3.下の方の足し算の結果に3をかける。  4.上の方の足し算の結果と、3の結果を、足し算する。

 

5.4の結果の数で、一の位が0なら、ドアを開ける。一の位の数が0でないなら、ドアを開けない。

  

次のカードで、そうたさんは部屋に入れますか?

A.1235427902184   B.6827913304018

  

  

    ☆    ☆    ☆

では、解答です。Aのカードから見て行きましょう。

上の数の足し算は、1+3+4+7+0+1+4=20。下の数の足し算は、2+5+2+9+2+8=28だから、3をかけると、28×3=84。

 

だから、上+(下×3)=20+84=104。よって、一の位の数が0でないから、ドアを開けず、部屋に入れません

  

次に、Bのカードについて。上の数の足し算は、6+2+9+3+0+0+8=28。下の数の足し算は、8+7+1+3+4+1=24だから、3をかけると、24×3=72。

  

だから、上+(下×3)=28+72=100。よって、一の位の数が0だから、ドアを開けて、部屋に入れます

   

  

そんな計算しなくても、入れるか入れないかだけ、簡単にカードに書けばいいのに・・という気もしますよね。

  

たぶん、数や読み取り方(プログラム)を変えることで、色んなことが出来るからだと思います。例えば、部屋に入れるのはいつまでなのか、とか、何人なのか、とか、13ケタの数に色んな意味を持たせることができるでしょう。

   

  

    ☆    ☆    ☆

次に、第2問。ドリルの62ページの問題、「30 アルゴリズム⑤」。アルゴリズムという言葉は、前回の記事(3本目)にも書きましたが、ある目的、問題の解決に向かって、1つずつ進む手続きをまとめたもの。 もとは数学者(難しい算数のプロ)の名前です。

    

問② 家と道がかかれた下の図で、丸の中に書かれた数は、その道を通るのに何分かかるかを表します。

  

200526a

  

(1)さくらの家から、お店を通って、ゆなの家に行きます。最も早く行くためには何分かかりますか?

(2)そうたの家から、ひまりの家を通って、りこの家に行きます。最も早く行くには何分かかりますか?

    

  

   ☆    ☆    ☆

では(1)から解きましょう。時間の長さは、道の長さと比例してますが、道を見ただけだとよく分かりません。いくつか計算して、合計時間を比べることになります。

     

さくらの家からお店までは、ゆうまとひまりとゆなの家を通るのが一番早くて、4分+3分+5分+2分=14分です。次に、お店からゆなの家までは、2分です。だから、合わせて、14分+2分=16分です。

  

ゆなとお店の間の道は2回通りますが、2回はダメとは書いてないので大丈夫です。また、さくら→ゆうま→そうた→りこ→お店→ゆなの順なら、4分+5分+3分+6分+2分=20分。だから、16分より遅くなってしまいます。

   

次に(2)。まず、そうたの家から、ひまりの家までは、ゆうまの家を通るのが一番早くて、5分+3分=8分。次に、ひまりの家からりこの家までは、来た道をそのまま帰って、ゆうま、そうたの家を通るのが一番早いです。3分+5分+3分=11分。

  

だから、合わせて、8分+11分=19分です。

  

このような、時間や長さが最も短い道を探す問題は、家と道が増えると面倒で難しくなるので、人間だと大変。だから、コンピューターが色々な道の時間を計算して、比べて一番短い時間や距離を探すことになります。

    

   

    ☆    ☆    ☆

次に、第3問。ドリルの70ページの問題、「34 移り変わり図①」。いくつかのもの(物、人など)の状態が、少しずつ変わる様子を考える図のことです。 

    

問② 下図は、スーパーのレジでのやり取りを表したものです。

  

200526b

  

次の説明から、正しいものを2つ選びましょう。

ア.客は商品を置くと同時にお金をはらう。   イ.レジ係は合計金額を伝えると同時に商品をわたす。

ウ.客は商品の合計金額を確かめてからお金をはらう。   エ.レジ係は客がはらったお金を確かめてから合計金額を伝える。

オ.客は商品のお金をはらってから商品を置く。   カ.レジ係は客がはらったお金を確かめてからおつりと商品をわたす。

  

  

     ☆    ☆    ☆

これは、図が無くても、常識で分かるでしょう♪ まず、ウが正しいですね。図だと、左上あたりを見ればそうなってます。

 

次に、カが正しいですね。図だと、右下あたりを見ることになります。

   

     

実際のスーパーやコンビニ、100円ショップだと、商品が1コなら、お客さんは商品とお金を同時に置くことがあります。また、合計金額を伝えると同時に商品を客の近くに置くレジ係もいます。

   

客とレジ係がお互いによく知ってて、相手を信頼してる場合も、あまり順番にはこだわらないでしょう。上図はあくまで、機械的な決めごと。今後はレジ係もロボットが増えるでしょうから、きっちり決めておく必要があります。

    

2つのコンピューターで、互いにデータをやり取りしながら計算していく場合も、似たような図になるでしょうね。それでは今日はこの辺で。。☆彡

   

      (計 2436字)

| | | コメント (0)

小学校『5、6年の楽しいプログラミング ドリルの王様』、問題と解き方3

この1ヶ月半で、小学生向けの学習参考書『5、6年の楽しいプログラミング ドリルの王様』(新興出版社)について、問題と解き方を紹介する記事を2本書きました。1本目の記事へのリンクはここです。2本目へのリンクはここです。

  

今日はその続きとして、3本目の記事を書きます。下の画像は、AMAZON(アマゾン)の通販ページです。同じシリーズで、小学1・2年生用、3・4年生用のドリルもあります。

       

200305a 

   

  

    ☆    ☆    ☆

前の2回で大まかな説明はしてるので、今回はすぐ問題に行きます。

では、第1問。ドリルの49~50ページの問題、「24 コンピュータの考え方①」。

  

問① 2つのカーペットを重ねると、色が変わります。白の部分と白の部分が重なると、そこは白になります。それ以外の重なり方だと、その部分は黒になります。

では、下の2枚のカーペットを重なると、どんな模様(もよう)になりますか?

  

200414a

  

   

   ☆    ☆    ☆

この変化は、わりと簡単にイメージできると思います。答は下図です。

 

200414b

  

   

この変化はいずれ、中学校・高校・大学とかで、「ORゲート」のような名前で習います。読み方は、オーアール・ゲートとか、オア・ゲート。コンピューターの設計図の部品(のはたらき)なのです。

    

白と白で、白」は、「0+0=0」などと書きます。「黒と黒で、黒」なら、「1+1=1」などと書きます。ちょっと変な計算だけど、すぐになれます。書き方は色々あるので、その時の先生や本などの指示に合わせます。

  

  

    ☆    ☆    ☆

問③ 次の変化では、重ねる2枚のカーペットの片方でも白の部分は、白になります。黒の部分と黒の部分が重なると、黒になります。そのルールで色を変えた後、さらに、白は黒に変え、黒は白に変えます。

  

次の2枚のカーペットを重ねると、どんな模様(もよう)になりますか?

  

200414c2

  

  

    ☆    ☆    ☆

1つずつ、進みましょう。まず、2枚を重ねるだけだと、下図のようになります。

   

200414d

   

さらに、白と黒を入れ替えると、下図になります。これがです。

  

200414e

  

  

1つめの変化はいずれ、中学校・高校・大学とかで、「ANDゲート」のような名前で習います。読み方は、アンド・ゲート。これもコンピューターの設計図の部品です。

    

白と黒で、白」は、「0・1=0」などと書きます。「黒と黒で、黒」なら、「1・1=1」です。ちょっと変な計算だけど、すぐになれます。

  

2つめの変化はいずれ、「NOTゲート」のような名前で習います。読み方は、ノット・ゲート。コンピューターの設計図の部品なのです。「白は、黒になる」なら、「¬0=1」。「黒は、白になる」なら、「¬1=0」などと書きます。

   

2つの変化を合わせて、例えば、「黒と白を合わせて白にした後、黒になる」のなら、「¬(1・0)=1」などと書きます。ちょっと難しいですね。今はまだ、ふう~んと聞き流していいです♪

   

  

   ☆    ☆    ☆

では、第2問。ドリルの59ページの問題、「29 アルゴリズム④」。

  

ロボットに命令して、5つの箱に書かれた数を、小さい順に並べ替えます。最初は左から右に、5、2、3、1、4と並んでます。ロボットは次のルールに従って、左右に動きます。

 

1. 正面の数と右どなりの数を見る。

2. 右どなりの数の方が小さければ、正面と右隣りを交かんする。

3. 右へ移動する。右端に移動するまで、1~3をくり返す。

4. 右はしまで来たら、左はしにもどる。右はしに移動した箱は見ない。

  

下の表の、(ア)、(イ)、(ウ)、(エ)に当てはまることばは何ですか? また、全部で何回、箱を交かんしましたか?

  

比べた回数 比べる数 交かん 比べた後のならび方

0回目            52314

1回目  5と2  する  25314

2回目  5と3  する  23514

3回目  5と1  する  2315

4回目  5と4  する  23145

 (左はしにもどる)

5回目  2と3 しない  23145

6回目  3と1  する  21345

7回目  3と4 (ア)  21345

 (右はしの5は見ないで左はしにもどる)

8回目  2と1 (イ)  12345

9回目  2と3 (ウ)  12345

(右はしの4と5は見ないで左はしにもどる)

10回目  1と2 (エ)  12345

  

  

    ☆    ☆    ☆

ちょっと難しいですね。特に、右はしに来た時にどうするのか、問題文のルールも分かりにくくなってるので、自分で「たぶん、こうゆう意味だろうな」と考えることになります。問題文が長いので、少しはぶいて短くしてるのです。

    

7回目。3と4を比べると、右の4の方が大きいので、交かんは「しない」・・(ア)の答。8回目。2と1を比べると、右の1の方が小さいので、交かんは「する」・・(イ)の答

  

9回目。2と3を比べると、右の3の方が大きいので、交かんは「しない」・・(ウ)の答。10回目。1と2を比べると、右の2の方が大きいので、交かんは「しない」・・(エ)の答

  

全部で、交かんは、6回です。・・・

   

   

    ☆    ☆    ☆

全体を大きく見直すと、ロボットの右への動き4セットになってます。1つ目のセットで、5が一番右に決まります。次に左はしにもどって、2つ目のセットで、4が右から2番目に決まります。

  

また左はしにもどって、3つ目のセットで、3が右から3番目に決まります。また左はしにもどって、4つ目のセットで、2が右から4番目に決まって、おしまいです。最後のセットではもう、ロボットは動かず、1と2を見て比べるだけです。

   

アルゴリズム」という言葉は初めて聞いたかも知れませんね。ある数学者の名前から作った言葉なのです。要するに、何かある目的、問題の解決に向かって、1つずつ進む手続きをまとめたものです。

   

例えばこの問題なら、5つの数を小さい順に並べるための手続きのまとめ(アルゴリズム)、ということです。その中で、たとえば2つ目のセットなら、左側の4つの数の中で一番大きい数(つまり4)を、右はしから2番目に決めてるのです。

  

新型コロナウイルスのせいで大変ですが、気楽にがんばってくださいね♪ それでは、今日はこの辺で。。☆彡

   

     (計 2412字)

| | | コメント (0)

より以前の記事一覧