掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26112

文字列ファイルの並び替えについて…
投稿者---あげは(2006/02/14 14:46:09)


indataファイルの中のデータを得点の高い順に並び替えてoutdataファイルに出力するプログラムを作ったら、変な数字が出てきます。どうしてこうなるんでしょうか?

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

int main(void)
{
  int i=0,j,k,n=0,d[100],f[100],temp,temp2;
char e1[100][100],temp3[100],a,b,c;
FILE *fpin,*fpout;

  printf("データを大きい順に並び替えます。\n");
if((fpin=fopen("indata3.dat","r"))==NULL)
{
printf("A:\indata.datが見つかりません。\n");
     getch();
exit(1);
    }
fpout=fopen("outdata.dat","w");

while(fscanf(fpin,"%d,%s,%d",&f[i],&e1[i][0],&d[i])!=EOF)
{
i++;
n++;
   }
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
        if(d[i]<d[j])
{
   temp=d[j];
 [j]=d[i];
 d[i]=temp;
  for( k=0;k<100;k++ )
     {
  temp3[k]=e1[j][k];
  e1[j][k]=e1[i][k];
  e1[i][k]=temp3[k];
}
temp2=f[j];
f[j]=f[i];
f[i]=temp2;
}
    }
}

fprintf(fpout,"ソート結果\n");
for(i=0;i<n;i++)
{
fprintf(fpout,"%d,%s,%d\n",f[i],e1[i],d[i]);
    }
printf("正常に終了しました\n");
fclose(fpin);
fclose(fpout);
getch();
return 0;
}

indataファイルの例

番号,氏名,得点
1,朝倉凪紗,80
2,芝姫若葉,90
3,阿僧祇那由他,100
4,絢姫菜々惟,50
5,響香織,95
6,戸田黎明,85
7,御門凪,70
8,瑚々音古町,60
9,高村朋季,75
10,佐々椿,48
11,佐久間斜智,32
12,佐倉ひより,68
13,加藤健太,10
14,桜坂秀明,68
15,杉村大輔,36
16,福島敦,77
17,中村太郎,97
18,佐々木幸太郎,44
19,田中ありす,80
20,桜木さくら,97


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列ファイルの並び替えについて… 26113 Blue 2006/02/14 15:07:13
<子記事> Re:文字列ファイルの並び替えについて… 26114 iijima 2006/02/14 15:44:42
<子記事> Re:文字列ファイルの並び替えについて… 26119 nop 2006/02/15 01:13:50


No.26113

Re:文字列ファイルの並び替えについて…
投稿者---Blue(2006/02/14 15:07:13)


とりあえず、「掲示板ご利用上の注意」はよんでください。
> ソースの添付は「HTML変換ツール」で字下げします。
> 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
が守られていません。

とても見づらかったので整形したソースを載せておきます。
(全角空白の混在やインデントでメチャクチャでしたが、、、)

#include<stdio.h> #include<stdlib.h> #include<conio.h> int main(void) { int i=0,j,k,n=0,d[100],f[100],temp,temp2; char e1[100][100],temp3[100],a,b,c; FILE *fpin,*fpout; printf("データを大きい順に並び替えます。\n"); if((fpin=fopen("indata3.dat","r"))==NULL) { printf("A:\indata.datが見つかりません。\n"); getch(); exit(1); } fpout=fopen("outdata.dat","w"); while(fscanf(fpin,"%d,%s,%d",&f[i],&e1[i][0],&d[i])!=EOF) { i++; n++; } for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(d[i]<d[j]) { temp=d[j]; [j]=d[i]; d[i]=temp; for( k=0;k<100;k++ ) { temp3[k]=e1[j][k]; e1[j][k]=e1[i][k]; e1[i][k]=temp3[k]; } temp2=f[j]; f[j]=f[i]; f[i]=temp2; } } } fprintf(fpout,"ソート結果\n"); for(i=0;i<n;i++) { fprintf(fpout,"%d,%s,%d\n",f[i],e1[i],d[i]); } printf("正常に終了しました\n"); fclose(fpin); fclose(fpout); getch(); return 0; }


んで、
> 番号,氏名,得点
> 1,朝倉凪紗,80
のようなデータ構造であれば、普通は構造体を使うのですがどうでしょうか?
struct Student
{
    int  no;         /* 番号 */
    char name[ 64 ]; /* 名前 */
    int  score;      /* 得点 */
};



この投稿にコメントする

削除パスワード

No.26114

Re:文字列ファイルの並び替えについて…
投稿者---iijima(2006/02/14 15:44:42)


>    while(fscanf(fpin,"%d,%s,%d",&f[i],&e1[i][0],&d[i])!=EOF)

fscanfの変換文字列中、"%s"は空白(空白、タブ文字、改行文字)までの文字列を読み
込もうとします。
%sの後に','をつけたからと言って、コンマの手前までで読み込むのを止めてくれません。


次のようにスキャンセットとしてコンマ以外を指定(%[^,])してはいかがでしょうか。

    while( fscanf( fpin, "%d,%[^,],%d\n", &f[i], &e1[i][0], &d[i]) != EOF )
    // %[^,]で、','の手前までの文字列を読み込む



この投稿にコメントする

削除パスワード

No.26119

Re:文字列ファイルの並び替えについて…
投稿者---nop(2006/02/15 01:13:50)


>変な数字が出てきます。どうしてこうなるんでしょうか?

肝心の「現在の出力結果」と、「本来あるべき出力結果」が書かれておりません。
現在ではどう出力されて、どう出力されて欲しいのですか?


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