第14回:復習

 今週は,1年間かけて学習してきたC言語によるプログラミングの総復習を行います.


前期に学習した内容をまとめると

これらについて,復習をかねて,もう一度前期の期末試験の問題を,何も見ないで解いてみよう.


後期に学習した内容をまとめると

年末に行った,演習を,しっかり復習しよう.


期末試験について

時間割

1月31日(月) 3時限 2003教室

持ち込みは,一切できません

試験範囲は,前後期合わせて情報処理・演習で取り上げた内容すべてです.

これまで演習で作ったプログラムをよく復習しておいてください.


【第11回 演習】

偏差値を求めるプログラム

#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);  


【第12回 演習】

問題1

(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)の二つの方法の違いについて説明しなさい.

値渡し と アドレス渡し

問題2

あるクラスの生徒の身長(整数に四捨五入されている)が番号順に1番から50番まで並んだファイルheight.txtがある(人数は50人だとわかっているとする).

(1) height.txtファイルの内容を配列に読み込む関数yomikomiを作成せよ.関数への引数は,データの数nと,データを読み込む配列point[]のアドレスとする.

(2) 読み込んだデータを利用して,キーボードから番号を入力するとその番号の生徒の身長を表示するプログラムを作成しなさい.

height.txt の中身

175    ←1番目の生徒の身長
163    ←2番目の生徒の身長
171

アドバンスド問題

問題2で,読み込んだデータを成績の良い順に並べ替えるプログラムを作成しなさい.


【第13回 演習】

以前,作成した,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)まで,きてください.