Lecture 11 ポインタ2 - ファイルI/O

Assignment(課題)11

【課題提出における注意】
  • すべてのプログラムは,必ずコンパイル&実行し,正しく機能することをチェックしてから提出すること.
  • プログラムは正しくインデントさせること.


    1. 【as_document.txt】 に書かれた文章を読み込み,表示するプログラムを作成せよ. また,同文章を構成するアルファベット,数字,記号の個数も併せて表示せよ. なお,英文字は大文字と小文字は区別せずにカウントすること. プログラム名を学籍番号10桁-11-1.cppとする.
      //実行例 
      Ubuntu is a Debian-based Linux operating system, 
      with Unity as its default desktop environment. 
      It is based on free software and named after 
      the Southern African philosophy of ubuntu (literally, "human-ness"), 
      which often is translated as "humanity towards others" or 
      "the belief in a universal bond of sharing that connects all humanity". 
      ...........《中略》

      a は 153 個ありました. b は 37 個ありました. c は 76 個ありました. d は 62 個ありました. e は 217 個ありました. ...........《以下省略》

      解答例 A11-1


      ヒントと解説

      • キャラクタそれぞれの出現回数を数えるという問題.
      • それには,キャラクタ番号別のカウンタ配列を用意すると良い. 例えば1バイト(char)で表せるすべての文字コードをカウントしようとするなら, int c_count[256]; などを準備すればよい.
      • ただし,実際にカウントする文字は,目で読める英数字と記号だけでよい. 具体的には 0x20(white space)から 0x7E(upper score)まで数えれば十分である.



    2. 【as_test_result.csv】 内には各行に生徒の名前と3科目のテストの点数がカンマ( , )区切りで記述されている(並びは名前順).
      • このファイルの中身を読み取り,
      • 各生徒の合計点数を算出して
      • その値が大きい順に並べて
      • ファイルに出力する
      プログラムを作成せよ. なお,出力ファイル名はtest_rank.csvとし,各行に名前と合計点をカンマ区切りで記し, 最後の行に平均点を追加すること. プログラム名を学籍番号10桁-11-2.cppとする.

      //出力ファイルの中身
      Yuma,285 
      Alicia,276 
      Clarice,274 
      Jean,273 
      《中略》
      Flora,214 
      Elena,206 
      Kate,165 
      
      average,247.13 
      

      解答例 A11-2


      ヒントと解説

      • CSVを文字列で読むときには,%sは使わず,%[^,]を用います
      • 先頭を%[^,]で読むと,前の行の改行文字を一緒に読み込んでしまうことがあります. この場合は,fscanf(fp,"%[^,],%d,%d,%d%*c", ...); の様に改行を明示的に読み飛ばします.
      • 名前やスコアを収める配列をつくります.スコアは,合計点を格納するためのエリアも設けます.
      • 点数順に並べるときには,すべてのレコードを並べ替えなければなりません. 名前を入れ替える部分は注意して作りましょう.



    3. 以下の行列データ,
      typedef double Matrix[4][4];
      Matrix A = { 0, 0, 0, 0,
                   0, 0, 0, 0,
                   0, 0, 0, 0,
                   0, 0, 0, 0 };
      
      をメモリイメージそのままバイナリファイル 【as_matrix_image.bin】 に保存した. このデータを上記の行列変数に読み込み,画面に表示するプログラムを作れ. プログラム名を学籍番号10桁-11-3.cppとする.

      解答例 A11-3


      ヒントと解説

      • バイナリデータを読み込むには,fread()を使います.
      • 読み込むバイトサイズはどの様に設定すればよいか考えましょう.



    4. このファイル【as_lyrics.txt】 を読み込み,"*iller"が含まれる行だけを抜き出して 表示するプログラムを作成せよ(*は任意の文字). プログラム名を学籍番号10桁-11-4.cppとする.
      //出力の例
      It's close to midnight and something evil's lurking in the dark
      Under the moonlight you see a sight that almost stops your heart
      

      解答例 A11-4


      ヒントと解説

      • fgets()を使って一行ずつ読み込むと良いです.
      • fgets()を用いると,データファイル中の改行コードも一緒に読み込まれることに注意.
      • 読み込んだ一行分の文字列をスキャンして探索文字列を発見したら,その行全体を表示すれば良いです.



    5. このファイル【as_hex_words.txt】 には4桁区切りで16進数の数が格納されている. これを読み取って2桁ごとに区切り,ASCII文字として表示するプログラムを作成せよ. プログラム名を学籍番号10桁-11-5.cppとする.

      //実行結果 
      Life is ... 《省略》
      


      解答例 A11-5


      ヒントと解説

      • まず読み込む対象のファイルをよく見ましょう.
      • 16進で4桁ずつデータが書かれていることがわかります.
      • 従って,16進の数値として読み込むのが最も簡単です.
      • 読み込んだデータは(16進表記では)4桁なので, 文字にするには2桁ずつ分けて変換しなければなりません.







    6. 【注意】すべてのファイル名は半角のみで構成すること.
      【注意】提出時のファイル名命名規則などを守っていない人がいる.これらのファイルは採点されないので注意すること.
      【お願い】提出するファイルは,フォルダに入れないでそのまま圧縮してください.