質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

828閲覧

C言語 並べ替えが上手く出来ません

chara1234d

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/10/17 13:32

C言語です。
最大10個の数字を入れて、合計、平均、降順で並べ替え、をするものです。
この中の並べ替えですが、
サンプル数が10個で、
1,2,3,4,5,6,7,8,9,10
を入れると
10,9,8,7,6,5,4,3,2,1
と適切に並べ替えてくれます。
しかし
バラバラな数字を入れると、並べ替えをせずに終わってしまうことが多々あります。
いろいろ調べてみましたが、どうしても上手く行きません。
宜しくお願いします。

#include <stdio.h>

int addavg(int *x, int *y, float *z ,int a);
int narabikae(int *x, int a);

int main(void){
int sum;
float avg;
sum = 0;
avg = 0;
int i=0;
int n=0;
int num[10] = {0,0,0,0,0,0,0,0,0,0};

printf("いくつの数の合計と平均を求めますか? ="); scanf("%d",&n); printf("%d\n",n); for(i=0;i<n;i++) { scanf("%d", &num[i]); printf("num[%d] =%d\n", i, num[i]); } addavg(&num[0], &sum, &avg, n); printf("\n合計 =%d\n",sum); printf("平均 =%.2f\n",avg); /*並び替え*/ narabikae(&num[0], n); printf("\n並び替え結果(降順)\n"); for(i=0;i<n;i++) { printf("num[%d] =%d\n", i, num[i]); }

}

int addavg(int *x, int *y, float *z, int a)
{
int i;
for (i = 0; i < a; i++)
{
*y = *y + *(x+i);
}

*z = (float)*y/a; return 0;

}

int narabikae(int *x, int a)
{
int i;
int j;
int max;
int b;
int temp;

for(i =0; i < a-1; i++) { max = *(x+i); b = i; for(j = i+1; j <a; j++) { if(*(x+j) > max) { max = *(x+j); b = j; } temp = *(x+i); *(x+i) = *(x+b); *(x+b) = temp; } } return 0;

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

jのループの中で一度bが書き換わると
jのループを抜けるまでbの値は書き換わった状態になっています。
そのため、現状の処理では毎回bの値をリセット(iを代入)する必要があります。

C

1 for(j = i+1; j <a; j++) 2 { 3 if(*(x+j) > max) 4 { 5 max = *(x+j); 6 b = j; 7 } 8 temp = *(x+i); 9 *(x+i) = *(x+b); 10 *(x+b) = temp; 11 b = i; 12 }

投稿2020/10/17 23:58

Gak

総合スコア83

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Gak

2020/10/18 00:27

他の回答のとおりループの外に入れ替え処理を移動する方が良いですね。 maxに入れ替える値は退避できているので変数tempはなくても入れ替えできますね。
guest

0

temp = *(x+i);
の前に } を追加

*(x+b) = temp;
の次の行の } を削除

位でいいんじゃないでしょうか。

投稿2020/10/17 14:53

編集2020/10/18 03:45
PingHermit

総合スコア478

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chara1234d

2020/10/17 15:59

多忙のところ、早速のご回答、ありがとうございます。 こんな時刻ですが、頂いた回答を基に、これから直してみます。
Gak

2020/10/18 00:10

temp = *(x+i); の前に `}` を追加 ですよね。
PingHermit

2020/10/18 03:47

失礼。 そうですね(^^; 修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問