% ファイル先頭から\begin{document}までの内容（プレアンブル）については，
% 基本的に { } の中を書き換えるだけでよい．
\documentclass[autodetect-engine,dvi=dvipdfmx,ja=standard,
               a4j,11pt]{bxjsarticle}

%%======== プレアンブル ============================================%%
% 用紙設定：指示があれば，適切な余白に設定しなおす
\RequirePackage{geometry}
\geometry{hmargin=25truemm,top=20truemm,bottom=25truemm,footskip=10truemm,headheight=0mm}
%\geometry{showframe} % 本文の"枠"を確認したければ，コメントアウト

% 設定：図の挿入
% http://www.edu.cs.okayama-u.ac.jp/info/tool_guide/tex.html#latex_figure
\usepackage{graphicx}

% 設定：ソースコードの挿入
% http://www.edu.cs.okayama-u.ac.jp/info/tool_guide/tex.html#latex_fvextra
\usepackage{fvextra}
\renewcommand{\theFancyVerbLine}{\texttt{\footnotesize{\arabic{FancyVerbLine}:}}}
\fvset{breaklines=true, breakanywhere=true}  % fvextraが必要．fancyvrbではエラーになる．

%%======== レポートタイトル等 ======================================%%
% ToDo: 提出要領に従って，適切なタイトル・サブタイトルを設定する
\title{プログラミング演習1 \\
       期末レポート}

% ToDo: 自分自身の氏名と学生番号に書き換える
\author{氏名: 原 直 (HARA, Sunao) \\
        学生番号: 0941xxxx}

% ToDo: レポート課題等の指示に従って適切に書き換える
\date{出題日: 20xx年xx月xx日 \\
      提出日: 20xx年xx月xx日 \\
      締切日: 20xx年xx月xx日 \\}  % 注：最後の\\は不要に見えるが必要．

%%======== 本文 ====================================================%%
\begin{document}
\maketitle
% 目次つきの表紙ページにする場合はコメントを外す
%{\footnotesize \tableofcontents \newpage}

%% 本文は以下に書く．課題に応じて適切な章立てを構成すること．
%% 章＝\section，節＝\subsection，項＝\subsubsection である．
% 以下の7行は提出用のレポートでは必ず消すこと
\textbf{\small※執筆上の注意：本書は空想上の課題に対するレポートの
    執筆例である．章の構成と書くべき内容の参考として提示するもの
    であるため，課題内容やプログラムの仕様などは，
    実際の演習課題の指示に従って適切にまとめ直す必要がある．
    文や文の一部を「・・・」や「??」によって省略している箇所があるが，
    これに穴埋めをするだけで，レポートが完成するわけではない．
    なお，サンプルと同じ書き出しで文章を書く必要もない．}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{概要} \label{sec:abstract}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 以下の4行は提出用のレポートでは必ず消すこと
\textbf{\small※執筆上の注意：概要は多すぎず少なすぎずが重要である．
    特に，次の3点について，執筆者の取り組みの概略が読者（＝教員）に
    伝わるようにしよう．(1) このレポートで取り組んだ課題の内容，
    (2) 実験等によって得られた結果，(3) 結果に対しておこなった考察．\\}

本演習では，名簿管理機能を有するプログラムを，C言語で作成する．
このプログラムは，標準入力から「ID, 氏名, 誕生日, 住所, 備考」からなる
コンマ区切り形式（CSV形式）の名簿データを受け付けて，それらをメモリ中に登録する機能を持つ．
ただし，\%で始まる入力行はコマンド入力と解釈し，登録してあるデータを表示したり整列したりする機能も持つ．

本レポートでは，演習中に取り組んだ課題として，
以下の課題1から課題3についての内容を報告する．
%
\begin{description}
  \item[課題1] 文字列操作の基礎：\verb|subst|関数と\verb|split|関数の実装
  \item[課題2] 構造体や配列を用いた名簿データの定義
  \item[課題3] 標準入力の・・・（\textbf{サンプルのため，省略}）
  %追記する場合は，本文の記述と矛盾しないように注意すること．
