2 課題プログラム

2.1 基本プログラム

以下の作業を行う場合のプログラムを示せ。
[練習 1]
以下の1文を表示する。
	Hello World !!
[練習 2]
以下の2行をを表示する。
	Hello World !!
	from Akita National College of Technology.
[練習 3]
2つの整数をキーボードから読み込んで、和と差、積を表示する。
[練習 4]
2つの整数をキーボードから読み込んで、商と余りを表示する。ヒン ト、余りを計算するには、演算子%を使う。abで割っ たときの余りは、a%bで計算できる。
[練習 5]
2つの実数をキーボードから読み込んで、和と差、積、商を表示する。
[練習 6]
角度[deg]2を読み込んで、それをラジアンに直して、 表示する。
[練習 7]
角度[deg]を読み込んで、角度と三角関数の値を表示する。ヒントは、 以下の通り。
  • 三角関数のような、数学関数を使う場合、いつものおまじな いの#include <stdio.h>に引き続き#include <math.h>を書く。
  • 角度をtラジアンをした場合、三角関数の値は sin(t)cos(t)tan(t)で計算できる。ただ し、引数は倍精度実数である。
  • 数学関数を含んだプログラムをコンパイルする場合、 -lmと言うオプションが必要である。すなわち、数学関 数を含んだhoge.cとソースをfugaと言う実行ファ イルにするためには、
    gcc -lm -o fuga hoge.c
    とする。

2.2 制御文

[練習 1]
ifgoto文を使って、1〜1000までの整数の合計を求める。
[練習 2]
for文を使って、1〜1000までの整数の合計を求める。
[練習 3]
while文を使って、1〜1000までの整数の合計を求める。
[練習 4]
do〜while文を使って、1〜1000までの整数の合計を求める。
[練習 5]
1〜100000までの素数を全て書き出す。

2.3 配列

[練習 1]
キーボードから10個の整数の値を読み込んで、それを配列に格納す る。偶数の合計と奇数の合計を計算するプログラムを作成せよ。
[練習 2]
数字を大きい、あるいは小さい順に並べることをソーティングと言 う。最も簡単な単純挿入法のプログラムを作成する。有名なC言語の 本「NUMERICAL RECIPES in C」によると、これは経験を積んだトラ ンプ師が使う方法と同じであるということである。順序がバラバラ のトランプを並び替える場合、
  • まず、2枚目のカードを拾い、1枚目と順序関係が正しい位置 に置く。
  • 次に3枚目のカードを拾い、最初の2枚と順序関係の正しい位 置にそれを挿入する。
  • 同じことを繰り返す。即ち、$ i$枚目のカードを拾い、最初の $ i-1$枚のカードの順序関係の正しい位置にそれを挿入する。
  •  最後のカードを正しい位置に挿入したら、並び替えは完了である。
この単純挿入法を用いて、リスト1で作成さ れた整数の配列a[0]〜a[1023]に格納されている整数を小さい 順に並び替えよ。すなわち、a[0]が最小で、a[1023]が最 大である。ヒント、単純挿入法のアルゴリズムを図 1に、乱数を作成するプログラムをリス ト1に示す。すなわち、このリストの19行目 以降に単純挿入法と、a[0]〜a[1023]の値をディスプレイに出 力するプログラムを書く。
図 1: 単純挿入法のフローチャート。ndataはデータ数で、a[0]〜 a[nadata-1]の配列に格納されている整数を小さい順(昇順)に並べる。
\includegraphics[keepaspectratio, scale=1.0]{figure/flow_simple_sort.eps}

   1 #include <stdio.h>
   2 #include <stdlib.h>    /* 乱数発生のため      */
   3 #include <time.h>      /* 時刻の関数を使うため */
   4 
   5 int main(void){
   6   int a[1024], i, j, ndata, test;
   7 
   8   ndata=1024;
   9 
  10   srand((unsigned int)time(NULL));    /* 起動毎に異なる乱数を発生させるため */
  11 
  12   for(i=0; i<ndata; i++){
  13     a[i]=rand();                      /* 配列a[i]に乱数の整数を設定 */
  14   }
  15 
  16 
  17 
  18   /*  これ以降に単純ソートと昇順に並んだ出力のプログラムを書く */
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27   return 0;
  28 }

2.4 ファイル入出力

[練習 1]
ファイルに、0〜360度の三角関数の値を書き込むプログラムを作成 する。ファイルの各行には、角度$ \theta$[deg]と $ \sin\theta$ $ \cos\theta$, $ \tan\theta$の値をタブ区切りで書くものとする。数 学関数を使う場合の注意は、基本プログラムの[練 習 7]の通りである。
[練習 2]
前問で作成したファイルを読み込み、ディスプレイに表示するプロ グラムを作成せよ。

2.5 文字処理

[練習 1]
キーボードから32文字以内のアルファベットを入力する。入力し た順序と逆にディスプレイに表示するプログラムを作成せよ。

2.6 関数

[練習 1]
三辺の長さ$ (a, b, c)$をキーボードから入力して、面積を求めるプ ログラムを作成する。面積を求める部分は、以下のような関数にする こと。
  • 関数の引数は三辺の長さとし、戻り値を面積とする。
  • 関数は、最初に引数のチェックをする。それは、「三角形の二 辺の和は他の一辺よりも長い」ということを確認する。もしこれ に反するならば、三角形の面積として、-999の値を返す。
  • 三角形の面積は、ヘロンの公式

    $\displaystyle S=\sqrt{s(s-a)(s-b)(s-c)}$    

    を使い求めること。ただし、

    $\displaystyle s=\frac{a+b+c}{2}$    

    である。
ヒント C言語で$ \sqrt{a}$を計算する場合、数学関数の sqrt(a)を使う。数学関数を使う場合の注意は、基本プログラム の[練習 7]の通りである。

2.7 構造体

[練習 1]
以下のような50人分の成績のファイルがある。ファイルの各行には、名字、 名前、英語、数学、情報処理の成績が書かれている。
Koizumi Junichiro 87 43 21
Yamamoto Masashi 42 25 91
Hamasaki Ayumi 23 92 41
Kimura Takuya 21 34 45
Shimada Masahiko 78 63 46
残り45人分
これらを構造体を使って管理し、平均点の高い順に学生の情報をディ スプレイに表示する。表示する情報は、順位、平均点、名字、名前、 英語、数学、情報処理の成績とする。

2.8 ポインター

[練習 1]
整数型の変数、a, b, cに入っている整数を、 a $ \rightarrow$bb $ \rightarrow$cc $ \rightarrow$aと入れ替えるプログラムを作成せよ。た だし、入れ替える部分は関数とすること。
[練習 2]
要素数が100$ \times$100の2次元配列にa[i][j]=i*i+jの値を代 入する。そして、a[i][j]a[j][i]と入れ替える 3プログラムを作成せよ。ただし、入れ 替える部分は関数とすること。

2.9 課題提出要領

提出方法は、次の通りとする。
期限 8月25日(木) AM 8:50
用紙 A4
提出場所 山本研究室の入口のポスト
表紙 表紙を1枚つけて、以下の項目を分かりやすく記述すること。
          授業科目名「情報工学」
          課題名「課題 夏休みの宿題」
          2E    学籍番号    氏名
          提出日
内容 ソースプログラム(プリントアウトでも、手書きでもOKとする)

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成17年9月22日


no counter