• ベストアンサー

データ管理プログラムを作っているんですが、初心者なもので困っています…。

学校の課題で上手くいかずに困っています。キーボードから入力したものを構造体に納める機能を関数で実装するんですが、1番目の構造体に入力した後、次の構造体に入力できません。下にその関数の部分を載せるので、どのように直したらいいか、また上手くいかなかった原因を教えてくだい。 typedef struct _Music { char title[1024]; char artist[1024]; int year, month, day, star; } Music; void register_record(Music *mus, int *current_num_ptr); int main(void) { Music musiclist[200]; int num_record = 0; char buf[128], n; while (1) { printf("[1]Registration [q|Q]quit\nEnter Number> "); fgets(buf, sizeof(buf), stdin); sscanf(buf, "%c", &n); if (n == 'q' || n == 'Q') { break; } else if (n == '1') { printf("Registration\n"); register_record(musiclist, &num_record); num_record = num_record + 1; } else { printf("wrong number\n"); } } return 0; } void register_record(Music *mus, int *current_num_ptr) { char tem[1024]; int x; printf("Title> "); scanf("%s", tem); strcpy(mus->title, tem); printf("Artist> "); scanf("%s", tem); strcpy(mus->artist, tem); printf("Date(year)> "); scanf("%d", &x); mus->year = x; printf("Date(month)> "); scanf("%d", &x); mus->month = x; printf("Date(day)> "); scanf("%d", &x); mus->day = x; printf("My Rate> "); scanf("%d", &x); mus->star = x; printf("---Complete registration!!---\n"); printf("No.%d Title:%s Artist:%s Date:%d/%d/%d My Rate:%d\n", current_num_ptr, mus->title, mus->artist, mus->year, mus->month, mus->day, mus->star); }

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

register_record( ) の mus は、 main でいう musiclist[200] の先頭だから mus->title のようにアクセスしたら、常に先頭にアクセスすることになる。 mus[*current_num_ptr].title のようにアクセスしたらいいんじゃないかと思う。

Taka6223
質問者

お礼

返信がおそくなってしまいすみません。 アドバイスの通りにやって、コンパイルしてみたところ、上手くいきました!!ありがとうございました。

その他の回答 (3)

回答No.4

   "register_record"内で、 "static int i;"を宣言して、 "mus"を、"mus + i"とし、 最後に"i ++"。

Taka6223
質問者

お礼

返信遅くなってしまって申し訳ないです。ご教授いただきありがとうございました。人によっていろんな方法があることが分かりました。

  • FAY
  • ベストアンサー率49% (95/193)
回答No.3

>register_record(musiclist, &num_record); register_record(&musiclist[num_record], &num_record);

Taka6223
質問者

お礼

お礼が遅くなってしまいすみませんでした。後でこの方法でもやってみたところ、上手く出来ていました。ありがとうございました。

回答No.2

register_record()へは常にmusiclist[200]の先頭しか渡ってないですね。 呼び出し部分を register_record(musiclist, &num_record); ↓ register_record(musiclist[num_record], &num_record); としたらどうですか? printf("No.%d ... ", current_num_ptr,...); ですが、ポインタのアドレスを表示してると思いますよ。 current_num_ptrはアドレス渡ししなくてもよいのでは?

Taka6223
質問者

お礼

一度この方法でやってみたんですけど、上手くコンパイル出来なかったんです…。でも、BLUEPIXYさんの方法で上手く出来ました!!アドバイスありがとうございました。

