情報基礎A-2 「Cプログラミング」総合演習

参考情報

2017年度 レポート課題(アカデミックスキルII)

課題1から5については全員、以下に指定したファイル名で成果物を提出すること。

課題6はボーナス課題である。 提出内容に応じて、他と合わせて満点(100点)を超えない範囲での加点を行なう。 ボーナス課題については、提出は任意で、真面目に取り組んでいると判断される限り、内容に間違いや不具合があっても減点は行わない。

各課題の提出ファイルは以下のとおり(課題6はボーナス課題):

レポートについての連絡事項

課題内容に訂正等が生じる場合がありますので、提出前に、必ず以下を確認してください:

全体に渡っての要件・注意

課題プログラムのひな形

/* 情報基礎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
icon-hintヒント

データの整列については、こちらのページを参照のこと

課題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)を縦軸に、西暦年を横軸にプロットしたものである。

plot-year-vs-temp

この課題は、興味や技量に応じて、以下の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 を作成せよ。

icon-hint ヒント

最小二乗法による回帰直線の求め方については、こちらのページを参照のこと。

課題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) ;
}