• 締切済み

C言語のプログラムについて

jppyの回答

  • jppy
  • ベストアンサー率14% (14/99)
回答No.2

while(scanf("%d", &bango)!= EOF) lo=0; を回してもしかたがないのではなかろうか? ちなみに中括弧は省略しないほうよいかと私は思います ちなみに探索対象のデータが学生番号でソートされていると思うのですが・・・? 昇順?降順?どちらですかね?

ksy9z
質問者

補足

回答ありがとうございます。 降順です。

関連するQ&A

  • C言語のプログラムについて

    リスト処理による挿入法で得点の降順に整列して表示する。また、整列する際に要素どうしを比較した回数も表示する。 このプログラムを作成したいのですが、ファイルを開いてからこの先どのように書けばいいのかわからなくなりました。分かる方教えてください。 実行例 番号 氏名      得点 1021 Machida Msao 100 1017 Nonaka Fujio 98 1011 Suzuki Kaoru 93 1006 kato Ichiro 91 1002 Inoue Yasuo 85 整列のための比較回数=○○回 ファイルを開くのはこのように書きました。 #include<stdio.h> #include<stdlib.h> int main(void) { struct GDATA{ int bango; char sei[11],mei[11]; int tokuten; }; struct GDATA seiseki; FILE *fp; if((fp=fopen("data-a.dat","r"))==NULL) { printf("data-a.dat OPEN ERROR!\n"); exit(1); }

  • C言語 プログラムの質問

    下記の問題はすでに他で回答されていますが、私のプログラムのどこがいけないかチェックしていただけませんか? 1)101人以下のクラスがあり、学生には1から通し番号が付いているものとする。 このクラスのある科目の得点を通し番号順にキーボードから受けとり、負の得点が入力されたら全員の入力が終わったものとする。 その後、キーボードから入力された番号の人の得点をxx点と漢字で表示し、存在しない番号が入力されたらプログラムを終了する。 2)第 1 種の定形外通常郵便物の料金は、次の表のように定められている。 郵便物の重さを g 単位で入力すると、料金が出力されるプログラムを作成しなさい。 ただし、以下の点を考慮すること。 *重さと料金の表は、2 次元配列として取り扱うこと *指定された範囲外の値(負の値,0,4001以上)が入力された場合は、正しい値が入力されるまで入力処理を繰り返すこと   重さ  料金   50gまで  120円   100gまで  140円   150gまで  200円   250gまで  240円   500gまで  390円  1000gまで  580円  2000gまで  850円  4000gまで  1150円 ----------------------------------------- 自分のプログラム 1) #include <stdio.h> int main(void) { int Snumber[101],score[101],i,n; for(i=0;i<101;i++){ scanf("%d",&score[i]); if(score[i]<0){ break; } } for(n=0;n<i;n++){ if(score[i-1]==''){ break; } printf("学生番号:%d\n %d\n",Snumber[i],score[i-1]); } } ----------------------------------------------- 2) #include <stdio.h> int main(void) { int weight,i; int array[8][2] = { {50,120}, {100,140}, {150,200}, {250,240}, {500,390}, {1000,580}, {2000,850}, {4000,1150}, }; scanf("%d",&weight); for(i=0;i<8;i++){ if(weight<=0){ break; }else if(weight>= 4001){ break; }else if(weight <= array[i][0]){ printf( "料金 : %d円\n", array[ i ][ 1 ] ); } } }

  • C言語 構造体

    以前にも構造体について質問させていただきましたが、より自由度の高い処理が必要となりご質問させていただきます。 よろしくお願いいたします。 以前のものは入力する項目数(列),行数(行)が前提にあるものでした。 テキストファイルを読み込んで、 構造体としてデータを読み込みたいのですが、 今回は項目数が不定のものです。 a.txt ------------------------- あああ,いいい,ううう ------------------------- とあれば あああ いいい ううう とカンマ抜きで得たい。(3項目) 次回読み込んだとき、 a.txt ------------------------- abc,def,g,h,i,jk ------------------------- とあれば、 abc def g h i jk とカンマ抜きで得たい。(6項目) 以前のものは下記のような感じです。 FILE *fp; FILE *file; struct seiseki seito[20]; char buf[1024]; fp = fopen("aaa.txt", "r"); i=0; while( fgets(buf, sizeof(buf), fp) ){ struct seiseki tmp; sscanf(buf,"%d %s %s %d %d %d",&tmp.no,tmp.lname,tmp.fname,&tmp.val[0],&tmp.val[1],&tmp.val[2]); seito[i++] = tmp; } for(i = 0; i < 3; i++) { printf("%d / %s %s / %d / %d / %d / %d\n", seito[i].no,seito[i].lname,seito[i].fname, seito[i].val[0], seito[i].val[1], seito[i].val[2], seito[i].val[0] + seito[i].val[1] + seito[i].val[2]); }

  • C言語についての質問です。

    C言語で順位表をつくる課題で困っています。 課題でプログラミングをしているのですが、順位表がうまく作成されません。 改善点をご教授ください。 課題は、http://www.centerjoho.com/23_q.pdf の第三問をC言語化するというものです。 よろしくお願いいたします。 以下、プログラムです。 #include <stdio.h> int main(void) { int Tensu[11]={ -1,15,9,26,13,2,28,17,21,12,10} ; int s, bango, sowa, saiko, saitei, heikin, TNin[101]={0} ; int GNin[101], ten, Tenjun[11], Tenban[11] ; int juni, i ; sowa = 0 ; saiko = 0 ; saitei = 100 ; for (bango=1;bango<=10;bango=bango+1) { s = Tensu[bango] ; sowa =sowa+s; if ( s >saiko ) saiko = s ; if ( s <saitei) saitei = s ; TNin[ s ] = TNin[ s ] + 1 ; } heikin = sowa / 10 ; printf("平均点=%d 最高点=%d 最低点=%d\n", heikin, saiko, saitei); GNin[100] = TNin[100] ; for (ten=99;ten>=0;ten=ten-1) GNin[ ten ] = GNin[ ten+ 1 ] + TNin[ ten ] ; for (bango=10;ten>=1;bango=bango-1) { s = Tensu[ bango ]; Tenjun[ GNin[s] ] = s ; Tenban[ GNin[s] ] = bango ; GNin[ s ] = GNin[ s ] - 1 ; } printf("#################\n") ; printf(" 順位 点数 番号\n") ; printf("#################\n") ; juni = 1 ; printf("%4d %4d %4d\n", juni, Tenjun[1], Tenban[1]); for (i=2;i<=10;i=i+1) { if (Tenjun[i] < Tenjun[i-1] ) juni = i ; printf("%4d %4d %4d\n", juni, Tenjun[i], Tenban[i]); } return 0 ; }

  • c言語 成績表示のプログラムです。

    c言語初心者です。課題で出た問題で、生徒の人数、その後出席番号と点数を入れ、ソートしてから表示するプログラムなのですが、人数分打ち終わったあとにセグメンテーション違反になります。添削とともになぜそうなるのか教えてもらえると幸いです。 include <stdio.h> #define MAXDATA 10000 main() { int stnum[MAXDATA],point[MAXDATA],mem; int n,j,k,i,tmp,tmps; printf("生徒数を入力してください。"); scanf("%d",&mem); if(mem<=0){ do{ printf("もう一度生徒数を入力してください。"); scanf("%d", &mem); }while(mem<=0); } for(i=0;i<mem;i++){ printf("%d人目の生徒の点数を入力してください。\n",i+1); scanf("%d", &(point[i])); printf("%d人目の出席番号を数字で入力してください。\n",i+1); scanf("%d", &(stnum[i])); } for(i=0;i<mem-1;i++){ j=i; } for(k=i+1;k<mem;k++){ if(point[j]>point[k]){j=k;} } tmp=point[j]; point[j]=point[i]; point[i]=tmp; for(k=i+1;k<mem;k++){ if(stnum[j]>stnum[i]){j=k;} } tmps=stnum[j]; stnum[j]=stnum[i]; stnum[i]=tmps; for(i=0;i<mem;i++){ printf("%d番の点数は%d点です。", stnum[n],point[n]); } }

  • C言語 アロー演算子

    このようなプログラムを作りたいのですが上手くいきません。 (入力と出力は必ずアロー演算子を使う。) <実行例> 番号を入力:1 名前を入力:taro 番号:1 名前:taro どなたかよろしくお願い致します #include <stdio.h> #include <string.h> typedef struct{ int no; char name[21]; }student; void in(student *std){ char namae[21]; int bango,i=0; scanf("%d", &bango); std->no = bango; while(1){ namae[i] = getchar(); if((i >= 20 ) || (namae[i] == '\n')) break; i++; } i++; namae[i] ='\0'; strcpy(std->name,namae); } void out(student *std){ printf("%d\n", std->no); printf("%s\n", std->name); } main(){ student person; in(&person); out(&person); return 0; }

  • fprint()とfscanf()を用いたプログラムについて

    テキストファイルへの出力はきちんとできているのですが、 得点・合計得点出力のところでつまづいてしまいます。 どうすればいいでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ char name[20]; int ten[3]; }RECORD; void csv(char *); void display_csv_file(char *); FILE *fpcsv; void main(int argc, char **argv) { csv(argv[1]); /* キーボード ⇒ CSV(テキスト)ファイル */ display_csv_file(argv[1]); /* CSV(テキスト)ファイル ⇒ ディスプレィ */ } void csv(char *filename) { RECORD seiseki; int i; fpcsv = fopen(filename,"w+"); while(printf("name(Ctrl + Z終了) >"),gets(seiseki.name) != NULL){ if(seiseki.name != NULL){ for(i = 0; i < 3;i++){ printf("得点%d >", i + 1); scanf("%d", &seiseki.ten[i]); } fprintf(fpcsv,"%s, %d, %d, %d, ", seiseki.name, seiseki.ten[0],seiseki.ten[1],seiseki.ten[2]); } rewind(stdin); } fclose(fpcsv); } void display_csv_file(char *filename) { char buf[255]; int i, sum, tokkuten[3]; fpcsv = fopen(filename,"r+"); while(fscanf(fpcsv,"%s%d%d%d", buf, tokkuten[0],tokkuten[1],tokkuten[2]) != EOF){ /*名前表示*/ strtok(buf,","); printf("name:%s ",buf); /*得点表示&合計計算*/ printf("得点1:%d 得点2:%d 得点3:%d", tokkuten[0],tokkuten[1],tokkuten[2]); sum = tokkuten[0] + tokkuten[1] + tokkuten[2]; /*合計表示*/ printf(" 合計得点: %d\n", sum); } fclose(fpcsv); }

  • プログラムの間違っている箇所が分かりません

    文字列の置換プログラムを作りたいのですが、下記のプログラムでは正常に動きませんでした。 例えば、「call」の「ll」を「sell」と変換しようとするとエラーがでてしまいます。 プログラミング初心者なので、どこが間違っているのかよく分からないです。 以下、問題のあるプログラムを記述します。 #include <stdio.h> void change(char *in, char *bef, char *af){     char tmp[100];     int i = 0, j = 0;     int flg=0;         for(i = 0; *(af + i) != '\0'; i++){         tmp[i] = *(af + i);     }     tmp[i] = '\0';     for(j = 0; *(in + j) != '\0'; j++){     if(flg == 0 && *(bef + j) == '\0'){             flg = 1;     }         if(flg == 1){             tmp[i++] = *(in + j);             tmp[i] = '\0';         }     }     for(j = 0; j<=i; j++){         *(in + j) = tmp[j];     } } int check(char *in, char *bef){       int i=0;     int flg=0;     while(*(bef+i)!='\0'){             if(*(in+i)=='\0' || *(in+i)!=*(bef+i)){             flg=1;             break;         }         i++;     }     return flg; } int main(){     char in[100];     char bef_ch[20];     char af_ch[20];     int i=0;     printf("文字列を入力して下さい。\n");     gets(in);     printf("置換したい文字列を入力して下さい。\n");     gets(bef_ch);     printf("置換後の文字列を入力して下さい。\n");     gets(af_ch);     while(in[i]!='\0'){         if(check(&in[i], &bef_ch[0]) == 0){             change(&in[i], &bef_ch[0], &af_ch[0]);         }         i++;     }     printf("置換結果を示します。\n");     printf("%s\n",in);     return 0; }

  • C言語で得点分布のプログラムの間違いがわからない

    以下のプログラムでfor(i=0; i=<10; i++)が構文エラーだと言われてしまうのですが、間違いがわかりません。ご教示ください。 #include <stdio.h> void main(void) /*得点分布*/ { int i,dat,histo[11]; for(i=0; i=<10; i++) histo[i]=0; printf("得点を入力してください\n"); while(scanf("%d",&dat)!=EOF){ histo[dat/10]++; for(i=0; i=<10; i++) printf("%3d : %3d\n",i*10,histo[i]); }

  • C言語のプログラムについて

    ファイル"data\d.dat"にはテストの各問の点数が以下のフォーマットで記録されている。     学生番号  問1の点数  問2の点数  問3の点数  問4の点数  問5の点数 これを入力し、学生ごとの合計点と、間ごと合計点を求めて表示する(整列前)。次に、間の合計点の 降順に左から右に向かって整列し、さらに、学生の合計点で降順に整列して表示する(整列後)。 <実行例> 整列前 番号  問1  問2  問3  問4  問5  合計 1001  20   30   40   41   90   230 1002  50   30   24    0   95   199 1003  20   33   55   35   90   233 1004  93   55   56   61   90   355 1005  20   50   51   44   90   255 合計 203  198   236   181  455 整列後 番号  問5  問3  問1  問2  問4  合計 1004  90   56   93   55   61   355 1005  90   51   20   50   44   255 1003  90   55   20   33   35   233 1001  90   49   20   30   41   230 1002  95   25   50   30    0   199 合計 455   236  203  198   181 このプログラムを作成したいのですが fscanfでdata-d.datを読み込み横に合計を表示させるのはわかりました。 しかし、縦の合計もだし、その結果から整列して表示させることができずに 困っています。分かるかた教えてください><