初めまして
配列問題がわからないのでご助力お願いします
問題は
下記に示すプログラムで配列を一つのみのプログラムに書き換えよ
#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');
}
このプログラムは大きい数字から順に並べるプログラムで
上の関数が最大値要素の添字を返すようになっています
配列問題について
Re: 配列問題について
バブルソートでも使って、data[]の要素どうしを直接交換するようにすれば、
res[]は不要です。
res[]は不要です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 配列問題について
バブルソートでも使って、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;
}
こうなりました。
これでも実行した結果正当得られるのですが、元のものから離れすぎてて…
最初に書いたものでもバブルソートは使えるのでしょうか?
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;
}
こうなりました。
これでも実行した結果正当得られるのですが、元のものから離れすぎてて…
最初に書いたものでもバブルソートは使えるのでしょうか?
Re: 配列問題について
穴埋め問題っぽくしてみました。これは、選択ソートと呼ばれるアルゴリズムです。考えてみてください。
Re: 配列問題について
>>そこの穴埋めでプログラムは完成するのでしょうか?a5ua さんが書きました:穴埋め問題っぽくしてみました。これは、選択ソートと呼ばれるアルゴリズムです。考えてみてください。
Re: 配列問題について
上の関数を最小値要素の添字を返す関数にすれば良いかも。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');
}
Re: 配列問題について
上の関数を最小値要素の添字を返す関数にすれば良いかも。
最大値要素の添字を返す関数のまま行なう場合には変更点が増えそうに感じました。
>>実際そのままやって変更点が多くて混乱してしまいました
data[5]=やらi<5 count<5やらは書かない方が良いです(依存する値があちこちに散らばってるのも)。
>>今回はata[5]=やらi<5 count<5が既に指定されていたのでこのままいきました
とても参考になりました
ありがとうございます
最大値要素の添字を返す関数のまま行なう場合には変更点が増えそうに感じました。
>>実際そのままやって変更点が多くて混乱してしまいました
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');
}
ありがとうございます