コンマで区切られた入力

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
toshi

コンマで区切られた入力

#1

投稿記事 by toshi » 16年前

名前、学籍番号、得点(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]);
のように変数に代入するには、どうすればいいのでしょうか。教えてください。

non

Re:コンマで区切られた入力

#2

投稿記事 by non » 16年前

添付されたプログラムは正しく動かないのではないでしょうか?
とりあえず、動くプログラムにして、タグで囲ってプログラムを載せてもらえませんか。

SCI

Re:コンマで区切られた入力

#3

投稿記事 by SCI » 16年前

質問者さん

コードの掲載には
タグを使ってもらえると嬉しいです。

> コンマで区切られたデータを
> 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()関数を使ってみてもいいと思います。

toshi

Re:コンマで区切られた入力

#4

投稿記事 by toshi » 16年前

返信ありがとうございます。
strtok(a,',');
のようにして、,区切りで分割した後にそれぞれの語句を
scanf("%s %s %d %d %d %d %d",&name[0],&bangou[0],&E,&K,&M,&R,&S);
のように変数に代入することは出来るのでしょうか。教えてください。

SCI

Re:コンマで区切られた入力

#5

投稿記事 by SCI » 16年前

strtokで分割した語句は"text\0"のように、語句が一つの文字列になります。
文字列を数値に変換するには、atoi関数やstrtol関数を使用します。

kazuoni

Re:コンマで区切られた入力

#6

投稿記事 by kazuoni » 16年前

とりあえずソートなしで作ってみました。
コメントなしなんで、解析頑張ってくださいw
(参考になるかといったらならないと思いますが・・・)

丸コピはやめたほうがいいです。
なんせ、人生で初めてgoto文(ジャンプ命令)をわざと使ったりしてますんでw
こういう課題は例外処理をつけてるとキリがないですね。
[,]が6個なかったら再入力を正しますけど、データの順番が
文列,文列,数字,...
でなくてもコンマ数さえ合ってれば通ってしまいます。
完全なる妥協です。ご勘弁。

>走査文字集合
ちょっとこれは知りませんでした・・・(えっ
参考になります^^;

kazuoni

Re:コンマで区切られた入力

#7

投稿記事 by kazuoni » 16年前

いきなりジャンプ先が違ってましたw
なれないものは使わないほうがいいですね・・・。

SCI

Re:コンマで区切られた入力

#8

投稿記事 by SCI » 16年前

スキャン文字集合とも言いますね。
#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] のように改行文字を指定しても意味はないのでした(笑)

toshi

Re:コンマで区切られた入力

#9

投稿記事 by toshi » 16年前

返信ありがとうございます。strtokで,で区切られたデータを分解した後、どのようにすれば、文字列のまま使う分と、atoi関数を使い数値に変換する分を分ければよいのですか。教えてください。お願いします。

SCI

Re:コンマで区切られた入力

#10

投稿記事 by SCI » 16年前

toshiさん
文字列と数値の並び順が一定なら、ifで条件を分ければいいでしょう。あまりスマートではないかも知れませんが・・・

それと、言い忘れていましたが、コンマ区切りのデータを読み込む方法が龍神録プログラミングの方で紹介されています。

閉鎖

“C言語何でも質問掲示板” へ戻る