課題ができず困っています。質問内容のポイントを教えてください。

このQ&Aのポイント
  • 課題は構造体で顧客情報を確保し、分岐点ごとに登録、一覧表示、削除、ファイル出力のプログラムを行います。
  • 登録では、名前、ふりがな、電話番号を入力します。電話番号は一定の条件で入力される必要があります。
  • 一覧表示では、登録された顧客情報を表示しますが、現在は表示が正しく行われていません。
回答を見る
  • ベストアンサー

課題ができず困っています。

前回は部分的に質問を投稿したのですが、あまりにもわからないのでもう少し範囲を広げて投稿することにしました。よろしくお願いします。 課題は構造体で顧客情報を確保(顧客情報入力の前に、キーボードで1~50の顧客情報の数を入力し、その数の構造体を確保)し、分岐点(登録、一覧表示、削除、ファイル出力、終了)に行き、それぞれを行なうプログラムです。 登録では、名前、ふりがな、電話番号を入力(idは1から順につける)。名前、ふりがなの型はcharで確保して入力もそのままなんですが、電話番号の型はcharにして0~9までとハイフンのみ入力可能にし、他の文字を入力したらエラーを返すようにするみたいなんですが方法がわからないです。それと現段階ではビルドはうまくいくのですが、登録画面に行くとidをいれるところ(多分)で論理エラーが起きてexeが強制終了してしまいます。 ちなみに、それぞれの出力サイズはidが5、名前が24、ふりがなが24、電話番号が16です。 一覧表示では、id、名前、ふりがな、電話番号を改行なしで位置はidは左から1番目、名前は6番目、ふりがなは32番目、電話番号が57番目からそれぞれ表示します。 今記述している段階ではスペースがあくことなくすべて左詰で表示され、顧客番号が変な数字になってしまいます。 削除では、指定したidを削除し、削除したidは再利用はできないがその分新たなidで顧客情報を入力することができる。削除の仕方がわからないです。 ファイル出力では、csv形式で出力するみたいなんですが。記述してもエラーが返ってくるばかりでよくわからないです。 こんな感じでわからないことが多いのですが、部分的にでもかまいませんので教えていただければと思います。 ちなみに、わたしが記述したのは下記のとおりです。 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> #include "top.h" #include "ichiran.h" #define size_id (5) #define size_name (24) #define size_huri (24) #define size_tel (16) struct kokyaku { long *id; char *name; char *huri; char *tel; }; int main() { int a , b , i , j; //顧客情報確保の件数 メニュー画面での分岐 顧客情報の件数と比較 long c = 1; //顧客番号 struct kokyaku *kok; printf("顧客情報がありません。何件分確保しますか?(1 - 50)"); scanf("%d",&a); kok = (struct kokyaku *)malloc( sizeof(struct kokyaku) * (a)); system("cls"); if(a < 1 || a > 50) { printf("<<入力範囲にありません>>\n"); printf("<<処理を中断します>>\n"); return 0; }else{ for(i = 0;i < a;i++){ kok[i].id = (long*)malloc(size_id); kok[i].name = (char*)malloc(size_name); kok[i].huri = (char*)malloc(size_huri); kok[i].tel = (char*)malloc(size_tel); memset(kok, '\0', sizeof(kok)); } } i = 0; while(b = 5){ printf("%s", top1); printf("処理区分>"); scanf("%d",&b); system("cls"); switch(b) //メニュー画面での分岐 { case 1: //登録 if(c <= a) { printf("***** 顧客登録画面 *****\n"); *(kok[i].id) = c; printf("氏名  :"); scanf("%s", kok[i].name); printf("ふりがな:"); scanf("%s", kok[i].huri); printf("電話番号:"); scanf("%s", kok[i].tel); c++; i++; } else { printf("登録がいっぱいになりました"); } break; case 2: //一覧表示 printf("%s\n", ichiran1); printf("%s\n", ichiran2); j = i; i = 0; while(i < j) { printf("%d%s%s%s\n", kok[i].id , kok[i].name , kok[i].huri , kok[i].tel); i++; } printf("%s\n", ichiran2); break; case 3:    //削除 break; case 4:    //ファイル出力 break; case 5:     //終了 break; default: //エラー printf("<<処理区分エラー>>"); break; return 0; } } return 0; } おかしなところがたくさんあるとおもいますが、ご指摘よろしくお願いします。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

