次のコードは文字列src1をsrc2にコピーしてsrc2の中身を表示する事を意図したプログラムであるが、src2のメモリ領域が正しく確保されていないために正しく実行されない可能性がある。src2のメモリ領域をmallocまたはcalloc関数を用いて確保し、正しいプログラムを完成させよ。ただし、下記の条件を満たす事。今回の課題では「string.h」で宣言される関数を利用してよい。
メモリ領域をコード内で明示的に解放する事。
メモリ領域が確保されなかった時の例外処理もコードに含める事。
malloc(10);などのように、malloc(またはcalloc)関数の引数として直接数字を与えてはならない。
必要十分なメモリ領域のみを確保し、使用しないのに不要なメモリ領域を確保しない。
#include <stdio.h>
#include <string.h>
int main(void){
char *src1 = "Hello,world!";
char *src2;
strcpy(src2, src1);
printf("%s\n", src2);
return 0;
}
注: 文字列リテラルの大きさは、末尾のナル文字を含めた文字数である事に注意せよ。また、メモリ領域が確保されなかった時に文字列をコピーしたり、領域を解放したりするコードは適切なコードではない。
締切: 10/29 23:59
参考: 資料C「Cでメモリ管理」
次のコードは、動的に生成した整数にキーボード入力により得られた整数値を読み込む事を意図したプログラムであるが、致命的な間違いが含まれている。コードを修正してプログラムを完成させよ。
#include <stdio.h>
#include <string.h>
int main(void){
int *x;
x = calloc(1, sizeof(int));
if(x == NULL){
exit(1);
}else{
scanf("%d", &x);
printf("%d\n", *x);
free(x);
}
return 0;
}
締切: 10/29 23:59
参考: 資料C「Cでメモリ管理」
乱数を用いて数値計算を行う事で近似解を得る手法はモンテカルロ法と呼ばれる。モンテカルロ法の一例として、以下のようにして円周率の近似解を得る手法が知られている。
0~1までの実数値の範囲をとる乱数を2つ生成する。これを1つの点のx座標とy座標が得られたと考える。N個の点を生成した時に、各点と原点との距離を計算し距離が1以下になる点の数Xを数える。この時円の面積の計算方法を考えると、4X/Nが円周率の近似解となっている。
モンテカルロ法を用いて、円周率を近似するプログラムを作成せよ。ただし、実行する度に新たな近似値が得られるようにすること。(レポートとして提出する必要はないが、余裕がある場合にはNを変化させた場合に円周率の近似値がどのように変化するかを確認せよ。)
締切: 10/29 23:59
参考: 資料C「乱数」
0以上100未満の異なる乱数を5個得ることを意図して次のようなプログラムを書いたが、このままでは意図通りに動かない。なぜこのコードが適切に動作しないのか、またどの様にプログラムを変更すれば意図通りに動くのか説明せよ。レポートはテキストファイルとして作成すること。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(void){
int i;
for (i = 0; i < 5; i++){
srand((unsigned int)time(NULL));
printf("%d\n", rand()%100);
}
return 0;
}
注1: 本課題は短答問題ではなくレポート課題であり、内容を論理的に説明する必要がある。例年、用語のみを挙げて「⚪︎⚪︎のため」と一行のみ書いて提出する学生が多く存在するが、そのようなレポートは受理しない。
締切: 10/29 23:59
参考: 資料C「乱数」
1つの自然数Xをキーボード入力から読み取り、X以下の素数を(改行区切りで)全て列挙するプログラムを作成せよ。Xは2000以下として良い。
締切: 10/29 23:59
1つの自然数Xをキーボード入力から読み取る。Xの階乗を計算した時に、末尾に連続する0の数を表示するプログラムを作成せよ。ただしXがint型の範囲内であれば、大きな値の時でも正しく動作するようにすること。
締切: 10/29 23:59