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)¶
作成すべき課題プログラムがどのようなものか理解するために,以下の手順を踏んでください.
課題を説明したPDFの演習課題説明資料を読む.
課題プログラムの作成例 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-sampleやsample.csvが現在のディレクトリに既に存在する場合は,wgetコマンドの実行が失敗します.古いdb-sampleやsample.csvをrmやmvしてから再実行してみて下さい.
作成例とサンプルデータを使ってみる¶
それでは,db-sampleを実行して,動作を見てみましょう. 例えば,
CSV (Comma Separated Value) データを1件入力
%C コマンドで登録件数をチェック
%P コマンドで登録した全件(この場合は1件)表示
%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;
}
|
5 行目をもっと簡潔に書きなおせ.
逆に 5 行目をASCIIコード表を参照して数値だけで分かりにくく書きなおせ.
プログラム実行後,変数
xは何を表しているか.値とその意味を説明せよ.16 行目から始まるループ全体を,ポインタ
pだけを使ったループに書きなおせ.また,このループを実行した結果,何が起こるか解説せよ.このプログラムは,出力文がまったくないため,実行しても何も表示されない.適切な位置に
printf()を挿入して,xやsの値を表示させるように改変せよ.何行目と何行目の間にprintf(…)を挿入するという形で解答し,…の詳細を記述すること.
練習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 をテストする
}
|
注: 文中のシンボルが大文字なのは,仮引数であることを強調するためです.