> こんな感じになっています。良いのかはわかりませんが^^; > エラーは消えましたが、ファイル出力や削除もわからないんですけど、特に一覧表示がうまくいきません。 まあ細かいこというときりがないので、とりあえずは良しとしましょう。 で、ファイル出力と削除も後回しにするとして、 > 登録でidの1にnameにabc、huriにdef、telに1234-5678といれると > > 4399008abcdef1234-5678 んー、 struct kokyaku の定義は今はどうなってますか? そして出力している行はどんな感じですか? idはとりあえずおいといて、name hrui tel がくっついて出てしまっているのは %s%s%s のようにしているからでしょう。 > 1****abc*********************def*********************1234-5678******* > *はスペースのことです。 > と表示したいのです printf の書式指定のところを調べてみてください。 こんな感じにすると、全体で何桁分か確保した上で変数の変換結果が足りないときに 適当に埋めてくれます。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { const char* str = "hello"; printf("<<%s>>\n"); printf("<<%10s>>\n"); printf("<<%-10s>>\n"); return 0; } 出力結果: <<hello>> << hello>> <<hello >> ファイル出力と削除がわからないということですけど、 ファイル出力の方は具体的に何がわかりませんか? ファイルをオープンするのと、書き込みの手順はわかりますよね? >記述してもエラーが返ってくるばかりでよくわからないです。 どんな書き方をして、どんなエラーになりましたか? 削除の方は、何らかの方法で「削除しました」って目印を つけるようにすればよいです。 とりあえず自分でもどういう「目印」にすればいいか考えてみてください。 あ、まずは一覧表示を正しくできるようにするのを優先で。

asthefancy
質問者

お礼

お礼遅くなりました。 一覧表示はスペースが空けられるようになりました。 しかし、idの代入がうまくいかなく意味のわからない数字が表示されたままです。 ファイル出力と削除のほうはもうちょっとがんばってみます。

asthefancy
質問者

補足

度々、すいません。 プログラムをいじっていてidがでてきたのでお知らせしました。 いままで、代入がうまくいってないとばかり思っていたのですが、もしかしたら表示の時うまくいってないのかと思い、いままでkok[i].idを表示としていたのですが、*(kok[i].id)を表示としたところうまくいきました。ありがとうございました。 まだ、削除や出力がうまくいってませんがもうすこしヒントを参考にがんばろうと思います。また質問することがあると思いますが、この質問も長くなりましたのでそのときは改めて投稿することにします。 そのときは改めてよろしくお願いします。 そして、ここまでありがとうございました。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> memsetがまだよく理解できないです。 > もう少し頭が良くなりたいです。 難しく考えすぎじゃないですか? memsetがやっていることは、 memset(kok, '\0', sizeof(kok)); _______↑ このアドレスから sizeof (kok) だけ '\0' で埋める ってことです。 そんだけ。 質問にあるやりかただと +---+ |k |→ "七氏権兵衛" |o |→ "ななしのごんべえ" |k |→ "000-1234-5678" +---+ こんなのが、kok[0] とか kok[1] になるわけです。 で、よーく質問にあるプログラムを見直してみると、 > kok = (struct kokyaku *)malloc( sizeof(struct kokyaku) * (a)); これで、kokyaku の領域を人数分確保してます。これはいいですね。 で、構造体のメンバーもポインタで確保することにしていたので kok[i].id = (long*)malloc(size_id); kok[i].name = (char*)malloc(size_name); kok[i].huri = (char*)malloc(size_huri); kok[i].tel = (char*)malloc(size_tel); としてそれぞれの分を確保している。これもいいです。 じゃあなにが問題かというと memset(kok, '\0', sizeof(kok)); これ。 最初に書いたとおり、これは kok を先頭としてゼロを埋めていくわけですけど その先頭はなにを指しているかというと、 > kok = (struct kokyaku *)malloc( sizeof(struct kokyaku) * (a)); これですよね。 たぶん、一人分の領域を確保してそれを初期化したかったのだと思いますが、 それをするなら kok[i].id = (long*)malloc(size_id); こっちでmalloc したほうです。 結局 +---+ |k |→ "七氏権兵衛" |o |→ "ななしのごんべえ" |k |→ "000-1234-5678" +---+ この箱の中身をゼロ埋めしちゃったわけです。 つまり、せっかく確保した名前とかを格納する領域を 指していたところをパーにしちゃったと。 そこをアクセスしたので異常終了したというわけです。 んー削除やら出力の説明を書くスペースがないなw

