教科書の練習問題の解答を示します。
/*==================================================================*/ /*==================================================================*/ /* 教科書 「C言語プログラミング初歩の初歩」 */ /* 練習問題 8 Lesson 8-1 アンケートの集計 */ /*==================================================================*/ /*==================================================================*/ #include <stdio.h> /* ---- 構造体 ---- */ struct datatype{ char sex; /* 性別を表す文字 m:男性 f:女性 */ int toto; /* 予想結果を記憶する整数 0:引分 1:勝 2:負 */ }; /* ---- プロトタイプ宣言 ---- */ int data_input(struct datatype data[]); int calc_result(struct datatype data[], int result[][3]); int print_result(int result[2][]); /*==================================================================*/ /* メイン関数 */ /*==================================================================*/ int main(void){ /* ---- 変数宣言 ---- */ struct datatype data[10]; /* 構造体の宣言 */ int result[2][3]; /* 勝敗予想人数[0:男 1:女][0:引分 1:勝 2:負]*/ /* ---- 実行文 ---- */ data_input(data); /* データ入力関数呼び出し */ calc_result(data, result); /* 結果集計関数の呼び出し */ print_result(result); /* 結果表示関数の呼び出し */ return 0; } /*==================================================================*/ /* データの入力 */ /* [引数] */ /* 仮引数 data[] : 予想結果を格納する構造体 参照渡し */ /* [戻り値] */ /* int : 常に 0 が返される */ /* [動作内容] */ /* ユーザーに入力を促し、キーボードから入力された 男性 or 女性 と */ /* 勝敗予想を引数で渡された構造体に格納する。 */ /* 男性 f 女性 m */ /* 勝ち 1 引き分け 0 負け 2 */ /* これらの値は、予想結果を格納する構造体 data[] に格納される */ /*==================================================================*/ int data_input(struct datatype data[]){ int loop; /* 読み込み番号のカウンター */ char temp; /* バッファーに残ったゴミを入れる */ /* ---- 勝敗予想の入力 ---- */ for(loop = 0; loop < 10; loop++){ printf("%d人目の予想をする方の性別は? 女性:f 男性:m\n",loop+1); scanf("%c%c", &data[loop].sex, &temp); printf("ホームチームの試合? 勝ち:1 引き分け:0 負け:2\n"); scanf("%d%c", &data[loop].toto, &temp); } return 0; } /*==================================================================*/ /* データの集計 */ /* [引数] */ /* 仮引数 data[] : 予想結果が格納されている構造体 参照渡し */ /* result[][]: 集計結果の集計を格納する配列 参照渡し */ /* result[0:女性 1:男性][0:引分 1:勝 2:負] */ /* [戻り値] */ /* int : 常に 0 が返される */ /* [動作内容] */ /* 予想結果の集計をおこなう。各場合における人数は配列result[][] */ /* に格納される。 */ /* 勝敗予想を引数で渡された構造体に格納する。 */ /* result[0][0] : 女性で引き分けと予想した人数 */ /* result[0][1] : 女性で勝ちと予想した人数 */ /* result[0][2] : 女性で負けと予想した人数 */ /* result[1][0] : 男性で引き分けと予想した人数 */ /* result[1][1] : 男性で勝ちと予想した人数 */ /* result[1][2] : 男性で負けと予想した人数 */ /*==================================================================*/ int calc_result(struct datatype data[], int result[][3]){ int loop1, loop2; /* ---- 初期化 ---- */ for(loop1=0; loop1<2; loop1++){ for(loop2=0; loop2<3; loop2++){ result[loop1][loop2]=0; /* 勝敗予想人数の配列を全てゼロに */ } } for(loop1=0; loop1<10; loop1++){ if(data[loop1].sex == 'f'){ result[0][data[loop1].toto]++; /* 女性の場合 */ }else{ result[1][data[loop1].toto]++; /* 弾性の場合 */ } } return 0; } /*==================================================================*/ /* 結果表示 */ /*==================================================================*/ int print_result(int result[][3]){ printf("\n##集計結果表示##\n"); printf("女性の予想は、[勝ち:%2d][引き分け:%2d][負け:%2d]\n", result[0][1],result[0][0],result[0][2]); printf("男性の予想は、[勝ち:%2d][引き分け:%2d][負け:%2d]\n", result[1][1],result[1][0],result[1][2]); return 0; }
#include <stdio.h> /* ---- 構造体 ---- */ struct cd_data{ char title[64]; /* タイトル名を入れる配列 */ char artist[64]; /* アーティスト名を入れる配列 */ char song[6][64]; /* 曲名をいれる配列 6曲まで入力可 */ }; /* ---- プロトタイプ宣言 ---- */ int data_input(struct cd_data CD[]); int write_file(struct cd_data CD[]); /*==================================================================*/ /* メイン関数 */ /*==================================================================*/ int main(void){ struct cd_data CD[10]; data_input(CD); /* CDのデータを入れる関数呼び出し */ write_file(CD); /* CDのデータをファイル出力する関数呼び出し */ return 0; } /*==================================================================*/ /* データの入力 */ /*==================================================================*/ int data_input(struct cd_data CD[]){ int i,j; for(i=0; i<10; i++){ printf("\n--------------------------------------------------\n"); printf("%d番目のCDについてです。\n", i+1); printf("タイトル?\t"); fgets(CD[i].title,64,stdin); /* 空白を含めてタイトル読み込み */ printf("\nアーティスト?\t"); fgets(CD[i].artist,64,stdin); /* 空白を含めてアーティスト読み込み */ for(j=0; j<6; j++){ printf("\n\t%d番目の曲目?\t",j+1); fgets(CD[i].song[j],64,stdin); /* 空白を含めて曲名読み込み */ } } return 0; } /*==================================================================*/ /* データのfile出力 */ /*==================================================================*/ int write_file(struct cd_data CD[]){ FILE *wfile; int i,j; wfile = fopen("CDdata.txt","w"); /* 書き込み用fileのオープン */ /* ---- 10個のCDタイトルの書き込み ---- */ for(i=0; i<10; i++){ fprintf(wfile, "CD%d Title: %s", i+1, CD[i].title); /* タイトル */ fprintf(wfile, "Artist: %s", CD[i].artist); /* アーティスト*/ for(j=0; j<6; j++){ /* 曲名 */ fprintf(wfile,"song%d: %s", j+1, CD[i].song[j]); } } fclose(wfile); /* 書き込み用のファイルのクローズ */ return 0; }
#include <stdio.h> #include <string.h> /*---- 構造体 ----*/ struct cd_data{ char title[64]; /* タイトルを入れる配列 */ char artist[64]; /* アーティストを入れる配列 */ char song[6][64]; /* 曲名を入れる配列(6曲分) */ }; /*---- プロトタイプ宣言 ----*/ int read_file(struct cd_data CD[]); int read_title(int cdnum, FILE *rfile, struct cd_data CD[]); int read_artist(int cdnum, FILE *rfile, struct cd_data CD[]); int read_song(int cdnum, FILE *rfile, struct cd_data CD[]); int find_song(char song[], struct cd_data CD[]); /*==================================================================*/ /* メイン関数 */ /*==================================================================*/ int main(void){ char song[64]; /* 検索する曲名を入れる配列 */ int nc, find; struct cd_data CD[10]; /* CDのデータを入れる構造体 */ /*----- 検索する曲名の入力 ---------*/ printf("探したい曲名?\t"); fgets(song, 64, stdin); /* キーボードから曲名入力 */ nc=strlen(song); /* 曲名の文字数+1(\n) */ song[nc-1]='\0'; /* 改行(\n)を文字終了(\0)に変更 */ printf("\n"); /* 改行 */ /*----- ファイルの読み込みと検索 ---------*/ read_file(CD); /* CDのデータの読み込み */ find = find_song(song,CD); /* 曲名の検索 */ /*----- 見つからなかった場合のメッセージ ---------*/ if(find==0){ printf("お探しの曲はありません。\n"); } return 0; } /*==================================================================*/ /* データのfileの読み込み */ /*==================================================================*/ int read_file(struct cd_data CD[]){ FILE *rfile; int i; rfile = fopen("CDdata.txt","r"); /* CDのデータファイルのオープン */ for(i=0; i<10; i++){ read_title(i, rfile, CD); /* タイトル名を読み込む関数のコール */ read_artist(i, rfile, CD); /* アーティスト名を読み込む関数のコール */ read_song(i, rfile, CD); /* 曲名を読み込む関数のコール */ } fclose(rfile); /* ファイルのクローズ */ return 0; } /*==================================================================*/ /* タイトル名の読み込み */ /*==================================================================*/ int read_title(int cdnum, FILE *rfile, struct cd_data CD[]){ int nc, nc1, nc2; char temp, c1[64], c2[64]; sprintf(c1,"CD%d",cdnum+1); /* CD番号 CD1, CD2, CD3 ...をc1へ */ nc1=strlen(c1); /* CD番号の文字数 */ do{ /* CD番号の検索 */ fscanf(rfile, "%s",c2); nc2=strlen(c2); if(nc1<nc2){ nc=nc2; }else{ nc=nc1; } }while(strncmp(c1,c2,nc)!=0); temp=fgetc(rfile); /* 空白の読み飛ばし */ sprintf(c1,"Title"); nc=strlen(c1); do{ /* Title: の検索 */ fscanf(rfile, "%s",c2); }while(strncmp(c1,c2,nc)!=0); temp=fgetc(rfile); /* 空白の読み飛ばし */ fgets(CD[cdnum].title,64,rfile); /* タイトルの読み込み */ nc=strlen(CD[cdnum].title); CD[cdnum].title[nc-1]='\0'; /* 改行(\n)を文字終了(\0)に変更 */ return 0; } /*==================================================================*/ /* アーティスト名の読み込み */ /*==================================================================*/ int read_artist(int cdnum, FILE *rfile, struct cd_data CD[]){ int nc, nc1, nc2; char temp, c1[64], c2[64]; sprintf(c1,"Artist:"); /* "Artist:"をc1へ格納 */ nc1=strlen(c1); do{ /* "Artist:"の検索 */ fscanf(rfile, "%s",c2); nc2=strlen(c2); if(nc1<nc2){ nc=nc2; }else{ nc=nc1; } }while(strncmp(c1,c2,nc)!=0); temp=fgetc(rfile); /* 空白の読み飛ばし */ fgets(CD[cdnum].artist,64,rfile); /* 空白付きアーティストの読み込み */ nc=strlen(CD[cdnum].artist); CD[cdnum].artist[nc-1]='\0'; /* 改行(\n)を文字終了(\0)に変更 */ return 0; } /*==================================================================*/ /* 曲名の読み込み */ /*==================================================================*/ int read_song(int cdnum, FILE *rfile, struct cd_data CD[]){ int i, nc, nc1, nc2; char temp, c1[64], c2[64]; for(i=0; i<6; i++){ /* 6曲分ファイルから読み込む */ sprintf(c1,"song%d:", i+1); /* "song?:"をc1へ格納 */ nc1=strlen(c1); do{ /* "song?:"の検索 */ fscanf(rfile, "%s",c2); nc2=strlen(c2); if(nc1<nc2){ nc=nc2; }else{ nc=nc1; } }while(strncmp(c1,c2,nc)!=0); temp=fgetc(rfile); /* 空白の読み飛ばし */ fgets(CD[cdnum].song[i],64,rfile); /* 曲名の読み込み */ nc=strlen(CD[cdnum].song[i]); CD[cdnum].song[i][nc-1]='\0'; /* 改行(\n)を文字終了(\0)に変更 */ } return 0; } /*==================================================================*/ /* 曲名検索 */ /*==================================================================*/ int find_song(char song[], struct cd_data CD[]){ int i,j; int nc, nc1, nc2, fnd; fnd=0; nc1=strlen(song); for(i=0; i<10; i++){ /* CD番号のループ */ for(j=0; j<6; j++){ /* 曲番号のループ */ nc2=strlen(CD[i].song[j]); /* 曲名の文字数 */ if(nc1<nc2){ /* 文字数の多い方で比較 */ nc=nc2; }else{ nc=nc1; } /* ---- 曲名が一致したら画面へ出力 ---- */ if(strncmp(song, CD[i].song[j], nc)==0){ if(fnd==0){ printf("%sが見つかりました。タイトルと曲番は以下の通り。\n", song); fnd=1; } printf("\t%s %d\n", CD[i].title, j+1); } } } return fnd; /* 0; 見つからない場合 1:見つかった場合 */ }
last update: