配列問題について

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

配列問題について

#1

投稿記事 by SOS » 14年前

初めまして
配列問題がわからないのでご助力お願いします

問題は
下記に示すプログラムで配列を一つのみのプログラムに書き換えよ


#include <stdio.h>

int my_max1(int num[], int m){
int i, temp, max_id;
for(i=0; i<m; i++){
if(i>0){
if(num>temp){
temp=num;
max_id=i;
}
}
else{
temp=num;
max_id=i;
}
}
return max_id;
}
main()
{
int i, j, data[5]={8,5,12,7,9}, count;
int res[5];
for(count=5; count>0; count--){
i=my_max1(data, count);
res[5-count]=data;
for(j=i; j<count-1; j++){
data[j]=data[j+1];
}
}
for(i=0; i<5; i++){
printf("%3d", res);
}
putchar('\n');
}

このプログラムは大きい数字から順に並べるプログラムで
上の関数が最大値要素の添字を返すようになっています

box
記事: 2002
登録日時: 14年前

Re: 配列問題について

#2

投稿記事 by box » 14年前

バブルソートでも使って、data[]の要素どうしを直接交換するようにすれば、
res[]は不要です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

SOS

Re: 配列問題について

#3

投稿記事 by SOS » 14年前

バブルソートでも使って、data[]の要素どうしを直接交換するようにすれば、
res[]は不要です。

>>バブルソートが解らなかったのでネットで参考にして自分で作ってみたんですが

#include <stdio.h>

void bubble(int a[],int n){
int w, i, j;
for(i=0; i<n-1; i++){
for(j=i+1; j<n; j++){
if(a<a[j]){
w=a;
a=a[j];
a[j]=w;
}
}
}
}

main() {

int i, data[]={8,5,12,7,9};
int n=sizeof(data)/sizeof(data[0]);
bubble(data,n);
for(i=0; i<n; i++)
printf("%d ",data);
printf("\n");
return 0;
}

こうなりました。
これでも実行した結果正当得られるのですが、元のものから離れすぎてて…

最初に書いたものでもバブルソートは使えるのでしょうか?

アバター
a5ua
記事: 199
登録日時: 14年前

Re: 配列問題について

#4

投稿記事 by a5ua » 14年前

穴埋め問題っぽくしてみました。これは、選択ソートと呼ばれるアルゴリズムです。考えてみてください。

コード:

int main(void)
{
	int i, x;
	int data[5] = {8, 5, 12, 7, 9};
	
	for (i = 0; i < 4; i++) {
		/* (1) data[i] ~ data[4] から最大値の位置xを探す */
		x = my_max1(???, ???);
		/* (2) data[i] と data[i + x] の値を入れ替える*/
	}

	for (i = 0; i < 5; i++) {
		printf("%3d", data[i]);
	}
	putchar('\n');
	return 0;
}

SOS

Re: 配列問題について

#5

投稿記事 by SOS » 14年前

a5ua さんが書きました:穴埋め問題っぽくしてみました。これは、選択ソートと呼ばれるアルゴリズムです。考えてみてください。

コード:

int main(void)
{
	int i, x;
	int data[5] = {8, 5, 12, 7, 9};
	
	for (i = 0; i < 4; i++) {
		/* (1) data[i] ~ data[4] から最大値の位置xを探す */
		x = my_max1(???, ???);
		/* (2) data[i] と data[i + x] の値を入れ替える*/
	}

	for (i = 0; i < 5; i++) {
		printf("%3d", data[i]);
	}
	putchar('\n');
	return 0;
}
>>そこの穴埋めでプログラムは完成するのでしょうか?

1964
記事: 5
登録日時: 14年前

Re: 配列問題について

#6

投稿記事 by 1964 » 14年前

SOS さんが書きました:初めまして
配列問題がわからないのでご助力お願いします

問題は
下記に示すプログラムで配列を一つのみのプログラムに書き換えよ
このプログラムは大きい数字から順に並べるプログラムで
上の関数が最大値要素の添字を返すようになっています
上の関数を最小値要素の添字を返す関数にすれば良いかも。
最大値要素の添字を返す関数のまま行なう場合には変更点が増えそうに感じました。

data[5]=やらi<5 count<5やらは書かない方が良いです(依存する値があちこちに散らばってるのも)。
int data[] = {20, 8,5,12,22,7,9}的にデータだけ変えれば使える様に書いた方が望ましそうな気もします。

コード:

#include <stdio.h>

int my_max1(int num[], int m){
 int i, temp=num[m], max_id=m;
 for(i=m+1; i<5; i++){
  if(num[i]>temp){
   max_id=i;
   temp=num[i];
  }
 }
return max_id;
}
int main( void )
{
int i, j, data[5]={8,5,12,7,9}, count, work;
for(count=0; count<5; count++){
i=my_max1(data, count);
work=data[count];
data[count]=data[i];
data[i]=work;
}
for(i=0; i<5; i++){
printf("%3d ", data[i] );
}
putchar('\n');
}

SOS

Re: 配列問題について

#7

投稿記事 by SOS » 14年前

上の関数を最小値要素の添字を返す関数にすれば良いかも。
最大値要素の添字を返す関数のまま行なう場合には変更点が増えそうに感じました。

>>実際そのままやって変更点が多くて混乱してしまいました


data[5]=やらi<5 count<5やらは書かない方が良いです(依存する値があちこちに散らばってるのも)。
>>今回はata[5]=やらi<5 count<5が既に指定されていたのでこのままいきました

コード:

#include <stdio.h>

int my_max1(int num[], int m){
 int i, temp=num[m], max_id=m;
 for(i=m+1; i<5; i++){
  if(num[i]>temp){
   max_id=i;
   temp=num[i];
  }
 }
return max_id;
}
int main( void )
{
int i, j, data[5]={8,5,12,7,9}, count, work;
for(count=0; count<5; count++){
i=my_max1(data, count);
work=data[count];
data[count]=data[i];
data[i]=work;
}
for(i=0; i<5; i++){
printf("%3d ", data[i] );
}
putchar('\n');
}
とても参考になりました
ありがとうございます

閉鎖

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