電子情報競技会 ソフトウェア課題1 Question_1 プロジェクト内のソースプログラムの /*** XX ***/ に適当な語句・式等を入れ、 プログラムを完成させなさい。ここで、同じ番号の/*** XX ***/ には同じ語句・式等が入 る。 /*** XX ***/ の部分以外は書き換えてはならないが、別のソースファイルにてテス トしてもかまわない。 [プログラムの説明] 1.処理内容 2桁の整数データ(-99~99)を配列に入力し、合計、平均、最高とその要素番号、最 低とその要素番号を出力する。ここで、平均点は小数点1 位まで表示する。 2.関数 関数名 機能 引数 戻り値 main メイン関数 なし 0(正常終了) 3.変数等 数値データ:dat (整数型配列変数) 合計点:sum (整数型変数) 平均点:ave (実数型変数) 最大値の要素番号:n_max (整数型変数) 最小値の要素番号:n_min (整数型変数) 4.プログラムリスト #include <stdio.h> // // 合計値・平均値・最大値・最小値の計算 // #include <stdio.h> int main(void){ int dat[5] ; // 5つの整数データ int sum ; // 合計値 /*** 01 ***/ ave ; // 平均値
int n_max, n_min ; // 最大値、最小値の要素番号 int i;
printf("5つの整数を入力して下さい。\n"); /* データ入力 */ for( /*** 02 ***/ ){ printf("%dつ目の入力:",i+1); scanf("%d", /*** 03 ***/ ); } sum=dat[0]; /* 合計値の初期設定 */ n_max= 0 ; /* 最大値の要素番号の初期設定 */ n_min= 0 ; /* 最小値の要素番号の初期設定 */ for( /*** 04 ***/ ){ sum+ = /*** 05 ***/ ; /* 合計値への積算 */ if( dat[i] > dat[n_max] ) /*** 06 ***/ ; /* 最大値の要 素番号の置換え */
if( dat[i] < dat[n_min] ) /*** 07 ***/ ; /* 最小値の要 素番号の置換え */ } ave = /*** 08 ***/ ; /* 平均値の計算 */ printf("合計値 : %d \n",sum); printf("平均値 : %.1f \n",ave); printf("最大値 : %d( %d 番目)\n", /*** 09 ***/ , n_max+1); printf("最小値 : %d( %d 番目)\n", /*** 10 ***/ , n_min+1); return 0; }
電子情報競技会 ソフトウェア課題2 Question_2 プロジェクト内のソースプログラムの /*** XX ***/ に適当な語句・式等を入れ、 プログラムを完成させなさい。ここで、同じ番号の/*** XX ***/ には同じ語句・式等が入 る。 /*** XX ***/ の部分以外は書き換えてはならないが、別のソースファイルにてテス トしてもかまわない。 [プログラムの説明] 1.処理内容 キーボードから入力された整数が奇数であれば三角形を、偶数であれば正方形を*記号 で表示するプログラムを作成する。この時、三角形、四角形ともにその辺の長さは入力 された数値となる。また、奇数・偶数の判定は2で割った余り(%演算子)で行うこと ができる。 (例1) 数値が3の場合 (例2) 数値が4の場合 * **** ** **** *** **** **** 2.関数 関数名 機能 引数 戻り値 main メイン関数 なし 0(正常終了) draw_triangle 三角形の描画 整数値 なし draw_square 四角形の描画 整数値 なし 3.変数等 入力整数:n (整数型変数) 辺の長さ:x (整数型変数) 4.プログラムリスト #include <stdio.h> // // 奇数・偶数の判定と図形の表示 // #include <stdio.h>
void draw_triangle( int ); // 三角形の表示 void draw_square( int ); // 正方形の表示
int main(void){ int n ; // 入力する整数 printf("数値入力:"); scanf("%d", /*** 01 ***/ ); if( /*** 02 ***/ ) /*** 03 ***/ ; // 奇数の判定と三角形描画 else /*** 04 ***/ ; // 偶数の判定と正方形描画 return 0 ; } // 三角形描画の関数
void draw_triangle( int x ){ int i,j; for(i=1; /*** 05 ***/ ;i++){ for(j=1; /*** 06 ***/ ;j++) printf( /*** 07 ***/ ); printf( /*** 08 ***/ ); } } // 正方形描画の関数
void draw_square( int x ){ int i,j; for(i=1; /*** 09 ***/ ;i++){ for(j=1; /*** 10 ***/ ;j++) printf( /*** 07 ***/ ); printf( /*** 08 ***/ ); } }
電子情報競技会 ソフトウェア課題3 Question_3 プロジェクト内のソースプログラムの /*** XX ***/ に適当な語句・式等を入れ、 プログラムを完成させなさい。ここで、同じ番号の/*** XX ***/ には同じ語句・式等が入 る。 /*** XX ***/ の部分以外は書き換えてはならないが、別のソースファイルにてテス トしてもかまわない。 [プログラムの説明] 1.処理内容 キーボード入力された半角のASCII 文字列について、英文字、数字のみを取り取り出 し、それぞれの文字列を作成し、文字数とともに表示する。また、廃棄した文字数につ いても表示する。さらに、数字の文字列に関しては、最初の5桁を限度に連結した10 進数の数値とみなし、16進数として表示する。入力される文字列の最大値は255 とし、 全角文字に対する処理は行わない。 ASCII コードを以下に示す。 ASCII 文字コード(16 進) 文字 コード 文字 コード 文字 コード 文字 コード 文字 コード 文字 コード 文字 コード 文字 コード NUL 00 DLE 10 SP 20 0 30 @ 40 P 50 ` 60 p 70 SOH 01 DC1 11 ! 21 1 31 A 41 Q 51 a 61 q 71 STX 02 DC2 12 " 22 2 32 B 42 R 52 b 62 r 72 ETX 03 DC3 13 # 23 3 33 C 43 S 53 c 63 s 73 EOT 04 DC4 14 $ 24 4 34 D 44 T 54 d 64 t 74 ENQ 05 NAK 15 % 25 5 35 E 45 U 55 e 65 u 75
ACK 06 SYN 16 & 26 6 36 F 46 V 56 f 66 v 76
BEL 07 ETB 17 ' 27 7 37 G 47 W 57 g 67 w 77 BS 08 CAN 18 ( 28 8 38 H 48 X 58 h 68 x 78 HT 09 EM 19 ) 29 9 39 I 49 Y 59 i 69 y 79 LF 0a SUB 1a * 2a : 3a J 4a Z 5a j 6a z 7a VT 0b ESC 1b + 2b ; 3b K 4b [ 5b k 6b { 7b FF 0c FS 1c , 2c < 3c L 4c \¥ 5c l 6c | 7c CR 0d GS 1d - 2d = 3d M 4d ] 5d m 6d } 7d SO 0e RS 1e . 2e > 3e N 4e ^ 5e n 6e ~ 7e SI 0f US 1f / 2f ? 3f O 4f _ 5f o 6f DEL 7f
*SP は空白文字(スペース)、その他のアルファベット表記は制御文字。 * ISO 646 で割り当ての変更が認められたものも含まれている。 例えば日本ではバックスラッシュが円記号になっている。 2.関数 関数名 機能 引数 戻り値 main メイン関数 なし 0(正常終了) 3.変数等 入力文字列:in_str[] (キャラクタ型配列) 英文字列:letter_str[] (キャラクタ型配列) 数字文字列:num_str[] (キャラクタ型配列) 変換数値:num_val (整数型変数) 英文字の文字数:letter_cnt(整数型変数) 数字の文字数:num_cnt(整数型変数) 無視した文字数:ignr_cnt(整数型変数) 4.プログラムリスト // // 文字列処理 // // #include <stdio.h> int main(void){
char in_str[256], letter_str[256], num_str[256]; // 入出 力文字列用の配列
int letter_cnt = 0 , num_cnt = 0, ignr_cnt = 0 ; // 各種の文字数 int num_val=0 ; // 数字文字列を変換した数値 int i_in = 0 ; // 入力文字列に対するカウンタ int i; printf("文字列を処理します。\n"); printf("半角の文字列を入力してください。\n");
printf("入力文字列:"); scanf("%s",in_str);
while( /*** 01 ***/ ){ /* 入力文字に対する繰り返し */
/* 数字の処理 */
if(0x30 <= in_str[i_in] && in_str[i_in] <= 0x39) num_str[num_cnt++] = in_str[i_in] ;
/* 英文字の処理 */
else if(0x40 < in_str[i_in] && in_str[i_in] < 0x5b /*** 02 ***/ 0x60 < in_str[i_in] && in_str[i_in] < 0x7b)
/*** 03 ***/ = in_str[i_in] ; /* その他文字の処理 */ else /*** 04 ***/ ; /* 廃棄文字のカウント */ i_in++ ; /* 入力文字カウンタの更新 */ } letter_str[ /*** 05 ***/ ] = /*** 06 ***/ ; /* 英文字列の 末端処理 */ num_str[ /*** 07 ***/ ] = /*** 06 ***/ ; /* 数字文字列 の末端処理 */ /* 連結した数字列から数値への変換 */ for(i=0;i<5;i++){ if(!num_str[i]) break; num_val *= 10 ; num_val += /*** 08 ***/ ; }
printf("英文字:%s ( %d 文字)\n", letter_str , letter_cnt); printf("数 字:%s ( %d 文字)\n", num_str , num_cnt);
printf("廃棄した文字数 ( %d 文字)\n", /*** 09 ***/ ); printf("16進数表示 : /*** 10 ***/ \n", num_val);
return 0 ; }
電子情報競技会 ソフトウェア課題4 Question_4 プロジェクト内のソースプログラムの /*** XX ***/ に適当な語句・式等を入れ、 プログラムを完成させなさい。ここで、同じ番号の/*** XX ***/ には同じ語句・式等が入 る。 /*** XX ***/ の部分以外は書き換えてはならないが、別のソースファイルにてテス トしてもかまわない。 [プログラムの説明] 1.処理内容 用意された配列から特定のデータを探索する。 配列に互いに異なる2桁の整数(01~99)が30個ある。任意の整数(キーボード 入力)がその配列中に存在するかどうか探索する。存在する場合はその数値と存在した 位置(要素番号)、存在しない場合はその数値と存在しないこと表示する。 探索には番兵法を使った線形探索法を用いる。 整数の入力は繰り返し行うことができ、0以下の整数が入力されたときに終了するもの とする。 ○ 線形探索の説明 線形探索はデータ配列を順に検索し、探索データが存在した場合にその要素番号を 求める。データの最後尾に到達した場合に存在なしとなる。 ○ 番兵法の説明 線形探索において、データ配列の最後尾に当該データを置く。そのことで、反復の 終了条件をデータ検索のみにすることができる。見つかったデータの要素番号が本 来のデータの次であれば存在しないことになる。 2.関数 関数 機能 引数 戻り値 main メイン関数 なし 0(正常終了) search_ban 線形探索 (番兵法) データ配列のポイン タ、探索データ 存在した配列の番号 3.変数等 探索されるデータ配列:data , dt (整数型配列) 探索するデータ:key , ky (整数型変数) 探索した要素の番号:no (整数型変数) データ数:NUM (整数型定数)
4.プログラムリスト // // // 番兵法を用いた線形探索 // #include <stdio.h> #define NUM /*** 01 ***/ //探索するデータ数
int search_ban(int *, int); //番兵法を用いた線形探索
int main(void){ int data[NUM+1] = { 84, 37, 85, 51, 69, 91, 21, 93, 77, 87, 10, 52, 16, 86, 38, 02, 66, 78, 80, 32, 95, 79, 64, 99, 27, 83, 48, 36, 41, 12 }; // 探索されるデータ int key; // 探索するデータ int no; // 探索したデータの要素番号 printf("線形探索(番兵法)\n"); while( /*** 02 ***/ ){ printf("探索する数値 : "); scanf("%d", &key); if( /*** 03 ***/ ) break; /*条件によりプログラム終了へ*/ no = search_ban( /*** 04 ***/ ); /* 配列dataから値がkey である要素を線形探索 */ if ( /*** 05 ***/ ) printf("%d はありませんでした。\n",key); else printf("%d は data[%d] にあります。\n", /*** 06 ***/ ); }
return 0; }
/*--- 要素数nの配列xからkyと一致する要素を線形探索(番兵法)---*/ int search_ban( int dt[], int ky )
{ int i = 0; dt[ /*** 07 ***/ ] = /*** 08 ***/ ; /* 最後尾に番兵追加 */ while (1) { if ( /*** 09 ***/ ) break; /* 発見し終了へ */ i++; } return /*** 10 ***/ ; }
電子情報競技会 ソフトウェア課題5 Question_5 プロジェクト内のソースプログラムの /*** XX ***/ に適当な語句・式等を入れ、 プログラムを完成させなさい。ここで、同じ番号の/*** XX ***/ には同じ語句・式等が入 る。 /*** XX ***/ の部分以外は書き換えてはならないが、別のソースファイルにてテス トしてもかまわない。 [プログラムの説明] 1.処理内容 温度(℃)と相対湿度(%)を入力する。温度と湿度から不快指数 DI を計算し、DI から不 快度を求める。 また、気温から最も快適( DI = 67.5 )と感じる相対湿度(最適湿度)を求める。た だし、得られた最適相対湿度が0%未満あるいは 100%以上となる場合は最適湿度をそれ ぞれ0%、100%とする。 入力された気温と湿度における不快指数DI と不快度を表示する。また、その気温の場 合の最適な相対湿度を不快指数とともに表示する。なお、不快指数、相対湿度の表示は 小数点以下1桁、合計5 桁とする。 各計算式、分類等は以下のとおりである。 DI = 0.81T + 0.01 H (0.99 T - 14.3 ) + 46.3 [ T : 温度(℃), H : 相対湿度(%)] H = ( DI - 0.81 T - 46.3 ) / ( 0.99 T - 14.3 )×100 不快度の判定 不快度番号 DI の基準値 不快度 0 55 未満 寒い 1 55 以上~60 未満 肌寒い 2 60 以上~65 未満 何も感じない 3 65 以上~70 未満 快適 4 70 以上~75 未満 暑くない 5 75 以上~80 未満 やや厚い 6 80 以上~85 未満 暑くて汗が出る 7 85 以上 暑くてたまらない
2.関数 関数 機能 引数 戻り値 main メイン関数 なし 0(正常終了) data_input データ入力 気温、相対湿度 のポインタ なし DI_calc BMI の計算 気温、相対湿度 DI 値 discomf_calc 不快度番号の算出 DI 値 不快度番号 comf_hum 最適湿度の計算 気温 最適湿度 result_out 結果の表示 DI 値、不快度番号、 気温 なし 3.変数等 気温:Temp , T (実数型変数) 相対湿度:Hum , H (実数型変数) DI 値:DI (実数型変数) 不快度番号:discomf (整数型変数) 不快度の基準値:discomf_ref[] (実数型配列) DI 最適値:opt_DI (実数型定数) 4.プログラムリスト // // 不快指数に関するプログラム // // #include <stdio.h>
#define opt_DI 67.5 // DIの最適値
void data_input(double *,double *); //温度・湿度を入力する関数 double DI_calc(double,double); // 不快指数を計算する関数 int discomf_calc(double); //不快度番号を計算する関数 double comf_hum(double); //最適湿度を計算する関数
void result_out(double,int,double); //結果を表示する関数
int main(void){
double Temp, Hum, DI; int discomf;
data_input( &Temp, &Hum );
DI = DI_calc( /*** 02 ***/ );
discomf = discomf_calc( DI );
result_out( DI, discomf, Temp );
return 0 ; } void data_input( /*** 03 ***/ ){ printf("温度(℃):"); fflush(stdin); scanf("%lf",T); printf("相対湿度(%):"); fflush(stdin); scanf("%lf",H); return ; }
double DI_calc(double T,double H){ double DI;
DI = /*** 04 ***/ ;
return DI ; }
int discomf_calc(double DI){ int i;
for( /*** 05 ***/ ) if( DI < discomf_ref[i] ) break ; return i; } double comf_hum(double T){ double H ; H = 100.0 * (opt_DI - 0.81 * T -46.3 )/( 0.99 * T - 14.3 ); /*** 06 ***/ H = 0.0 ; /*** 07 ***/ H = 100.0 ; return H ; }
void result_out(double DI,int discomf,double T){
printf("DI = /*** 08 ***/ → ",DI); switch ( /*** 09 ***/ ){ case 0 : printf("寒い"); break; case 1 : printf("肌寒い"); break; case 2 : printf("何も感じない"); break; case 3 : printf("快適"); break; case 4 : printf("暑くない"); break; case 5 :
printf("やや厚い"); break; case 6 : printf("暑くて汗が出る"); break; case 7 : printf("暑くてたまらない"); } printf("\n快適湿度 : /*** 08 ***/ %", comf_hum(T) ); printf(", (不快指数 : /*** 08 ***/ )\n", /*** 10 ***/ ); return ; }