アプリ版:「スタンプのみでお礼する」機能のリリースについて

c言語 選択法

numbers.dat の中身は、91 63 71 14 60 1 24 13 80 15

numbers.dat というファイルからデータを読み込み選択法で、小さい順にソートするプログラムを作りたいのですが、以下のエラーが出ます。


#include <stdio.h>

int main(int argc, char *argv[]){
if(argc < 2){
fprintf(stderr,"ERROR:コマンドライン引数を指定してください.\n");
return 1;
}
FILE *fi;
if((fi=fopen("numbers.dat","r")) == NULL){
fprintf(stderr,"ERROR:ファイル(%s)は読み込むことができません.\n",argv[1]);
return 1;
}
puts("===読み込んだ値===");
int array[10]={0};
int i;
for(i=0; i<10; i++){
fscanf(fi,"%d",&array[i]);
printf("%d%s",array[i],i==9 ? "\n":"->");
}

selection_sort(array,10); //ここでソート
puts("===ソ\ート後==="); //ダメ文字
for(i=0; i<10; i++){
printf("%d%s",array[i],i==9 ? "\n":"->");
}

return 0;
}

void selection_sort(int array[],const int size){
int i;
for(i=0;i<size-1;i++){
int min=array[i];
int min_pos=i;
int n;
for(n=i+1;n<size;n++){
if(array[n]<min){
min=array[n];
min_pos=n;
}
}
int tmp=array[i];
array[i]=min;
array[min_pos]=tmp;
}
}

A 回答 (5件)

>ERROR:コマンドライン引数を指定してください が表示されるので、



何故?
そのようにコードをコピペしてきたのでしょう?

エラーで表示されているようにコマンドライン引数を指定すればいいのでは?

./a.out copy
でも、
./a.out winner
でも、好きに指定してください。
そういうコードですから。
    • good
    • 0

>実行しても、数字が表示されません



で……なにが表示されるんです?

『ERROR:コマンドライン引数を指定してください.』か
『ERROR:ファイル(ほゃらら)は読み込むことができません.』か、
『===読み込んだ値===』のどれかは表示されると思いますが。
# たぶん最初のだろうけど。

ちなみにコピペしているコードがどういう動作をするものか理解しないでコピペしてますよね?
    • good
    • 0
この回答へのお礼

ERROR:コマンドライン引数を指定してください が表示されるので、選択法で小さい文字から出力できるようにしたいのです。

お礼日時:2016/11/30 00:48

https://oshiete.goo.ne.jp/qa/9531524.html

例え貰い物でも、エラーが出たら、自分が作ったつもりで直すのが、プログラミング上達のコツです。

> :22:8: 警告: unknown escape sequence: '\343'
ファイル名:22:8 は 22行目8文字目の意味です。
puts("===ソ\ート後==="); //ダメ文字
の 最初の" の下に印が付いていると思います。
"===ソ\ート後==="
に関するエラー(正確には警告)です。
コメントにあるように「ダメ文字」対策ですが、そもそもそれが必要かどうか、です。
そのソースコードは、UTF-8で書かれているのでは?
それなら「ダメ文字対策」は基本不要です。


> (.text+0x130): undefined reference to `selection_sort'

これが出るのは、上記URLにある方ですよね?
たしかに、上記URLには、 selection_sort の実体が無いのでエラーになります。

この質問のをコンパイルしたら、違うエラーになるはずです。

C言語では「使う前に宣言する」が大原則です。
selection_sort(array,10); //ここでソート
の時点で、 selection_sort については何の情報もありません。
それがエラーの原因です。


余談)
>>for(i=0;i<size-1;i++){
>>int min=array[i];
>>int min_pos=i;
> これってどうなるんでしたっけね?

ここは「ブロックの先頭」なので、C89でもOKです。
FILE *fi;
とか
int tmp=array[i];
はNGなはずですけど、C99以降、あるいは、GCC独自拡張でOKなようです。
    • good
    • 0
この回答へのお礼

改善して、コンパイルはできたのですが、表示されません。



void selection_sort(int array[],const int size){

int i;

for(i=0;i<size-1;i++){

int min=array[i];
int min_pos=i;
int n;

for(n=i+1;n<size;n++){

if(array[n]<min){

min=array[n];
min_pos=n;
}
}

int tmp=array[i];

array[i]=min;
array[min_pos]=tmp;

}

}

#include <stdio.h>

int main(int argc, char *argv[]){
if(argc < 2){

fprintf(stderr,"ERROR:コマンドライン引数を指定してください.\n");

return 1;

}

FILE *fi;

if((fi=fopen("numbers.dat","r")) == NULL){

fprintf(stderr,"ERROR:ファイル(%s)は読み込むことができません.\n",argv[1]);

return 1;

fclose(fi);

}

puts("===読み込んだ値===");

int array[10]={0};

int i;

for(i=0; i<10; i++){

fscanf(fi,"%d",&array[i]);

printf("%d%s",array[i],i==9 ? "\n":"->");

}

selection_sort(array,10); //ここでソート

puts("===ソート後==="); //ダメ文字

for(i=0; i<10; i++){

printf("%d%s",array[i],i==9 ? "\n":"->");

}

return 0;

}

お礼日時:2016/11/29 12:33

>puts("===ソ\ート後==="); //ダメ文字



ダメ文字問題が出るのはソースコードのファイルがShift-JISの時ですが…その辺りどうなんです?
# コンパイラがShift-JISにちゃんと対応していると、ダメ文字もちゃんと処理してくれる…んだったっけかな????

規格とかちゃんと当っていないけど……

>for(i=0;i<size-1;i++){
>int min=array[i];
>int min_pos=i;

これってどうなるんでしたっけね?
    • good
    • 0
この回答へのお礼

実行しても、数字が表示されません

なぜでしょうか?

void selection_sort(int array[],const int size){

int i;

for(i=0;i<size-1;i++){

int min=array[i];
int min_pos=i;
int n;

for(n=i+1;n<size;n++){

if(array[n]<min){

min=array[n];
min_pos=n;
}
}

int tmp=array[i];

array[i]=min;
array[min_pos]=tmp;

}

}

#include <stdio.h>

int main(int argc, char *argv[]){
if(argc < 2){

fprintf(stderr,"ERROR:コマンドライン引数を指定してください.\n");

return 1;

}

FILE *fi;

if((fi=fopen("numbers.dat","r")) == NULL){

fprintf(stderr,"ERROR:ファイル(%s)は読み込むことができません.\n",argv[1]);

return 1;

fclose(fi);

}

puts("===読み込んだ値===");

int array[10]={0};

int i;

for(i=0; i<10; i++){

fscanf(fi,"%d",&array[i]);

printf("%d%s",array[i],i==9 ? "\n":"->");

}

selection_sort(array,10); //ここでソート

puts("===ソート後==="); //ダメ文字

for(i=0; i<10; i++){

printf("%d%s",array[i],i==9 ? "\n":"->");

}

return 0;

}

お礼日時:2016/11/29 12:32

「以下のエラー」って, 何ですか?

    • good
    • 0
この回答へのお礼

これですね

:22:8: 警告: unknown escape sequence: '\343'
/tmp/ccf7q3cx.o: In function `main':
:(.text+0x130): undefined reference to `selection_sort'
collect2: ld はステータス 1 で終了しましたですね

お礼日時:2016/11/28 18:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!