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

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

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

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

Q&A

解決済

3回答

5544閲覧

c言語 入門レベル問題 配列の数字を並び替え

GokaTokyo

総合スコア66

C

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

0グッド

0クリップ

投稿2017/12/18 13:17

配列要素1,2,3,4,5 を5,4,3,2,1に出せたいですが、何故か5,4,4,4,4になってしまいましたか?

#define N 5 //配列の要素数 int main() { int num[N] = {1,2,3,4,5}; int sort[N]; int i,max,min; for(i=0;i<N;i++){ printf("num[%d]=%3d\n",i,num[i]); } printf("\n"); for(i=0;i<N;i++){ if( num[i]>num[i-1]){ max=num[i-1]; min=num[i]; } } for(i=0;i<N;i++){ { sort[i]=max; sort[i-1]=min; } } for(i=0;i<N;i++){ printf("sort[%d]=%3d\n",i,sort[i]); } return 0; }

イメージ説明

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

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

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

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

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

guest

回答3

0

ベストアンサー

回答は他の方が書いているので、あなたが書いたプログラムの何がおかしいのかを書いてみますね。

と、その前に、このプログラムには配列のオーバーアクセスが含まれています。なので、これは直す必要があります。

c

1for(i=0;i<N;i++){ 2 if( num[i]>num[i-1]){ // ← i=0の時sort[-1]になるのでマズイ!! 3 max=num[i-1]; // ← i=0の時sort[-1]になるのでマズイ!! 4 min=num[i]; 5 } 6}

まず、この部分ですが、if文では隣り合う数値の大小関係を調べ、配列のインデックスが小さい方の数値が小さい場合、maxにインデックスの小さい方を、minにインデックスの大きい方を代入しています。
配列の中身が{1, 2, 3, 4, 5}なら、for文を処理し終わった時のminとmaxは

max = 4 min = 5

になります。

c

1for(i=0;i<N;i++){ 2 sort[i]=max; 3 sort[i-1]=min; // ← i=0の時sort[-1]になるのでマズイ!! 4}

次にこの部分ですが、sort配列の隣り合う数値にminとmaxを代入してますが、配列のインデックスは1ずつ増えていくので、結果は、

sort[0] = 5 sort[1] = 5 sort[2] = 5 sort[3] = 5 sort[4] = 4

になります。
プログラムを走らせるまでもなく、これくらいはソースを追っかければわかります。

配列インデックスが負になるというバグは別にして、数値の並び替えにはなっていません。
ソートのアルゴリズムには色々なものが有ります。それらを勉強したいのであれば以下をどうぞ。
C言語講座:ソート

投稿2017/12/19 08:20

PineMatsu

総合スコア3579

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

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

0

maxとminとsortの関係が良くわかりませんが、sortの部分を作ってみました。

c

1#include <stdio.h> 2#define N 5 //配列の要素数 3 4int main() 5{ 6 int num[N] = {1,2,3,4,5}; 7 int sort[N]; 8 int i,j,max,mi; 9 10 for(i=0;i<N;i++){ 11 printf("num[%d]=%3d\n",i,num[i]); 12 } 13 14 printf("\n"); 15 16 for(i=0;i<N;i++){ 17 max=num[i]; 18 mi=i; 19 for(j=i+1;j<N;j++){ 20 if (max < num[j]){ 21 max = num[j]; 22 mi = j; 23 } 24 } 25 num[mi]=num[i]; 26 sort[i]=max; 27 } 28 29 for(i=0;i<N;i++){ 30 printf("sort[%d]=%3d\n",i,sort[i]); 31 } 32 33 return 0; 34}

一番大きいものを右から順に並べています。

投稿2017/12/18 15:47

編集2017/12/18 15:58
A.Ichi

総合スコア4070

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

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

GokaTokyo

2017/12/19 13:18

ソースコードいただき、ありがとうございます!!
guest

0

配列要素1,2,3,4,5 を5,4,3,2,1に出せたいですが

...並びを反転させたいの? それとも大きい順にsortしたいの?
sortしたいんなら自前で書かずにqsort呼べばいい。
※ 「sortアルゴリズムを書きたい」が目的ならともかく

C

1#include <stdio.h> 2#include <stdlib.h> 3 4static int int_compare(const void* x, const void* y) { 5 return *(const int*)y - *(const int*)x; 6} 7 8#define N 5 9 10int main() { 11 int num[N] = {1,2,3,4,5}; 12 qsort(num, N, sizeof(int), int_compare); 13 14 printf("%d %d %d %d %d\n", num[0], num[1], num[2], num[3], num[4]); 15 return 0; 16}

投稿2017/12/19 01:19

episteme

総合スコア16614

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

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

GokaTokyo

2017/12/19 13:19

こいうもできるですね、ありがとうございます!感謝!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問