C++の宿題で困っています。(その2)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kos-mos

C++の宿題で困っています。(その2)

#1

投稿記事 by kos-mos » 15年前

一日に何度もすみません。
今回は挿入ソートを用いて値の小さい順に表示させるという宿題についての質問です。

宿題の内容は以下の通りです。

=問題=

一次配列(要素はint型、要素数は30)に格納されている要素を値の小さい順に並べ替える。
配列の初期値は以下のように,配列の初期化で指定する.
int array[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331, 444, 723, 916, 287, 492, 719, 476, 187, 704, 115, 774, 334, 618, 625, 582, 938, 427, 831, 899, 999};
挿入ソート(insertion sort)アルゴリズムを用いる。

=アルゴリズム=

1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、配列末 尾の要素番号-1になるまで以下の処理を繰り返す。
 1-1. ソート済み位置+1の位置に格納されている要素を挿入要素とする。
 1-2. 挿入位置←ソート済み位置+1
 1-3. 現在位置←ソート済み位置
 1-4. 現在位置が配列先頭の要素番号以上であり、かつ現在位置の要素が 挿入要素よりも大きい限り以下の処    理を繰り返す。
  1-4-1. 現在位置の要素を1つ後ろの位置に格納する。
  1-4-2. 挿入位置←現在位置
  1-4-3. 現在位置を配列の先頭方向に1つ戻す。
 1-5. 挿入要素を挿入位置に格納する。
2. 配列の各要素を表示する。


現在わかる範囲で以下のように書いてみたところ、
コンパイルエラーに「'=' : 左のオペランドが、左辺値になっていません。(27)」と表示されてしまいました。
このプログラムでいいのか自体分からず、ここからどうすればいいのか全く分かりません。

OS:Vista
コンパイラ:VC++ 2008
C++は数カ月程度の初心者です。
二度目の投稿なので至らないところもあると思いますが、どうかよろしく願いします。
#include <iostream>
using namespace std;

#define N 30  //配列の要素数

void main(){
	int array[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331, 444, 723, 916, 287, 492, 719, 476, 187, 704, 115, 774, 334, 618, 625, 582, 938, 427, 831, 899, 999};
	int sortedPos;    //ソート済み位置
	int pos;          //現在位置
	int insertElem;   //挿入要素
	int insertPos;    //挿入位置
	
	//1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、配列末 尾の要素番号-1になるまで以下の処理を繰り返す。
	for(sortedPos = -1; sortedPos < N-1; sortedPos++){

		//1-1. ソート済み位置+1の位置に格納されている要素を挿入要素とする。 
		insertElem = array[sortedPos +1];
		
		//1-2. 挿入位置←ソート済み位置+1 
		insertPos = sortedPos +1;
		
		//1-3. 現在位置←ソート済み位置 
		pos = sortedPos;
		
		//1-4. 現在位置が配列先頭の要素番号以上であり、かつ現在位置の要素が 挿入要素よりも大きい限り以下の処理を繰り返す。 
		while( pos >= sortedPos && array[pos] > insertElem);{
			
			//1-4-1. 現在位置の要素を1つ後ろの位置に格納する。 
			array[pos +1] = array[pos];

			//1-4-2. 挿入位置←現在位置 
			insertPos = pos;
			
			//1-4-3. 現在位置を配列の先頭方向に1つ戻す。 
			pos +1 = pos;
		}

		//1-5. 挿入要素を挿入位置に格納する。 
		insertPos = insertElem;
	}

	//2. 配列の各要素を表示する。
	for(int i = 0; i < N; i++){
		cout << array <<endl;
	}
}

たかぎ

Re:C++の宿題で困っています。(その2)

#2

投稿記事 by たかぎ » 15年前

詳しく見ていませんが、コメントを信じるなら...

> pos +1 = pos;

の部分は

--pos;

ではないでしょうか?

kos-mos

Re:C++の宿題で困っています。(その2)

#3

投稿記事 by kos-mos » 15年前

pos +1 = pos;

の部分を

--pos;

としたところ、エラーは無くなったのですが、実行すると -858993460 が30回表示されるだけでした。

たかぎ

Re:C++の宿題で困っています。(その2)

#4

投稿記事 by たかぎ » 15年前

> エラーは無くなったのですが、実行すると -858993460 が30回表示されるだけでした。