asthefancy
質問者

お礼

またまたご指摘ありがとうございます。 いまは int main() { int kokyaku , bunki , i , j; //顧客情報確保の件数 メニュー画面での分岐 顧客情報の件数と比較 long id = 1; //顧客番号 struct kokyaku *kok; printf("顧客情報がありません。何件分確保しますか?(1 - 50)"); scanf("%d",&kokyaku); system("cls"); if(kokyaku < 1 || kokyaku > 50) { printf("<<入力範囲にありません>>\n"); printf("<<処理を中断します>>\n"); return 0; }else{ kok = (struct kokyaku *)malloc( sizeof(struct kokyaku) * (kokyaku)); } こんな感じになっています。良いのかはわかりませんが^^; エラーは消えましたが、ファイル出力や削除もわからないんですけど、特に一覧表示がうまくいきません。 登録でidの1にnameにabc、huriにdef、telに1234-5678といれると 4399008abcdef1234-5678 と表示されてしまいます。理想では、 1****abc*********************def*********************1234-5678******* *はスペースのことです。 と表示したいのです。 idは、1でも2でも4399008とわけのわからないすうじになってしまいます。うまく代入できずに、そのままの中身が出てるのでしょうが原因がよくわからないです。それと、理想のようにスペースをそれぞれの変数のサイズの分確保したいのですがどうすれば。。。 何度も質問してしまって申し訳ないです。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

a, b, c なんて一文字の名前の変数を使わない。 きちんと何に使う変数なのか意味がわかる名前をつける ただし、for ループでつかう i, j, k 辺りは例外。 kok[i].id = (long*)malloc(size_id); kok[i].name = (char*)malloc(size_name); kok[i].huri = (char*)malloc(size_huri); kok[i].tel = (char*)malloc(size_tel); memset(kok, '\0', sizeof(kok)); } 最後の memset で '\0'が埋められているのは一体どこなのか よーーく考えてみてください。 つか、前回のアドバイスにあった通りに 構造体の中で固定長の配列でとるようにすればいいのに。 printf("顧客情報がありません。何件分確保しますか?(1 - 50)"); scanf("%d",&a); kok = (struct kokyaku *)malloc( sizeof(struct kokyaku) * (a)); system("cls"); if(a < 1 || a > 50) もし、件数の入力でとんでもない値(十億件とか)が 入力されたらどうなるでしょう?

asthefancy
質問者

お礼

ご指摘ありがとうございます。 固定長で配列を確保しました。変数名も変えました。 >もし、件数の入力でとんでもない値(十億件とか)が >入力されたらどうなるでしょう? すごくめんどくさいことになるところでしたね^^; 顧客の数を確認した後に kok = (struct kokyaku *)malloc( sizeof(struct kokyaku) * (a)); を書くようにしました。 memsetがまだよく理解できないです。 もう少し頭が良くなりたいです。