\end{description}
%
また，取り組んだ課題のうち，特に以下の課題については，詳細な考察を行った．
%
\begin{description}
  \item[課題1] 文字列操作の基礎：\verb|subst|関数と\verb|split|関数の実装
  \item[課題3] 標準入力の・・・（\textbf{サンプルのため，省略}）
  %追記する場合は，本文の記述と矛盾しないように注意すること．
\end{description}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{プログラムの作成方針}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 以下の4行は提出用のレポートでは必ず消すこと
\textbf{\small※執筆上の注意：追加仕様については，書かなくても良い．
    書く場合は，次節の説明などでも，その仕様を参照しながら書くとよい．\\}

本演習で作成したプログラムが満たすべき要件と仕様として，
「(1) 基本要件」と「(2) 基本仕様」を示す．

\subsubsection*{(1) 基本要件}

\begin{enumerate}
  \setlength{\parskip}{0em} \setlength{\itemsep}{0.25em}  % <-- この一行は項目間の調整
    \item プログラムは，その実行中，少なくとも10,000件の名簿データをメモリ中に保持できるようにすること．
    \item 名簿データは，・・・・
    \item プログラムとしての動作や名簿データの管理のために，・・・
    \begin{enumerate} \setlength{\parskip}{0em} \setlength{\itemsep}{0.25em}
        \item プログラムの正常な終了
        \item 登録された・・・
        % サンプルのため省略
    \end{enumerate}
    \item 標準入力からのユーザ入力を通して，，，      % サンプルのため省略
\end{enumerate}

\subsubsection*{(2) 基本仕様}

\begin{enumerate}
  \setlength{\parskip}{0em} \setlength{\itemsep}{0.25em}  % <-- この一行は項目間の調整
    \item 名簿データは，コンマ区切りの文字列（\textbf{CSV入力}と呼ぶ）で表されるものとし，%
          図\ref{fig:csvdata}に示したようなテキストデータを処理できるようにする．%
          %CSV入力の詳細は，\ref{sec:sepc_csv}節に示す．  % <-- この1文は，レポートでは不要
    \item コマンドは，\%で始まる文字列（\textbf{コマンド入力}と呼ぶ）とし，表\ref{tab:commands}にあげたコマンドをすべて実装する
    \item 1つの名簿データは，C言語の構造体 (\texttt{struct}) を用いて，・・・   % サンプルのため省略
    % サンプルのため省略．仕様書の footnote は書かなくてよい．
\end{enumerate}

%========================= EXAMPLE CSV ================================%
\begin{figure}[b]
\centering % この1行はbegin～endの中を中央寄せにする，というコマンド
% Verbatim environment
% プリアンブルで \usepackage{fvextra} か \usepackage{fancyvrb} が必要．
%   - frame         枠で囲う．single なら，四角で囲われる
%   - xleftmargin   枠の左の余白
%   - xrightmargin  枠の右の余白
%   - gobble        先頭n文字を無視．インデントを無視したい場合に利用する．
%   - fontsize      フォントサイズ指定
%   - numbers       行番号を表示．left なら左に表示．
%   - firstnumber   最初の行番号を指定
\begin{Verbatim}[frame=single, xleftmargin=5mm, xrightmargin=5mm, gobble=4,
                 fontsize=\small, numbers=left, firstnumber=1]
    5100046,The Bridge,1845-11-2,14 Seafield Road Longman Inverness,SEN Unit 2.0 Open
    5100127,Bower Primary School,1908-1-19,Bowermadden Bower Caithness,01955 641225 ...
    5100224,Canisbay Primary School,1928-7-5,Canisbay Wick,01955 611337 Primary 56 3...
    5100321,Castletown Primary School,1913-11-4,Castletown Thurso,01847 821256 01847...
\end{Verbatim}
    \caption{名簿データのCSV入力形式の例．1行におさまらないデータは...で省略した．}
    \label{fig:csvdata}
\end{figure}
%========================= EXAMPLE CSV ================================%

%========================= COMMAND LIST ================================%
\begin{table}[b]  %表の位置は原則として t または b．h や H は使わない．
\centering % この1行はbegin～endの中を中央寄せにする，というコマンド
    \caption{実装するコマンド}
    \label{tab:commands}
    \begin{tabular}{|l|ll|l|}
    \hline
    \textbf{コマンド} & \textbf{意味} &        & \textbf{備考} \\
    \hline\hline
    \verb|%Q|   & 終了                & (Quit)  & \\
    \hline
    \verb|%P n| & 先頭から$n$件表示   & (Print) & $n$が$0$ $\to$ 全件表示，        \\
                &                     &         & $n$が負 $\to$ 後ろから$-n$件表示 \\
    \hline
    *****       &（サンプルのため     & 省略）    & \\
    \hline
    \end{tabular}
\end{table}
%========================= COMMAND LIST ================================%

% 以下の2行は提出用のレポートでは必ず消すこと
\textbf{\small※執筆上の注意：繰り返すが，本書は空想上の課題に対するレポートの
    執筆例である．書くべき内容としては，課題書等を読んだうえで適切に執筆すること\\}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{プログラムの説明}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 以下の6行は提出用のレポートでは必ず消すこと
\textbf{\small ※執筆上の注意：変数や数値は$\backslash$verbや\$\$
    で囲って，適切な書体で記述することを忘れずに．
    なお，このサンプルでは``わざと''一部の処理を省略している．
    見た目の違いを確認して，自分のレポートでは処理を忘れないようにしよう．
    また，この章はこのレポートサンプルの2章に基づいて書かれているが，
    そもそも2章が架空の講義内容に基づいて書かれている点に注意すること．\\}

プログラムリストは・・・節に添付している．プログラムは全部で267行からなる．
以下では，\ref{sec:abstract}節の課題ごとに，プログラムの主な構造について説明する．

%--------------------------------------------------------------------%
\subsection{文字列操作の基礎：\texttt{subst}関数と\texttt{split}関数の実装}
%--------------------------------------------------------------------%
% Tips:
% - subsectionなどでは verbが使えない．texttt を使うとよい．
% - 最初の段落で，この節で説明する関数等の名前や場所などを説明する．
% - 以降の段落で，最初の段落で示した，各関数等に関する詳細を説明する．

まず，汎用的な文字列操作関数として，
\verb|subst()|関数を11--25行目で宣言し， % この行は適切な書き方の例
split()関数を27-44行目で宣言している．   % この行は不適切な書き方の例
また，これらの関数で利用するために，・・・（省略）

\verb|subst(STR, C1, C2)|関数は，
\verb|STR|が指す文字列中の，文字\verb|C1|を文字\verb|C2|に置き換える．
プログラム中では，xxx関数の中で，入力文字列中の末尾に付く改行文字を
ヌル文字で置き換えるために使用している．

\verb|split(STR, ...)|関数は，・・・（※サンプルのため，いろいろと省略）

%--------------------------------------------------------------------%
\subsection{構造体や配列を用いた名簿データの定義}
%--------------------------------------------------------------------%

本名簿管理プログラムでは，構造体の配列を名簿データとして扱う．
18--27行目で，\verb|date|構造体を定義し，
29--48行目で，\verb|profile|構造体を定義している．
この・・・・が，名簿データ1つに相当する．
そして，xxx行目の\verb|xxxxx|変数で，全名簿データを管理し，
xxx行目の\verb|xxxxx|変数で，名簿データの個数を管理する．

\verb|date|構造体の定義にあたっては，・・・（以降，サンプルのため，省略）

・・・（サンプルのため，省略）

%--------------------------------------------------------------------%
\subsection{標準入力の・・・（\textbf{サンプルのため，省略}）}
%--------------------------------------------------------------------%