では、コメントがおかしいか、他のところが間違っているのだと思います。

kos-mos

Re:C++の宿題で困っています。(その2)

#5

投稿記事 by kos-mos » 15年前

挿入位置←ソート済み位置+1

はソート済み位置+1を挿入位置に代入するという意味です。

たかぎ

Re:C++の宿題で困っています。(その2)

#6

投稿記事 by たかぎ » 15年前

↓この意味は?

> //1-4-3. 現在位置を配列の先頭方向に1つ戻す。

kos-mos

Re:C++の宿題で困っています。(その2)

#7

投稿記事 by kos-mos » 15年前

現在位置(pos)をpos-1みたいな感じだと思うんですが・・・

kazuoni

Re:C++の宿題で困っています。(その2)

#8

投稿記事 by kazuoni » 15年前

おかしいのは
while( pos >= sortedPos && array[pos] > insertElem);
pos +1 = pos;
insertPos = insertElem;
の三行ですかね。

配列の扱い方ができていないような気がします・・・

#追記
上に挙げた三行についてですが、
一行目はアクセスしてはいけない要素にアクセスしてしまうことがあります。
二行目はたかぎさんのおっしゃる通りです。
三行目は「ポジション」に値を代入するのではなく、「要素」に代入するです。

たかぎ

Re:C++の宿題で困っています。(その2)

#9

投稿記事 by たかぎ » 15年前

> 現在位置(pos)をpos-1みたいな感じだと思うんですが・・・

つまり、

pos = pos - 1;

ですね。これは、

--pos;

と同じ意味です。
このコメントが正しいのであれば、ほかが間違っています。

しっかり見る時間がとれないので、こんな回答になってしまいますが、もう一度良く見直してみてください。

kazuoni

Re:C++の宿題で困っています。(その2)

#10

投稿記事 by kazuoni » 15年前

ごめんなさい。一行目では、なぜかセミコロンが入っているという点を忘れていましたので、さらに追記です・・・

たかぎ

Re:C++の宿題で困っています。(その2)

#11

投稿記事 by たかぎ » 15年前

kazuoniさんが指摘された3箇所を修正すれば動きます。
ただし、最初のwhileについては、

> //1-4. 現在位置が配列先頭の要素番号以上であり、かつ現在位置の要素が 挿入要素よりも大きい限り以下の処理を繰り返す。

でなければならないのに、

現在位置がソート済み位置以上であり、かつ現在位置の要素が 挿入要素よりも大きい限り以下の処理を繰り返す。

になっています。

sizuma

Re:C++の宿題で困っています。(その2)

#12

投稿記事 by sizuma » 15年前

ちょこちょこ変えて考えようかと思ったんですけど、自分でアルゴリズム見て書いた方が早そうなんで、書いてみたです。
変数が多すぎてわけがわからなくなってしまうので・・・

#include <iostream>

using namespace std;

#define N 30  //配列の要素数

void main(){

	int array[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331,
			444, 723, 916, 287, 492, 719, 476, 187, 704, 115,
			774, 334, 618, 625, 582, 938, 427, 831, 899, 999};

	int currentPos;
	int insertElm;
	
	for(int i=0;i<N-1;i++){
		currentPos=i+1;
		insertElm = array[currentPos];
		while(currentPos > 0 && insertElm < array[currentPos-1]){
			array[currentPos] = array[currentPos-1];
			currentPos--;
		}
		array[currentPos] = insertElm;
	}

	for(int i = 0;i<N;i++){
		cout<<array<<endl;
	}
}


頭の中で要素の移動とかを考えながら(もしくはソートの流れを書きながら)したほうがいいのではないでしょうか?
http://ja.wikipedia.org/wiki/%E6%8C%BF% ... C%E3%83%88

kos-mos

Re:C++の宿題で困っています。(その2)

#13

投稿記事 by kos-mos » 15年前

皆さんのご指摘を参考にいじったら、無事完成しました

kos-mos

Re:C++の宿題で困っています。(その2)

#14

投稿記事 by kos-mos » 15年前

本当にありがとうございました。

kos-mos

Re:C++の宿題で困っています。(その2)

#15

投稿記事 by kos-mos » 15年前

解決マークを忘れてました。

閉鎖

“C言語何でも質問掲示板” へ戻る