わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

文字列を配列に格納すると

 いきなりですが問題です.以下について,【  】の欄に適切な語句または数値を入れ,適切な文章にしましょう.

 文字列を配列に格納したい場合,例えばchar s[34] = "Cwm fjord veg balks nth pyx quiz.";と書くことができる.ここで34は【  】数である.またこのとき,s[0]は'C',s[1]は'w',...,s[【  】]は'.'とそれぞれ等しい値となる.forループを使用して,この配列を先頭から順に見ていき,特定の文字('A'など)の【  】を求めるようなプログラムを書くことができる.

 先週のオンライン授業で,動画を見たあと,または動画を見ながら,解いてもらった穴埋め問題です.文字列,数値,語句は改変しています."Cwm fjord veg balks nth pyx quiz."は,wikipedia:パングラムによると「すべての単語が高校程度の辞書に載っており、かつ略語を含んでいない」とのことです.
 さっそくですが解答です.

 文字列を配列に格納したい場合,例えばchar s[34] = "Cwm fjord veg balks nth pyx quiz.";と書くことができる.ここで34は「Cwm fjord veg balks nth pyx quiz.」の長さ(空白文字もそれぞれ数える)に1を加えた数である.またこのとき,s[0]は'C',s[1]は'w',...,s[32]は'.'とそれぞれ等しい値となる.forループを使用して,この配列を先頭から順に見ていき,特定の文字('A'など)の出現回数を求めるようなプログラムを書くことができる.

 いくつか,解説します.「ここで34は【  】数である.」の穴埋めは,言い換えると「なぜchar s[34] = "(略)";として34を書いたか」の理由を書くことになります.
 誤答の一つは「ここで34は文字列の長さの数である.」です.これだと,ナル文字('\0')が考慮されていませんし,上記のように文字配列に格納したsに対するstrlen(s)も,格納しない値に対するstrlen("Cwm fjord veg balks nth pyx quiz.")も,戻り値は33となるため,34と合いません.
 格納したあと,s[0]=='C',s[1]=='W'になるのはいいとして,'.'は配列のどこになるかです.1文字1文字書き出して数えるのは,手間がかかりますし,数え間違いをしやすいです.そこで後ろから考えます.s[34]は式の中で参照できず,s[33]はナル文字が格納されるので,'.'はその一つ前,s[32]となります.
 ところで「Cwm fjord veg balks nth pyx quiz.」の長さが,空白文字をそれぞれ数えて33というのは,正しいでしょうか? ソフトウェアで確認しておきます.まず,Notepad++で新規作成した中に貼り付けると,下段に「length: 33 lines: 1」と出ました*1Windowsのメモ帳で,貼り付けると,下段の表示は「1行、34列」です.すべてカットすると「1行、1列」となることから,左上が1行1列で,貼り付けた字数は33文字と分かります.Wordに貼り付けたときの下段の表示は「7文字」ですが,この「7文字」をクリックすると,小さなウィンドウが現れて,「文字数 (スペースを含める) 33」を見ることができます.
 最後の「出現回数」は,動画の例題プログラムでそのように書いていました.


 先週の授業のテーマは「データ型」でした.それまではintしか使用していなかったのですが,授業前日を締切とする予習課題で,算術型を調査してもらったあと,この回で,doubleを中心とした実数型と,文字・文字配列を解説しました.動画は4つに分け,提示した穴埋め問題の文章が1000文字近く,穴埋めの数が20を超えていました.
 採点したところ,上記の「32」の箇所について「32」「33」が半々くらいでした.動画のもととなるPowerPointファイルを開いて,見直したところ,「33」と書いていました.Moodleの授業ページに「おわび」を出しました.

*1:文字列を領域選択すると「Ln: 1 Col: 1 Sel: 33」と出ます.