1\documentclass[a4j,11pt]{jarticle}
2% ファイル先頭から\begin{document}までの内容(プレアンブル)については,
3% 教員からの指示がない限り, { } の中を書き換えるだけでよい.
4
5% ToDo: 提出要領に従って,適切な余白を設定する
6\usepackage[top=25mm, bottom=30mm, left=25mm, right=25mm]{geometry}
7% bxjsarticleを利用する場合:以下のように設定する.
8%\geometry{top=25mm, bottom=30mm, left=25mm, right=25mm}
9
10% ToDo: 提出要領に従って,適切なタイトル・サブタイトルを設定する
11\title{プログラミング演習1 \\
12 期末レポート}
13
14% ToDo: 自分自身の氏名と学生番号に書き換える
15\author{氏名: 原 直 (HARA, Sunao) \\
16 学生番号: 0941xxxx}
17
18% ToDo: 教員の指示に従って適切に書き換える
19\date{出題日: 20xx年xx月xx日 \\
20 提出日: 20xx年xx月xx日 \\
21 締切日: 20xx年xx月xx日 \\} % 注:最後の\\は不要に見えるが必要.
22
23% ToDo: 図を入れる場合,以下の1行を有効にする
24%\usepackage[dvipdfmx]{graphicx}
25
26\begin{document}
27\maketitle
28
29% 目次つきの表紙ページにする場合はコメントを外す
30%{\footnotesize \tableofcontents \newpage}
31
32% 以下の7行は提出用のレポートでは必ず消すこと
33\textbf{\small※執筆上の注意:本書は空想上の課題に対するレポートの
34 執筆例である.章の構成と書くべき内容の参考として提示するもの
35 であるため,課題内容やプログラムの仕様などは,
36 実際の演習課題の指示に従って適切にまとめ直す必要がある.
37 途中まで文を書いて「・・・」によって省略している箇所があるが,
38 これに穴埋めをすることで提出できるレポートになるわけではない.
39 また,サンプルと同じ書き出しで文章を書く必要はない.}
40
41%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
42\section{概要} \label{chap:abstract}
43%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
44
45% 以下の4行は提出用のレポートでは必ず消すこと
46\textbf{\small※執筆上の注意:概要は多すぎず少なすぎずが重要である.
47 特に,次の3点について,執筆者の取り組みの概略が読者(=教員)に
48 伝わるようにしよう.(1) このレポートで取り組んだ課題の内容,
49 (2) 実験等によって得られた結果,(3) 結果に対しておこなった考察.\\}
50
51本演習では,外部からの入力データを計算機で扱える内部形式に変換して格納し,
52それらを操作する方法について学習する.
53具体的には,標準入力から与えられる名簿のCSVデータをC言語の構造体の配列に格納し,
54それらをソートして表示するプログラムを作成する.
55
56与えられたプログラムの基本仕様と要件,および,本レポートにおける実装の概要を以下に述べる.
57
58\begin{enumerate}
59\setlength{\parskip}{0mm}\setlength{\itemsep}{0mm}%この1行で箇条書きの行間を調整している
60\item 基本仕様
61 \begin{enumerate}
62 \item 標準入力から「コード,氏名,生年月日,性別,出身,身長,体重」からなる
63 コンマ区切り形式 (CSV 形式) の名簿データを受け付けて,
64 それらをメモリ中に登録する機能を持つ.CSV形式の例を以下に示す.
65
66% 波括弧の内部 {...} だけ文字サイズ等を設定する書き方の例
67% 以下の例はフォントサイズ:10pt 行送り:11pt
68 {\fontsize{10pt}{11pt} \selectfont
69 \begin{verbatim}
70 0,Takahashi Kazuyuki,1977-04-27,3,Saitama,184,78
71 10,Honma Mitsuru,1972-08-25,2,Hokkaidou,180,78
72 11,Ogura Shinsuke,1976-07-23,0,Kanagawa,177,72
73 13,Shibata Kazuya,1968-03-16,0,Hyougo,176,75
74 :
75 \end{verbatim}
76 }
77%% 注:行送りの変更は"指定箇所を含む段落”に効果があらわれる.
78%% fontsizeコマンドを用いて,行送りを変える場合は,
79%% その {...} の前後に空白行を入れ,段落を変えるようにすること.
80%% なお,行先頭がコメントから始まる行は空白行とは扱われない.
81
82 \item 標準入力から\verb|%|で始まるコマンドを受け付けて,
83 登録してあるデータを表示したり整列したりする機能を持つ.
84 実装するコマンドを表\ref{tbl:commands}に示す.
85 \end{enumerate}
86\item 要件
87 \begin{enumerate}
88 \item 名簿データは配列などを用いて少なくとも$100$件のデータを登録できるようにする.
89 今回のプログラムでは,構造体\verb|struct person|の配列\verb|person_array[]|を宣言して,
90 $100$件のデータを格納できるようにする.
91 \item 名簿データは構造体\verb|struct person|および構造体\verb|struct date|を利用して,
92 構造を持ったデータとしてプログラム中に定義して利用する.
93 実装すべきデータ構造は表\ref{tbl:structure_person}である.
94 表中の$n$~bytesとは,$n$バイトの\verb|char|型配列を意味する.
95 \end{enumerate}
96\end{enumerate}
97
98\begin{table}[t] % 表の位置は原則として t または b である.hやHは使わない.
99 \centering % この1行はbegin~endの中を中央寄せにする,というコマンド
100 \caption{実装するコマンド}
101 \label{tbl:commands}
102 \begin{tabular}{|l|l|l|}
103 \hline
104 コマンド & 解説 & パラメータ範囲\\
105 \hline
106 \verb|%Sn| & CSV の\verb|n|番目の項目でソート & \verb|n|: 1--7\\
107 \hline
108 \verb|%Pn| & CSV の\verb|n|番目を抜き出して表示 & \verb|n|: 0--99 (0は全て)\\
109 \hline
110 \end{tabular}
111\end{table}
112
113\begin{table}[t]
114\centering % この1行はbegin~endの中を中央寄せにする,というコマンド
115 \caption{名簿データ}
116 \label{tbl:structure_person}
117 \begin{tabular}{|l|l|l|l|l|l|l|}
118 \hline
119 コード & 氏名 & 生年月日 & 性別 & 出身 & 身長 & 体重\\
120 \hline
121 $32$~bit整数 & $20$~bytes & \verb|struct date|
122 & \verb|char| & $10$~bytes & $32$~bit整数 & $32$~bit整数\\
123 \hline
124 \end{tabular}
125\end{table}
126
127また,本レポートでは以下の考察課題について考察をおこなった.
128
129\begin{enumerate}
130\setlength{\parskip}{2pt}\setlength{\itemsep}{2pt}%この1行で箇条書きの行間を調整している
131 \item 不足機能についての考察をおこなった.特に,・・・(サンプルのため省略)
132 \item エラー処理についての考察をおこなった.例えば,・・・(サンプルのため省略)
133 \item 構造体 \verb|struct profile| がメモリ中を占めるバイト数について確認をおこなった.
134 具体的には,\verb|sizeof|演算子を使用して・・・(サンプルのため中略)・・・確認をおこなった.
135\end{enumerate}
136
137% 以下の2行は提出用のレポートでは必ず消すこと
138\textbf{\small※執筆上の注意:繰り返すが,本書は空想上の課題に対するレポートの
139 執筆例である.書くべき内容としては,課題書等を読んだうえで適切に執筆すること\\}
140
141
142%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
143\section{プログラムの作成方針}
144%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
145
146% 以下の5行は提出用のレポートでは必ず消すこと
147\textbf{\small ※執筆上の注意:講義中の説明などに基づいて計画した作成方針についてまとめる.
148 例えば,どういう手順で作成をおこなったのか?作成にあたって何を重視したのか?
149 この例は架空の講義内容に基づいて書かれている.実際の講義に合わせて内容や節構成を精査すること.
150 なお,コーディング中に考え直した細かい内容は,できる限り,
151 この章ではなく後の「作成過程における考察」でまとめること.\\}
152
153プログラムをおおよそ以下の部分から構成することにした.
154それぞれについて作成方針を立てる.
155
156\begin{enumerate}
157\setlength{\parskip}{2pt} \setlength{\itemsep}{2pt}
158 \item 必要なデータ構造の宣言部(\ref{sec:declare}節)
159 \item 標準入力から得た CSV データの解析部(・・・節)
160 \item 構文解析したデータの内部形式への変換部(・・・節)
161 \item 各種コマンド実現部(・・・節)
162\end{enumerate}
163
164
165%--------------------------------------------------------------%
166\subsection{宣言部} \label{sec:declare}
167%--------------------------------------------------------------%
168
169``宣言部''は・・・をする部分である.
170このレポートでは概要で示した表\ref{tbl:structure_person}に基づいて,
171以下のように宣言する.
172
173{\fontsize{10pt}{11pt} \selectfont
174\begin{verbatim}
175 struct date {
176 int y; // 年.
177 int m; // 月.
178 int d; // 日.
179 };
180
181 struct person {
182 int code; // コード.
183 char name[20];
184 struct date bday;
185 char type;
186 char home[10];
187 int height;
188 int weight;
189 };
190
191 struct person person_array[100];
192\end{verbatim}
193}
194%% 注:行送りの変更は"指定箇所を含む段落”に効果があらわれる.
195%% fontsizeコマンドを用いて,行送りを変える場合は,
196%% その {...} の前後に空白行を入れ,段落を変えるようにすること.
197%% なお,行先頭がコメントから始まる行は空白行とは扱われない.
198
199ここで,・・・については・・・としている.
200これによって,・・・とすることができる.
201
202(※サンプルのため省略.また,途中の説明においても,一部省略している.)
203
204%--------------------------------------------------------------%
205\subsection{解析部} \label{sec:parse}
206%--------------------------------------------------------------%
207
208``解析部''は・・・をおこなう箇所である.
209しかし,このままでは,・・・であるため,・・・である.
210そこで,段階的詳細化の考え方に基づいてさらなる詳細化をおこない,
211下記の(a)から(e)のように分割することにする.
212
213\begin{enumerate}
214\setlength{\parskip}{2pt} \setlength{\itemsep}{2pt}
215\renewcommand{\labelenumi}{(\alph{enumi})} % 参考:この1行はリスト見出しを(a), (b), ...に変えるためのコマンド
216 \item 標準入力から読むべき行が残っている間,文字の配列\verb|char line[]|に1行分を読み込む.
217 \item \verb|line|の1文字目が\verb|'%'|ならば,%
218 2文字目をコマンド名,3文字目以降をその引数として,%
219 決定されたコマンドを実行する. % 参考:itemの途中で改行する場合,1行上のように行末に%をつけておくと良い
220 \item さもなくば\verb|line|をCSVとみなし\verb|','|を区切りとして7つの文字列に分割する.
221 \item 分割してできた7つの文字列を変換部に渡し構造体に代入する.
222 \item 次の行を読み込む
223\end{enumerate}
224
225ここで,・・・は・・・と詳細化することもできるが,今回は・・・とする.
226また,・・・で扱う文字列は・・・として処理するため,解析部に続く・・・では・・・に注意する必要がある.
227
228(※サンプルのため省略)
229
230%--------------------------------------------------------------%
231\subsection{変換部}
232%--------------------------------------------------------------%
233
234``変換部''は分割されたCSVデータを項目毎に型変換し,
235対応する構造体メンバーに代入する部分である.
236メンバーとして様々な型を用いているため,適切な代入の使い分けが必要となる.
237
238文字列は関数\verb|xxxxxx|を用いて代入する.
239数値の場合,関数\verb|xxxx|を用いて文字列を・・・してから代入する.
240構造体\verb|struct date|であるメンバー\verb|bday|については・・・してから代入する.
241
242なお,構造体への代入については,・・・を用いることで容易に実装することができる.
243例えば,\verb|"2014-10-25"|のような文字列を・・・し,
244・・・によって・・・しつつ格納するという処理は,・・・を・・・する処理と同じ処理である.
245従って,区切り文字がCSVの\verb|','|とは異なる・・・になること以外は同様に記述できるはずである.
246
247また,解析部から与えられた文字列は揮発性であることにも注意する.
248つまり,変換部で文字列を処理する際には・・・を・・・するのではなく,
249関数・・・を使って・・・を行わなければならないことに気をつける必要がある.
250
251(※サンプルのため省略)
252
253%--------------------------------------------------------------%
254\subsection{各種コマンド実現部}
255%--------------------------------------------------------------%
256
257``各種コマンド実現部''は・・・の実際の処理をおこなう部分である.
258このレポートでは,具体的には・・・を実装している.
259
260表示(\verb|%Pn|)は\verb|printf|で各項目毎に表示すればよい.
261ただし,・・・であることに注意が必要である.
262また,実装中に・・・ということがわかったため,
263・・・のように実装をすることにしている.
264この実装に関する方針決定の詳細は後のxxxx節で説明する.
265
266ソートは,C の標準関数である \verb|qsort()| を使用することにする.
267構造体の各メンバー毎にソートをするために,7つの比較関数を用意する.
2687つの比較関数へのポインタを要素とする配列を宣言することによって
269項目毎のソートを見通しよく行えるようにする.
270
271(※サンプルのため省略)
272
273%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
274\section{プログラムおよびその説明}
275%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
276
277% 以下の6行は提出用のレポートでは必ず消すこと
278\textbf{\small ※執筆上の注意:変数や数値は$\backslash$verbや\$\$
279 で囲って,適切な書体で記述することを忘れずに.
280 なお,このサンプルでは``わざと''一部の処理を省略している.
281 見た目の違いを確認して,自分のレポートでは処理を忘れないようにしよう.
282 また,この章はこのレポートサンプルの2章に基づいて書かれているが,
283 そもそも2章が架空の講義内容に基づいて書かれている点に注意すること.\\}
284
285
286プログラムリストは・・・節に添付している.プログラムは全部で267行からなる.
287以下では,前節の作成方針における分類に基づいて,プログラムの主な構造について説明する.
288
289%--------------------------------------------------------------%
290\subsection{汎用的な関数の宣言(11行目から44行目)}
291%--------------------------------------------------------------%
292
293まず,汎用的な文字列操作関数として,
294\verb|subst()|関数を11--25行目で宣言し, % この行は適切な例
295split()関数を27-44行目で宣言している. % この行は不適切な例
296
297\verb|subst| は,\verb|sp|が指す文字列中の\verb|c1|文字を\verb|c2|に置き換える.
298プログラム中では,入力文字列中の末尾に付く
299改行文字をヌル文字で置き換えるために使用している.
300
301split は str が指す文字列を区切文字 c で分割し,
302分割した各々の文字列を指す複数のポインタからなる配列を返す関数である.
303プログラム中では,CSVを\verb|','|で分割し,
304分割後の各文字列を返すのに使用されている.
305また,``2004-05-10'' のような日付を表す文字列を `-' で分割して,
306struct date を生成する際にも使用している.
307
308(※サンプルのため省略)
309
310%--------------------------------------------------------------%
311\subsection{・・・部(93行目から214行目)}
312%--------------------------------------------------------------%
313
31446--91行目は struct date データ型の宣言部とそれを扱う関数群である.
315
31693--214行目は struct person データ型の宣言部とそれを扱う関数群である.
317文字列から各データ型への変換を担う関数は,
318名前を new\_データ型 とすることで,
319変換部であることを明確にした.
320
321また,各種コマンド実現部の qsort に必要な比較関数群は,cmp\_メンバー名 という
322名前に統一することで,比較関数であることを明確にした.
323
324(※サンプルのため省略)
325
326%--------------------------------------------------------------%
327\subsection{・・・部(216行目から245行目)}
328%--------------------------------------------------------------%
329
330216--245行目は,\%P, \%S のコマンドを解釈して
331適切な関数を呼び出す部分である.
332
333(※サンプルのため省略)
334
335%--------------------------------------------------------------%
336\subsection{・・・部(247行目から267行目)}
337%--------------------------------------------------------------%
338
339247行目以降は,\verb|main()|関数であり,
340作成方針で説明した解析部の動作におおよそ相当する.
341ただし (c) の 7つの文字列に分割する部分は,解析部の\verb|main()|関数では実現せず,
342変換部である\verb|new_person()|関数中で\verb|split|を呼出すことにしている.
343この理由については,考察にて後述する.
344
345(※サンプルのため省略)
346
347%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
348\section{プログラムの使用法}
349%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
350
351% 提出するレポートでは以下5行は必ず消すこと
352\textbf{\small ※執筆上の注意:この節はプログラムの使用法を説明す
353 る節である.最低限,起動の方法,入力の形式と方法,出力の読み方
354 を入れること.当然,実装したコマンドすべてを説明すべきであるが,
355 このサンプルのように説明に使う実行例が1つである必要はない.
356 なお,このサンプルは架空の課題であり,動作環境も架空である.\\}
357
358本プログラムは名簿データを管理するためのプログラムである.
359CSV形式のデータと \% で始まるコマンドを標準入力から受け付け,
360処理結果を標準出力に出力する.
361入力形式の詳細については,概要の節を参照のこと.
362
363プログラムは,Red Hat Linux 3.2.2-5 で動作を確認しているが,
364一般的な UNIX で動作することを意図している.
365以降の実行例における,行頭の\verb|$|記号はRed Hat Linux 3.2.2-5におけるターミナルのプロンプトである.
366
367まず,\verb|gcc|でコンパイルすることで,プログラムの実行ファイルを生成する.
368ここで,\verb|-Wall|とは...するためのオプションであり,
369\verb|-o|とは・・・を指定するオプションである.
370これらのオプションをつけることで,・・・(略)
371
372{\fontsize{10pt}{11pt} \selectfont
373 \begin{verbatim}
374 $ gcc -Wall -o program1 program1.c
375 \end{verbatim}
376}
377%% 注:行送りの変更は"指定箇所を含む段落”に効果があらわれる.
378%% fontsizeコマンドを用いて,行送りを変える場合は,
379%% その {...} の前後に空白行を入れ,段落を変えるようにすること.
380%% なお,行先頭がコメントから始まる行は空白行とは扱われない.
381
382次に,プログラムを実行する.
383以下の実行例は,プログラム実行中の・・・を模擬するため,
384・・・を・・・により与えることで,実行する例を示している.
385通常の利用においては,・・・(略)
386
387{\fontsize{10pt}{11pt} \selectfont
388 \begin{verbatim}
389 $ ./program1 < csvdata.csv
390 \end{verbatim}
391}
392
393プログラムの出力結果として,CSVデータの各項目が読みやすい形式で出力される.
394例えば,下記の \verb|cvsdata.csv| に対して,
395
396{\fontsize{10pt}{11pt} \selectfont
397 \begin{verbatim}
398 0,Takahashi Kazuyuki,1977-04-27,3,Saitama,184,78
399 10,Honma Mitsuru,1972-08-25,2,Hokkaidou,180,78
400 %S3
401 %P0
402 \end{verbatim}
403}
404
405\noindent % noindentとはここでは段落を変えない(一字下げをしない)というコマンド.
406以下のような出力が得られる.
407
408{\fontsize{10pt}{11pt} \selectfont
409 \begin{verbatim}
410 code: 10
411 name: Honma Mitsuru
412 bday: 1972/08/25
413 type: 2
414 home: Hokkaidou
415 height: 180
416 weight: 78
417
418 code: 0
419 name: Takahashi Kazuyuki
420 bday: 1977/04/27
421 type: 3
422 home: Saitama
423 height: 184
424 weight: 78
425 \end{verbatim}
426}
427
428まず,入力データについて説明する.
429入力中の最初の2行で,2つのCSVデータを登録している.
430CSVデータは,表1で示したように,7つの項目からなる.
431% 注:上1行の「表1」の部分は,\refを用いて適切に参照すること.
4323行目の\%S3 は,これまでの入力データを3番目の項目(生年月日)で
433ソートすることを示している.
4344行目の\%P0 は,入力した項目の全ての項目 ($1$--$7$) を
435表示することを示している.
436
437(※サンプルのため省略)
438
439%以下の4行は提出レポートでは不要なため消すこと.
440\textbf{\small ※執筆上の注意:良くないレポートの書き方例を2つ挙げる.\\
441 (1) 入力の説明が無いため,何をしたのかがわからない.\\
442 (2) 出力結果だけが書いてあり,それが「想定(仕様)通り」なのかどうか,
443 を述べていない.\\}
444
445%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
446\section{作成過程における考察}
447%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
448
449%以下の3行は提出レポートでは不要なため消すこと.
450\textbf{\small ※執筆上の注意:ここでは,作成中に試行錯誤した内容,
451 例えば,「Aという実装ではなくBという実装にしたのはなぜか?」
452 などについて,バランスよくまとめる.\\}
453
454・・・節で述べた実装方針に基づいて,・・・節ではその実装をおこなった.
455しかし,実装にあたっては実装方針の再検討が必要になる場合もあった.
456本節では,名簿管理プログラムの作成過程において検討した内容,
457および,考察した内容について述べる.
458
459%--------------------------------------------------------------%
460\subsection{・・・についての考察}
461%--------------------------------------------------------------%
462
463・・・については方針通りに実装することができたが,
464・・・については・・・となった.
465これは・・・に原因があると考えている.
466
467(※サンプルのため省略)
468
469%--------------------------------------------------------------%
470\subsection{・・・についての考察}
471%--------------------------------------------------------------%
472
473・・・の作成方針として・・・としたため,・・・となっていることには注意が必要である.
474なぜなら,・・・.しかし,・・・であるため,・・・である.
475例えば,・・・としたいのであれば,・・・・とすればよい.
476
477(※サンプルのため省略)
478
479%--------------------------------------------------------------%
480\subsection{・・・についての考察}
481%--------------------------------------------------------------%
482
483・・・については・・・という方針にしたが,・・・という方針にすることも考えられる.
484今回は・・・ということを考えたため,・・・とすることにした.
485ただし,もし・・・であるならば,・・・は・・・よりも・・・であるから,
486・・・という実装方針とするほうがよいだろう.
487
488(※サンプルのため省略)
489
490
491%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
492\section{結果に関する考察}
493%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
494
495%以下の5行は提出レポートでは不要なため消すこと.
496\textbf{\small ※執筆上の注意:考察課題を中心にまとめる.
497 自分で考えた考察課題を書くことも強く推奨しているが,
498 「作成過程における考察」とは区別して書くこと.
499 「作成されたプログラムから考察できること」を求めている.
500 また,単なる感想で終わるような内容を書いてはいけない.\\}
501
502演習課題のプログラムについて,
503\ref{chap:abstract}~章で述べた仕様と要件をいずれも満たしていることを,
5043章のプログラムの説明および4章の使用法における実行結果例によって示した.
505ここでは,概要で挙げた以下の項目について考察を述べる.
506% 注:3章や4章と書かれた部分も,\ref コマンドを用いて適切に参照すること.
507
508\begin{enumerate}
509\setlength{\parskip}{2pt} \setlength{\itemsep}{2pt}
510 \item 不足機能についての考察
511 \item エラー処理についての考察
512 \item 構造体 \verb|struct person| のサイズに関する考察
513\end{enumerate}
514
515%--------------------------------------------------------------%
516\subsection{不足機能についての考察}
517%--------------------------------------------------------------%
518
519(※サンプルのため省略)
520
521%--------------------------------------------------------------%
522\subsection{エラー処理についての考察}
523%--------------------------------------------------------------%
524
525(※サンプルのため中略)
526
527\subsubsection{CSVデータ処理中のエラー処理}
528
529CSVデータ中に,不正なデータが含まれていた場合の処理について考察する.
530エラーが含まれていた場合は,以下のような対処が考えられる.
531
532\begin{description} % descriptionで見出し後に改行するときは ~\\ とする.
533 \item[(1) エラーのあった行を指摘して,無視する]~\\
534 この方法は,一回の入力で,できるだけ多くの
535 エラーを発見できるため,通常はこの方法が好ましい.
536 しかし,エラーのあった状態からの復帰を行う必要があるため
537 プログラムが複雑になる.
538 \item[(2) エラーのあった行を指摘して,終了する]~\\
539 この方法は,入力中に 1つのエラーを発見することしかできない.
540 しかし,エラーのあった入力をデータを無視してしまうと
541 以降のデータ入力の正当性チェックにも影響がでるような場合には,
542 この方法を採らざるを得ないこともある.
543\end{description}
544
545エラーのあった行を指摘せず,終了または無視するという
546方法も考えられるが,正常終了との区別が付かないため実用的でない.
547
548今回は,エラーのあった行を指摘して,無視する方法がよいと考えた.
549現時点ではエラー処理については未実装であるが,
550プログラム中でエラーチェックすべき部分に\verb|ToDo:|で始まるコメントを入れて
551改版時の目印となるようにしている.
552
553また,エラーのあった行を指摘するためには,・・・
554
555(※サンプルのため省略)
556
557\subsubsection{・・・関数におけるエラー処理}
558
559(※サンプルのため省略)
560
561\subsubsection{・・・}
562
563(※サンプルのため省略)
564
565
566%--------------------------------------------------------------%
567\subsection{\texttt{struct person}のサイズ}
568%--------------------------------------------------------------%
569
570以下のプログラムを \verb|gcc| でコンパイルして実行して,
571\verb|sizeof(struct person) = 88| という結果を得た.
572
573(※サンプルのため省略)
574
575{\fontsize{10pt}{11pt} \selectfont
576 \begin{verbatim}
577 1 my_person_data:
578 2 .long 999 ← 4バイト code
579 3 .string "taro" ← 5バイト name (末尾のヌルを入れて)
580 4 .zero 25 ← name が 30 になるように 0 を埋める
581 5 .zero 2 ← **** 2バイトの調整用 padding
582 6 .long 2000 ← 4バイト date.y = 2000
583 7 .long 1 ← 4バイト date.m = 1
584 8 .long 1 ← 4バイト date.d = 1
585 9 .byte 0 ← 1バイト type
58610 .string "Kagawa" ← 7バイト home (末尾のヌルを入れて)
58711 .zero 23 ← home が 30 になるように 0 を埋める
58812 .zero 1 ← **** 1バイトの調整用 padding
58913 .long 180 ← 4バイト height = 180
59014 .long 75 ← 4バイト weight = 75
591 \end{verbatim}
592}
593
594これを見ると,$5$行目と$12$行目に合計で
595$3$バイトの padding が入っていることが分かる.
596よく見ると \verb|.long| つまり \verb|int| の前に必ず入って$4$バイト境界に
597整数が跨がらないようになっている.
598しかし,$10$行目の \verb|home| のように,文字列の場合は,
599もともと$1$バイト単位で処理することが
600前提のためか,特に$4$バイト境界に納めるような padding は行われていない.
601(つまり$9$行目と$10$行目の間に \verb|.zero 3| が入らない)
602
603家電の中に組込まれているマイコンなどのメモリが少ないマシンにおいては,
604実行効率よりもこのメモリの無駄使いが問題になることがある.
605そのような場合に対応するため,\verb|gcc| はこの padding を止める
606オプションを提供している.
607同じコードを \verb|-fpack-struct| オプションを付けてコンパイルすると,
608メモリを無駄に使用しない,以下のコードを生成する.
609
610{\fontsize{10pt}{11pt} \selectfont
611\begin{verbatim}
612 1 my_person_data:
613 2 .long 999
614 3 .string "taro"
615 4 .zero 25
616 5 .long 2000
617 6 .long 1
618 7 .long 1
619 8 .byte 0
620 9 .string "Kagawa"
62110 .zero 23
62211 .long 180
62312 .long 75
624\end{verbatim}
625}
626
627(※サンプルのため省略)
628
629%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
630\section{感想}
631%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
632
633(※サンプルのため省略)
634
635%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
636\section{作成したプログラム}
637%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
638
639作成したプログラムを以下に添付する.
640与えられた課題については,・・・節で示したようにすべて正常に動作したことを付記しておく.
641
642%
643% 行番号付きのリストを挿入
644% cat -n ds-sample.c > ds-sample.txt
645% としたものを貼付する.
646% なお, fold コマンドを使うと指定行数で折り返すことができる.
647% 詳しくは fold --help を実行してヘルプを読んでみるとよい.
648%
649{\fontsize{10pt}{11pt} \selectfont
650\begin{verbatim}
651 1 #include <stdio.h>
652 2 #include <stdlib.h>
653 3 #include <string.h>
654 4
655 5 #define MAX_LINE_LEN 256
656 6
657 7 /****************************************************************/
658 8 /* string fuctions */
659 9 /****************************************************************/
660 10
661 11 /* substitute C1 to C2 in string SP. */
662 12 /* return value: number of replacement */
663 13 int subst(char *sp, char c1, char c2)
664 14 {
665 15 int n = 0;
666 16
667 17 while (*sp){
668 18 if (*sp == c1){
669 19 *sp = c2;
670 20 n++;
671 21 }
672 22 sp++;
673 23 }
674 24 return n;
675 25 }
676 26
677 27 /* split STR using delimiter char C */
678 28 /* return value: number of split elements */
679 29 /* ret[] points each split element */
680 30 int split(char *str, char *ret[], char c, int max)
681 31 {
682 32 int cnt = 0;
683 33
684 34 ret[cnt++] = str;
685 35
686 36 while (*str && cnt < max){
687 37 if (*str == c){
688 38 *str = '\0';
689 39 ret[cnt++] = str + 1;
690 40 }
691 41 str++;
692 42 }
693 43 return cnt; /* not more than MAX */
694 44 }
695 45
696
697 (※サンプルのため中略)
698
699 264 }
700 265 }
701 266 return 0;
702 267 }
703\end{verbatim}
704}
705%% 注:行送りの変更は"指定箇所を含む段落”に効果があらわれる.
706%% fontsizeコマンドを用いて,行送りを変える場合は,
707%% その {...} の前後に空白行を入れ,段落を変えるようにすること.
708%% なお,行先頭がコメントから始まる行は空白行とは扱われない.
709
710% 以下の3行は提出用のレポートでは必ず消すこと.
711\textbf{\small ※執筆上の注意:余白部分に文字がはみ出していないか,よく確認する.
712 例えば,\LaTeX によるコンパイル時のWarningメッセージを確認しよう.
713 \texttt{Overfull hbox}が出ていたら,はみ出している場所があるはずである.}
714
715\end{document}