質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

3回答

1546閲覧

バブルソートとファイル出力

takumi-33

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

1クリップ

投稿2021/01/28 02:46

編集2021/01/28 02:47

前提・実現したいこと

data.txtに書かれている10個の少数を、バブルソートで並び替えて、out.txtに出力するプログラムを作成したいです。
実行時に、’+’ ’ー’ を入力することで昇降順を降順を降順を決めます。

kadai11_3.exe + data.txt out.txt の形で実行したいです、

発生している問題・エラーメッセージ

コンパイルは、問題なくできたのですが、実行結果に何も表示されません。 なので、適当な位置にprintf();を置いてみた所、ファイル入力の後までは表示されるのに、昇降順を決めるコードの場所から表示されないくなることが分かりました。 どのようにすれば、実行結果が表示されるのでしょうか?

該当のソースコード

#include <stdio.h> #include <stdlib.h> /*昇順のバブルソート*/ void bubble_sort1(double a[], int n){ int i,j,t; for(i = 0 ; i < n-1 ; i++){ for(j = n-1 ; j > i ; j--){ if(a[j-1] > a[j]){ t = a[j]; a[j] = a[j-1]; a[j-1] = t; } } } } /*降順のバブルソート*/ void bubble_sort2(double a[], int n){ int i,j,t; for(i = 0 ; i < n-1 ; i++){ for(j = n-1 ; j > i ; j--){ if(a[j] > a[j-1]){ t = a[j]; a[j] = a[j-1]; a[j-1] = t; } } } } int main(int argc,char *argv[]){ int i=0,j=0; char tmp[256]; double a[10]; double n; char str ={'+'}; /*ファイル入力*/ FILE *fp; fp = fopen("data.txt", "r"); if(fp == NULL){ printf("ファイルが開けませんでした\n"); exit(1); } while(fgets(tmp, sizeof(tmp), fp) != NULL){ n = (double)atoi(tmp); a[i] = n; i++; } fclose(fp); printf("a\n"); /*昇順・降順を判断する*/ if(strcmp(argv[1],str)==0){ bubble_sort1(a,i+1); }else{ bubble_sort2(a,i+1); } printf("i\n"); /*ファイル出力*/ FILE *outputfile; outputfile = fopen("out.txt", "w"); if(outputfile == NULL){ printf("ファイルが開けませんでした\n"); exit(1); } while(a[j] != '\0'){ fprintf(outputfile, "%f\n",a[j]); j++; } fclose(outputfile); printf("比較回数:"); printf("交換回数:"); return 0; }

試したこと

適当な位置にprinf();を入れてみること、コードの見直しなど

補足情報(FW/ツールのバージョンなど)

コマンドプロンプト VS2019

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2021/01/28 06:15 編集

double a[10];・・・なぜ、doubleなのでしょう?・・・10行以上有ったらスタック壊します。 ・・・data.txtの中身は? while(a[j] != '\0')・・・doubleと文字の比較は出来ません・・・また、データに0はないのでしょうか?
takumi-33

2021/05/18 03:20

ありがとうございます。
guest

回答3

0

ベストアンサー

kadai11_3.exe + data.txt out.txt の形で実行したいです、

それなら、argc が 4 であるかどうかチェックしてから、
fopen(argv[2], "r")、strcmp(argv[1], "+")、fopen(argv[3], "w") を
実行しないとだめでしょう。

昇順と降順は比較演算が異なるだけで、同じバブルソートを使うなら、
比較演算を関数にして渡せばよいでしょう。

C

