2024年10月30日 第7回
書くコードが複雑になるほど読み直した時に理解できなくなり,
ここは何をやっていたのかわからなくなることが多かった.
コメントを時間を多少かけてでも丁寧に書いた方が
もう一度コードを読んで理解するよりも効率がいいかもしれないと思った.
そうですね.後から見返すとわからなくなることが多いので,
こんなに書かなくてもいいだろうぐらいを超えるぐらい丁寧な
コメントを書くと良いでしょう.
変換仕様についてよく学び,
うまく使えるようになる必要がある.
落ち着いてやってください.
マクロの利用の#define NUM 5というふうにコードを入力しなければならなかったのに
int NUM =5としていたのでうまくいかなかった.
間違いについてわかっているので問題ないでしょう.
今日はリストと文字列について扱った.
今回の課題は少しレベルが高く,
また自分はリストの長さを指定する際の数字について勘違いしていたこともあり,
時間がかかってしまった.
また,C言語には型としての文字列はないのでどのように表現するのか気になっていたのだが,
それは一文字をたくさん連ねてリストにすることで文字列を再現することに成功したことが分かった.
最近のプログラミング演習の時間はいろいろな複雑な関数を学べるので,とても楽しいと思う.
楽しいのであればよかったと思います.
配列を用いることで宣言する識別子を少なくしてコードを書くことができた.
さらに配列をif分,for文と組み合わせることで表現できることがらが増えた.
素晴らしい.
魔法陣の問題で,条件を足していくと,
どの階層にいるのかわからなくなって何度も書き直した.
配列の初期化をしていないと,いざつかうときに初期値で変な値を出力することがあるので,
初期化する意識を持っていきたい.
そうですね.配列に限らず変数については初期化しておいた方が良いでしょう.
今回の魔方陣の問題は最初にどこから手を付ければいいか悩み,非常に手こずりました.
そこで紙にとりあえず書いてみて,
進めていったらうまくいけそうかもと思えるようになり,
いろいろ調整をしながらうまく動くようにすることができました.
素晴らしい.
課題で書くコードの量が増えていて,初心者にとっては複雑なのでとても難しいと感じた.
特に多次元配列の使い方があまりよくわからず,てこずった.
課題をこなすうちに慣れていきたい.
分からないのであれば質問をしてもらうのが良いでしょう.
答えを教えるわけには行きませんが,議論しながら分かるようになってもらえると思います.
演習を通して,今回学んだ配列はもちろんだが,
for文などを用いたループの便利さに気付かされた.
工夫次第で書く文の量を大幅に減らすことができ,演習を行っていて楽しく感じた.
そうですね.うまく工夫できると良いですね.
魔法陣が難しかったです.
コンパイルはうまくいってるのに想像通りにならず,
先生が言っていたことを実感しました.
そうですか.でも魔法陣も答えがわかっているのでね...
kadai5でa〜zの数を数える際に,
a〜zのそれぞれの文字を文字列として出力しようとするとうまくいかず,
文字として出力しないといけないということに気が付くのに時間がかかりました.
また,行列の問題は$2 \times 2$行列のみに適応される状態になっているので,
これから提出までに修正して$N \times N$行列でも計算できるようにしようと思います.
トライしてみると良いですね.大変だと思いますが.
配列を使って初めて文字stringを扱えると言うのがすごく不便に感じたが,
C++などのstringもcharの配列のようなものであるため,本来の姿を学べたと思う.
ここで気になったのですが,c言語の配列には拡張性,
あるいは要素数を定義しないて配列を定義する方法はあるのでしょうか.
実際に演習でも文字数が不明なcharの配列を定義するとき,
多めに要素を取るため多くのメモリを消費してしまい,非効率と思いました.
また,話は変わって提出形式についてですが,
魔方陣の出力などで,見本に枠があったとき,
それも出力するようにコードを書きましたが,ifがたくさん出てきて見づらくなりました.
枠(+---+のようなもの)は必要ですか?
良いコメントだと思います.ありますよ.次回触れましょう.
今週の課題は自分の中では複雑なものが多いと感じた.
今回の演習をきちんと復習して次の演習に繋げていきたい.
期待しています.
今回の演習では,配列について学び,利用しましたが,
いつもの演習よりもてこずってしまいました.
どのようなプログラムを書けばよいかを
フローチャートを用いて考えようとしても行き詰まってしまうこともあり,
うまくプログラミングが書けるように,日々の予習復習により集中して取り組みたいと思った.
分からない場合は質問してください.ヒントを出すことができます.
配列の操作における基本的なアルゴリズムの実装が理解でき,
実際のコードにどのように適用できるかを学べました.
今後も応用できるようにしたいと思います.
また課題6では,魔法陣を生成するアルゴリズムをプログラムで実装する際,
配置ルールをうまくコードに落とし込むのが難しかったです.
そのため,$3 \times 3$や$5 \times 5$の奇数次元の魔法陣で使われるルールを実装することで,
論理的思考が鍛えてみたりもしました.
よろしいと思います.
今回の演習では配列を学びました.
これは,今まで学習してきた構文と組み合わせると,
よりプログラミングの幅が広がると思います.
ですので,しっかり今までやってきたことを復習し,
使いこなせるようにしたいと思います.
そうしてください.
今日の課題は今までの知識をたくさん使う場面があったので楽しくできました.
少し応用しなければならないようなところもたくさんあったので苦労しました.
楽しいのであればよかったです.
課題4の行列計算が難しかったが自力でコードを書けたことで,
少しC言語が楽しいと思えた.
楽しいのは素晴らしい.
今回の課題で,文字列のアルファベット別の文字数を求める問題や魔方陣の問題でかなり悩みましたが,
どうにか解くことが出来ました.
よろしいと思います.
問題4の行列は$2 \times 2$行列だったのでどういった処理を行えば良いか整理したらできたが,
サイズが大きくなるともっと複雑になると思うので,
どんなサイズでも対応できるように今回習ったことを復習して,他のことでも活かせるようにする.
そうでうすね.考えてみると良いでしょう.
文字1つを標準出力するのか,文字列を標準出力するのかで
「&」をつけるかつけないのかが変わってくるので気を付けたいです.
また, 私たちプログラマー(になるかも)にとってエラーをなくすのは必ず必要であり,
コンパイルエラーなど可愛いもんだという教授のコメントに大変共感しました.
しかし,ゲームのバグを楽しんでいる自分も一方にあり少し複雑な気持ちになりました.
バグを楽しむこと自体はよろしいことなのでは?自分で作るものについては
バグがないようにするのが良いと思いますが.
計算が正しくできたとしても,
ユーザーに結果を見やすくするための調整も考えるとなるとかなり時間がかかった.
行列演算をコーディングすることで,配列のイメージが自分の中に落とし込みやすかったので良かった.
素晴らしい.
コードの文量が多いまま実際に書くと,
ミスに気がつき憎くなることに加えて,時間もかかるので,
できる限りもっとわかりやすく書けないかを考えるようにしたい.
まずは戦略を立てましょう.
配列やそれを応用したソーティングなどについて学び,
演習課題を通じて理解を深めることができた.
また,標準入力された文字列を配列に格納して繰り返し処理を行うとき,
文字列が終わったら偽となり繰り返し処理を終了させる条件を簡潔に記述できるなど,
文字列配列の末尾にヌル文字が格納されるという仕様の利便性や,
文字列をヌル文字で終端させることの必要性を実感できた.
よろしいと思います.
これまではあまり恩恵を感じてこなかったフローチャートだが,
今回からプログラムの作成難易度が上がった(あくまで個人の感想です)と感じ,
思い通りに動かなかったときに確認したらミスを見つけることができたので,
その有用性を再確認することができた.
どのレベルで必要となるかは個人依存なので,今まではいらなかったというのは
アリだと思います.
複数のデータをまとめて処理する際に,「配列」を用いることで,
1つの変数名で複数の値を処理することが出来ると学ぶことが出来た.
また,ある集合の要素をある順序に従って並び替えるのには
「ソーティング」が有効だと学ぶことが出来た.
ソーティングも色々な方法があります.
今回は一つ一つの課題が重かったのでかなり苦戦しました.
次回も頑張ります.
そうしてください.期待していますよ.
今回は配列について学びましたが,課題がなかなか難しく,
1つひとつ,じっくり考えて,何度も修正しないと出来ないですが,
調べてみたりして課題をこなせるように頑張りたいです
考えることが大切なのでこの調子でいけば大丈夫でしょう.
今回は,配列について勉強した.
理大祭の準備でC言語以外の言語を書いているが,
ほとんどの言語は大体の用意されているものは同じで
ドキュメントを見ながら引数が何か確認をしたりするなど,
基本を理解することの大切さを実感した.
この講義でも,一つ一つ丁寧に理解しながら学習をしていきたい.
そうですね.基本は大切ですね.
配列は関連のある数字や文字を同じように表すことができ,
わかりやすく簡潔にプログラムできる点で優れていると感じた.
その通りですね.
2次元配列の導入によって,行列を表現することができることがわかった.
行列の積を出力するのに多くの時間を費やしてしまった.
今までやってきたことを復習して,今後の演習で困らないようにしていこうと思った.
まずは慣れることで良いと思います.
今回,配列について学んだが思ったよりはスムーズにプログラムを組めていたと思う.
しかし,肝心のタイプ速度が遅く時間がかかっているように思う.
スムーズなのであれば素晴らしい.タイプの速度はこれから早くなるでしょう.
後半の課題はかなり苦労した.
紙に書いたフローチャートと見比べながら,
どこまでは正しく動いているのかをprintfでこまめに確認することで,
ミスの場所を突き止める事ができた.
それで良いと思いますよ.
行列式の積の計算のアルゴリズムや魔法陣など今回は特に楽しかったです.
楽しかったのであればよかったです.
今回の課題はかなり難しいが,その中のロジックを考えることが面白いです
面白いのであればよかったです.
配列を使っていると,
プログラムにバグを起こすような入力が簡単にできてしまうということを実感できた.
今までのコードは入力値などを勝手に自分で絞り込んでしまっていたので
バグを簡単に起こせてしまうなと思った.
あらゆる入力に対応した良いコードを書くのは本当に難しそうだなと感じた.
そうですね.良いコメントですね.
周りの人に比べて自分のプログラミングのスピードが遅いので,
焦りを感じて冷静にプログラミングに取り組むことができていませんでしたが,
教授がプログラミングが遅くても気にすることはないとおっしゃっていたのを聞いて,
心が楽になり,落ち着いて演習を行うことができました.
rand関数の使い方に慣れていないため,
for文や他のものと組み合わせて使おうとしたときに混乱してしまいました.
そうです.まずは落ち着いてやるのが一番です.
オプション課題2の逆行列を求める問題で,
#define N 2とし,Nを使ってコードを書いたのですが,
出来たあとでそれが$2 \times 2$行列の逆行列しか求められないことに気がつきました.
逆行列の求め方を一般化した時のsign($\sigma$)はどうやって求めればいいのか気になりましたが
調べても知らない関数を使ったコードばかりであまり分かりませんでした.
どこを見ましたか?
課題5でアルファベットのa〜zをfor文で表せなくて全て書くことになり,時間がかかってしまった.
解いた後にa〜zの文字列をつくれば良いと友達にアイディアをもらい,
数字を文字にどう応用するかの考えが足りなかったなと思った.
柔軟な思考でいかに効率的なコードを見つけ出すかが大切だなと思った.
課題6ではコードが違ったときに何も出力されなくなってしまって,
どこが間違えているのか分からず大変だった.
このような場合に間違えている箇所を見つける良い方法があったら知りたいと思った.
問題が思考力を使うようになってきて難しいが,作業的な問題よりも解く楽しみがあり面白かった.
次回触れましょう.
今回の課題では,今までよりも条件が増え,
情報を整理しながら進めるのが難しく感じたので
頭が混乱しないようにするにはどうしたらいいか気になった.
まずは落ち着いて何を計算するのかを考えましょう.
教授が何度もおっしゃった「コンパイルはできるが正しい値が求まらないエラー」が興味深く思えました.
今の段階からそのようなバグを防ぐためにできる取り組みや意識を教えていただきたいです.
良いコメントですが.それは計算不能なのですよ.次回触れますね.
初めのころと比べてコンパイルしてエラーが発生することが少なくなった.
ソースコードをいきなり書き始めるのではなく,フローチャートを紙に書いて,
まずはどのように課題を解決していくのかを吟味することの大切さを成長とともに実感した.
その通りです.素晴らしいね.
今回は配列について学んだ.
配列を使う際は,添字の値に十分な注意が必要であることを理解した.
また,マクロを使うと特定の値にのみ対応するのではなく一般化できるので,
マクロの利用はとても重要だと感じた.
2次元配列を使う問題に苦戦しているので,しっかり復習する必要がある.
良いコメントですが,一般化についてはさらに上があるので次回触れましょう.
マスを移動する際の,移動先の判定手段に少し手こずった
でもできましたか?
配列は全部列挙する必要がなくなるから便利だと感じた.
ある文字を抜き出し,数えるのが難しかった
その通りですね.便利です.
今までの課題は自分の身の回りのものへの活用方法がいまいちよくわかっていませんでしたが,
今回の数列の計算の課題を通して,
普段使っているインターネット上の計算ソフトの仕組みが少しわかった気がしました.
数学のような,数値に規則性があるものとの相性の良さがわかりました.
そうですね.その通りですね.
C言語では,配列の範囲外にアクセスしてもすぐに参照エラーが返ってくるのではなく,
プログラム内で確保されている別のメモリにアクセスできてしまうということが課題3で分かりました.
これはつまり,C言語では意図しないメモリの値の書き換えが行えてしまう危険があるということでしょうか.
C++やJavaでは範囲外参照をすると即座に実行時エラーとなるのでこのような心配はないと思うのですが.
また,これは前回書き忘れてしまった内容なのですが,
教科書や講義資料でfor文でループを回すときに,
カウンタ変数をループブロックの外で宣言する書き方 :
int i;
for (i = 0; i < N; i++) {...}
をしていることが気になりました.
ループブロックに埋め込む書き方 :
for (int i = 0; i < N; i++) {...}
でもコンパイルエラーとはならず,
私としてはカウンタ変数 i を大域変数とすることに違和感があるのですが,
何か理由があるのでしょうか.
言いたいことはわかりました.
次回触れますが,情報の皆さんは歴史的なことも含めて知っておくべき内容かなとも思います.
今回は非常に難しかった. フローチャートに時点で難しく感じたが,
わからない時は自分で調べ, 塾講師ながら進めていくことが大切だと思った.
次回はもっと難しいですよ.
今回の講義の配列は高校でさわりだけやっていたが想像よりも難しく大変だった.
そうですか.高校でやるのですね.
aからzまでの判別をするときにコードがとても長くなってしまったのでうまく短くできるやり方を考えたい.
forやifはコードを簡潔にするのによく使えると思うので,
より使いこなせるように復習しようと思う.
色々なコードをかくのがいいですね.すぐにできます.
今回の課題で特に魔法陣が難易度的に高めであると感じました.
コードを打つ際に変数を多く使ってしまったため,
どの変数が何を表しているのかを再確認するのがとても大変でした.
そこから,どの変数が何を示しているのかを
わかりやすく置く事がとても大事であると痛感しました.
変数名ということでしょうか.確かにそれも大切ですね.
今回の演習では行列の部分と魔法陣で苦戦し,
縦にだけで表現されるものよりも横にも出力するものがとても苦手だと感じました.
これから基礎の段階からしっかりと復習して身につけなければならないと感じました.
ぜひ復習してください.
一応は正しい結果が出力できたとしても,
行列に入れる値によっては出力結果が汚い(揃っていないなど)ことが多く,
それを直すのがかなり大変だと感じた.
確かになかなか難しいですね.
本日は配列の宣言方法について学びました.
2次配列を活用する問題はかなり難しく感じました.
どこが難しいでしょうか.
今回は配列と繰り返しの組み合わせ方を学びました.
2次元の配列の扱いと行列計算が同じような方法でできることから,
線形代数を学ぶ意義の一端を見ることができました.
今後扱うデータが膨大になってくると,
3次元以上の配列の扱いも必要になってくると思うので,
その練習もしようと思いました.
そうしてください.
今回は配列について学びました.
1次元の配列はうまく扱えたのですが,2次元から少し苦戦しました.
課題6の$N * N$の魔法陣の作り方が全然わかりませんでした.
分からなければ質問してくれたらヒントをバンバンだしますよ.
今回の講義では,配列と文字列について学びました.
文字列を配列として扱うということが不思議で,
なぜこのような扱いになっているのか気になりました.
また,日本語などの多バイト文字はどのように扱われるのかも知りたくなりました.
一方,途中で#defineマクロについて触れましたが,
意義や使いどころがあまりよくわかりませんでした.
変数で定数を表現するのと何が違うのでしょうか?
次回触れますね.
難しかったので,しっかり復習してこようと思った
そうしてください.