関連するQ&A

  • C言語の課題でまたまた悩んでいます。

    前にも、投稿して一部はうまくいきその後自力で何とかしようと頑張ったのですがやはりできませんでした。そこでもう一度皆さんの力を借りたいと思い投稿しました。 改めまして、 課題は構造体で顧客情報を確保(キーボードで1~50の顧客情報の数を入力)し、分岐点(登録、一覧表示、削除、ファイル出力、終了)に行き、それぞれを行なうプログラムです。 登録では、名前、ふりがな、電話番号を入力(idは1から順につける)。名前、ふりがなの型はcharで確保して入力もそのままなんですが、電話番号の型はcharにして0~9までとハイフンのみ入力可能にし、他の文字を入力したらエラーを返すようにするみたいなんですが方法がわからないです。 一覧表示では、id、名前、ふりがな、電話番号をそれぞれ表示します。今のところ問題はないです。 削除では、指定したidを削除し、削除したidは再利用はできないがその分新たなidで顧客情報を入力することができる。 記述してエラーは出なかったのですが削除はされません。 ファイル出力では、csv形式で出力するみたいなんですが。記述してもエラーが返ってくるばかりでよくわからないです。構造体の出力の場合 、記述の仕方が違うと思うのですが???の部分など全体的に記述の仕方がわかりません。 ちなみに、私が記述したのは下記のとおりです。 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> #include "top.h" #include "ichiran.h" #define size_id (4) #define size_name (24) #define size_huri (24) #define size_tel (16) struct kokyaku { long id[size_id]; char name[size_name]; char huri[size_huri];   char tel[size_tel];   struct kokyaku *next; }; int main() { int kokyaku , bunki , sakuzyo , i , j; //顧客情報確保の件数 メニュー画面での分岐 削除id番号 顧客情報の件数と比較 long id = 1; //顧客番号 struct kokyaku *kok; printf("顧客情報がありません。何件分確保しますか?(1 - 50)"); scanf("%d",&kokyaku); system("cls"); if(kokyaku < 1 || kokyaku > 50) { printf("<<入力範囲にありません>>\n"); printf("<<処理を中断します>>\n"); return 0; }else{ kok = (struct kokyaku *)malloc( sizeof(struct kokyaku) * (kokyaku)); } i = 0; while(bunki = 5){ printf("%s", top1); printf("処理区分>"); scanf("%d",&bunki); system("cls"); switch(bunki) //メニュー画面での分岐 { case 1: //登録 if(id <= kokyaku)     {     printf("***** 顧客登録画面 *****\n");     *(kok[i].id) = id;     printf("氏名  :");     scanf("%s", kok[i].name);     printf("ふりがな:");     scanf("%s", kok[i].huri);     printf("電話番号:");     scanf("%s", kok[i].tel);     id++;     kok[i].next = &kok[i+1];     i++;     }else{ printf("登録がいっぱいになりました");   } break; case 2: //一覧表示 printf("%s\n", ichiran1); printf("%s\n", ichiran2); j = i; i = 0; while(i < j) { printf("%d%5s%25s%25s\n", *(kok[i].id) , kok[i].name , kok[i].huri , kok[i].tel); i++; } printf("%s\n", ichiran2); break; case 3: //削除 scanf("%d",&sakuzyo); for(i = 0;i < kokyaku || i < sakuzyo;i++) { if(i == sakuzyo - 1)   {  kok[i-1].next = &kok[i+1];  }  }  kokyaku++;     break; case 4: //ファイル出力 FILE *fp; if((fp = fopen("kokyaku.csv", "w")) == NULL ) { return 0; } while(fgets(???) != NULL) { printf("%s", ???); } fclose(fp); printf("プログラムが終了しました。\n"); return 0; break; case 5: //終了     return 0; break;     default: //エラー printf("<<処理区分エラー>>"); break; return 0; } } return 0; } ちなみにエラーが出ている場所は削除とファイル出力の部分のみです。 完成にはまだ遠くおかしなところがたくさんあると思います。ご指摘よろしくお願いします。

  • C言語の構造体で悩んでます。

    構造体で顧客情報を管理する課題に取り組んでいるんですが、言語は苦手な分野で解決しかねてます。みなさんの力を借りたいです。お願いします。 課題は、構造体で顧客情報を確保(顧客情報入力の前に、キーボードで1~50の顧客情報の数を入力し、その数の構造体を確保)し、その後、顧客情報を登録するというものです。 私が記述したのは下記のとおりです。 間違いだらけだと思います。すみません。 #define size_id (5) #define size_name (25) #define size_huri (25) #define size_tel (17) struct kokyaku { long *id; char *name; char *huri; char *tel; }; int main() { int a , i; // 構造体確保の数、構造体参照時使用 long c = 1; // id struct kokyaku *ko; printf("顧客情報がありません。何件分確保しますか?(1 - 50)"); scanf("%d",&a); ko = (struct kokyaku *)malloc( sizeof(struct kokyaku) * (a)); if(a >= 1 || a <= 50) { for(i = 0;i < a;i++){   ko[i].id = (long*)malloc(size_id);   ko[i].name = (char*)malloc(size_name);   ko[i].huri = (char*)malloc(size_huri);   ko[i].tel = (char*)malloc(size_tel);       } }else{ printf("<<入力範囲にありません>>\n"); printf("<<処理を中断します>>\n"); return 0; } while(c <= a) {  i = 0;  printf("***** 顧客登録画面 *****\n");  ko[i].id = &c;  printf("氏名  :");  scanf("%s", ko[i].name);  printf("ふりがな:");  scanf("%s", ko[i].huri);  printf("電話番号:");  scanf("%s", ko[i].tel);  c++;  i++; } } エラーとか特にないのですが、構造体を件数分確保できていないと思います。 この後にも削除やファイル出力といった展開をさせなければならないのですが、後はなんとか自力でがんばろうと思います。 乱文ですみません。 よろしくお願いします。

  • 課題でつまってます・・・

    閲覧ありがとうございます。 main内のkr_sortの部分と、kr_sortのswapがおかしいのですが、どうやっても「警告: 互換性のないポインタ型からの引数 1 個の `swap' を渡しますです」という風になってしまいます。どなたかご指摘お願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define NUMERIC 1 #define DECR 2 #define LINES 100 #define MAXLEN 1000 #define ALLOCSIZE 10000 #define MAXLINES 5000 int numcmp(char *s1, char *s2); int readlines(char *lineptr[], int maxlines); int getline (char s[], int lim); void kr_qsort(char *v[], int left, int right, int (*comp)(void *, void *)); void writelines(char *lineptr[], int nlines, int decr); char *lineptr[MAXLINES]; char linestor[20]; char *alloc(int n); static char option = 0; static char allocbuf[ALLOCSIZE]; static char *allocp = allocbuf; main(int argc, char *argv[]) { char *lineptr[LINES]; int nlines; int c, rc = 0; while (--argc > 0 && (*++argv)[0] == '-') while (c = *++argv[0]) switch (c) { case 'n': option |= NUMERIC; break; case 'r': option |= DECR; break; default: printf("sort: illegal option %c\n", c); argc = 1; rc = -1; break; } if (argc) printf("Usage: sort -nr \n"); else if ((nlines = readlines(lineptr, LINES)) > 0) { if (option & NUMERIC) kr_qsort((void **) lineptr, 0, nlines-1, (int (*) (void *, void *)) numcmp); else kr_qsort((void **) lineptr, 0, nlines-1, (int (*) (void *, void *)) strcmp); writelines(lineptr, nlines, option & DECR); } else { printf("input too big to sort \n"); rc = -1; } return rc; } int numcmp(char *s1, char *s2) { double v1, v2; v1 = atof(s1); v2 = atof(s2); if (v1 < v2) return -1; else if (v1 > v2) return 1; else return 0; } int readlines(char *lineptr[], int maxlines) { int len, nlines; char *p, line[MAXLEN]; nlines = 0; while ((len = getline(line, MAXLEN)) > 0) if (nlines >= maxlines || (p = alloc(len)) == NULL) return -1; else { line[len-1] = '\0'; strcpy(p, line); lineptr[nlines++] = p; } return nlines; } char *alloc(int n) { if (allocbuf + ALLOCSIZE - allocp >= n) { allocp += n; return allocp - n; } else return 0; } void kr_qsort(char *v[], int left, int right, int (*comp)(void *, void *)) { int i, last; void swap(void *v[], int i, int j); if (left >= right) return; swap(v, left, (left + right)/2); last = left; for (i = left+1; i <= right; i++) if ((*comp)(v[i], v[left]) < 0) swap(v, ++last, i); swap(v, left, last); kr_qsort(v, left, last-1, comp); kr_qsort(v, last+1, right, comp); } void writelines(char *lineptr[], int nlines, int decr) { int i; if (decr) for (i = nlines-1; i >= 0; i--) printf("%s\n", lineptr[i]); else for (i = 0; i < nlines; i++) printf("%s\n", lineptr[i]); } void swap(char *v[], int i, int j) { char *temp; temp = v[i]; v[i] = v[j]; v[j] = temp; } int getline (char s[], int lim) { int c, i; i = 0; while (--lim > 0 && (c=getchar()) != EOF && c != '\n') s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return i; }

  • この課題を解いてください

    大学で C言語の入門の授業を取っています。 受講生はC言語をやるのは初めてのようです。 私は何年か前からやっていたので楽勝の授業なんですが、 3週目にして、以下の課題を与えられました。 キーボードから数値を入力して、それが正なら「plus」を、負なら「minus」 を、ゼロなら「zero」を表示するプログラムを作成せよ。ただしピリオド「.」が入力されたら終了とする。 で、私は、 #include<stdio.h> #include <stdlib.h> int main(void){ char s[1]; int a; while (1){ printf("変数aに数字を入力してください\n"); printf("a="); scanf("%s",&s[0]); a=atoi(s); if(s[0]=='.')break; if(a>0){ printf("%d is plus\n",a); }else if(a==0){ printf("%d is zero\n",a); }else{ printf("%d is minus\n",a); } } return(0); } のように作りました。 私は授業ではまだ習っていない配列や、atoiという関数を使いましたが、 他の履修生にとっては難しい課題じゃないですか? それとももっとシンプルに作れますか?

  • 助けてください。困っています

    初めまして 課題でメイン関数(メインメニュー)から呼び出されるサブシステムの「かな氏名検索」を作っているのですが、 自分なりに頑張ってみたものの全くの初心者のため完全に行き詰ってしまい、どこが悪いのかもわからない状態です。 なので、皆さんに教えて頂きたいと思い、 お願いにまいりました。 100人分のデータから「ふりがな」を部分一致で検索して、一致した人のデータを表示させるもので、 探すデータ(社員データ)はカンマ区切りテキストで 社員番号 名前 ふりがな 郵便番号 住所 電話番号 生年月日 入社年月日 役職コード 所属コード 性別 の順に 0523,鈴木一郎,すずきいちろう,105-0000,東京都どこどこ, ,19830101,20090404,01,01,M のように入っています。空白部には半角スペースが入ってます。 現在の自分で作ったソースは #include <stdio.h> #include <string.h> #include "CFUNC.h" #include "display.h" #define NUM 200 typedef struct shain{ char id[5]; char name[21]; char hurigana[31]; char yubin[9]; char jusyo[101]; char tel[14]; int birth; int nyusya; char yakusyokucode[3]; char syozokucode[3]; char seibetsu[2]; }shain; int main(void) { int j; int i; int cnt = 0; shain data[100]; FILE *fp; char *token; char s[NUM]; char mes[25] = "該当する結果がありません"; char mes2[30] = "該当するメニューがありません"; char str[30]; fp = fopen("shain.txt","r"); if(fp==NULL){ printf("ファイルオープンに失敗しました。\n"); return 1; } for(i=0; i<100; ++i){ fgets(s,NUM-1,fp); token= strtok(s, ","); /* str1の分割(1回目) */ strcpy(data[i].id,token); token = strtok(NULL, ","); strcpy(data[i].name,token); token = strtok(NULL, ","); strcpy(data[i].hurigana,token); token = strtok(NULL, ","); strcpy(data[i].yubin,token); token = strtok(NULL, ","); strcpy(data[i].jusyo,token); token = strtok(NULL, ","); strcpy(data[i].tel,token); token = strtok(NULL, ","); data[i].birth =(int)token; token = strtok(NULL, ","); data[i].nyusya=(int)token; token = strtok(NULL, ","); strcpy(data[i].yakusyokucode,token); token = strtok(NULL, ","); strcpy(data[i].syozokucode,token); token = strtok(NULL, "\n"); strcpy(data[i].seibetsu,token); } cls(); /*検索画面*/ printf("*****************************************************\n"); printf("[かな氏名検索]\n"); printf("かなを入力してください:\n"); printf(" \n"); printf(" \n"); printf(" 0:メニューに戻る\n"); printf("*****************************************************\n"); printf("メッセージ:\n"); for(;;){ setLocate(24,3); scanf("%s",str); if(strcmp(str,"0")==0){ break; } for(i=0; i<100; ++i){ if(strncmp(str,data[i].hurigana,5)==0){ cnt++; if(cnt==1){ /*検索結果画面*/ printf("*****************************************************\n"); printf("[かな氏名検索結果]\n"); printf("社員番号 氏名  ふりがな  入社年度  所属  性別 役職\n"); printf(" %s  %s  %5s %d %s %s %s %s\n",  data[i].id,data[i].name,data[i].hurigana,data[i].nyusya,  data[i].syozokucode,data[i].seibetsu,data[i].yakusyokucode); } else{ printf(" %s  %s  %5s %d %s %s %s %s\n", data[i].id,data[i].name,data[i].hurigana,data[i].nyusya, data[i].syozokucode,data[i].seibetsu,data[i].yakusyokucode); } } //見たつからなかった時 if (cnt==0){ setLocate(12,8); printf("%s\n",mes); } //メッセージ setLocate(24,3); scanf("%s",str); setLocate(12,8); printf("%s\n",mes); } } printf("\n"); fclose(fp); return 0; } 所々変なところもあり見にくいと思いますが、 とりあえず単独で検索だけしっかり出来るようにしたいです。 検索は1回だけでなく、何回も出来るようにしたいです。 下手な文章のうえ長文でまことにすいませんが、よろしくお願いします。

  • プログラミングの課題です、助けてください。

    C言語のプログラミングの課題で、「以下のプログラムで、引数としてスコア(100等の数字)を与えると、そのスコア以上のエントリだけを検索して、出力するように変更する」という問題なのですが、プログラミングが苦手な私にはさっぱりわからず、大変困っています。設問のプログラミングがわかる方がいらっしゃいましたら、教えていただけると大変助かります。よろしくお願いします。 #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); }

  • 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); }

  • 学校の課題で

    sin,cos,tanを0~90度を出せっていわれたのですが #include <stdio.h> #include <math.h> main() { int N; float x; char *line="-------------------------------------\n"; printf(line); printf("%3s %5s %10s %13s \n", "kakudo", "sin","cos","tan"); for(N=0; N<=90; ++N) { x=N*3.14159265358979323846264338327950288/180; if(N%10==1) { printf(line); } if(N=90) { tan(N)= ; } printf("%3d %7.6f %10.6f %13.6f \n", N, sin(x), cos(x), tan(x)); } printf(line); } で出ません。 間違いは if(N=90){tan(N)= ;} の部分なのですが、どうすれば出せますか?

  • 複数の戻り値

    関数にポインタを渡して、結果を格納してもらう方法で 複数の戻り値を得ようとしたのですがうまく行きません どうしたら複数戻せますか? ---ソース--- #include <stdio.h> #include <stdlib.h> void check(int a,char *b,char *c); void main(void){ int a; char *b,*c; int i; char *va[5]={"2","3"}; for(i=0;i<5;i++){ //ここ何とかなったらwhileにしとこ if(va[i]!=NULL){ a=atoi(va[i]); check(a,b,c); printf("%s%s\n",b,c); } } } void check(int a,char *b,char *c){ switch(a){ case 0: b="0:×\n"; c="0:○\n"; break; case 1: b="1:×\n"; c="1:○\n"; break; case 2: b="2:×\n"; c="2:○\n"; break; case 3: b="3:×\n"; c="3:○\n"; break; case 4: b="4:×\n"; c="4:○\n"; break; } }

  • ループが回らない

    #include<stdio.h> #include<string.h> #define HASH_SIZE 100 #define NAME_SIZE 20 char name[ HASH_SIZE ][ NAME_SIZE ]; i int hash_func( char str[] ) { } void main() { char s[ NAME_SIZE ],i; int index ; while(1){ printf("文字を入力!"); scanf("%s",s); if( s[0]='.') break; index = hash_func(s); strcpy( name[ index ],s) ; printf("*\n"); } } このプログラムの 無限ループのところがぜんぜん回らないんです。 自分なりに試行錯誤してみたのですが 限界に達しましたので助言をいただきたいです。 上の関数は今はなにも書いてないですが、 書いてあっても動かないです。 月曜日提出の課題なので なるべく早め回答いただけると幸いです。 アドバイスお待ちしております。

専門家に質問してみよう