1#include <stdio.h> // fopen, fclose, fgets, printf, puts, perror 2#include <stdlib.h> // atof 3#include <string.h> // strcmp 4 5int comp1(double a, double b) { return a > b; } 6int comp2(double a, double b) { return a < b; } 7 8void bubble_sort(double a[], int n, int comp(double, double)) 9{ 10 for (int i = 0; i < n - 1; i++) 11 for (int j = n - 1; j > i; j--) 12 if (comp(a[j-1], a[j])) { 13 double t = a[j]; a[j] = a[j-1]; a[j-1] = t; 14 } 15} 16 17int main(int argc, char *argv[]) 18{ 19 if (argc != 4) { 20 printf("usage: %s [+|-] infile outfile\n", argv[0]); 21 return 4; 22 } 23 int n; double a[10]; char tmp[256]; 24 25 FILE *fp = fopen(argv[2], "r"); 26 if (fp == NULL) { perror(argv[2]); return 2; } 27 for (n = 0; n < 10 && fgets(tmp, sizeof(tmp), fp); n++) a[n] = atof(tmp); 28 fclose(fp); 29 30 if (strcmp(argv[1], "+") == 0) bubble_sort(a, n, comp1); 31 else if (strcmp(argv[1], "-") == 0) bubble_sort(a, n, comp2); 32 else { puts("+ or - not specified"); return 1; } 33 34 fp = fopen(argv[3], "w"); 35 if (fp == NULL) { perror(argv[3]); return 3; } 36 for (int i = 0; i < n; i++) fprintf(fp, "%f\n", a[i]); 37 fclose(fp); 38}

投稿2021/01/28 14:17

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takumi-33

2021/05/18 03:21

ありがとうございます。
guest

0

とりあえず、修正しました。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5 6 7/*昇順のバブルソート*/ 8void bubble_sort1(double a[], int n){ 9 int i,j; 10 double t; 11 for(i = 0 ; i < n-1 ; i++){ 12 for(j = n-1 ; j > i ; j--){ 13 if(a[j-1] > a[j]){ 14 t = a[j]; 15 a[j] = a[j-1]; 16 a[j-1] = t; 17 } 18 } 19 } 20} 21 22 23 24/*降順のバブルソート*/ 25void bubble_sort2(double a[], int n){ 26 int i,j; 27 double t; 28 for(i = 0 ; i < n-1 ; i++){ 29 for(j = n-1 ; j > i ; j--){ 30 if(a[j] > a[j-1]){ 31 t = a[j]; 32 a[j] = a[j-1]; 33 a[j-1] = t; 34 35 } 36 } 37 } 38} 39 40int main(int argc,char *argv[]){ 41 42 int i=0,j=0; 43 char tmp[256]; 44 double a[10]; 45 double n; 46 char str[] = "+"; 47 48/*ファイル入力*/ 49 FILE *fp; 50 51 fp = fopen("data.txt", "r"); 52 53 if(fp == NULL){ 54 printf("ファイルが開けませんでした\n"); 55 exit(1); 56 } 57 58 while(fgets(tmp, sizeof(tmp), fp) != NULL){ 59 n = (double)atof(tmp); 60 a[i] = n; 61 i++; 62 } 63 64 fclose(fp); 65 66 printf("a\n"); 67 68/*昇順・降順を判断する*/ 69 if(strcmp(argv[1],str)==0){ 70 bubble_sort1(a,i); 71 }else{ 72 bubble_sort2(a,i); 73 } 74 printf("i=%d\n",i); 75 76 77/*ファイル出力*/ 78 FILE *outputfile; 79 80 outputfile = fopen("out.txt", "w"); 81 82 if(outputfile == NULL){ 83 printf("ファイルが開けませんでした\n"); 84 exit(1); 85 } 86 87 for (j =0;j <i;j++){ 88 fprintf(outputfile, "%f\n",a[j]); 89 } 90 91 fclose(outputfile); 92 93 94 printf("比較回数:"); 95 printf("交換回数:"); 96 97 return 0; 98} 99

変更箇所

diff

