• 締切済み

C言語について

いつも、お世話になっています。 以下のソースでわからないことがあります。 1.構造体入れ子になっている SCH の代入方法。 2.一覧表示するとき、入れ子になっているSCHの表示方法。 3./*IDの入力後に社員リストからそのIDを呼び出す*/の件ついての考え方。 宜しくお願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #define MAX_NUMBER 100 /* 登録件数 */ #define NAME 30 /* 氏名の文字数 */ #define LINE 100 /* スケジュールの文字数 */ #define NUM 4 /* IDの桁数 */ typedef struct { char SCH[LINE]; /* 予定 */ } work; typedef struct { char ID[NUM]; /* 番号 */ char name[NAME]; /* 氏名 */ work sched; } syain; void namecheck(char* ID) { printf("ID:"); scanf("%s", ID); } void namecheck(char* name) { printf("名前:"); scanf("%s", name); } void syaintouroku(syain data[], int syain_num) { IDcheck(data[syain_num].ID); namecheck(data[syain_num].name); } void sched_touroku(syain data[], int syain_num) { puts("登録するIDを入力してください。"); /*IDの入力後に社員リストからそのIDを呼び出す*/      /*そのIDの方のスケジュールを登録*/ SCHcheck(data[syain_num].work.SCH); } void print_data(syain data[], int syain_num) { for(i = 0; i < MAX_NUMBER; i++){      printf(data[syain_num].ID, data[syain_num].name, data[syain_num].work.ID,); } } int main(void) { syain meibo[MAX_NUMBER]; int max_syain = 0; syaintouroku(meibo, max_syain); max_syain++; worktouroku(meibo, syain_num); print_data(meibo, syain_num) return 0; }

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス ・次のリンクを読んで下さい。  http://oshiete1.goo.ne.jp/qa3262541.html→『入れ子の構造体について』  ここを読めば分かると思います。 ・以上。

参考URL:
http://oshiete1.goo.ne.jp/qa3262541.html
hatenan114
質問者

お礼

