- 第1項:基本知識
- 第2項:プログラム読取
- 第3項:プログラム書取
- 第4項:記述式
- 第5項:基本知識(解答例)
- 第6項:プログラム読取(解答例)
- 第7項:プログラム書取(解答例)
- 第8項:記述式(解答例)
[ 1-1 ]
プログラムの実行中に自由に作ることができる配列をなんと呼ぶか。
解答例
[ 1-2 ]
長期的に使用され、サイズの大きなメモリ領域のことをなんと呼ぶか。
解答例
[ 2-1 ]
次のプログラムには移植する上で問題点がある。
それはどのような問題なのか簡潔に説明せよ。
#include <stdio.h> #include <stdlib.h> int main() { int i; int *data; data = (int *)malloc(sizeof(int) * 10); return 0; }
解答例
[ 3-1 ]
練習問題16の、
「3人分の、名前、年齢、性別、を入力して表示するプログラムを作りなさい。
ただし、データは構造体で記憶することとし、
また、データの入力と表示はそれぞれ専用の関数を作って行うこととする。」
という問題を元に、何人分でも入力できるように改造しなさい。
なお、年齢に-1が入力されれば入力終了とする。
※配列番号がint型なのでint型の最大値まで扱えれば良い。
解答例
[ 4-1 ]
配列を使えばデータの格納はできるのに、
あえて動的配列を使うのは何故か簡潔に説明せよ。
[ 1-1 ]
動的配列
問題
[ 1-2 ]
ヒープ
問題
[ 2-1 ]
動的配列を解放していないため、
メモリ領域が無駄に残る可能性がある。
問題
[ 3-1 ]
※InputPeopleとShowPeople関数は変更していませんが、#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { char name[256]; int age; int sex; } People; void InputPeople(People *data); void ShowPeople(People data); int main(void) { int i,count,datasize; People *data; datasize = 10; data = (People*)malloc(sizeof(People) * datasize); count = 0; while (1) { InputPeople(&data[count]); if (data[count].age == -1) break; count++; if (count >= datasize) { datasize += 10; data = (People*)realloc(data,sizeof(People) * datasize); } } for (i = 0;i < count;i++) { ShowPeople(data[i]); } free(data); return 0; } void InputPeople(People *data) { printf("名前:"); scanf("%s",data->name); printf("年齢:"); scanf("%d",&data->age); printf("性別(1-男性、2-女性):"); scanf("%d",&data->sex); printf("\n"); } void ShowPeople(People data) { char sex[16]; printf("名前:%s\n",data.name); printf("年齢:%d\n",data.age); if (data.sex == 1) { strcpy(sex,"男性"); } else { strcpy(sex,"女性"); } printf("性別:%s\n",sex); printf("\n"); }
InputPeople関数を変更すれば入力しやすくできます。
※realloc関数の呼び出しを減らすために10ずつ増やしています。
※free関数を呼び出していない場合は大幅減点です。
問題
[ 4-1 ]
要素数をプログラム実行中に自由に決められるため、
メモリを効率よく扱えるから。