1--- goo.org.c 2021-01-29 10:27:02.142726800 +0900 2+++ goo.c 2021-01-29 10:28:44.316570900 +0900 3@@ -1,11 +1,13 @@ 4 #include <stdio.h> 5 #include <stdlib.h> 6+#include <string.h> 7 8 9 10 /*昇順のバブルソート*/ 11 void bubble_sort1(double a[], int n){ 12- int i,j,t; 13+ int i,j; 14+ double t; 15 for(i = 0 ; i < n-1 ; i++){ 16 for(j = n-1 ; j > i ; j--){ 17 if(a[j-1] > a[j]){ 18@@ -21,7 +23,8 @@ 19 20 /*降順のバブルソート*/ 21 void bubble_sort2(double a[], int n){ 22- int i,j,t; 23+ int i,j; 24+ double t; 25 for(i = 0 ; i < n-1 ; i++){ 26 for(j = n-1 ; j > i ; j--){ 27 if(a[j] > a[j-1]){ 28@@ -40,7 +43,7 @@ 29 char tmp[256]; 30 double a[10]; 31 double n; 32- char str ={'+'}; 33+ char str[] = "+"; 34 35 /*ファイル入力*/ 36 FILE *fp; 37@@ -53,7 +56,7 @@ 38 } 39 40 while(fgets(tmp, sizeof(tmp), fp) != NULL){ 41- n = (double)atoi(tmp); 42+ n = (double)atof(tmp); 43 a[i] = n; 44 i++; 45 } 46@@ -64,11 +67,11 @@ 47 48 /*昇順・降順を判断する*/ 49 if(strcmp(argv[1],str)==0){ 50- bubble_sort1(a,i+1); 51+ bubble_sort1(a,i); 52 }else{ 53- bubble_sort2(a,i+1); 54+ bubble_sort2(a,i); 55 } 56- printf("i\n"); 57+ printf("i=%d\n",i); 58 59 60 /*ファイル出力*/ 61@@ -81,9 +84,8 @@ 62 exit(1); 63 } 64 65- while(a[j] != '\0'){ 66+ for (j =0;j <i;j++){ 67 fprintf(outputfile, "%f\n",a[j]); 68- j++; 69 } 70 71 fclose(outputfile); 72

投稿2021/01/28 06:12

編集2021/01/29 01:33
tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hidezzz

2021/01/28 14:52

diffに「-u」オプションをつけた出力を貼り付けると色分けもされて変更箇所が見やすくなると思います。(diff -u org.c new.c)
tatsu99

2021/01/28 23:45 編集

ありがとうございます。 こちらの環境では色分けされませんでした。 centos 7.5 diff バージョン3.3 あなたの環境とdiffのバージョンを教えていただけるとありがたいです。 windowsからteratermを使用してcentos7.5にログインしています。 centos7.5はvmware player上で稼働しています。
hidezzz

2021/01/29 01:16

言葉足らずな書き込みをしてしまいすみません。 teratailの質問/回答へmarkdownコードブロック内に「diff -u」で出力したdiffテキストをコピー&ペーストして、かつ書式として「diff」を指定すると(```diff)、色分け表示されるという意味です。 こちらでもターミナル上では色分けはされません。 Linux Mint 19.3 diff (GNU diffutils) 3.6 ターミナル: guake 3.7.0 です。
tatsu99

2021/01/29 01:21

ああ、なるほど、そういうことでしたか。やってみます。ありがとうございました。
hidezzz

2021/01/29 01:41 編集

気になって調べてみたら、GNU diffutils 3.4のdiffからは「--color」オプションが追加されたようです。このオプションを付けると「-u」があっても無くてもターミナル上のdiffでも色分け表示されます。
tatsu99

2021/01/29 02:01

ありがとうござます。diff -uでteratailの回答欄で色分けができました。--colorオプションについては、回答欄で色分けができれば、それで十分ですので、特に今必要とするわけではありませんが、記憶にとどめておきます。ありがとうございました。
guest

0

文字('+')を比較するのにstrcmp()は使えません。*argv[1] == '+'などとしましょう。
「追記」
参考:C言語 バブルソート

投稿2021/01/28 02:58

編集2021/01/28 05:39
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問