ページ 11

課題

Posted: 2018年12月20日(木) 11:17
by らっくま
c言語の課題です。
入力された10個の整数を大きい順に並べ変えて出力するにはどのように書けばいいのですか?
whileやforを使えば良いのはわかったけど、続きがわからないので教えてください。

Re: 課題

Posted: 2018年12月20日(木) 19:54
by usao
まず【10個の整数が与えられたとき,その中の最大値を見つける処理】は作れるものと仮定する.
ここでは説明を簡単にするため,以下のような関数として実装されるとしよう.

コード:

//引数Valuesには要素数がArraySize個の配列の先頭を指定してね.
//最大値の要素のindexを返すよ.
int IndexOfMaxValue( int *Values, size_t ArraySize )
{ ... }
さて,これができれば,話は簡単.

入力された10個の整数を,配列に格納し,
IndexOfMaxValue( 配列, 10 );
とすれば,10個の整数のうち最大値のindexが得られるのだから,まずはその要素の値を出力すればいい.

次は残り9個のうちの最大値を出力する必要があるが,これは
配列の{先ほど見つけた最大値位置の要素 と 10番目の位置の要素}の値を交換してしまえば,
IndexOfMaxValue( 配列, 9 );
とすることで,
「残りの9個のうちの最大値」として「元々の10個の整数のうち,2番目に小さい値」を特定できる.
その値を出力する.

次は残り8個のうちの最大値を出力する必要があるが,これは
配列の{先ほど見つけた最大値位置の要素 と 9番目の位置の要素}の値を交換してしまえば,
IndexOfMaxValue( 配列, 8 );
とすることで,やはり特定できる.

以下同様に繰り返せばよい.

Re: 課題

Posted: 2018年12月27日(木) 05:22
by かずま
らっくま さんが書きました:
5年前
入力された10個の整数を大きい順に並べ変えて出力するにはどのように書けばいいのですか?
whileやforを使えば良いのはわかったけど、続きがわからないので教えてください。
(1) 10個の整数の入力
(2) 大きい順の並べ替え
(3) 10個の整数の出力
の 3つのうち、(1) と (3) は分かっているということでしょうか?
質問するときは、フォーラム(掲示板)ルールにあるように
どこまで分かっているのかを書きましょう。続きが分からないのなら、
それ以前の分かっている部分のコードを示してください。

(2) については、すでに解法が回答されていますが、これは
選択ソートというものです。
単純ソートには他にも、バブルソートや挿入ソートがあります。
例えば、挿入ソートは次のようなコードになります。

コード:

	for (i = 1; i < 10; i++) {
		t = a[i];
		for (j = i; j > 0 && a[j-1] < t; j--) a[j] = a[j-1];
		a[j] = t;
	}

Re: 課題

Posted: 2018年12月28日(金) 14:40
by usao
「見つけた最大値を都度配列の後ろ側に持ってく」よりも
「見つけた最大値を都度最小値に書き換えてしまう」の方が簡単で良かったかな?