Practice 1: 課題プログラムの仕様の理解 他

まず,練習1-1 で,本プロジェクトを開始しましょう.次に,小手調べとして,あるいは,勘を取り戻すために,練習1-2を解いてみて下さい.練習1-3 はポインタを用いた実用的な関数で,後の課題で実際に利用します.

まず,解説「文字,文字列,配列,ポインタ」を読んで考えてみましょう.解答例(前半後半)は,後に公開されるかもしれませんが,その前に自分で解けるようにしておきましょう.

プロジェクトの開始(1): 作業ディレクトリの準備,UNIXコマンドを使いこなす

以下をクリックして,プロジェクトを開始しましょう!

(クリックすると,詳細な説明が現れます)

作業ディレクトリの準備

まず,ターミナルを開き,ホームディレクトリ (~/) に移動 (change directory) して,その直下にeop(Exercise On Programming) という名前のディレクトリを作りましょう.今回のプロジェクト(演習)のためのディレクトリです.

実行例:

$ cd ~/
$ mkdir eop
$ cd eop

実行例中の$は,プロンプトといって,計算機(UNIXのシェル)がコマンド入力を促す記号です.実際のプロンプトは$ではなく,09421234@d075:~/eop$などとなっているかもしれません.以降,$より後ろの部分を実際に入力するのだと覚えておいて下さい.

<参考>

エディタ,コンパイラ,Linuxのシェルコマンドなど,基本操作を忘れている人は,以下を参照してください.緑教科書(1年次 工学基礎実験実習で利用した教科書)をいつでも読めるよう準備しておくのもよいでしょう.

練習1-1 課題プログラムの仕様の理解(1)

作成すべき課題プログラムがどのようなものか理解するために,以下の手順を踏んでください.

  1. 課題を説明したPDFの演習課題説明資料を読む.

  2. 課題プログラムの作成例 db-sample(コンパイル済みのバイナリ)を実際に動かしてみて,資料と照らし合わせながら,動作や表示方法を知る.

では,順を追ってやってみましょう.

演習課題説明資料は読めましたか?読めたら,以下をクリックして,続きを確認しましょう!

(クリックすると,詳細な説明が現れます)

作成例とサンプルデータをダウンロードする

作成例とサンプルデータをダウンロードします.wgetというコマンドを使います.

まず,作成例(db-sample) をダウンロードして,実行可能にします.

$ wget -nc --no-cache https://edu2024.sp.cs.okayama-u.ac.jp/eop/p2/_static/p2/db-sample
$ chmod +x db-sample

最後のchmod +x db-sampleは,db-sampleファイルに実行可能属性を付与するための書式です.これによって,システムは,db-sampleが一般のファイルではなく,実行可能なプログラムファイルであると認識します.

注釈

演習室環境でダウンロードに失敗する場合は,以下を実行して,wgetからもう一度試してみてください.

$ export http_proxy='http://proxysv01.edu.cs.okayama-u.ac.jp:3128'

次に,サンプルデータ (sample.csv) をダウンロードします.

$ wget -nc --no-cache https://edu2024.sp.cs.okayama-u.ac.jp/eop/p2/_static/p2/sample.csv

目的のファイルが取得できたか,lsコマンドで,逐次確認しながら実行してください.

なお,db-samplesample.csvが現在のディレクトリに既に存在する場合は,wgetコマンドの実行が失敗します.古いdb-samplesample.csvrmmvしてから再実行してみて下さい.

作成例とサンプルデータを使ってみる

それでは,db-sampleを実行して,動作を見てみましょう. 例えば,

  1. CSV (Comma Separated Value) データを1件入力

  2. %C コマンドで登録件数をチェック

  3. %P コマンドで登録した全件(この場合は1件)表示

  4. %Q コマンドで終了

してみましょう.以下が,その実行例です.

$ ./db-sample
5100046,The Bridge,1845-11-2,14 Seafield Road Longman Inverness,SEN Unit 2.0 Open
%C
1 profile(s)
%P
Id    : 5100046
Name  : The Bridge
Birth : 1845-11-02
Addr. : 14 Seafield Road Longman Inverness
Comm. : SEN Unit 2.0 Open

%Q

うまくいきましたか?

本演習では,このdb-sampleに相当する,あるいはそれ以上の物を作ることを目指しています.

とはいえ,いきなり難しいプログラムを作ろうと思うと,手が動かなくなってしまいそうです.まずは簡単な目標から達成していきましょう.

プログラミング演習1の前半(第1回~第3回)の目標は,

「キーボード入力を何度も受け付けて,CSV入力と%コマンドを見分けて,何らかの処理をするプログラム」

の作成にしておきましょう.

練習1-2 文字列操作に関する復習

本演習では,文字列操作に対する深い理解が要求されます.その準備として,以下の問題を解いてみて下さい.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

int main()
{
  char s[4] = {'A', 'B', 'C', '\0'};  // ← (1) & (2)
  char *p;
  int i, x;

  p = s;
  while (*p != '\0') {
    p++;
  }
  x = p - s;

  p = s;
  for (i = 0; i < x + 1; i++) {  // ← (4)
    if ('A' <= s[i] && s[i] <= 'Z') {
      s[i] += ('a' - 'A');
    }
  }
  return 0;
}
  1. 5 行目をもっと簡潔に書きなおせ.

  2. 逆に 5 行目をASCIIコード表を参照して数値だけで分かりにくく書きなおせ.

  3. プログラム実行後,変数xは何を表しているか.値とその意味を説明せよ.

  4. 16 行目から始まるループ全体を,ポインタpだけを使ったループに書きなおせ.また,このループを実行した結果,何が起こるか解説せよ.

  5. このプログラムは,出力文がまったくないため,実行しても何も表示されない.適切な位置にprintf()を挿入して,xsの値を表示させるように改変せよ.何行目と何行目の間にprintf(…)を挿入するという形で解答し,の詳細を記述すること.

» 解答例(練習1-2)

練習1-3 文字列操作関数 subst() の作成

文字列STR中の文字C1を文字C2に置き換える関数subst()を作成せよ.戻り値は,実際に置き換えた文字の数である.また,subst()の動作をテストするmain()関数を書け.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
/**
 * 文字列 STR 中の文字 C1 を文字 C2 に置き換える
 * 戻り値: 実際に置き換えた文字の数
 */
int subst(char *str, char c1, char c2)
{
    // ... ここを埋める
}

int main()
{
  // ... subst をテストする
}

注: 文中のシンボルが大文字なのは,仮引数であることを強調するためです.

» 解答例(練習1-3)