名前、学籍番号、得点(5教科)がコンマで区切られているデータが10人分ある。平均点の高い順にソートして、60点以上が合格する。1教科でも0点があれば、不合格となる。このプログラムを作成せよ。という問題なのですが、コンマで区切るのではなく、空白で区切る問題なら
#include <stdio.h>
#include <math.h>
#define N 50
main()
{
int i,l,n,s,j,m,max1,max4,max5,max6,max7,max8;
int E[N],K[N],M[N],R[N],S[N],G[N],H[N];
char *name[N][10], *bangou[N][10],*max2,*max3;
for(i=0;i<N;i++){
s=scanf("%s %s %d %d %d %d %d",&name[0],&bangou[0],&E,&K,&M,&R,&S);
if(s == EOF) break;
}
n=i;
for(i=0;i<n;i++){
G = E + K + M[i] + R[i] + S[i];
H[i] = G[i] / 5;
}
for(j=0;j<i;j++){
for(m=i;m>j;m--){
if(H[m] > H[m-1]){
max1 = H[m];
max2 = name[m][0];
max3 = bangou[m][0];
max4 = E[m];
max5 = K[m];
max6 = M[m];
max7 = R[m];
max8 = S[m];
H[m] = H[m-1];
E[m] = E[m-1];
K[m] = K[m-1];
M[m] = M[m-1];
R[m] = R[m-1];
S[m] = S[m-1];
name[m][0] = name[m-1][0];
bangou[m][0] = bangou[m-1][0];
H[m-1] = max1;
E[m-1] = max4;
K[m-1] = max5;
M[m-1] = max6;
R[m-1] = max7;
S[m-1] = max8;
name[m-1][0] = max2;
bangou[m-1][0] = max3;
}
}
}
for(l=0;l<i;l++){
if(H[i]<60 || K[i] = 0 || E[i] = 0 || S[i] = 0 || M[i] = 0 || R[i] = 0){
printf("%s,%s,%d,%d,%d,%d,%d,%d,不合格\n",
name[[/url],bangou[[/url],E[[/url],K[[/url],M[[/url],R[[/url],S[[/url],H[[/url]);
}
else printf("%s,%s,%d,%d,%d,%d,%d,%d,合格\n",
name[[/url],bangou[[/url], E[[/url],K[[/url],M[[/url],R[[/url],S[[/url],H[[/url]);
}
}
このようなプログラムで上手くいくのですが、コンマで区切られたデータを
scanf("%s %s %d %d %d %d %d",&name[i][0],&bangou[i][0],&E[i],&K[i],&M[i],&R[i],&S[i]);
のように変数に代入するには、どうすればいいのでしょうか。教えてください。
コンマで区切られた入力
Re:コンマで区切られた入力
質問者さん
コードの掲載には
ただ、あまり一般的ではないので、手動で分割するかstrtok()関数を使ってみてもいいと思います。
コードの掲載には
タグを使ってもらえると嬉しいです。 > コンマで区切られたデータを > scanf("%s %s %d %d %d %d %d",&name[0],&bangou[0],&E,&K,&M,&R,&S); > のように変数に代入する とりあえず、コードは無視してこの部分だけ。 空白のときと同様に「基本的には」scanf("%d,%d,%d", ...)とすれば、カンマ区切りで入力できます。 だたし、「%s」(文字列)を受ける場合には、カンマも文字列として読み込んでしまうので、カンマは受け取らないようにする必要があります。 具体的には走査文字集合[pre]%[...]を使って、入力文字列
%[^,\n]とでも指定すればいいわけです。
ただ、あまり一般的ではないので、手動で分割するかstrtok()関数を使ってみてもいいと思います。
Re:コンマで区切られた入力
返信ありがとうございます。
strtok(a,',');
のようにして、,区切りで分割した後にそれぞれの語句を
scanf("%s %s %d %d %d %d %d",&name[0],&bangou[0],&E,&K,&M,&R,&S);
のように変数に代入することは出来るのでしょうか。教えてください。
strtok(a,',');
のようにして、,区切りで分割した後にそれぞれの語句を
scanf("%s %s %d %d %d %d %d",&name[0],&bangou[0],&E,&K,&M,&R,&S);
のように変数に代入することは出来るのでしょうか。教えてください。
Re:コンマで区切られた入力
strtokで分割した語句は"text\0"のように、語句が一つの文字列になります。
文字列を数値に変換するには、atoi関数やstrtol関数を使用します。
文字列を数値に変換するには、atoi関数やstrtol関数を使用します。
Re:コンマで区切られた入力
とりあえずソートなしで作ってみました。
コメントなしなんで、解析頑張ってくださいw
(参考になるかといったらならないと思いますが・・・)
丸コピはやめたほうがいいです。
なんせ、人生で初めてgoto文(ジャンプ命令)をわざと使ったりしてますんでw
こういう課題は例外処理をつけてるとキリがないですね。
[,]が6個なかったら再入力を正しますけど、データの順番が
文列,文列,数字,...
でなくてもコンマ数さえ合ってれば通ってしまいます。
完全なる妥協です。ご勘弁。
>走査文字集合
ちょっとこれは知りませんでした・・・(えっ
参考になります^^;
コメントなしなんで、解析頑張ってくださいw
(参考になるかといったらならないと思いますが・・・)
丸コピはやめたほうがいいです。
なんせ、人生で初めてgoto文(ジャンプ命令)をわざと使ったりしてますんでw
こういう課題は例外処理をつけてるとキリがないですね。
[,]が6個なかったら再入力を正しますけど、データの順番が
文列,文列,数字,...
でなくてもコンマ数さえ合ってれば通ってしまいます。
完全なる妥協です。ご勘弁。
>走査文字集合
ちょっとこれは知りませんでした・・・(えっ
参考になります^^;
Re:コンマで区切られた入力
スキャン文字集合とも言いますね。
%[^,\n] のように改行文字を指定しても意味はないのでした(笑)
#include <stdio.h> int main(void) { char str[32]; int a, b, c; scanf("%[^,],%d,%d,%d", str, &a, &b, &c); printf("%s,%d,%d,%d\n", str, a, b, c); return 0; }こんな感じです。
%[^,\n] のように改行文字を指定しても意味はないのでした(笑)
Re:コンマで区切られた入力
返信ありがとうございます。strtokで,で区切られたデータを分解した後、どのようにすれば、文字列のまま使う分と、atoi関数を使い数値に変換する分を分ければよいのですか。教えてください。お願いします。
Re:コンマで区切られた入力
toshiさん
文字列と数値の並び順が一定なら、ifで条件を分ければいいでしょう。あまりスマートではないかも知れませんが・・・
それと、言い忘れていましたが、コンマ区切りのデータを読み込む方法が龍神録プログラミングの方で紹介されています。
文字列と数値の並び順が一定なら、ifで条件を分ければいいでしょう。あまりスマートではないかも知れませんが・・・
それと、言い忘れていましたが、コンマ区切りのデータを読み込む方法が龍神録プログラミングの方で紹介されています。