今週は,1年間かけて学習してきたC言語によるプログラミングの総復習を行います.
これらについて,復習をかねて,もう一度前期の期末試験の問題を,何も見ないで解いてみよう.
年末に行った,演習を,しっかり復習しよう.
1月31日(月) 3時限 2003教室
持ち込みは,一切できません.
試験範囲は,前後期合わせて情報処理・演習で取り上げた内容すべてです.
これまで演習で作ったプログラムをよく復習しておいてください.
#include <stdio.h> #include <math.h> void main() { int i; int data[100]; float sum, sum2, ave, sigma; FILE *fp; fp = fopen("testdata.txt", "r"); if(fp == NULL) return; sum = 0; sum2 = 0; for(i = 0; i<100; i++){ fscanf(fp, "%d", &(data[i])); sum += data[i]; sum2 += data[i] * data[i]; } fclose(fp); ave = sum / 100.0; sigma = sqrt((100*sum2 - (sum*sum))/100/(100-1)); printf("平均値=%f\n", ave); printf("標準偏差=%f\n", sigma); for(i =0; i<100; i++){ printf("%d, %f\n", i, (data[i] - ave)/sigma*10+50; } }
#include <stdio.h> #include <math.h> void swap(float *a, float *b) { float t; t = *a; *a = *b; *b = t; } void sort(int n, float *s) { int i, j; for(i=0; i < n-1; i++){ for(j=i+1; j < n; j++){ if(s[i] > s[j]){ swap(&(s[i]), &(s[j])); } } } } void main() { int i, j; int data[100] float dev[100]; float sum, sum2, ave, sigma; FILE *fp; fp = fopen("testdata.txt", "r"); if(fp == NULL) return; sum = 0; sum2 = 0; for(i = 0; i<100; i++){ fscanf(fp, "%d", &(data[i])); sum += data[i]; sum2 += data[i] * data[i]; } fclose(fp); ave = sum / 100.0; sigma = sqrt((100*sum2 - (sum*sum))/100/(100-1)); printf("平均値=%f\n", ave); printf("標準偏差=%f\n", sigma); for(i =0; i<100; i++){ dev[i] = (data[i] - ave)/sigma*10+50; } sort(100, dev); for(i=0; i<100; i++){ printf("%d, %f\n", i, dev[i]); } }
この場合は,上のプログラムのうちファイルを読み込む部分を下のように変える.
void main() { int i, j, n; fp = fopen("testdata.txt", "r"); if(fp == NULL) return; for(i = 0; !(feof(fp)); i++){ fscanf(fp, "%d", &(data[i])); } n = i; fclose(fp);
(1) 一辺の長さを引数(int型)として渡し,立方体の体積を求めて返す(return文を使うこと)関数cubeと,この関数を用いて一辺の長さをキーボードから入力すると立方体の体積を表示するプログラムを作成しなさい.
#include <stdio.h>
int cube(int a) /* 関数の定義 */ { int v; v = a * a * a; return v; /* 結果を戻す */ } void main() { int a; printf("立方体の一辺の長さを入力してください:"); scanf("%d", &a); printf("立方体の体積は,%dです.", cube(a)); /* 関数を呼び出す */ }
(2) 半径(int型)を引数として渡し,円の面積と円周の長さを求めて返す関数circleと,この関数を用いて半径をキーボードから入力すると円の面積と円周の長さを表示するプログラムを作成しなさい.
#include <stdio.h> void circle(int r, float *s, float *l) /* 変数rの値と,変数s, lのアドレスを受け取る(ポインタ変数) */ { float pai = 3.1415; *s = r * r * pai; /* 円の面積を計算して変数sへ */ *l = 2 * r * pai; /* 円の円周 */ } void main() { int r; float s, l; printf("円の半径を入力してください:"); scanf("%d", &r); circle(r, &s, &l); printf("円の面積:%f\n", s); printf("円の円周:%f\n", l); }
(3) 関数への値の渡し方には二種類ある.(1),(2)の二つの方法の違いについて説明しなさい.
値渡し と アドレス渡し
あるクラスの生徒の身長(整数に四捨五入されている)が番号順に1番から50番まで並んだファイルheight.txtがある(人数は50人だとわかっているとする).
(1) height.txtファイルの内容を配列に読み込む関数yomikomiを作成せよ.関数への引数は,データの数nと,データを読み込む配列point[]のアドレスとする.
(2) 読み込んだデータを利用して,キーボードから番号を入力するとその番号の生徒の身長を表示するプログラムを作成しなさい.
height.txt の中身
175 ←1番目の生徒の身長
163 ←2番目の生徒の身長
171
…
問題2で,読み込んだデータを成績の良い順に並べ替えるプログラムを作成しなさい.
以前,作成した,sin, cos の値を計算して保存するプログラムの結果をファイルから読み込んで,
Y = sin(X),Y = cos(X),のグラフを表示するプログラムを作成してみよう.
#include <stdio.h> #include <math.h> #include "mogra.f" void main() { int x, y; g_int(640,480); for(x=0; x<640; x++){ y = 240 - 100 * sin(3.1415*x/320); pset(x, y, 0); } gend(); }
これをもとに,ファイルから配列へデータを読み込むようにする.
わからないことがあったら,研究室(4号館1階 4105B)まで,きてください.