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

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

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

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

Q&A

解決済

2回答

2141閲覧

読み込んだファイルを降順、昇順で並べたい

rft3

総合スコア7

C

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

0グッド

0クリップ

投稿2020/05/31 17:43

編集2020/06/01 12:40

main関数の中で第二コマンドライン引数を指定し、0を入力したときは昇順、1を入力したときは降順でファイル内の数字を並べたいです。
しかしどのようなコードを書けば指定できるのかが分かりません。ご教授お願いいたします。

#include <stdio.h> #include <stdlib.h> #include "sort_array.h" void read_data(char *fn, int *arr, int n){ FILE *fp; if((fp = fopen(fn, "r")) == NULL){ fprintf(stderr, "ファイル%sが開けません\n", fn); exit(1); } for(int i = 0; i < n; i++) fscanf(fp, "%d", &arr[i]); fclose(fp); } void write_result(char *fn, int *arr, int n){ FILE *fp; if((fp = fopen(fn, "w")) == NULL){ fprintf(stderr, "ファイル%sが開けません\n", fn); exit(1); } for(int i = 0; i < n; i++) fprintf(fp, "%d\n", arr[i]); fclose(fp); } int main(int argc, char* argv[]){ int N = atoi(argv[1]); // ここに第2コマンドライン引数で,0:昇順と1:降順を指定したい // ここに関数ポインタの配列を定義したい int *scores = (int *) malloc(N*sizeof(int)); read_data(argv[3], scores, N); // ここにinsert_sort関数の第3引数に比較関数へのポインタを指定したい write_result(argv[4], scores, N); } ```sort_array.hの中身 ```ここに言語を入力 int asc(void *p, void *q){ return *(int *)p - *(int *)q; } int desc(void *p, void *q){ return *(int *)q - *(int *)p; } void insert_sort(int *arr, int n, int (*cmp)(void*, void*)){ int i, j, temp; for(i = 1; i < n; i++){ temp = arr[i]; for(j = i; j > 0; j--){ if(cmp(&arr[j-1], &temp) > 0) arr[j] = arr[j-1]; else break; } arr[j] = temp; } }

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

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

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

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

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

episteme

2020/05/31 21:56

呈示されたコードは何をするものですか?
kazuma-s

2020/05/31 22:19

insert_sort と asc は sort_array.h の中で宣言されていると思いますが、 どのように宣言されていますか? 第2コマンドライン引数が 0 か 1 かを見ているところがないように見えますが、 どうなっているんですか?
guest

回答2

0

ベストアンサー

ヘッダファイルの sort_array.h の中に関数 insert_sort の
「定義」を書いていますが、通常そんなことはしません。

C

1void insert_sort(int *arr, int n, int (*cmp)(void*, void*));

という「宣言」だけを書いて、「定義」は、sort_array.cファイルに書くべきです。

main の書き方の一例を示します。他にも書き方はあります。

C

1int main(int argc, char* argv[]){ 2 int N = atoi(argv[1]); 3 int i = atoi(argv[2]); 4 int (*cmp[2])(void*, void*) = { asc, desc }; 5 int *scores = (int *) malloc(N*sizeof(int)); 6 read_data(argv[3], scores, N); 7 insert_sort(scores, N, cmp[i]); 8 write_result(argv[4], scores, N); 9}

コマンドライン引数の正当性のチェックはしなくていいのでしょうか?

投稿2020/06/01 13:09

kazuma-s

総合スコア8224

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

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

rft3

2020/06/02 10:40

ありがとうございます。参考にさせていただきます。 コマンドライン引数の正当性のチェックはsortコマンドにより行いました。
guest

0

c.c

c.c

1#include <stdio.h> 2#include <stdlib.h> 3// #include "sort_array.h" 4 5void read_data(char * file_name, int *arr, int n) { 6 FILE *fp; 7 if((fp = fopen(file_name, "r")) == NULL) { 8 fprintf(stderr, "ファイル%sが開けません\n", file_name); 9 exit(1); 10 } 11 for(int i = 0; i < n; i++) fscanf(fp, "%d", &arr[i]); 12 fclose(fp); 13} 14 15void write_result(char *file_name, int *arr, int n) { 16 FILE *fp; 17 if((fp = fopen(file_name, "w")) == NULL) { 18 fprintf(stderr, "ファイル%sが開けません\n", file_name); 19 exit(1); 20 } 21 for(int i = 0; i < n; i++) fprintf(fp, "%d\n", arr[i]); 22 fclose(fp); 23} 24 25void sort_scores(int *arr, int n, int sort_order) { 26 if (sort_order == 0) { 27 // 昇順に並べ替える 28 } else if (sort_order == 1) { 29 // 降順に並べ替える 30 } else { 31 // sort_order 市営が無効である場合の処理をする 32 } 33} 34int main(int argc, char* argv[]) { 35 int N = atoi(argv[1]); 36 int sort_order = atoi(argv[2]); 37 38 int *scores = (int *) calloc(N, sizeof(int)); 39 read_data(argv[3], scores, N); 40 sort_scores(scores, N, sort_order); 41 write_result(argv[4], scores, N); 42} 43

質問にあるコードをベースに書いています。
ソートする部分は適宜 埋めてみてください。
maaloc のかわりに calloc をつかうようにしています。

実行例
イメージ説明

参考情報

  • callocとmallocの違いは何ですか。

http://www.bohyoh.com/CandCPP/FAQ/FAQ00054.html

投稿2020/05/31 22:09

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問