%=====================================================================
% 秋田高専 2E 情報工学概論 テキスト
%　　テーマ　ポインター(配列とリテラル)
%    本テキストの内容
%        ・
%        ・
%        ・
%        ・
%　　　 　・
%
% last updated 2005.6.23
%    created by  Masashi Yamamoto
%     e-mail yamamoto@akita-nct.jp
%=====================================================================
\documentclass[10pt,a4paper]{jarticle}
\usepackage{graphicx,amsmath,amssymb,ascmac,float}
\usepackage{html, listings, jlisting}
\oddsidemargin 0mm  %左の余白 25.4mm-0mm　奇数ページ
\evensidemargin 0mm %左の余白 25.4mm-0mm　偶数ページ
\textwidth 160mm
\newcommand{\command}[1]{「\texttt{#1}」}
\newcommand{\cl}[1]{\texttt{#1}}
\newcommand{\tw}[1]{\texttt{#1}}
%
\newcounter{ex_num}
\newcommand{\exercise}{\textbf{\texttt{[練習 \arabic{ex_num}]}}
   \addtocounter{ex_num}{1}}
%
\renewcommand{\lstlistingname}{リスト}
\lstset{language=C,%
        basicstyle=\footnotesize,%
        commentstyle=\textit,%
        classoffset=1,%
        keywordstyle=\bfseries,%
	frame=tRBl,framesep=5pt,%
	showstringspaces=false,%
        numbers=left,stepnumber=1,numberstyle=\footnotesize%
	}%
%
\begin{htmlonly}
\usepackage{verbatimfiles}
 \providecommand{\lstinputlisting}[2][]{\verbatimlisting{#2}}
\end{htmlonly}
%
\begin{document}
\title{夏休みの課題}
\author{山本昌志\thanks{独立行政法人　秋田工業高等専門学校　電気情報工学科}}
\date{2005年7月14日}
\maketitle
%
%
%=====================================================================
\section{課題の概要}
%=====================================================================
これまでの授業でC言語の一通りの学習は終わった。ただし、ほとんどC言語の表面をなめ
ただけで、詳細については教えていない。実際のプログラミングで必要な細かいことにつ
いては、各自、もっと細かく書いてある書籍を購入して学習するのが良いだろう。購入に先
立って、図書館などで借用し、自分に向いている図書を探すことを勧める。

夏休み後の学習は、あるレベルのプログラムが自在に作成できることを目指す。そのため、
復習を兼ねたプログラムの作成の課題を与える。教科書やプリント、あるいは自分で調べ
て、プログラムを完成させること。自宅にパソコンがある者は、コンパイラーをインストー
ルして、プログラムの実行を確認してプリントアウトしたものを提出するのが良いだろう。
あるいは、学校の情報処理センターのパソコンを利用しても良い。パソコンの利用が不可
能な者は、手書きでも良い。
%
%=====================================================================
\section{課題プログラム}
%=====================================================================
%---------------------------------------------------------------------
\subsection{基本プログラム}
%---------------------------------------------------------------------
以下の作業を行う場合のプログラムを示せ。
\setcounter{ex_num}{1}
\begin{quote}
 \begin{list}{}{\leftmargin=5em \labelwidth=5em}
  \item[\exercise]以下の1文を表示する。
 \begin{quote}
  \setlength{\baselineskip}{12pt}
  \begin{verbatim}
	Hello World !!
  \end{verbatim}
 \end{quote}
%
  \item[\exercise]以下の2行をを表示する。
 \begin{quote}
  \setlength{\baselineskip}{12pt}
  \begin{verbatim}
	Hello World !!
	from Akita National College of Technology.
  \end{verbatim}
 \end{quote}
%
%
  \item[\exercise]2つの整数をキーボードから読み込んで、和と差、積を表示する。
%
  \item[\exercise]2つの整数をキーボードから読み込んで、商と余りを表示する。ヒン
		  ト、余りを計算するには、演算子\tw{\%}を使う。\tw{a}を\tw{b}で割っ
		  たときの余りは、\tw{a\%b}で計算できる。
%
  \item[\exercise]2つの実数をキーボードから読み込んで、和と差、積、商を表示する。
%
  \item[\exercise]角度[deg]\footnote{角度の単位でdegと書いたら、度を表す。radと
		  書いたらラジアンである。}を読み込んで、それをラジアンに直して、
		  表示する。
%
  \item[\exercise]角度[deg]を読み込んで、角度と三角関数の値を表示する。ヒントは、
		  以下の通り。
		  \begin{itemize}
		   \item 三角関数のような、数学関数を使う場合、いつものおまじな
			 いの\tw{\#include <stdio.h>}に引き続き\tw{\#include
			 <math.h>を書く。}
		   \item 角度を\tw{t}ラジアンをした場合、三角関数の値は
			 \tw{sin(t)}や\tw{cos(t)}、\tw{tan(t)}で計算できる。ただ
			 し、引数は倍精度実数である。
		   \item 数学関数を含んだプログラムをコンパイルする場合、
			 \tw{-lm}と言うオプションが必要である。すなわち、数学関
			 数を含んだ\tw{hoge.c}とソースを\tw{fuga}と言う実行ファ
			 イルにするためには、\\
			 \hspace{10mm}\tw{gcc -lm -o fuga hoge.c}\\
			 とする。
		  \end{itemize}
 \end{list}
\end{quote}
%
%---------------------------------------------------------------------
\subsection{制御文}
%---------------------------------------------------------------------
\setcounter{ex_num}{1}
\begin{quote}
 \begin{list}{}{\leftmargin=5em \labelwidth=5em}
  \item[\exercise]\tw{if}と\tw{goto}文を使って、1〜1000までの整数の合計を求める。
  \item[\exercise]\tw{for}文を使って、1〜1000までの整数の合計を求める。
  \item[\exercise]\tw{while}文を使って、1〜1000までの整数の合計を求める。
  \item[\exercise]\tw{do〜while}文を使って、1〜1000までの整数の合計を求める。
  \item[\exercise]1〜100000までの素数を全て書き出す。
 \end{list}
\end{quote}
%
%
%---------------------------------------------------------------------
\subsection{配列}
%---------------------------------------------------------------------
\setcounter{ex_num}{1}
\begin{quote}
 \begin{list}{}{\leftmargin=5em \labelwidth=5em}
  \item[\exercise] キーボードから10個の整数の値を読み込んで、それを配列に格納す
		   る。偶数の合計と奇数の合計を計算するプログラムを作成せよ。 
  \item[\exercise] 数字を大きい、あるいは小さい順に並べることをソーティングと言
		   う。最も簡単な単純挿入法のプログラムを作成する。有名なC言語の
		   本「NUMERICAL RECIPES in C」によると、これは経験を積んだトラ
		   ンプ師が使う方法と同じであるということである。順序がバラバラ
		   のトランプを並び替える場合、
		   \begin{itemize}
		    \item まず、2枚目のカードを拾い、1枚目と順序関係が正しい位置
			  に置く。
		    \item 次に3枚目のカードを拾い、最初の2枚と順序関係の正しい位
			  置にそれを挿入する。
		    \item 同じことを繰り返す。即ち、$i$枚目のカードを拾い、最初の
			  $i-1$枚のカードの順序関係の正しい位置にそれを挿入する。
		    \item　最後のカードを正しい位置に挿入したら、並び替えは完了である。
		   \end{itemize}
		   この単純挿入法を用いて、リスト\ref{prog:simple_sort}で作成さ
		   れた整数の配列\tw{a[0]〜a[1023]}に格納されている整数を小さい
		   順に並び替えよ。すなわち、\tw{a[0]}が最小で、\tw{a[1023]}が最
		   大である。ヒント、単純挿入法のアルゴリズムを図
		   \ref{fig:flow_simple_sort}に、乱数を作成するプログラムをリス
		   ト\ref{prog:simple_sort}に示す。すなわち、このリストの19行目
		   以降に単純挿入法と、\tw{a[0]〜a[1023]}の値をディスプレイに出
		   力するプログラムを書く。
 \end{list}
\end{quote}
%
\begin{figure}[hbtp]
 \begin{center}
  \includegraphics[keepaspectratio, scale=1.0]{figure/flow_simple_sort.eps}
  \caption{単純挿入法のフローチャート。\tw{ndata}はデータ数で、\tw{a[0]〜
  a[nadata-1]}の配列に格納されている整数を小さい順(昇順)に並べる。}
  \label{fig:flow_simple_sort}
 \end{center}   
\end{figure}
%
\lstinputlisting[caption=単純挿入法のプログラムの一部,label=prog:simple_sort]
{program/simple_sort.c}
%---------------------------------------------------------------------
\subsection{ファイル入出力}
%---------------------------------------------------------------------
\setcounter{ex_num}{1}
\begin{quote}
 \begin{list}{}{\leftmargin=5em \labelwidth=5em}
  \item[\exercise] ファイルに、0〜360度の三角関数の値を書き込むプログラムを作成
		   する。ファイルの各行には、角度$\theta$[deg]と$\sin\theta$、
		   $\cos\theta$, $\tan\theta$の値をタブ区切りで書くものとする。数
		   学関数を使う場合の注意は、基本プログラムの\textbf{\texttt{[練
		   習 7]}}の通りである。
  \item[\exercise] 前問で作成したファイルを読み込み、ディスプレイに表示するプロ
		   グラムを作成せよ。
 \end{list}
\end{quote}
%
%---------------------------------------------------------------------
\subsection{文字処理}
%---------------------------------------------------------------------
\setcounter{ex_num}{1}
\begin{quote}
 \begin{list}{}{\leftmargin=5em \labelwidth=5em}
  \item[\exercise] キーボードから32文字以内のアルファベットを入力する。入力し
		   た順序と逆にディスプレイに表示するプログラムを作成せよ。
 \end{list}
\end{quote}
%
%---------------------------------------------------------------------
\subsection{関数}
%---------------------------------------------------------------------
\setcounter{ex_num}{1}
\begin{quote}
 \begin{list}{}{\leftmargin=5em \labelwidth=5em}
  \item[\exercise]三辺の長さ$(a, b, c)$をキーボードから入力して、面積を求めるプ
		  ログラムを作成する。面積を求める部分は、以下のような関数にする
		  こと。
		  \begin{itemize}
		   \item 関数の引数は三辺の長さとし、戻り値を面積とする。
		   \item 関数は、最初に引数のチェックをする。それは、「三角形の二
			 辺の和は他の一辺よりも長い」ということを確認する。もしこれ
			 に反するならば、三角形の面積として、-999の値を返す。
		   \item 三角形の面積は、ヘロンの公式
			 \begin{align}
			  S=\sqrt{s(s-a)(s-b)(s-c)}\nonumber
			 \end{align}
			 を使い求めること。ただし、
			 \begin{align}
			  s=\frac{a+b+c}{2}\nonumber
			 \end{align}
			 である。
		  \end{itemize}
		  \textbf{ヒント} C言語で$\sqrt{a}$を計算する場合、数学関数の
		  \tw{sqrt(a)}を使う。数学関数を使う場合の注意は、基本プログラム
		  の\textbf{\texttt{[練習 7]}}の通りである。
 \end{list}
\end{quote}
%
%---------------------------------------------------------------------
\subsection{構造体}
%---------------------------------------------------------------------
\setcounter{ex_num}{1}
\begin{quote}
 \begin{list}{}{\leftmargin=5em \labelwidth=5em}
  \item[\exercise] 以下のような50人分の成績のファイルがある。ファイルの各行には、名字、
		   名前、英語、数学、情報処理の成績が書かれている。
		   \begin{quote}
		    \tw{Koizumi Junichiro 87 43 21}\\
		    \tw{Yamamoto Masashi 42 25 91}\\
		    \tw{Hamasaki Ayumi 23 92 41}\\
		    \tw{Kimura Takuya 21 34 45}\\
		    \tw{Shimada Masahiko 78 63 46}\\
		    \tw{残り45人分}
		   \end{quote}
		   これらを構造体を使って管理し、平均点の高い順に学生の情報をディ
		   スプレイに表示する。表示する情報は、順位、平均点、名字、名前、
		   英語、数学、情報処理の成績とする。
 \end{list}
\end{quote}
%
%---------------------------------------------------------------------
\subsection{ポインター}
%---------------------------------------------------------------------
\setcounter{ex_num}{1}
\begin{quote}
 \begin{list}{}{\leftmargin=5em \labelwidth=5em}
  \item[\exercise] 整数型の変数、\tw{a, b, c}に入っている整数を、
		   \tw{a}$\rightarrow$\tw{b}、\tw{b}$\rightarrow$\tw{c}、
		   \tw{c}$\rightarrow$\tw{a}と入れ替えるプログラムを作成せよ。た
		   だし、入れ替える部分は関数とすること。
  \item[\exercise] 要素数が100$\times$100の2次元配列に\tw{a[i][j]=i*i+j}の値を代
		   入する。そして、\tw{a[i][j]}と\tw{a[j][i]}と入れ替える
		   \footnote{転置行列と言う。}プログラムを作成せよ。ただし、入れ
		   替える部分は関数とすること。
 \end{list}
\end{quote}
%
%=====================================================================
\subsection{課題提出要領}
%=====================================================================
提出方法は、次の通りとする。
% 
\begin{quote}
 \begin{tabular}{ll}
  期限 & 8月25日(木) AM 8:50 \\
  用紙 & A4 \\
  提出場所 & 山本研究室の入口のポスト \\
  表紙 & 表紙を1枚つけて、以下の項目を分かりやすく記述すること。\\
       & \qquad 授業科目名「情報工学」\\
       & \qquad 課題名「課題　夏休みの宿題」\\
       & \qquad 2E\quad 学籍番号\quad 氏名\\
       & \qquad 提出日\\
  内容 & ソースプログラム(プリントアウトでも、手書きでもOKとする)
 \end{tabular}
\end{quote}
%
%
%
%=====================================================================
\end{document}
