問 1 配列の宣言整数型配列 data1 にデータが初期設定されている この配列 data1 のデータを下図のように 整数型配列 data2 に代入しなさい また data2 の内容を printf( "data2[0] = %d\n", data2[0] ); printf( "data2[5] = %d\n", data2[5] ); を用いて出力しなさい 実行結果 data2[0] = 76 data2[1] = 11 data2[2] = 46 data2[3] = 18 data2[4] = 25 data2[5] = 3 1
問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a = 30000, b = 10000; long c; c = a + b; return 0; 問 3 ( 演算 ) 1 個 3000 円の品物 Aを 12 個と 1 個 5000 円の品物 Bを8 個購入したときの合計金額 および 品物 A を8 個と品物 Bを12 個購入したときの合計金額をもとめなさい また 計算結果は printf( " 結果 = %ld\n", 計算結果が格納されている変数 ); を用いてそれぞれ画面出力しなさい 実行結果 結果 = 76000 結果 = 84000 2
問 4 ( 配列 ) 整数型の配列 data1 に図 1のようにデータが初期設定されている また 浮動小数点型の配列 data2 に図 2のようにデータが初期設定されている これらの配列の中身を printf() 関数を用いて 実行結果のように画面表示せよ 実行結果 data1[0] = 1 data1[1] = 22 data1[2] = 333 data1[3] = 4444 data2[0] = 12.340 data2[1] = 0.002 data2[2] = 5678.120 data2[3] = 912.100 3
次のフローチャートに基づいてプログラムを作成しなさい 問 5 ( ループ処理 (for 文 )) 実行例 総和 =5050 4
問 6 ( ループ処理 (for 文ネスト )) 次のフローチャートに基づいてプログラムを作成しなさい 実行結果 * ** *** **** ***** ****** ******* ******** ********* ********** 5
問 7 ( ループ処理 (while 文 )) while 文を用いてプログラムを作成しなさい 実行結果 総和 = 5050 6
do~while 文を用いてプログラムを作成しなさい 問 8 ( ループ処理 (do~while 文 )) 今 data1 に 1000 という値が初期設定されている scanf 関数を用いて変数 data2 に整数値を入力し data1 から data2 を引きなさい この処理を data1 が 0 以下になるまで結果を確認しながら繰り返しなさい 実行結果 整数値を入力 500 data1 = 500 整数値を入力 300 data1 = 200 整数値を入力 250 data1 = -50 7
switch 文を用いてプログラムを作成しなさい 問 9 scanf 関数を用いて計算方法 ( + - * / ) と2 個の整数を入力し 計算方法によって 2 個の整数の計算を行いなさい ただし 除算を指定した場合には 0 で割り算をしないこと 実行例 計算方法の入力 ( + - * / )+ 整数値 1の入力 12 整数値 2の入力 22 kekka = 34 問 10 scanf 関数で 1~10 までの整数値を1 個入力し 入力した値により 以下の処理を行いなさい 入力した数字が 1 か 2 か 3 なら "1: one 2: two 3: three" と表示する 入力した数字が 4 か 5 か 6 なら "4: four 5: five 6: six" と表示する 入力した数字が 7 か 8 か 9 か 10 なら "7: seven 8: eight 9: nine 10: ten" と表示する それ以外なら "number input err" と表示する 実行例 input number( 1-10 ) 5 4:four 5:five 6:six 8
問 11 ( ループ処理 ( 応用 )) 次の仕様に従って プログラムを作成せよ 2つの整数の除算を行い 小数点以下 50 桁まで求めなさい ただし 計算途中で割り切れた場合は それ以後の小数点は求めません また 割る数に 0 が入力された場合は計算を行いません ( ナツメ社中山敬二著 はじめての C 言語 を参考にオリジナルに作り変えました ) ( 内容 ) 計算結果を格納する整数型配列を大きさ 51 で宣言する 整数値 ( a, b ) を入力する b に 0 が入力されたら そのまま処理を終了する ( コンピュータでは 0 で割るという処理はあってはならないもの ) 計算結果 [0] に a を b で割った結果を格納する 1 から 51 までループする a を b で割った余りが 0 ならループを終了する a に余り 10 を代入する 計算結果 [ ループ番目 ] に a を b で割った結果を格納する 計算結果を表示する 9
実行結果例 1( 小数部で割り切れる ) 整数値を 2 つ入力してください 5 4 5 / 4 = 1.25 実行結果例 2( 割り切れない ) 整数値を 2 つ入力してください 10 3 10 / 3 = 3.33333333333333333333333333333333333333333333333333 ( 小数点以下 50 桁 ) 実行結果例 3( 整数部で割り切れる ) 整数値を 2 つ入力してください 10 2 10 / 2 = 5. 実行結果例 4( b に 0 を入力 ) 整数値を 2 つ入力してください 10 0 処理終了 10
問 12 ( 配列 + 条件文応用 ) 次の仕様に従って 生徒の科目得点から平均点と評価を求め 実行結果のように画面表示するプログラムを作 成しなさい [ 仕様 ] 1. プログラムに組み込むデータについては 配列の初期値として与え 生徒番号は1 次元配列 科目点数は 2 次元配列で 次のとおりとすること 生徒番号国語数学理科社会 1001 85 74 63 90 1002 78 65 70 62 1003 89 92 88 76 1004 32 48 66 25 1005 92 76 81 98 2. 処理手順は 次のとおりとすること (1) 各人の4 科目の平均点を求めること (2) 4 段階の評価基準は 次のとおりとすること 平均点 評価 80 点以上 A 70 点以上 80 点未満 B 60 点以上 70 点未満 C 60 点未満 D 実行結果 番号国語数学理科社会 平均 評価 1001 85 74 63 90 78.00 B 1002 78 65 70 62 68.75 C 1003 89 92 88 76 86.25 A 1004 32 48 66 25 42.75 D 1005 92 76 81 98 86.75 A 11
問 13 ホ インタのホ インタ "Iizumi","Kanto","Kudo","Sato","Sugawara","Matuda","Wada" の 7 個の文字列の長さを求めて表示しなさい ただし ポインタのポインタを用いること 実行結果 6 : Iizumi 5 : Kanto 4 : Kudo 4 : Sato 8 : Sugawara 6 : Matuda 4 : Wada 12
問 14 ( 関数 ) 次のプログラムの空欄部を埋めて プログラムを完成させなさい /* 文字列を大文字に変換する関数 */ #include <stdio.h> #include <ctype.h> void oomoji( char *st ); int main( void ) { char str[3][10] = { "computer", "lsi-c", "ms-dos" ; int i; for ( i = 0; i < 3; i++ ) { oomoji( ); return 0; void oomoji( char *st ) { int i = 0; while(!= '\0' ) { = toupper( ); i++; printf( "%s\n", st ); 実行結果 COMPUTER LSI-C MS-DOS 13
問 15 ( コマンドライン引数 ) 次のプログラムの空欄部を埋めて プログラムを完成させなさい #include <stdio.h> #include <stdlib.h> int main( ) { int sum; if (!= 3 ) { /* 引数の個数をチェック */ puts( " 引数の個数が違います " ); return 0; /* エラーなら処理を打ち切り */ sum = atoi( ) + atoi( ); /* 文字列を数値にして合計をとる */ printf( " 合計 = %d\n", sum ); return 0; 実行例 ( 引数 :21 42 のとき ) 合計 = 63 14
問 16 ( 記憶クラスグローバル変数 ) 以下のプログラムはグローバル変数に定義され 初期化された 10 個の int 型データの合計 平均 分散 標準偏差を求めて表示するプログラムである このプログラムを以下のような関数を用いて書き換えよ return 型関数名引数機能 int get_goukei なし合計を求めて返却する double get_bunsan 平均値分散を求めて返却する なお n 件のデータの分散と標準偏差を求める式は以下である 分散 = { ( 要素 0 - 平均値 ) 2 + ( 要素 1 - 平均値 ) 2 + + ( 要素 n-2 - 平均値 ) 2 + ( 要素 n-1 - 平均値 ) 2 / n 標準偏差 = 分散 #include <stdio.h> #include <math.h> #define N 10 int data[n] = { 80, 76, 59, 87, 66, 54, 40, 78, 94, 61 ; int main( void ) { double heikin, bunsan = 0.0, hensa; int goukei = 0; int i; for ( i = 0; i < N; i++ ) { goukei = goukei + data[i]; heikin = ( double ) goukei / N; for ( i = 0; i < N; i++ ) { bunsan = bunsan + ( data[i] - heikin ) * ( data[i] - heikin ); bunsan = bunsan / N; hensa = sqrt( bunsan ); 15
printf( " 合計点 : %d\n", goukei ); printf( " 平均点 : %f\n", heikin ); printf( " 分散 : %f\n", bunsan ); printf( " 標準偏差 : %f\n", hensa ); return 0; 問 17 ( ビット演算 ) 任意の 2 つの unsigned int 型で表すことのできる整数値を入力し 論理積 (AND) 論理和(OR) 排他的論理和 (XOR) を求めて表示せよ ただし 表示はわかりやすいように 16 進数で行うこと 実行結果例 0~65535 の整数を2つ入力 65530 65535 65530(0xfffa) AND 65535(0xffff) = 0xfffa 65530(0xfffa) OR 65535(0xffff) = 0xffff 65530(0xfffa) XOR 65535(0xffff) = 0x5 16
問 18 ( シフト演算 ) 次の手順で Ctrl+Z (UNIX の環境では Ctrl+D ) が入力されるまで 任意の unsigned int 型で表すことのできる整数値を入力し そのビットパターンを表示するプログラムを作成しなさい (1) main() 関数で次の処理を行う CTRL+Z が入力されるまで 任意の unsigned int 型で表すことのできる 10 進整数を入力する 入力した整数を引数にして ビットパターン表示関数 bit_disp( ) を呼ぶ CTRL+Z が入力されたら プログラムを終了する (2) bit_disp() 関数で次の処理を行う ( 関数の仕様 ) 関数 I/F void bit_disp( unsigned int dt ); 入力 dt 任意の符号無し 10 進整数出力なし処理 unsigned int ビットサイズ分ループする 最上位ビットから順にビットパターン (0 or 1) を表示する 実行結果例 0~65535 の整数を入力 ( 終了条件 :Ctrl+Z) 0 0 ---> 0000000000000000 32767 0x7fff ---> 0111111111111111 65535 0xffff ---> 1111111111111111 ^Z 17
問 19 ( 構造体ホ インタ ) 次に示す生徒情報を構造体として作成し それぞれの科目の平均点を構造体のポインタを用いて求めなさい 生徒番号国語数学理科社会 1001 85 74 63 90 1002 78 65 70 62 1003 89 92 88 76 1004 32 48 66 25 1005 92 76 81 98-1 0 0 0 0 実行結果例 国語平均 = 75.20 数学平均 = 71.00 理科平均 = 73.60 社会平均 = 70.20 18
次の手順に従ってプログラムを作成せよ 問 20 ( アドレス渡し ) main() 関数の処理以下の 11 個の点数を配列として持つ 但し 最後の-1はストッパーとする この配列を 成績データ取得関数 にアドレス渡しする 成績データ取得関数 より 次の構造体を返却値にして 最高点 最低点 平均点を得る 最高点 最低点 平均点を表示する 成績データ取得関数の処理引数で渡された点数が -1 になるまでループし 最高点 最低点 合計点 点数総数を求める 合計点と点数総数から平均点を求める 最高点 最低点 平均点を上記 1.3 と同じ型の構造体にセットして返却する 実行結果例 最高点 = 94 最低点 = 37 平均点 = 66.2 19
問 21 ( 構造体 ( リスト処理 )) 下記のプログラム ) を以下のように修正せよ キーと名前の他に 処理コードを入力させ 処理コードに従って次の処理を行うようにする 処理コード :1 キーボードから入力したキーと名前を 新規のデータとしてリストに追加する このとき リストのデータはキーで降順に並ぶように登録すること 処理コード :2 キーボードから入力したキーと同一キーのデータをリストから削除する 処理コード :3 入力処理を終了し リストの中身を表示する 実行結果例 次の処理コードを選択しなさい 1: リストの追加 2: リストの削除 3: 処理終了 1 KEY を入力 1 名前を入力 (MAX:19 文字 ) Ryo 次の処理コードを選択しなさい 1: リストの追加 2: リストの削除 3: 処理終了 1 KEY を入力 3 名前を入力 (MAX:19 文字 ) Yoko 次の処理コードを選択しなさい 1: リストの追加 2: リストの削除 3: 処理終了 1 KEY を入力 5 名前を入力 (MAX:19 文字 ) Taro 次の処理コードを選択しなさい 1: リストの追加 2: リストの削除 3: 処理終了 1 KEY を入力 20
2 名前を入力 (MAX:19 文字 ) Jiro 次の処理コードを選択しなさい 1: リストの追加 2: リストの削除 3: 処理終了 1 KEY を入力 7 名前を入力 (MAX:19 文字 ) Sayaka 次の処理コードを選択しなさい 1: リストの追加 2: リストの削除 3: 処理終了 2 KEY を入力 5 次の処理コードを選択しなさい 1: リストの追加 2: リストの削除 3: 処理終了 3 リストの表示 7 Sayaka 3 Yoko 2 Jiro 1 Ryo /* 自己参照構造体を使ったリスト処理の例 として 用いたプログラム */ #include <stdio.h> #include <string.h> #include <stdlib.h> struct list { int key; /* キー */ char name[20]; /* 名前 */ struct list *next; /* 次のデータへのポインタ */ ; 21
struct list *add_list( int key, char *name, struct list *head ); void show_list( struct list *p ); void free_list( struct list *p ); int main( void ) { struct list *head; /* 先頭ポインタ */ char name[20]; int key = 0; head = NULL; /* 先頭ポインタに NULL を設定 */ printf( " キーと名前 (MAX:19 文字 ) を入力 ( 終了 :Ctrl+Z)\n" ); while ( scanf( "%d %s", &key, name )!= EOF ) { /* リストにデータを登録 */ head = add_list( key, name, head ); /* リストの表示 */ show_list( head ); /* リストの開放 */ free_list( head ); return 0; /*** リストにデータを登録 ***/ struct list *add_list( int key, char *name, struct list *head ) { struct list *p; /* 記憶領域の確保 */ if ( ( p = ( struct list * )malloc( sizeof( struct list ) ) ) == NULL ) { printf( "malloc error\n" ); exit( EXIT_FAILURE ); 22
/* リストにデータを登録 */ p->key = key; strcpy( p->name, name ); /* ポインタのつなぎ換え */ p->next = head; /* 今までの先頭ポインタを次ポインタに */ head = p; /* 新たな領域を先頭ポインタに */ return head; /*** リストの表示 ***/ void show_list( struct list *p ) { while ( p!= NULL ) { /* 次ポインタが NULL まで処理 */ printf( "%3d %s\n", p->key, p->name ); p = p->next; /*** リストの開放 ***/ void free_list( struct list *p ) { struct list *p2; while ( p!= NULL ) { /* 次ポインタが NULL まで処理 */ p2 = p->next; free( p ); p = p2; 23