- ベストアンサー
C言語初心者です。
C言語初めて壁にぶち当たりました。下の問題がとけません。よろしくお願いします。 標準入力から整数値を4個,int型の配列へ読み込んで,これかの値を大きい順に配列上で並び替え,出力するプログラムを作成してください。ただし,for文の2重ループを必ず使用してください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 並べ替えるためのforのループと比較して必要ならデータを > 入れ替えるというところをどのように作成すれば > いいかがわかりません。 ふむ。 先のそれ以外の部分はとりあえずは大丈夫ということで良いとして、さきに一例を挙げます。 /* C形式のコメントは今回のコメントで、C++形式のコメントは前回のコメントです。 */ int main() { // for文で使う変数を2個宣言 // intの配列(サイズ=4)を宣言 int i,j; int array[4]; // 読み込み(データを4個) /* 検証が面倒なので、仮にデータを直接代入する。 ここは多分既に学習済みなのでしょうから、ご存知の方法で代入するようにしてください。 */ array[0]=254; array[1]=351; array[2]=153; array[3]=289; // 並べ替えるためにforのループ(外側) // 並べ替えるためにforのループ(内側) // 入れ替え用のintの変数を1個宣言 // 比較して // 必要ならデータを入れ替え // (内側)ループ終了 // (外側)ループ終了 // 出力 // 終わり for(i = 0; i < 4; i++) { printf("%d: %d\n", i, array[i]); } return 0; } こんな感じで良いでしょうか。 さて、 並べ替え方法ですが、 2重ループを用いた並べ替えの基本、バブルソートで 説明しましょうか。 この並べ替え方法は、データの終端から隣同士を順次比較し、初端にほしいデータが行くように入れ替えていくということです。 // 並べ替えるためにforのループ(外側) for(i=0;i<4;i++) { // 並べ替えるためにforのループ(内側) /* ここで後ろから比較するのがバブルソート #2の方のように頭から比較して最大値を探すようにすると、選択ソートselection sortという方法です。 この二つは二重ループソートの基本中の基本です。 */ for(j=4;j<i;j--) { // 入れ替え用のintの変数を1個宣言 int temp; // 比較して if(array[j]>array[j-1]) { // 必要ならデータを入れ替え /* この入れ替え用の変数を用いて入れ替える部分は、よく使います。 */ temp=array[j]; array[j]=array[j-1]; array[j-1]=temp; } // (内側)ループ終了 } // (外側)ループ終了 } javaアプレットでバブルソートの動作を可視的に見せてくれるサイトがありましたので、参考URLに出しておきます。
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
/* 1つの例 */ #if 0 標準入力から整数値を4個,int型の配列へ読み込んで,これかの値を大きい順に配列上で並び替え,出力するプログラムを作成してください。ただし,for文の2重ループを必ず使用してください。 #endif #include <stdio.h> #include <stdlib.h> #define SIZE 4 int main(void){ int data[SIZE]; int i, j, max, wk; char inpStr[16]; for(i=0;i<SIZE;i++){ printf("整数値入力して下さい:"); gets(inpStr); data[i]=atoi(inpStr); } for(i=0;i<SIZE-1;i++){ max=data[i]; for(j=i+1;j<SIZE;j++){ if(data[j]>max){ wk=max; max=data[i]=data[j]; data[j]=wk; } } } for(i=0;i<SIZE;i++) printf("%d ",data[i]); return(0); }
- rentahero
- ベストアンサー率53% (182/342)
いったいどこがわからんのでしょうか。 とりあえず書けたところまででも出してください。 これは、どこかの演習問題でしょうか。 まあ擬似プログラムを出しときますから、 ここにプログラムを入れていって、実行してみてください。 int main() { // for文で使う変数を2個宣言 // intの配列(サイズ=4)を宣言 // 読み込み(データを4個) // 並べ替えるためにforのループ(外側) // 並べ替えるためにforのループ(内側) // 入れ替え用のintの変数を1個宣言 // 比較して // 必要ならデータを入れ替え // (内側)ループ終了 // (外側)ループ終了 // 出力 // 終わり }
補足
ご回答ありがとうございます。 並べ替えるためのforのループと比較して必要ならデータを入れ替えるというところをどのように作成すればいいかがわかりません。
お礼
ご回答ありがとうございました。参考にしたらできました。 #include<stdio.h> void main(void){ int x,i,j,a[4]; for(i=0;i<=3;i++){ scanf("%d",&a[i]); } for(i=0;i<=3;i++){ for(j=3;j>=i;j--){ if(a[j]>a[j-1]){ x=a[j]; a[j]=a[j-1]; a[j-1]=x; } } } i=0; while(i<=3){ printf("%d ",a[i]); i++; } printf("\n"); }