関連するQ&A

  • 検索機能の実装について

    データ管理プログラムを作っていて、上手くいかないので質問させていただきました。検索機能なんですが、コンパイルしても該当項目が表示されません。どこを直したら良いか教えてください。また、これを大文字小文字区別なし・完全一致のものを一覧表示するようにしたいのですが、どのようにすればいいかをご教授いただけないでしょうか。それと、"const"の意味が良く分からないので、それも教えていただけるとありがたいです。 /* 構造体の定義 */ typedef struct _Music { char title[MAXBUFSIZE]; char artist[MAXBUFSIZE]; int year, month, day, star; } Music; /* 検索機能の関数 */ void search_record(Music *mus, int current_num, const char *search_string) { int i; int count = 0; printf("Please input the artist> "); scanf("%s", search_string); for(i = 0; i < current_num; i++) { if(strcmp(mus[i].artist, search_string) == 0) { printf("Title:%s Artist:%s Date:%d/%d/%d My Rate:%d\n", mus[i].title, mus[i].artist, mus[i].year, mus[i].month, mus[i].day, mus[i].star); count = count + 1; } } if(count == 0) { printf("No applicable items!\n"); } else { printf("%d applicable items!\n", count); } }

  • 作成したプログラムファイルの管理を行うプログラムというものを学校の課題

    作成したプログラムファイルの管理を行うプログラムというものを学校の課題で行っているのですが、 この課題の制作にあたって、手始めにファイルの保存と読み込みを行う関数を作ろうと思うのですが、ファイルを保存する関数(save)と読み込む関数(load)の作り方、ファイルポインタに格納する方法がわかりません。 現在の途中経過を示します。 #include <stdio.h> #include <stdlib.h> struct date {/*作成日付を格納*/ int year;/*年*/ int month;/*月*/ int day;/*日*/ }; struct record {/*レコード*/ char title[30];/*タイトル名*/ char stitle[50];/*副タイトル名*/ struct date adate;/*作成日付*/ char path[50];/*パス名(ファイルがどこのフォルダにあるか)*/ char category[30];/*分類*/ }; int save(struct record file)/*ファイルを保存する*/ { FILE *fp; int c; fp = fopen("program.txt","w"); if (fp == NULL){ fprintf(stderr,"Cannot open file: composition.txt\n"); return -1; } fprintf(""); fclose(fp); } int load(struct record file)/*ファイルを読み込む*/ { } int main() { int num; char file; int sortnum; printf("プログラムファイル管理プログラムへようこそ!\n"); do{ printf("何をしますか?\n"); printf("[0:終了、1:保存、2:読み込み]\n"); printf("入力してください: "); scanf("%d",&num); if(num==1 && num == 2){ printf("ファイル名を指定してください: "); scanf("%s",&file); if(num==1) save(file); if(num==2) load(file); }else printf("入力された数値が正しくありません。\n"); }while(num != 0) return 0; }

  • このプログラム見てください

    これで動いたと書いてあるのに動きません。 どこを直せば良いのか教えてください。 #include <stdio.h> int combination(int n,int r){ if ( r==0 ){ return 1; }else if( r==n ){ return 1; }else{ return (combination(n-1,r-1)+combination(n-1,r)); } } int main(){ int num_n=0; int num_r=0; int answer=0; printf("組み合わせの計算をします。数値を入力してください。N=?。\n"); printf("[n]:"); scanf("%d",&num_n); rewind(stdin); printf("[r]:"); scanf("%d",&num_r); rewind(stdin); answer=combination(num_n,num_r); printf("%dC%d=%d\n" , num_n, num_r, answer); return 0; }

  • プログラム問題(3)

    以下の問題のプログラムをやったのですが、コマンドプロンプトで実行してみるとエラーになってしまうのですが、どなたか問題点を指摘していただけないでしょうか? 【問題】 3桁の整数の値を入力していき、-9999が入力されたところで、それまでに入力された数の個数と合計を整数で、平均を浮動小数点数で出力するプログラム。 【プログラム】 #include <stdio.h> #include <stdlib.h> #include <string.h> #define streq(a, b) !strcmp((a), (b)) int main(int argc, char *argv[]) { int i, num, sum = 0; double avg; char buf[256]; char *endptr; for (i = 0;; i++) { printf("INPUT>"); if (fgets(buf, sizeof buf, stdin) == NULL) { perror("fgets"); exit(1); } if (streq(buf, "-9999") || streq(buf, "-9999\n")) { break; } if (streq(buf, "") || streq(buf, "\n")) { fprintf(stderr, "数値を入力してください。\n"); exit(1); } num = (int) strtol(buf, &endptr, 0); if (! (*endptr == '\n' || *endptr == '\0')) { fprintf(stderr, "数値を入力してください。\n"); exit(1); } sum += num; } printf("入力数:%d 合計:%d 平均:%g\n", i, sum, (double) sum / i); return 0; }

  • おみくじプログラムですがじっこうできません。

    #include<stdio.h> int main() { int i; char data[5][10]={"大吉","小吉","吉","凶","大凶"}; printf("1~5の間の整数を入力:"); scanf("%d",&i); while(i<1&&i>5){ printf("入力値が不適切です。\n"); printf("1~5でお願いします。\n"); scanf("%d",&i); } printf("%s\n",data[5][i-1]); return 0; } 自分で考えてみたのですが、どうしたらいいかわかりません。

  • C言語初心者です。次のプログラムを簡潔にしたいです

    二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成せよ。 自分のプログラムは以下の通りです。 #include <stdio.h> int main(void) { int num1,num2,small,big,sum=0; printf("二つの整数を入力してください。\n"); printf("整数A:"); scanf("%d",&num1); printf("整数B:"); scanf("%d",&num2); small=(num1 > num2) ? num2 : num1; big=(num1 > num2) ? num1 : num2; printf("%d以上%d以下の全整数の和は",small,big); if (num1 < num2) { do { sum+=num1; num1++; }while (num1 <= num2); } else { do { sum+=num2; num2++; }while (num2 <= num1); } printf("%dです。",sum); return 0; } 結果は正しく表示されるはずです。 しかし多変数かつループ文を組み合わせているため、長ったらしくなっています。 どのようなプログラミングならば、簡潔にかけますか? 解答がないので困っています。

  • C言語初心者です。次の問題で質問です。

    (問題) 二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値表示するプログラムを作成せよ。 (自分の解答) #include <stdio.h> int main(void) { int num1,num2; int sum=0; do { printf("整数1>整数2となる整数をそれぞれ入力してください\n"); printf("整数1:"); scanf("%d",&num1); printf("整数2:"); scanf("%d",&num2); if (num1 < num2) printf("整数1>整数2としてください\n"); } while (num1 < num2); printf("%d以上%d以下の全整数の和は",num2,num1); for (num2;num2 <= num1;num2++) { sum=sum+num2; } printf("%dです。",sum); return 0; } これでも一応正しく実行されるのですが、ごちゃごちゃしてるので簡潔に書けないでしょうか? 回答お願いします。

  • 初心者です。

    ループで、どうしてもわからないので、質問します。   1234567890123456789012345 と、いうように表示したいのですが、以下のソースでは、表示されません。教えてください。  ※ 読み込まれた整数値の個数は25とした場合です。 #include <stdio.h> int main(void) { int i = 0; int num; printf("整数を入力してください。:"); scanf("%d",&num); for (i = 0; i < num; i++){ printf("%d", i); if ( i <= 10 ){ i = 0; } } putchar('\n'); return(0); }

  • 4桁の英字の3桁目を当てるプログラム

    乱数でとってくる4ケタの英字の3桁目を入力して当てるプログラムを 組もうとしているのですが、コンパイラしてもいまいちうまくいきません。 特に下に書いたプログラムのこの部分が違っていると思い どのように修正したらよいのか指摘していただきたいです。 human=getchar(); if(comp[2]!=human) { ero=1; } よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> int sleep(unsigned long x) { clock_t c1=clock(),c2; do{ if((c2=clock())==(clock_t)-1) { return 0; } }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); return 1; } int main(void) { int num,val,i,j; char comp[21]; char human; int ero=0; int try_count=0; int seikai=0; clock_t start,end; int num1; char eiji[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; srand(time(NULL)); puts("英字記憶トレーニング"); do{ printf("挑戦するレベル(3~20):"); scanf("%d",&num1); }while(num1<3 || num1>20); printf("%d個の英字を記録しましょう。\n",num1); start=clock(); do{ for(i=0;i<num1;i++) { comp[i]=eiji[rand()%strlen(eiji)]; } comp[num1]='\0'; printf("%s",comp); fflush(stdout); sleep(125*num1); printf("\r%*s\r3番目の英字を入力してください:",num1,""); human=getchar(); if(comp[2]!=human) { ero=1; } if(ero==0) { printf("正解です。\n"); seikai++; } else { printf("\a間違いです。\n"); } try_count++; }while(try_count<2); end=clock(); printf("%d回中%d回成功しました。\n",try_count,seikai); printf("%.1f秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

  • C言語

    文を繰り返すときに、『続けますか(Y=続行。N=終了)』と表示して、Yが入力されたら文を繰り返すようにしたいのですが、わからないので教えてください。 #include<stdio.h> int main(void) { int m,s,r,num; char moji; num=1; do{ printf("距離を入力してください。\n"); scanf("%d",&m); printf("平均速度を入力してください。\n"); scanf("%d",&s); r=m/s; printf("所要時間は%dです。\n",r); printf("続けますか?(Y=続行。N=終了)\n");/*このあたりがどうすればいいのかわかりません*/ moji=getchar(); }while(num) printf("終了します。\n"); return 0; }