みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

c言語 select sort

最大値検索法のプログラムコードです。
どこがおかしいのでしょうか?
分かる方、教えてください。
よろしくおねがいします。

swapのプログラムコード
#include <stdio.h>
void swap(int *px,int *py);
int main (void)
{
FILE *fp;
if ((fp=fopen("file.txt","rt"))==NULL){
printf("File open error.\n");
return 0;
}
int i,a[100];
for(i=0;i<100;i++){
fscanf(fp,"%d,",&a[i]); //ファイルから読み込み処理。//
}
fclose(fp);
for(i=0;i<10;i++) printf("[%d]=%d\n",i,a[i]);
/*1.ソートすべきデータの中で最大のデータを見つけ、
2.そのデータを最後のデータと入れ替える。
最大データは配列のどこにあるのか⇒maxi
             その値⇒max とする。*/

//データが10個の場合
int max,maxi,j;
max=a[0],maxi=0;
for(i = 0;i < 9; i++){
if(a[i + 1] > max){
max = a[i + 1];
maxi = i + 1;
}
swap(&a[maxi],&a[9-j]);
/* コマンド $cc sort.c swap.c */

for(j=0;j<9;j++){
printf("%d\n",j);
max=a[0], maxi=0;
for(i=0;i<9-j;i++){
//最大値をもつデータ探索;(カウンタ変数)
max++;
}
//最大データと探索範囲最後のデータとの入れ替え:

//void swap(int *px, int *py){
int n,*px,*py;
n = *px;
*px = *py;
*py = n;


// }


if((fp=fopen("file.txt","wt"))==NULL){
printf("File open error.\n");
return 0;
}
for(i=0;i<100;i++){
fprintf(fp,"%d",a[i]);
}
fclose(fp);
}
}

sort.cのプログラムコード
#include<stdio.h>

void swap (int *px,int *py);

int main(void)
{
int a[0],b,maxi,j,max;
max=a[0],maxi=0;
printf("input \"a\" as integer = "); scanf("%d",&a);
printf("input \"b\" as integer = "); scanf("%d",&b);

printf("Before swap...\n");
printf("a - b = %d, a / b = %d...%d\n",a-b,a-b,a-b);
// swap(&px,&py);
swap(&a[maxi],&a[9-j]);
printf("After swap...\n");
printf("a - b = %d, a / b = %d...%d\n",a-b,a-b,a-b);

return 0;
}

void swap (int *px,int *py)
{
int n;
n = *px;
*px = *py;
*py = n;
}

実行結果
/tmp/ccBGIpCi.o(.text+0x0): In function `main':
: multiple definition of `main'
/tmp/ccMCttJd.o(.text+0x0): first defined here
/usr/bin/ld: Warning: size of symbol `main' changed from 304 in /tmp/ccMCttJd.o to 641 in /tmp/ccBGIpCi.o
collect2: ld はステータス 1 で終了

投稿日時 - 2011-01-30 16:03:56

QNo.6485913

困ってます

質問者が選んだベストアンサー

エラーの原因は main 関数の定義が2つもあること。

swap関数だけ使いたいなら、後半のソースのmain関数の定義は不要。
あるいは、swapの定義だけ抜き出せば、後半のソース自体が不要。

> swapのプログラムコード
> sort.cのプログラムコード
内容からすると逆のようですが。

> for(i=0;i<100;i++){
> fscanf(fp,"%d,",&a[i]); //ファイルから読み込み処理。//
> }
ここで100個読んでるのに、あとは10個しか使っていない。
そもそも100個読めてるかも疑問。fscanfを使うときはエラーチェックを。

> /*1.ソートすべきデータの中で最大のデータを見つけ、
> 2.そのデータを最後のデータと入れ替える。
> 最大データは配列のどこにあるのか⇒maxi
>             その値⇒max とする。*/
> //データが10個の場合

多分課題を出した人がヒントとして書いたものと思われる。
ここから

> swap(&a[maxi],&a[9-j]);
> /* コマンド $cc sort.c swap.c */

ここまでは、ほぼ説明の通り。(謎の変数jがあるけど)
最大値と列の最後(a[9])を入れ替えただけなので、残り9個はソートされていないまま。
だから、次はその9個の中から、最大値と列の最後(a[9-1])を入れ替える
次は、残りの8個の中から、最大値と列の最後(a[9-2])を入れ替える
次は、残り7個から...
...と最後まで続けるのが、選択ソートのやりかた。

それができると、10個のソートはできる。でも、プログラムからすると、100個のデータを並びかえる必要があるようだから、どうしたらいいかを考える。


ここから下の
> *py = n;
> // }

までは何がやりたいのか、まったく理解できません。

投稿日時 - 2011-01-30 16:43:07

お礼

回答ありがとうございます。
無事、できました。

投稿日時 - 2011-01-30 17:44:26

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問