降順にソートする

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

降順にソートする

#1

投稿記事 by なすび » 1年前

エラーがいくつかありわからないので教えてください。
これが問題文です。
システムは、従業員がdist.txtファイルから読み取ったすべての分配された寄付とその累積数量をリストアップすることを可能にする必要があります。

注:画面に表示する前に、バブルソートで寄付金とその分配数量を降順にソートする必要がある(最も多い数量が最初に表示され、2番目に多い数量がそれに続く)。

私の書いたコードはこれです。
void totalinformation() {
FILE *f;
int n;

char number[5];
int point[5];

if ((f = fopen("dist.txt", "r")) == NULL) {
printf("fileopen faile\n");
return 0;
}
for (n = 0; n < 5; n++)
printf("%\n", n + 1, number[5]);
  return 0;  
fclose(f);
    
}

box
記事: 2002
登録日時: 13年前

Re: 降順にソートする

#2

投稿記事 by box » 1年前

その関数を呼び出しているmain関数など、コード全体は
提示していただけないのですか?

また、今のtotalinformation関数は
戻り値の型がvoidなので
return 0;
しようとするとコンパイルエラーになるはずです。大丈夫ですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

なすび

Re: 降順にソートする

#3

投稿記事 by なすび » 1年前

問題がこの他に三つありそれを全部繋げておりコードが長いので全体はのせませんでした。。
return 0を消してもcharや printf("%\n", n + 1, number[5]);にエラーがあり原因がわからないです。

box
記事: 2002
登録日時: 13年前

Re: 降順にソートする

#4

投稿記事 by box » 1年前

コード:

char number[5];
この定義において、number[]の添字として有効なのは0~4です。

コード:

printf("%\n", n + 1, number[5]);
定義範囲外のnumber[5]を出力しようとすると何が起きるかわかりませんし、
そもそも、
n + 1

number[5]
に対応する書式指定文字列が正しく設定されていません。

コード:

"%\n"
これじゃ、printf君はどういう形式で出力したらいいか困惑していると思いますよ。

ところで、今回の問題の肝である降順ソート部分のコードは提示していただけないのですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 降順にソートする

#5

投稿記事 by box » 1年前

降順ソートうんぬんの前に、そもそも
ファイルから読んでいる箇所(fscanfとか)がなかった…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

なすび

Re: 降順にソートする

#6

投稿記事 by なすび » 1年前

畏まりました。
ご丁寧にありがとうございます!!
申し訳ありません。提示できていませんでした。
全体的に書き換えてみました。
void totalinformation() {
FILE *f;
int n;

char name[5][20];
int quantity[5];

int i;
int j;
char SupplyCode[20];
int number;

if ((f = fopen("dist.txt", "r")) == NULL) {
printf("fileopen faile\n");
}
for (n = 0; n < 5; n++)
fscanf(f, "%s %d", name[n], &quantity[n]);
printf("%s %d \n\n", name[n], quantity[n]);

for (i=0;i<5;i++)
{
for (
j = 0;
j<5;j++)
{
if(quantity<quantity[j])
{
number = quantity;
quantity = quantity[j];
quantity[j] = number;

strcpy(SupplyCode, name);
strcpy(name, name[j]);
strcpy(name[j], SupplyCode);
}
}
}
for (n=0;n<5;n++)
printf("%s: %s \n",n+1,name[n],quantity[n]);


fclose(f);
}

box
記事: 2002
登録日時: 13年前

Re: 降順にソートする

#7

投稿記事 by box » 1年前

コード:

if(quantity<quantity[j])
number = quantity;
quantity = quantity[j];
この3箇所、なんでquantityに適切な添字がないままなんですか?
コンパイルエラーで引っかかってるはずなんですが、
エラーメッセージの読み方は大丈夫ですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 降順にソートする

#8

投稿記事 by みけCAT » 1年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
なすび さんが書きました:
1年前

コード:

        if ((f = fopen("dist.txt", "r")) == NULL) {
            printf("fileopen faile\n");
        }
ファイルオープンに失敗した場合でも、処理を続けてしまっています。
NULLがファイルポインタとしてファイル操作関数に渡され、実行時エラーの原因になります。
printfの後に return; などを追加し、処理を終了するようにしましょう。
なすび さんが書きました:
1年前

コード:

        for (n = 0; n < 5; n++)
            fscanf(f, "%s %d", name[n], &quantity[n]);
        printf("%s %d \n\n", name[n], quantity[n]);
printfがfor文から外れています。
この書き方だと、ループ後の n = 5 の状態でprintfの呼び出しを行うことになり、
配列の範囲外にアクセスしてしまいます。
{} を補い、printfもforループの中で実行するようにしましょう。
なすび さんが書きました:
1年前

コード:

         for (i=0;i<5;i++)
       {
       for (
       j = 0;
       j<5;j++)
      {
      if(quantity[i]<quantity[j])
i > j のときでも quantity[​i]<quantity[j] であれば交換を行うため、ソートがうまく行えない可能性があります。
j の初期値を 0 ではなく i+1 にするとよいでしょう。
オフトピック
なんで内側のfor文が3行に分かれてるんだ…!?
box さんが書きました:
1年前

コード:

if(quantity<quantity[j])
number = quantity;
quantity = quantity[j];
この3箇所、なんでquantityに適切な添字がないままなんですか?
コンパイルエラーで引っかかってるはずなんですが、
エラーメッセージの読み方は大丈夫ですか?
掲示板の不親切設計により、[i​]が斜体タグとみなされ、隠されてしまっています。
codeタグを使わずに貼り付けられたコードは、引用ボタンから確認するとよいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 降順にソートする

#9

投稿記事 by みけCAT » 1年前

なすび さんが書きました:
1年前

コード:

            printf("%s: %s \n",n+1,name[n],quantity[n]);
n+1に対応する書式指定文字列が無いため、
%sにより整数n+1の値を文字列を指すポインタだと思い込んで出力しようとし、
未定義動作になります。
書式または引数を修正し、書式と引数がきちんと対応するようにしましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

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