講義ノート2E 情報工学概論 → 演習(構造体)

演習(構造体)

教科書の練習問題の解答を示します。

目次

  1. アンケートの集計
  2. データをまとめて管理する1
  3. データをまとめて管理する2

アンケートの集計

/*==================================================================*/
/*==================================================================*/
/*           教科書 「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;
}

データをまとめて管理する1

#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;

}

データをまとめて管理する2

#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:



no counter