- 締切済み
C言語のプログラムについて
jppyの回答
- jppy
- ベストアンサー率14% (14/99)
while(scanf("%d", &bango)!= EOF) lo=0; を回してもしかたがないのではなかろうか? ちなみに中括弧は省略しないほうよいかと私は思います ちなみに探索対象のデータが学生番号でソートされていると思うのですが・・・? 昇順?降順?どちらですかね?
関連する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・C++・C#
- 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++・C#
- 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++・C#
- 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・C++・C#
- 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; }
- ベストアンサー
- C・C++・C#
- 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); }
- ベストアンサー
- C・C++・C#
- プログラムの間違っている箇所が分かりません
文字列の置換プログラムを作りたいのですが、下記のプログラムでは正常に動きませんでした。 例えば、「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・C++・C#
- 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・C++・C#
- 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を読み込み横に合計を表示させるのはわかりました。 しかし、縦の合計もだし、その結果から整列して表示させることができずに 困っています。分かるかた教えてください><
- 締切済み
- C・C++・C#
補足
回答ありがとうございます。 降順です。