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

[2020/06/13, H.Aman]

[10] 文字列 演習課題

〆切は 6/19(金)14:10 です.

  • 演習 1

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

    そして,アルファベット a ~ z の文字コードをすべて表示するようにプログラムを書き換えなさい. (ダウンロードしたプログラムの内容がヒントになっています)
    アルファベットは全部で 26 文字ありますが, printf を 26 個書くようなことをしてはいけません.

    実行例
     a の文字コードは 97 です
     b の文字コードは 98 です
     c の文字コードは 99 です
     
     ... (途中は省略) ...
     
     y の文字コードは 121 です
     z の文字コードは 122 です
  • 演習 2

    サンプルプログラム②を別名(ex02.c)にコピーし, それを次のように編集しなさい:
    • マクロ SIZE を 14 に変更する.
    • ログイン ID ではなく携帯電話番号(-付き)を読み込む.
    • 上 3 桁と下 2 桁以外を * で隠す(ただし,ハイフン(-)は隠さない)

    入出力例(キーボードからの入力は赤色
     携帯電話番号(-付き)を入力してください:090-1234-5678
     一部を隠して表示します:090-****-**78
  • 演習 3

    サンプルプログラム③を別名(ex03.c)にコピーし, それを次のように編集しなさい:
    • ドメイン(@より後ろ)も表示させる.
    • ユーザ部とドメインそれぞれについても文字数を表示させる.
    (ヒント)
    サンプルプログラム③では
    while 文を使って mail[i] != '@' である限り
    • mail[i] を表示し,
    • i を +1 する
    という操作を繰り返している.
    したがって,上記の while 文の 繰り返しが終わった直後は, mail[i] == '@' の状態にあることとなる.

    そこで i を +1 した後(mail[i]は @ の一つ右の文字に対応),
    再び while 文を使って mail[i] != '\0' である限り
    • mail[i] を表示し,
    • i を +1 する
    という操作を繰り返せば @ よりも後のみを表示できる.

    文字数については,ローカル部とドメインそれぞれの表示の前にいったん n = 0; としておき, 表示とともにカウントしていけばよい.

    入出力例(キーボードからの入力は赤色
     メールアドレスを入力してください:
     aman@ehime-u.ac.jp
     アドレスは aman@ehime-u.ac.jp(18 文字)
     ローカル部は aman ですね(4 文字)
     ドメインは ehime-u.ac.jp ですね(13 文字)

    演習用データ: data3-1.txt / data3-2.txt / data3-3.txt
    それぞれリンクを右クリックし,名前を付けて保存する.
    これらを使って実行するには次のようにすればよい:
     a < data3-1.txt
     メールアドレスを入力してください:
     アドレスは aman.hirohisa.mm@ehime-u.ac.jp (30 文字)
     ローカル部は aman.hirohisa.mm ですね(16 文字)
     ドメインは ehime-u.ac.jp ですね(13 文字)
  • 演習 4

    サンプルプログラム④を別名(ex04.c)にコピーし, それを次のように編集しなさい:
    • 入力された氏名をすべて大文字に変換する.
    • 入力された氏名を 名,姓 の順に表示する. (入力は 姓,名 の順)
      順番が入力とは逆になっているので注意!

    入出力例(キーボードからの入力は赤色
    氏名を入力してください(姓と名の間は空白):
    aman hirohisa
    ようこそ HIROHISA AMAN さん

余裕のある人は

  • 演習 1【発展課題】

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

    そして,次の動作をするようにプログラムを編集しなさい:
    二つの自然数 x, y を読み込み, 文字コードが x のものから y のものまで, 文字コードと文字の対応表を表示させる.

    (実行例)
     表示させたい文字の文字コード範囲を指定してください:40 50
     文字 [(] <--> 文字コード [40]
     文字 [)] <--> 文字コード [41]
     文字 [*] <--> 文字コード [42]
     文字 [+] <--> 文字コード [43]
     文字 [,] <--> 文字コード [44]
     文字 [-] <--> 文字コード [45]
     文字 [.] <--> 文字コード [46]
     文字 [/] <--> 文字コード [47]
     文字 [0] <--> 文字コード [48]
     文字 [1] <--> 文字コード [49]
     文字 [2] <--> 文字コード [50]
  • 演習 3【発展課題】

    演習 3 のプログラムを別名(ex03e.c)にコピーし,
    • メールアドレスと文字数を表示する関数 print_email,
    • ローカル部のみと文字数を表示する関数 print_local,
    • ドメインのみと文字数を表示する関数 print_domain
    をそれぞれ作りなさい.
    【print_email, print_local, print_domain の仕様】
    ●戻り値型はvoidt とする (戻り値を持たない).
    ●引数は対象のメールアドレス(char 配列)とする
    ●上の演習 3 と同様にそれぞれの文字数も一緒に表示するのを忘れないこと.

    なお,main 関数の内容は以下の通りとする(必ずこの通りにしなさい):
    int main(void){
      char mail[SIZE];
    
      printf("メールアドレスを入力してください:\n");
      scanf("%s", mail);
    
      print_email(mail);
      print_local(mail);
      print_domain(mail);
    
      return 0;
    }

    実行例は上の演習 3 と同じなので省略する.
  • 演習 4【発展課題】

    上記の演習 4 で作ったプログラムを別名(ex04e.c)にコピーし, これを改良して, 次の実行例のように大文字と小文字を入れ替えて表示するようにしなさい.
    【ヒント】講義スライドの最後のページを参照のこと
    例えば,次のようにするとよい(一部のみを示します).
    if ( isupper(name1[i]) ){
      name1[i] = tolower(name1[i]);
    }
    else{
      name1[i] = toupper(name1[i]);
    }

    入出力例(キーボードからの入力は赤色
     氏名を入力してください(姓と名の間は空白):
     Aman Hirohisa
     ようこそ hIROHISA aMAN さん