情報基礎A-2 「Cプログラミング」総合演習
参考情報
2017年度 レポート課題(アカデミックスキルII)
課題1から5については全員、以下に指定したファイル名で成果物を提出すること。
課題6はボーナス課題である。 提出内容に応じて、他と合わせて満点(100点)を超えない範囲での加点を行なう。 ボーナス課題については、提出は任意で、真面目に取り組んでいると判断される限り、内容に間違いや不具合があっても減点は行わない。
各課題の提出ファイルは以下のとおり(課題6はボーナス課題):
- 基本課題1【必須】 プログラム
check-order-3.c
- 基本課題2【必須】 プログラム
sort-3-num.c
- 基本課題3【必須】 プログラム
sort-data.c
- 基本課題4【必須】 プログラム
mean-and-median.c
- 基本課題5【必須】 プログラム
instant-stat.c
- 発展課題6【オプション】 レベル1: プログラム
global-temp-1.c
, レベル2:プログラムglobal-temp-2.c
のいずれか一方
レポートについての連絡事項
課題内容に訂正等が生じる場合がありますので、提出前に、必ず以下を確認してください:
全体に渡っての要件・注意
- 他人(クラスメイト、ウェブ、書籍等、一切)のプログラムや提出物の一部、または全部をコピーした場合は0点(この科目は不合格)とする。
- プログラムは適切に字下げをして、見やすく記述すること。「見にくい」と判断される場合は減点する。
- 同じ結果を与えるプログラムであっても、アルゴリズムやコーディングの上での工夫に応じて配点が異なる場合がある。 また、明らかに無駄・不必要な処理、変数の未使用、等は減点の対象となる場合がある。
- 課題毎の要件や指示にも留意すること。
- 課題毎に指定されたファイル名で提出すること。提出にはISTUを使うこと(情報基礎A-2 / 科目共通教材 / 最終課題)。 メール等での提出、〆切を過ぎてからの問い合わせは一切受け付けない。提出期限は2017年8月9日(水)深夜23時59分。〆切厳守。
- プログラムは、必ず動作確認をしてから提出すること。最終的にプログラムが正しく動作するところまでこぎ着けなかった場合でも、プログラム中にそのことをコメントして、 作成途中のプログラムを提出すること。
- Cプログラムについては、以下のひな形を参考に、コメント欄に氏名と学籍番号を明記すること。記入の無い場合は減点する。
課題プログラムのひな形
/* 情報基礎A-2 課題X 学籍番号:B7XB1234 氏名:東北太郎 */ #include <stdio.h> #include <math.h> main() { /* 必要な変数の宣言 */ /* 各自のプログラムを記述 */ } |
1. 基本課題
以下に示す問題1〜5のプログラムを作成し、実行せよ。レポートには、設問ごとに、作成したCのソースプログラムを提出すること。
課題1:数値の順序の判定(10点)
キーボードから3つの整数を入力する($a, b, c$の順に入力したとする)と、
$a \le b \le c$の場合は「昇順」、$a \ge b \ge c$の場合には「降順」、それ以外の場合は「整列していない」、
と出力するプログラム: check-order-3.c
を作成せよ (ただし、$a = b = c$の場合は「昇順」と見做す)。
動作の例
3つの整数を入力: 3 2 2 降順
課題2:3つの数値の整列(15点)
キーボードから3つの整数を入力すると、
それを小さいものから順に出力するプログラム: sort-3-num.c
を作成せよ。
動作の例
3つの整数を入力: 4 2 7 2 4 7
課題3:数値データの整列(20点)
キーボードから整数値を入力すると、それを小さい順に整列(ソート)して出力するプログラム: sort-data.c
を作成せよ。
入力は、最初にデータの件数(最大で100件とする)を入力し、その後、各データが続くと仮定せよ。 入出力は以下の例に倣うこと。 100を超える件数を入力すると「100以下の件数を入力してください」と出力して、停止するように設計すること。
動作の例
件数: 5 1番目のデータ: 4 2番目のデータ: 3 3番目のデータ: 9 4番目のデータ: 1 5番目のデータ: 8 5件のデータを昇順に整列: 1 3 4 8 9
ヒント
データの整列については、こちらのページを参照のこと
課題4:データの平均と中央値(20点)
キーボードから整数値を入力すると、その平均値と中央値を実数で出力するプログラム: mean-and-median.c
を作成せよ。
最初にデータの件数(最大で100件とする)を入力し、その後、各データが続くと仮定せよ。 入出力は以下の例に倣うこと。 100を超える件数を入力すると「100以下の件数を入力してください」と出力して、停止するように設計すること。
動作の例
件数: 5 1番目のデータ: 4 2番目のデータ: 3 3番目のデータ: 9 4番目のデータ: 1 5番目のデータ: 8 平均値= 5.00000 中央値= 4.00000
課題5:データの中央値と平均の逐次計算 (35点)
キーボードから整数値を入力すると、それまで入力した分のデータについて、平均値と中央値を逐次的に計算し表示するプログラム: instant-stat.c
を作成せよ。
ただし、データの件数は最大100で、それを超えると「最大件数を超えました」と出力して、停止するように設計すること。
また、データ入力の都度、すでに変数に保持されているデータを利用しながら、効率的に計算が進むようにアルゴリズムを工夫すること。
動作の例
1番目のデータ: 4 平均値= 4.00000 中央値= 4.00000 2番目のデータ: 3 平均値= 3.50000 中央値= 3.50000 3番目のデータ: 9 平均値= 5.33333 中央値= 4.00000 4番目のデータ: 1 平均値= 4.25000 中央値= 3.50000 ...
2. 発展課題(オプション)
課題6:データの回帰直線の計算
以下のグラフは、University of East Angliaのグループが公開しているデータを元に、 1850年から2016年までの地球上の気温の変動(単位は度C)を縦軸に、西暦年を横軸にプロットしたものである。
図
この課題は、興味や技量に応じて、以下の2つのレベルのうちからひとつを選択すること(提出ファイルは1つ)。
課題6・レベル1(最大+20点)
時間軸(西暦年)を $x$ とし、気温の変動(度)を変量 $y$ とするとき、最小二乗法でデータの直線回帰 $y = a x + b$ のパラメータ $a, b$ を計算し、
それらの値を出力するCプログラム: global-temp-1.c
を作成せよ。
各データ点の値を以下の「ひな形」のコード中にCの配列として与えたので、それをそのまま用いること。 上図の直線(黄色)は、回帰直線を求め、プロットしたものである。
課題6・レベル2(最大+30点)
課題6の1のプログラムを拡張し、1850から2016年の間の西暦年を2つ入力すると、その期間のデータについて
回帰直線のパラメータを計算し、$a, b$ を出力するプログラム: global-temp-2.c
を作成せよ。
ヒント
最小二乗法による回帰直線の求め方については、こちらのページを参照のこと。
課題6のひな形(配列データを含む)
/* 情報基礎A-2 課題6(レベル 1/2) 学籍番号:B7XB1234 氏名:東北太郎 */ #include <stdio.h> #include <math.h> /* global mean temperature anomaly from year 1850 to 2016 */ float year_vs_temp[][2]={ {1850,-0.374},{1851,-0.221},{1852,-0.224},{1853,-0.269},{1854,-0.251}, {1855,-0.273},{1856,-0.353},{1857,-0.460},{1858,-0.466},{1859,-0.287}, {1860,-0.349},{1861,-0.413},{1862,-0.526},{1863,-0.281},{1864,-0.494}, {1865,-0.274},{1866,-0.249},{1867,-0.322},{1868,-0.234},{1869,-0.267}, {1870,-0.278},{1871,-0.334},{1872,-0.230},{1873,-0.304},{1874,-0.375}, {1875,-0.397},{1876,-0.382},{1877,-0.076},{1878,0.036},{1879,-0.232}, {1880,-0.229},{1881,-0.207},{1882,-0.214},{1883,-0.298},{1884,-0.411}, {1885,-0.390},{1886,-0.368},{1887,-0.422},{1888,-0.312},{1889,-0.173}, {1890,-0.417},{1891,-0.335},{1892,-0.456},{1893,-0.473},{1894,-0.405}, {1895,-0.390},{1896,-0.184},{1897,-0.208},{1898,-0.413},{1899,-0.289}, {1900,-0.198},{1901,-0.261},{1902,-0.404},{1903,-0.482},{1904,-0.519}, {1905,-0.377},{1906,-0.284},{1907,-0.466},{1908,-0.511},{1909,-0.523}, {1910,-0.491},{1911,-0.543},{1912,-0.437},{1913,-0.425},{1914,-0.245}, {1915,-0.147},{1916,-0.382},{1917,-0.463},{1918,-0.331},{1919,-0.272}, {1920,-0.241},{1921,-0.187},{1922,-0.301},{1923,-0.272},{1924,-0.292}, {1925,-0.214},{1926,-0.105},{1927,-0.208},{1928,-0.206},{1929,-0.348}, {1930,-0.134},{1931,-0.083},{1932,-0.134},{1933,-0.267},{1934,-0.127}, {1935,-0.172},{1936,-0.140},{1937,-0.022},{1938,-0.003},{1939,-0.047}, {1940,0.018},{1941,0.020},{1942,-0.024},{1943,-0.000},{1944,0.149}, {1945,0.027},{1946,-0.072},{1947,-0.038},{1948,-0.037},{1949,-0.072}, {1950,-0.172},{1951,-0.051},{1952,0.031},{1953,0.097},{1954,-0.129}, {1955,-0.190},{1956,-0.266},{1957,-0.004},{1958,0.046},{1959,0.017}, {1960,-0.049},{1961,0.040},{1962,0.016},{1963,0.049},{1964,-0.223}, {1965,-0.140},{1966,-0.069},{1967,-0.074},{1968,-0.112},{1969,0.031}, {1970,-0.027},{1971,-0.187},{1972,-0.067},{1973,0.062},{1974,-0.213}, {1975,-0.147},{1976,-0.240},{1977,0.046},{1978,-0.063},{1979,0.058}, {1980,0.093},{1981,0.140},{1982,0.011},{1983,0.193},{1984,-0.013}, {1985,-0.030},{1986,0.046},{1987,0.191},{1988,0.199},{1989,0.118}, {1990,0.296},{1991,0.254},{1992,0.103},{1993,0.145},{1994,0.206}, {1995,0.321},{1996,0.180},{1997,0.389},{1998,0.536},{1999,0.306}, {2000,0.293},{2001,0.439},{2002,0.497},{2003,0.508},{2004,0.448}, {2005,0.544},{2006,0.505},{2007,0.492},{2008,0.394},{2009,0.506}, {2010,0.556},{2011,0.421},{2012,0.469},{2013,0.512},{2014,0.575}, {2015,0.760},{2016,0.773} } ; main(){ float a,b ; float e_x, e_y, e_xx, e_xy ; int i ; int n=2016-1850+1 ; ?????? ?????? printf("a= %f [deg/year]\n",a) ; printf("b= %f [deg]\n",b) ; }