・・・（サンプルのため，省略）


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{プログラムの使用法と実行結果}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 提出するレポートでは以下6行は必ず消すこと
\textbf{\small ※執筆上の注意：この節はプログラムの使用法を説明す
    る節である．最低限，起動の方法，入力の形式と方法，出力の読み方
    を入れること．当然，実装したコマンドすべてを説明すべきであるが，
    このサンプルのように説明に使う実行例が1つである必要はない．
    適宜，subsectionなどを用いて見やすく整理するとよい．
    なお，本学科の演習室では Red Hat Linux は利用していない．\\}

本プログラムは名簿データを管理するためのプログラムである．
CSV形式のデータと \% で始まるコマンドを標準入力から受け付け，
処理結果を標準出力に出力する．
入力形式の詳細については，\ref{??????}節で説明した．

% 実行結果を得るために利用した，実行環境のOSを必ず書くこと．
プログラムは，Red Hat Linux 3.2.2-5 で動作を確認しているが，
一般的な UNIX で動作することを意図している．
なお，以降の実行例における，行頭の\verb|$|記号は，
Red Hat Linux 3.2.2-5におけるターミナルのプロンプトである．

まず，\verb|gcc|でコンパイルすることで，プログラムの実行ファイルを生成する．
ここで，\verb|-Wall|とは．．．するためのオプションであり，
\verb|-o|とは・・・を指定するオプションである．
これらのオプションをつけることで，・・・（略）

\bgroup\fontsize{10pt}{11pt} \selectfont
\begin{verbatim}
   $ gcc -Wall -o program1 program1.c
\end{verbatim}
\egroup
%% 注1：行送りやフォントの変更は\bgroupと\egroupの間で効果があらわれる．
%%      特に\egroupでの閉じ忘れに注意．
%% 注2：\end{verbatim}の前に不用意な空白を入れると，余分な空行が入る

次に，プログラムを実行する．
以下の実行例は，プログラム実行中の・・・を模擬するため，
・・・を・・・により与えることで，実行する例を示している．
通常の利用においては，・・・（略）

\bgroup\fontsize{10pt}{11pt} \selectfont
\begin{verbatim}
   $ ./program1 < csvdata.csv
\end{verbatim}
\egroup

プログラムの出力結果として，CSVデータの各項目が読みやすい形式で出力される．
例えば，下記の \verb|cvsdata.csv| に対して，

\bgroup\fontsize{10pt}{11pt} \selectfont
\begin{verbatim}
  0,Takahashi Kazuyuki,1977-04-27,3,Saitama,184,78
  10,Honma Mitsuru,1972-08-25,2,Hokkaidou,180,78
  %S3
  %P0
\end{verbatim}
\egroup

\noindent % noindentとはここでは段落を変えない（一字下げをしない）というコマンド．
以下のような出力が得られる．

\bgroup\fontsize{10pt}{11pt} \selectfont
\begin{verbatim}
  code:   10
  name:   Honma Mitsuru
  bday:   1972/08/25
  type:   2
  home:   Hokkaidou
  height: 180
  weight: 78

  code:   0
  name:   Takahashi Kazuyuki
  bday:   1977/04/27
  type:   3
  home:   Saitama
  height: 184
  weight: 78
\end{verbatim}
\egroup

まず，入力データについて説明する．
入力中の最初の2行で，2つのCSVデータを登録している．
CSVデータは，表1で示したように，7つの項目からなる．
% 注：上1行の「表1」の部分は，\refを用いて適切に参照すること．
3行目の\%S3 は，これまでの入力データを3番目の項目（生年月日）で
ソートすることを示している．
4行目の\%P0 は，入力した項目の全ての項目 ($1$--$7$) を
表示することを示している．

（※サンプルのため省略）


%以下の4行は提出レポートでは不要なため消すこと．
\textbf{\small ※執筆上の注意：良くないレポートの書き方例を2つ挙げる．\\
    (1) 入力の説明が無いため，何をしたのかがわからない．\\
    (2) 出力結果だけが書いてあり，それが「想定（仕様）通り」なのかどうか，
        を述べていない．\\}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{考察}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%以下の5行は提出レポートでは不要なため消すこと．
