[[Members Only]]

&size(30){C言語 ゼミ演習課題};

#contents

*【重要】課題の趣旨 [#m19aa550]
みなさんが自分自身でプログラムを作成できるようになるために,
-実現すべき処理手順を自分で考えられるようになる
-実現すべき処理手順を自分で実装できるようになる

ことを目標としています.

したがって,今ある知識だけで実現できる課題ばかりではないかもしれません.
それでも,「できる範囲で頑張ってみてね」という趣旨のものではありません.
足りない知識やスキルを補って「必ず実現して提出してね」という趣旨です.
したがって,「知らなかったのでできなかった」は理由になりません.

できなかったときには
-どこまでできているのか
-何ができなかったのか
-出来なかったことに対してどのように対処しようとしたのか
-その対処の結果

について書いて提出してください.

//*第1回 課題 (締め切り:4/11 13:00まで) [#oaae6e28]
*課題1 [#oaae6e28]

+小数点以下第一位までの値を入力し、小数点以下を四捨五入して整数にした値を表示するプログラムを作成せよ。&br;
例1: 1.5→2、 例2: 2.3→2、 例3: 4.9→5  
+西暦を入力し、昭和または平成の年号に変換するプログラムを作成せよ。 
+アルファベットで文字列を入力し,小文字ならば大文字に,大文字ならば小文字に変換して表示するプログラムを作成せよ。
+西暦で年を入力し、その年までに含まれるうるう年を表示するプログラムを作成せよ。 
+以下の数値はテストの点数を表す。この点数をA、B、C、D、Eで判定し、それぞれの人数を数えたい。各グレードと人数を表示するプログラムを作成せよ。(例:A:4人 B:3人…)&br; 
ただしA〜Eの点数の範囲は A:100〜90点,B:89〜80点,C:79〜70点,D:69〜60点,E:59点以下 とする.
 30, 49, 53, 60, 64, 69, 71, 78, 83, 88, 89, 91, 98
+ 上記の問題でカウントした人数を*印でグラフ化して表示したい.
++ 縦軸をグレード(A〜E),横軸を人数として人数をグラフで表せ.
++ 縦軸を人数,横軸をグレード(A〜E)として人数をグラフで表せ.&br;
 例(3. iiの例):
 例(3. iiの例):
         *         *    *     
    *    *    *    *    *      
    *    *    *    *    *      
 ---------------------------
    A    B    C    D    E  
+ キーボードから10個の整数を入力し、1が入力されたとき降順に、2が入力されたとき昇順に並び変えるプログラムを作成せよ。
+ キーボードから-1が入力されるまで整数を入力し、1が入力されたとき降順に、2が入力されたとき昇順に並び変えるプログラムを作成せよ。
+ キーボードから初期値と最終値を入力し、その間に含まれる整数の合計と平均、および素数を求めるプログラムを作成せよ。


//*第2回 課題 (締め切り:4/17 13:00まで) [#z6d7b959]
*課題2 [#z6d7b959]

+ キーボードから10個の整数を入力し、"TOP"と入力された場合は降順に、"BOTTOM"と入力された場合は昇順に並び変えるプログラムを作成せよ。
--文字列の比較を行ってください.文字列の比較を行う関数がC言語標準関数にありますので,各自調べて使用すること.
+ キーボードから整数を入力する。"end"と入力されたらキーボードからの入力を終了し、"TOP"と入力されたら降順に、"BOTTOM"と入力されたら昇順に並び変えるプログラムを作成せよ。昇順または降順の並べ替え結果に加えて,中央値を求めて表示すること.
--文字列の比較を行う関数があります.各自調べること
+y(t) = exp(-at) のa(a>0)の値を変えたときの出力y(t)をファイルに書き出すプログラムを作成し,出力されたファイルをgnuplotで表示して,aをいろいろ変化させて,aによるy(t)への影響を調べる。また変数tも,t = 0.1, t = 0.01としてy(t)の違いを比較してみよう。
-- ファイルの書き出しは各自で調べること
-- gnuplotの使い方も各自で調べ,分からなければ院生,新妻に聞くこと
+ じゃんけんを行うプログラムを作成せよ。じゃんけんの勝敗に関しては以下のルールに従うこと.
--じゃんけんは3回勝負とし,3回勝負後,勝った回数の多いプレイヤーを最終的な勝者とする.
--引き分けの場合も1回の勝負として数える.
--勝ち数が同じ場合は引き分けとする.&br;&br;
以下の要件を満足するプログラムにすること.
++ プレイヤーは2人(1人は人間,1人はコンピュータとする)
++ コンピュータの手は乱数を用いて決定すること(乱数の使い方は各自調べること)
++ 1回ごとに勝者を判定し,結果を表示すること
++ 最終的な勝者を判定し,結果を表示すること
++ 勝敗判定は&color(red,){「if文は2つ以下,さらにそこで使用される条件は合計3つ以下」};で行うこと
++ 2人のプレイヤーの区別と手の選択は多次元配列を用いて実装すること.~
たとえば,int player[プレイヤー数][じゃんけんの手の数]として定義して,手の種類は0:グー,1:チョキ,2:パーのように表現して,その配列の中身の値で各手の選択状態(0なら選択されていない,1なら選択されている)を表すことを考えればよい.「プレイヤー0がチョキを選択している」ということを表現したければ,player[0][1]=1; とすればよいことになる.
+魔方陣を作成するプログラムを作成せよ.魔方陣とは,N行N列のますめに,1からN*Nまでの自然数を配置して,各行,各列,各対角線の和がどれも等しくなるものである.ただし,Nは自然数(自然数というのは非負整数).
++ 3行3列のますめに,1から9までの自然数を配置して魔方陣を作るには,各ますめにどのような数を割り振ればよいかをプログラムで求めよう.魔方陣となる配置パターンの数とすべての配置例を表示せよ.
 表示例:
  6 1 8 
  7 5 3 
  2 9 4 
++ 3行3列のますめに,1から51までの自然数を配置して魔方陣を作りたい。各行,各列,各対角線の和が最も大きくなるときの配置例を示せ。
//++ 5行5列のますめに,1から25までの自然数を配置して魔方陣を作りたい。魔方陣となる数字の配置


//*第3回 課題 (締め切り:4/24 13:00まで) [#r3b5e13d]
*課題3 [#r3b5e13d]

+ じゃんけんプログラムを構造体を使って実装せよ.
++ 構造体には次の項目を含むこと
+++ ユーザ名,選択した手,勝敗数,勝率
+++ 毎回の勝敗に加え,3回勝負後に,勝敗数及び勝率を表示せよ
++ ただし,第2回の課題で行ったように,すべての場合を比較することなく,勝敗判定を行うこと.
+ 次のファイルを読み込み,データ解析を行え.
++ 読み込むファイルはこちら &ref(resultTest.dat);
++ ファイルは次のデータを有している
+++ 1列目:学生名
+++2列目から6列目:英語,数学,力学,材料工学,制御工学 
++ 各人の平均値を求めよ
+++各人の氏名及び平均点を表示せよ
++ 各科目の平均値,及び分散を求め,科目名及び平均値,分散を表記せよ.さらにデータに対する考察を行え.
++ 平均値は折れ線グラフで表し,各点数における分散値をグラフ内に書き込め~
グラフへの数値の書き込みは無理してgnuplotで行う必要はない.PPTでも何でも
,使えるツールを使ってよい.
++ただし,構造体を用いて実装せよ.構造体の構成はプログラムの効率を考えて,自由に設計してよい.
++ 同時に,データ数が変わってもプログラムに変更を加えることなく対応できるように実装せよ.
+標準入力から,カンマ区切りの文字列を入力したとする.
++読み取った文字列をカンマ区切りでカウントし,その文字列数を表示せよ.
+++ 例:human, systems, interaction ⇒ 3
++ 人が文字列数のうち任意の番号を指定したとき,その文字列を表示せよ.
+++ 例;human, systems, laboratory ⇒ 2 ⇒ systems
+ 人とコンピュータ対決のマルバツゲームを作れ
++ 3×3マスのとき,人は選択したいマスを座標を使って指定する(例:0,0 1,0など)
++ コンピュータの位置の選択はrandをつかって行え
++ 1手ごとに状況を表示せよ.この表示は関数を用いて実装せよ.
++ 先攻,後攻は適当に決めてよい
++ 勝敗(または引き分け)が決まった段階でプログラムを終了せよ

//*第4回 課題 (締め切り:5/1 13:00まで) [#d71f2bf1]
*課題4 [#d71f2bf1]

+図に示すような,箱とばね,ダンパで構成されるシステムがある.
箱の質量をm [kg], 減衰係数をc [Ns/m],ばね定数をk [kg/s^2]とする.~
&ref(kadai4-2orders.png);~
外部から働く力u(t)=0のとき,図中にある運動方程式が成り立つ.~
図の箱を右方向にひっぱり,位置 x = x0 で止め,止まった後にそっと手を離した(x(0) = x0, x'(0) = 0という意味.ただしx'はxの一階微分を表す).このときの箱の動きの時間的変化(時間応答,解軌跡ともいう)を調べ,グラフで表せ.
++ 微分方程式を解析的に解いたときのグラフを示せ(ただし,特性方程式の根が実数根をもつとき,虚数根をもつとき,重根をもつとき,となるようにm, c, kの係数を適当に決めて,それぞれの場合における解軌跡を示すこと)
++ 【チャレンジ問題】微分方程式を数値的に(例えばルンゲクッタ法などを用いて)解いて,上の1-i の解軌跡と比較してみよう
+ 次に示す関数を数値積分したい~
&ref(kadai4_daikei12.png);~
数値積分を行うには「台形公式」という方法がある.台形公式は,区間[a, b]をn等分して,その分点 x0 (=a), x1, x2, ... , xn (=b)とすると,関数f(x)の積分を次式により近似的に得るものである.
&ref(kadai4_daikei23.png);
++ 分割数 n を 5, 10, 100の場合で計算を行い,演算結果を比較せよ
++ 台形公式以外の数値積分法を自分で探し,上のi の結果と比較して示せ 
+ チェスのクイーンのコマは,縦,横,斜めの方向に盤の上なら
どこまででも自由に動くことができる.(将棋でいう,飛車と角の両方の性質を持つ)~
いま,4×4のマス目にクイーンを4個,置いてもらいたい.
ただし,お互いの動く道筋をふさがないような配置をしてほしい.
++ 人が座標を使って駒を置く4か所を指定する.その配置が条件を満足するかどうかをプログラムで判定し,結果を表示するプログラムを作成せよ.
++ 人が座標を使って駒を置く場所を指定するごとに配置状況を判定し,条件を満足していればそのまま盤と駒を表示し,条件を満足しない場合は,どの駒とどの駒が条件を満足していないかを盤上で区別して表示するプログラムを作成せよ.
++ プログラムが4箇所の配置位置を決定し,条件を満足する配置例を表示するプログラムを表示せよ.

//*第5回 課題 (締め切り:5/8 13:00まで) [#yf881ed1]
*課題5 [#yf881ed1]

+スレッドを用いて以下の要件を満たすプログラムを作成せよ.
++標準入力で浮動小数点型の数値を入力する.
++入力した数値に0.1ずつ足してその値を標準出力する.
++標準出力はmain文,計算はスレッド内で行うこと.
++動作中に標準入力で特定の値または文字が入力されたときにプログラムが終了するようにすること.
++sleep関数を用いて実装すること.
+TCP/IPを用いて以下の要件を満たすプログラムを作成せよ.
++サーバ側,クライアント側のプログラムを作成する.
++クライアント側のプログラムは,文字列を標準入力して送信
++送信する文字列はカンマ区切りでいくつかの単語を送信
++サーバ側のプログラムは,クライアント側から文字列を受信し,標準出力
++出力するのは単語数と,単語を出力


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS