\documentclass[xelatex,a4paper,11pt,ja=standard]{bxjsarticle} \usepackage{tex/preamble} \usepackage{tex/simple-title} \reportauthor{柴田健琉} \reporttitle{情報処理2 - 前期第9回課題} \reportdate{2026年}{06月}{16日} \turnindate{2026年}{06月}{16日} \begin{document} \simpletitle \section{はじめに} この課題のプログラムは以下の環境での動作が確認されている: \begin{itemize} \item{OS: NixOS 26.05 Yarara, Linux 7.0.12 x86\_64} \item{CC: GCC 15.2.0} \item{CFLAGS: \texttt{-g -O1 -Wall -Wpedantic}} \item{デバッガ: GNU gdb (GDB) 17.1} \end{itemize} \section{課題1 - 演習10-1} 教科書の演習10-1の\texttt{adjust\_point}関数を作成する. \lstinputlisting[language=C,caption={課題1のプログラム}]{./src/cls09/a1.c} \newpage \subsection{実行結果} \begin{figure}[tbh] \centering \includegraphics[width=10cm]{./assets/cls09-a1.png} \caption{課題1の実行結果} \end{figure} \subsection{処理の流れ} \begin{enumerate} \item{標準入力から整数を取得, 変数\texttt{d}に格納} \item{\texttt{adjust\_point}関数を変数\texttt{d}のポインタを引数とし呼び出す} \item{ディレファレンスした引数の値をもとに, 0未満であれば引数が指す値を0に, 100より大きければ100に, それ以外の値では何もしない} \item{変数\texttt{d}の値を標準出力に表示} \end{enumerate} \subsection{書く際の難点} この課題では特に大きな疑問・難点を抱えずに素直に処理を記述できた. \subsection{想定されるバグ} \texttt{scanf}関数の戻り値を確認していないので, 入力が正常かどうか不明のまま処理を行う. これにより, 意図しない結果が出る可能性がある. \section{課題2 - 演習10-2} 教科書の演習10-2の\texttt{increment\_date}と\texttt{decrement\_date}関数を作成する. なお, 閏年は考慮しないものとする. \lstinputlisting[language=C,caption={課題2のプログラム}]{./src/cls09/a2.c} \newpage \subsection{実行結果} \begin{figure}[tbh] \centering \includegraphics[width=10cm]{./assets/cls09-a2.png} \caption{課題2の実行結果} \end{figure} \subsection{処理の流れ} \subsubsection{\texttt{main}関数} \begin{enumerate} \item{標準入力から日付を含む行を取得し, 文字列バッファに格納する} \item{文字列バッファから\texttt{sscanf}関数を用いて年月日それぞれの値を取得する} \item{標準入力から1文字取得し, \texttt{opr\_in}変数に格納する} \item{'+'を受取れば\texttt{increment\_date}関数を, '-'を受取れば\texttt{decrement\_date}関数を呼び出す, それ以外の文字であれば手順3に戻る} \item{標準出力に操作の結果を表示する} \end{enumerate} \subsubsection{\texttt{increment\_date}関数} \begin{enumerate} \item{ディレファレンスした変数\texttt{day}をインクリメントする} \item{\texttt{day}が指す値が月の日数より大きければ, \texttt{day}が指す値を1にし, \texttt{month}が指す値をインクリメントする} \item{\texttt{month}が指す値が年の月数より大きければ, \texttt{month}が指す値を1にし, \texttt{year}が指す値をインクリメントする} \end{enumerate} \subsubsection{\texttt{decrement\_date}関数} \begin{enumerate} \item{ディレファレンスした変数\texttt{day}をデクリメントする} \item{\texttt{day}が指す値が0以下の時,} \begin{enumerate} \item{\texttt{month}が指す値をデクリメントする} \item{\texttt{month}が指す値が0以下の時, その値を12にし, \texttt{year}が指す値をデクリメントする} \item{\texttt{day}が指す値を\texttt{month}の日数にする} \end{enumerate} \end{enumerate} \subsection{書く際の難点} 日付入力を受け付る際, \texttt{scanf}関数を使用した直後に別の標準入力にアクセスする関数を実行すると日付入力に入った改行文字が次の関数で読み取られ, \texttt{main}関数の手順4の操作指定用の文字以外の文字が入力された状態になってしまうことが発生した. この問題は\texttt{fgets}関数で行単位で標準入力から文字列バッファにコピーし, バッファに対し\texttt{sscanf}関数を使用することで回避した. \subsection{想定されるバグ} 日付入力のサニタイズ(検疫)を行っていないので異常値(例: 15/01/1970)が入力された際, 両関数では正常な演算が実行できず, 時には\texttt{DAYS\_IN\_MONTH}配列の範囲外へアクセスする恐れがある. \section{課題3 - 演習10-3} 教科書の演習10-3の\texttt{sort3}関数を作成する. \lstinputlisting[language=C,caption={課題3のプログラム}]{./src/cls09/a3.c} \subsection{実行結果} \begin{figure}[tbh] \centering \includegraphics[width=10cm]{./assets/cls09-a3.png} \caption{課題3の実行結果} \end{figure} \subsection{処理の流れ} \subsubsection{\texttt{main}関数} \begin{enumerate} \item{標準入力から3つの整数値を取得し, 変数\texttt{a}, \texttt{b}, \texttt{c}にそれぞれ格納する} \item{取得した値に対し\texttt{sort3}関数を適用する} \item{標準出力に結果を表示する} \end{enumerate} \subsubsection{\texttt{sort3}関数} \begin{enumerate} \item{\texttt{x}が指す値が\texttt{y}が指す値より大きければ\texttt{swap}関数で2つの値を交換する} \item{\texttt{y}が指す値が\texttt{z}が指す値より大きければ\texttt{swap}関数で2つの値を交換する} \item{\texttt{x}が指す値が\texttt{y}が指す値より大きければ\texttt{swap}関数で2つの値を交換する} \end{enumerate} \subsection{書く際の難点} 最初は配列やループを使用せずにどうやって並び換えを行うか一瞬分からなかったが, 3要素のバブルソートの処理を直接記述することで解決した. \subsection{想定されるバグ} \texttt{scanf}関数の戻り値である変換に成功した値の数を確認していないので1つ以上の変数が初期化されていない状態が発生しうる. この状態では意図しない値が並び換えの順序に影響してしまう. \end{document}