いつも回答ありがとうございます。 これから読んでみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語 初心者です。

    いつもお世話になっています。 またまた困ってます。 以下のソースは一部分を抜粋したものです。 質問内容ですが、現在コンパイルをすると、warningが出てきて、型の互換性がありません。とでてきます。たぶん文字列の長さを読むときがおかしいみたいで、型を色々変えましたが、warningはとれません。どうしたらいいか教えてください。 ちなみに #define NAME 128 /* IDの桁数 */ typedef struct { char name[NAME]; /* 社員番号 */ } syain; size_t str_length(char *str) { size_t length = 0; while (*str++){ length++; } return(length); } void namecheck(syain data[], int syain_num) { int len = 0;/* 社員名の桁数 */ while(1){ printf("社員名:"); scanf("%s", data[syain_num].name); /* 社員名の桁数を変数lenに格納する */ len =(unsigned)str_length(data[syain_num].name); putchar('\n'); if (len < NAME){ break; } } } void syaintouroku(syain data[], int syain_num) { namecheck(data[syain_num].name, syain_num); putchar('\n'); } int main(void) { syain meibo[MAX_NUMBER]; int max_syain = 0; int i; syaintouroku(meibo, max_syain); max_syain++; return (0); }

  • c言語 

    データを構造体の配列に格納したいのですが、このやり方ではできませんでした。どうすればいいですか? (ファイル内のデータを読み込んで格納しようとしています。) typedef struct dataset{ int price; char id; char name; }data; int main(void) { FILE *f = fopen("input.txt","r"); FILE *output = fopen("output.txt","w"); char order[100]; char name[100]; char id[100]; int price; int num = 0; while(fscanf(f,"%s",order) != EOF){ fscanf(f,"%s%s%d",product->name[num],product->id,&product[num].price); num++; } } return 0; } input.txt CD Kenji 300 DVD Nanako 350 PC Koki 1000 ........

  • 関数について

    いつも、お世話になっています。 また、教えてもらえないでしょうか? printf("count%d\n", count);では、カウントしているのですが、 mainに戻ったときに、 printf("登録件数%d\n", max_syain); では 0 でかえってきます。 何故なんでしょうか? 教えてください。 int SYAINTOUROKU(syain data[], int syain_num) { int count = syain_num; int touroku_repeat; while (1){ if(count > MAX_NUMBER){ return 0; } syaintouroku(data, count); count++; sortID(data, count); write_syainfile(data, count); scanf("%d", &touroku_repeat); printf("count%d\n", count); if(touroku_repeat == 0) break; } return (count); } int main(void) { syain meibo[MAX_NUMBER] = {{0x00} ,{0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00} ,{0x00}, {0x00}}; int max_syain = 0; SYAINTOUROKU(meibo, max_syain); printf("登録件数%d\n", max_syain); return 0; }

  • C言語でポインタを勉強しています。

    C言語でポインタを勉強しています。 それで、以下のようなプログラムを作成したのですが思ったようにいきません。何が原因でしょうか。 標準入力から全ての文字列を読み取った後、発言者と、「です」を付加した文字列を表示するプログラム 1 # include < stdio . h > 2 # include < string . h > 3 4 5 typedef enum { 6 NAME , // 発言者 7 COMMENT , // 発言 8 MAX _ RECORD _ ARRAY // レコード の 属性 の 数 9 } RecordArrayIndex ; 10 11 12 static const int MAX _ RECORD = 100 ; // 最大 の レコード 数 13 static const int MAX _ STRING = 32 ; // 発言者及 び 発言 の 最大文字数 ( ナル文字 を 含 む ) 14 15 // 関数 プロトタイプ 宣言 16 // record に 発言者 ( name ) と 、 その 発言 ( comment ) を 設定 する 。 17 void setNameAndCommentToRecord ( char * name , char * comment , char * record []) ; 18 // record の 発言 の 語尾 に 「 です 」 を 付 け 加 える 。 19 void appendCommentMeow ( char * record []) ; 20 21 int main ( void ) { 22 char * record [ MAX _ RECORD ][ MAX _ RECORD _ ARRAY ] ; 23 char * name = " 太郎 " ; 24 25 int currentIndex = 0 ; 26 for ( ;; ) { 27 char comment [ MAX _ STRING ] ; 28 if ( gets ( comment ) == NULL ) { 29 break ; 30 } 31 setNameAndCommentToRecord ( name , comment , record [ currentIndex ]) ; 32 appendCommentMeow ( record [ currentIndex ]) ; 33 currentIndex ++ ; 34 } 35 36 int const availableIndex = currentIndex ; 37 for ( int index = 0 ; index < availableIndex ; index ++) { 38 printf ( "% s : 「 % s 」 \ n " , record [ index ][ NAME ] , record [ index ][ COMMENT ]) ; 39 } 40 41 return 0 ; 42 } 43 44 void setNameAndCommentToRecord ( char * name , char * comment , char * record []) { 45 record [ NAME ] = name ; 46 record [ COMMENT ] = comment ; 47 } 48 49 void appendCommentMeow ( char * record []) { 50 strcat ( record [ COMMENT ] , " です " ) ; 51 } 52

  • C言語の課題なのですが、助けてください

    C言語のプログラミングの課題で、「以下のプログラムをキーワードを引数として入力できるように変更する(argvを利用する)」という問題なのですが、プログラミングが苦手な私にはさっぱりわからず、大変困っています。設問のプログラミングがわかる方がいらっしゃいましたら、教えていただけると大変助かります。よろしくお願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LEN 256 int main(int argc, char *argv[]) { FILE *rfp; FILE *wfp; int i, score; double evalue; char id[MAX_LEN], name[MAX_LEN], fname[MAX_LEN]; char keyword[] = "glu"; for(i = 0; i < 100; i++){ sprintf(fname,"files/%d.txt",i); if((rfp = fopen(fname, "r")) == NULL) { printf("入力ファイルが存在しません。\n"); return (EXIT_FAILURE); } while (fscanf(rfp,"%s\t%s\t%d\t%f", id, name, &score, &evalue) != EOF){ if (strstr(name,keyword) != NULL){ printf("%s\n",id); } } fclose(rfp); } return (EXIT_SUCCESS); }

  • 勉強しています。力をかしてください。

    #include <stdio.h> #include <string.h> #define MAX_NUMBER 999 /* 最大登録件数 */ #define NAME 20 /* 氏名の文字数 */ #define DATE 9 /* 生年月日の桁数 */ #define ID 4 /* IDの桁数 */ #define INT 8 /* 登録・修正日の桁数 */ typedef struct { /* 社員名簿 */ char ID[NUM]; /* 社員番号 */ char name[NAME]; /* 氏名 */ char birth[DATE]; /* 生年月日 */ int touroku; /* 登録日 */ }syain_data; このような構造体で、 001 abc 20000101 20070911 と、画面表示し、S_data.txtファイルに書き込むようにしようとおもうのですが、以下のところで悩んでます。教えてください。 /* 実行時の日付の表示 */ void put_data(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); fprintf(fp, "%2d%2d%2d%2d\n", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday); 20070911←の表示のことですが、これをファイルに書き、構造体に書くにはどうすればいいのでしょうか?

  • C言語の初心者です。教えてください

    #include<stdio.h> #define NAME 4 void main() { char str[NAME]; int i; for (i = 0;i < NAME;i++){ scanf("%s", &str[i]); } for(i = 0; i < NAME;i++){ printf("%s\n", str[i]); } } どこか間違っているのですか?それとも何か足りないのでしょうか? お願いします。

  • ファイル操作やポインタ、構造体について(C言語)

    C言語の課題で詰まってしまいました。宜しければ助言を宜しくお願いします。 コマンド選択で,0) 終了,1) 追加,2) 検索(id),3)変更 が行える学生成績管理プログラムを作成する。 データは,学生の番号 名前 GP 総単位数 形で学生のデータを持っているファイルである。 #include<stdio.h> #include<stdlib.h> #include<string.h> struct student{ int id; char name[25]; int gp; int credit; }; void add(char *, struct student);//追加 int search(char *, struct student *);//検索 void change(char *, struct student);//指定したidの学生の情報を変更 main(int argc,char *argv[]) { FILE *fp; int i = 0; int num; struct student students; if(argc == 1){ printf("set filename\n"); return 1; } while(1) { printf("1)add 2)search 0)quit "); scanf("%d",&num); if(num == 0) break; /* 追加 */ if(num == 1) { printf("id name gp credit ? "); scanf("%d %s %d %d", &students.id, students.name, &students.gp, &students.credit); add(argv[1], students); } /* 検索 */ if(num == 2) { printf("id ? "); scanf("%d", &students.id); if(search(argv[1],&students)){ printf("%d %s %d %d\n", students.id, students.name, students.gp, students.credit); } else{ printf("ID %d Not Found.\n",students.id); } } if(num == 3){ //変更 } } } /* 追加ルーチン */ void add(char *filename, struct student students) { FILE *fp; if((fp = fopen(filename, "a")) == NULL){ printf("can't open %s\n", filename); exit(1); } fprintf(fp,"%d %s %d %d\n", students.id, students.name, students.gp, students.credit); fclose(fp); } /* 検索ルーチン */ int search(char *filename, struct student *students) { FILE *fp; int id; char name[25]; int gp; int credit; if((fp = fopen(filename, "r")) == NULL){ printf("can't open %s\n", filename); exit(1); } while(fscanf(fp,"%d %s %d %d", &id, name, &gp, &credit) != EOF) { if(id == students->id){ students->id = id; strcpy(students->name ,name); students->gp = gp; students->credit = credit; return 1; } } return 0; fclose(fp); } /* 変更ルーチン */ void add(char *filename, struct student students){ } ------------ここまで------------ ファイルの操作での入出力は"a"や"r"、また"w"を利用するのかとも思いましたが、 指定したIDの内容を書き換えるにはポインタを2つ使う方法しか思いつかないのですが、与えられた問題で、変更のプロトタイプは void change(char *, struct student); となっていて、どうやるのかまったく見当もつきません。 稚拙な文で伝わりにくいかもしれませんが、 変更のやり方についてご教授願います。 見難くて申し訳ありません。 どうか宜しくお願いします。

  • C言語 ソートについて

    #include <stdio.h> #include <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }

  • C言語のコードについて

    C言語の問題なのですか、作成したのですが内容がわからないです。 コードをわかりやすく解説していただけると嬉しいです。 #include <stdio.h> void printBinary(unsigned char num) { int i ; /*①上位ビットから順に表示する*/ for(i = 7 ; i >= 0; i--) { /*②シフトとマスクを使用しています。*/ printf("%d", (num>>i) &0x01 ); } printf("\n"); } int main(void) { unsigned char num1 = 0xD2;/*11010010*/ unsigned char num2 = 0x5E;/*01011110*/ printf("0xD2 : "); printBinary(num1); printf("0x5E : "); printBinary(num2); return 0; }