2004 年度「計算機基礎論3B」 2004-12-17

発展問題

練習問題(補足)

次のプログラムは、関数 int swap(int x, int y) を書いて xy の値を入れかえようとしたものだが、 うまく働かない。なぜか?

#include <stdio.h>

int swap(int x, int y);

main() {
    int x, y;

    x = 1; y = 2;
    swap(x, y);
    printf("%d %d\n", x, y);
}


int swap(int x, int y) {
    int tmp;

    tmp = x; x = y; y = tmp;
}
なお、 今まで習った範囲の知識では二つの変数の値を入れかえる関数は書けない。 なぜか。少し考えてみよ。

課題2

適当な十進二桁の素数 p を一つ選び、 1 以上 p 未満の自然数 x に対し mod p での逆数を返す関数 int inv(int x) を書け。 すなわち、 積 xy が mod p で 1 になるような自然数 y を返す関数を書け。 y は 1 以上 p 未満に値をとるようにせよ。

main() もつけて提出すること。 main() をどんなふうに書くかは各自の判断に任せる。

提出方法などは課題1に準ずる。 ただし件名は「kadai02」 (←全て半角文字、アルファベットは小文字、途中にスペースをいれない) とすること。 締め切りは 2005 年 01 月 21 日(金)12 時 50 分。

来学期の「計算数学1」のための準備

関数 srand() は 0 以上 RAND_MAX 以下の整数 (int 型)に値をとる乱数を返す。 RAND_MAX の値は次のプログラムでわかる。

#include <stdio.h>
#include <stdlib.h> /* RAND_MAX */

int main() {
    printf("%d\n", RAND_MAX);

    return 0;
}

次のプログラムの末尾に関数 void print(void) を自分で書いてつけ加えよ。 ただし、この関数は、 配列に格納されている値をスペースで区切って一行に出力するものとする。 値は 0 以上 100 未満なので、 一桁のときも二桁分のスペースで出力されるようにせよ。 そのとき、十の位を 0 とするかスペースにするかは各自の判断にまかせる。 定数 N の値は、 Terminal を最大にしたうえでなるべく大きくしておくとよいだろう。

#include <stdio.h>
#include <stdlib.h> /* srand() */
#include <time.h>   /* time() */

#define N 20

void init(void);
void print(void);

int a[N];

int main() {
    init();
    print();

    return 0;
}


void init(void) {
    int i;

    srand((unsigned)time(NULL));    /* 現在時刻で乱数の種を初期化 */
    for (i = 0; i < N; i++) {
        a[i] = rand() % 100;
    }
    return;                         /* この return は普通は書かない */
}

/* ここに書き加える */

岩瀬順一