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

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

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

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

Q&A

解決済

1回答

2319閲覧

ポインタを用いた並び替え

Red_Bull

総合スコア19

C

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

0グッド

0クリップ

投稿2021/09/22 06:46

編集2021/09/22 07:34

降順で並べ替えるコードを書きたいのですが、正しく並び替えられません。
特に8,7,6等の大きいものから入力した際にも__deascend__内のif文が実行されてしまい、正しい順番で表示されません。
どのように変更をすれば良いでしょうか

また、バブルソートについても調べたのですがfor文を使った例しか出てこないです。
今回のような場合もfor文を利用して並び替えるのが正しいですか?

c

1#include<stdio.h> 2 3void deascend(int *x, int *y, int *z); 4void swap(int *a, int *b); 5 6int main(void) { 7 int n1,n2,n3; 8 9 printf("n1:"); scanf("%d", &n1); 10 printf("n2:"); scanf("%d", &n2); 11 printf("n3:"); scanf("%d", &n3); 12 13 deascend(&n1, &n2, &n3); 14 15 printf("%d, %d, %d\n", n1, n2, n3); 16 17 return 0; 18} 19 20void deascend(int *x, int *y, int *z) { 21 22 if (*x > *y) swap(x,y);printf("[1]%d,%d\n",*x,*y); 23 if (*y > *z) swap(y,z);printf("[2]%d,%d\n",*y,*z); 24 if (*z > *x) swap(z,x);printf("[3]%d,%d\n",*z,*x); 25 26 return; 27} 28 29void swap(int *a, int *b) { 30 int i; 31 i = *a; 32 *a = *b; 33 *b = i; 34 return; 35}

terminal

1n1:1 2n2:2 3n3:3 4[1,2,3] 5[1]2,1 6[2]3,1 7[3]1,2 82, 3, 1

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

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

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

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

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

fana

2021/09/22 07:05 編集

関数deascendの中にはifが3つ書かれていますが,こう書いたからには ・それぞれを何をするための処理として書いたのか? ・どうしてこの順番で書いたのか? といった考えがあったハズ. まずはそういうところを自身で整理してみてはどうでしょう.
jimbe

2021/09/22 07:23

「バブルソート」というソート法によるコードをお探しになれば、何時何処と何処を比較・交換すればソート出来るかの参考になると思います。
jimbe

2021/09/22 07:38

> バブルソートについても調べたのですがfor文を使った例しか 注目して頂きたいのは for 文か if 文かでは無く、「いつ」「どことどこを」比較・交換しているか、です。
fana

2021/09/22 07:51

正直何に躓いているのかがわからない. とりあえず3要素しかないのだから,かっこつけて「バブルソートがどうの」とか言わずとも,自明な手順をそのままコード化すればよいだけではないのか? 例えば「数値が書かれたカードが3枚配られたときに,それを自分が降順に並べかえるとしたらどうやるか?」とか何とか考えてみればよい. トランプで自分に配られた手札を見やすいように並び替えたりとかは普通にやるっしょ. 普通にやるってことは手順は自明ってことだ. (現実世界でこれができない,というのならば自明とは言えなくなるが)
guest

回答1

0

ベストアンサー

特に8,7,6等の大きいものから入力した際にも

その場合、

C

1if (*x > *y)

*x = 8, *y = 7ですよね? 条件式をよくご覧ください

で、これを直したところで、
例えば1, 2, 3が渡されたとき

1, 2, 3
↓1番目と2番目を入れ替える
2, 1, 3
↓2番目と3番目を入れ替える
2, 3, 1
↓1番目と3番目は入れ替わらない
2, 3, 1

となってしまいます。

投稿2021/09/22 07:01

ozwk

総合スコア13553

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

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

Red_Bull

2021/09/22 07:14 編集

if (*x < *y) に変更してもif文内が実行されてしまいます。
ozwk

2021/09/22 07:14

上2つのif文はif(前 後)ですが、一番下だけif(後 前)と向きが違います。
Red_Bull

2021/09/22 07:21

if (*x < *y) swap(x,y); if (*y < *z) swap(y,z); if (*z > *x) swap(z,x); ににすれば良いという事でしょうか また3,4,2と入力した際にもswapされてしまいます。 なぜなのかを教えていただきたいです。
ozwk

2021/09/22 07:24

3<4なのでスワップされて当然では?
Red_Bull

2021/09/22 07:30

勘違いしていました。理解しました。 ozwkさんの で、これを直したところで、 例えば1, 2, 3が渡されたとき 1, 2, 3 ↓1番目と2番目を入れ替.... という部分の仕組みは理解できるのですが、どのように解決をしたら良いのかがわからないので教えていただきたいです。
ozwk

2021/09/22 07:32

バブルソートで検索してください
ozwk

2021/09/22 07:37

wikipediaより: > 全ての要素に関して、隣接する要素と比較し順序が逆であれば入れ替える。これを要素数-1回繰り返すことでソートを行なう。
Red_Bull

2021/09/22 07:46

隣接する要素と比較するという部分が理解できていませんでした。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問