C プログラミング (C Programming)

[2020/06/27, H.Aman]

[12] ポインタ(2)演習課題

〆切は 7/3(金)の 14:10 です.

  • 演習 1

    まずはこのプログラム(ex01.c)をダウンロードしなさい.

    そして,この中の関数 fill_array を完成させなさい.
    main の方は一切変更しないこと.
    【関数 fill_array の仕様】
    引数で与られた int 配列の内容を等差数列で埋める.
    • 引数 a :対象の配列
    • 引数 x :等差数列の初項
    • 引数 d :等差数列の公差
    【注意事項】
    • 配列の長さはマクロ SIZE で与えられています.
      関数 fill_array の中でもこれを使い, 配列の長さを 5 といった数字で直接書いてはいけません.
    • プログラム中で等差数列の公式を使ってはいけません.
      (ヒント)第 n 項の値は,第 n-1 項の値に d を足せば求まります.

    入出力例(キーボードからの入力は赤色※初期状態の値は各自で異なる可能性あり
     配列の内容(初期状態)を表示します:
     a = { 6422400 4201104 4200992 0 2895872 }
    
     上の配列を等差数列で埋めていきます.
     初項と公差を指定してください:5 8
    
     配列の内容(代入後)を表示します:
     a = { 5 13 21 29 37 }
    
  • 演習 2

    サンプルプログラム②を別名(ex02.c)にコピーし, 関数 print_str を次のように書き換えなさい:
    • すべての文字を < > で囲むのではなく, 大文字だけを囲むようにしなさい.
      大文字かどうかの判定は isupper 関数 (第 10 回の講義で説明. #include<ctype.h> が必要) で行いなさい.
    • さらに,以下の実行例のように文字数(大文字と小文字の内訳も含む)を表示させなさい.
      ただし,講義の後半で紹介した strlen を使ってはいけません
    • この課題では,入力される文字はすべてアルファベットであると仮定してよい.

    入出力例(キーボードからの入力は赤色入力する単語の途中に空白は入れないこと
     英単語を入力してください:ProgrammingLanguage
     <P>rogramming<L>anguage
     (19文字:大文字2文字 + 小文字17文字)

    【演習用データファイル】(右クリックして保存してください)

    入出力例(データファイル data2-1.txt を使った場合)
     a < data2-1.txt
     英単語を入力してください:<T>his<I>s<A><S>ample<S>tring
     (19文字:大文字5文字 + 小文字14文字)
  • 演習 3

    まず,このプログラム(ex03.c)をダウンロードしなさい.

    ダウンロードしてもらった ex03.c はサンプルプログラム③ を次のように編集しようとした途中のもの(未完成)である:
    • 関数 string_copy に第 3 の引数 n(int 型)を追加する.
    • 新しい string_copy では,先頭から n 文字だけをそのままコピーし, 残りの文字については * をコピーする.
      ただし,n は 1 以上で,なおかつコピー元の文字数以下であると仮定してよい.
    • main 関数では,文字列だけでなく n も読み込むようにする.
    目的としている新しい string_copy を完成させなさいmain の方は一切変更してはいけません).

    入出力例(キーボードからの入力は赤色
     文字列(空白無し)を一つ入力してください:programming
     先頭から何文字をそのままコピーしますか:5
     コピーした文字列:<progr******>
  • 演習 4

    サンプルプログラム④を別名(ex04.c)にコピーし, それを以下に示すすべての条件を満たすように編集しなさい:
    1. マクロ SIZE を 256 に変更しなさい.
    2. main 関数内で新たに char 配列 str を宣言しなさい(長さは SIZE とする).
    3. まず最初に単語を一つ読み込み,それを配列 str にコピー(上書き)しなさい.
    4. その次に,以下の作業を 3 回繰り返しなさい(実行例参照):
      • str を表示する.
      • str の末尾にハイフン(-)をつなげる.
      • 単語を一つ新たに読み込み,それを str の末尾に追加する.
    5. 最後に str を表示しなさい.
    6. (7/2, 18:52 追記)
      繰り返しを実現するのに同じプログラムを 3 回コピー&ペーストするのはやめてください.
      繰り返しなので for か while を使ってください.

    入出力例(キーボードからの入力は赤色
     単語を一つ入力してください:ehime
     str = ehime
     単語を一つ入力してください:university
     str = ehime-university
     単語を一つ入力してください:computer
     str = ehime-university-computer
     単語を一つ入力してください:science
     str = ehime-university-computer-science
    

余裕のある人は

  • 演習 1【発展課題】

    まず, このプログラム(ex01e.c)をダウンロードしなさい.

    このプログラムは,上の演習 1 における fii_array に相当する部分が fill_fibo という別の関数になっている(ただし,未完成).
    fill_fibo を完成させなさい.
    main の方は一切変更しないこと.
    【関数 fill_fibo の仕様】
    引数で与られた int 配列の内容をフィボナッチ数列で埋める.
    • 引数 b :対象の配列
    【注意事項】
    • 配列の長さはマクロ SIZE で与えられています.
      関数 fill_fibo の中でもこれを使い, 配列の長さを 10 といった数字で直接書いてはいけません.
    • フィボナッチ数列とは,第 1 項と第 2 項が 1 であり, それ以降の第 k 項の値は k-1 項と k-2 項の和となっているものです.

    入出力例(キーボードからの入力は赤色※初期状態の値は各自で異なる可能性が高いです
     配列の内容(初期状態)を表示します:
     a = { 0 0 0 0 4196016 0 4195440 0 1836496192 32766 }
    
     上の配列をフィボナッチ数列で埋めていきます.
     配列の内容(代入後)を表示します:
     a = { 1 1 2 3 5 8 13 21 34 55 }
  • 演習 2【発展課題】

    演習 2 のプログラムを別名(ex02e.c)にコピーし, print_str 関数での文字列表示を逆順で行うように変更しなさい.
    ただし, main 関数は変更せず, print_str 関数の中のみを変更しなさい.
    (講義の中で説明しているように,ポインタを使うと文字列を逆順に表示するのは簡単です

    入出力例(キーボードからの入力は赤色入力する単語の途中に空白は入れないこと
     英単語を入力してください:ProgrammingLanguage
     egaugna<L>gnimmargor<P>
     (19文字:大文字2文字 + 小文字17文字)
  • 演習 3【発展課題】

    演習 3 のプログラムを別名(ex03e.c)にコピーし, 関数 string_copy の内容を次のように変更しなさい:
    先頭の n 文字ではなく末尾の n 文字のみをそのままコピーし,その他は * にする.
    (※これに合わせて,main 関数内でのメッセージ表示も一部変更となる:先頭 → 末尾)

    入出力例(キーボードからの入力は赤色
     文字列(空白無し)を一つ入力してください:programming
     末尾から何文字をそのままコピーしますか:5
     コピーした文字列:<******mming>
  • 演習 4【発展課題】

    演習 4 のプログラムを別名(ex04e.c)にコピーし,次のように変更しなさい:
    繰り返しの回数を 3 回に限定するのではなく, end と入力されるまで繰り返すようにしなさい.
    (※講義スライドの最後のページで紹介されている strcmp を活用しなさい)
    ただし,最後に入力された end は出力には含めないものとする(以下の実行例を参照)
    【文字列(char 配列)str の内容が「 end 」という
    文字列かどうかを確認する例】
     if ( strcmp(str, "end") == 0 ){
        str の内容が end の場合 
     }
     else{
        str の内容が end ではない場合 
     }

    入出力例(キーボードからの入力は赤色
     単語を一つ入力してください:ehime
     str = ehime
     単語を一つ入力してください:university
     str = ehime-university
     単語を一つ入力してください:computer
     str = ehime-university-computer
     単語を一つ入力してください:science
     str = ehime-university-computer-science
     単語を一つ入力してください:end