\textbf{\small ※執筆上の注意：考察課題を中心にまとめる．
    あくまで「作成したプログラムとその実行結果から考察できること」を，
    主に求めている．単なる感想で終わるような内容を書いてはいけない．\\}

・・・章のプログラムの説明，および，・・・章の使用法と実行結果から，
演習課題として作成したプログラムが，
\cite{sec:abstract}章で述べた基本要件と基本仕様のいずれも満たしていることを示した．
ここでは，個別の課題のうち，以下の3つの項目について，考察を述べる．
% 注：\ref コマンドを用いて適切に参照すること．

\begin{enumerate}
\setlength{\parskip}{2pt} \setlength{\itemsep}{2pt}
    \item 文字列操作の基礎：\texttt{subst}関数と\texttt{split}関数の実装
    \item 標準入力の・・・（\textbf{サンプルのため，省略}）
    \item ・・・（\textbf{サンプルのため，省略}）
\end{enumerate}

%--------------------------------------------------------------------%
\subsection{「文字列操作の基礎：\texttt{subst}関数と\texttt{split}関数の実装」に関する考察}
%--------------------------------------------------------------------%

(※サンプルのため省略)

%--------------------------------------------------------------------%
\subsection{「標準入力の・・・（\textbf{サンプルのため，省略}）」に関する考察}
%--------------------------------------------------------------------%

(※サンプルのため中略)

\subsubsection{「・・・（\textbf{サンプルのため，省略}）」に関する考察}

(※サンプルのため省略)



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{感想}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(※サンプルのため省略)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{作成したプログラム}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%以下の注意書きは提出レポートでは不要なため消すこと．
\textbf{\small ※執筆上の注意：はみ出さないように注意．
    また，??章のような状態でレポートを提出しないように注意すること．\\}

作成したプログラムを以下に添付する．
なお，\ref{sec:abstract}章に示した課題については，
\ref{xxxx}章で示したようにすべて正常に動作したことを付記しておく．

% Verbatim environment
% プリアンブルで \usepackage{fvextra} か \usepackage{fancyvrb} が必要．
%   - numbers           行番号を表示．left なら左に表示．
%   - xleftmargin       枠の左の余白．行番号表示用に余白を与えたい．
%   - numbersep         行番号と枠の間隙 (gap)．デフォルトは 12 pt．
%   - fontsize          フォントサイズ指定
%   - baselinestretch   行間の大きさを比率で指定．デフォルトは 1.0．
\begin{Verbatim}[numbers=left, xleftmargin=10mm, numbersep=6pt,
                    fontsize=\small, baselinestretch=0.8]
#include <stdio.h>

int main()
{
    char s[4] = {'A', 'B', 'C', '\0'};

    printf("s = %s\n", s);

    return 0;
}
\end{Verbatim}

% 以下の3行は提出用のレポートでは必ず消すこと．
\textbf{\small ※執筆上の注意：余白部分に文字がはみ出していないか，よく確認する．
    例えば，\LaTeX によるコンパイル時のWarningメッセージを確認しよう．
    \texttt{Overfull hbox}が出ていたら，はみ出している場所があるはずである．}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 参考文献
%   実際に，参考にした書籍等の奥付などを見て書くこと．
%   本文で引用する際は，\cite{book:algodata}のように書けばよい．
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{thebibliography}{99}
  \bibitem{book:algodata} 平田富雄，アルゴリズムとデータ構造，森北出版，1990.
  \bibitem{book:label2} 著者名，書名，出版社，発行年.
  \bibitem{www:label3} WWWページタイトル，URL，アクセス日.
\end{thebibliography}
%以下の注意書きは提出レポートでは不要なため消すこと．
\textbf{\small ※執筆上の注意：
      これらは書き方の例である．実際に，参考にした書籍等を見て書くこと．\\}

%--------------------------------------------------------------------%
%% 本文はここより上に書く（\begin{document}～\end{document}が本文である）
\end{document}
