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

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

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

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

Q&A

解決済

2回答

1875閲覧

各桁の和で並び替える特殊なソートプログラムを実装したい

rft3

総合スコア7

C

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

0グッド

0クリップ

投稿2020/06/02 13:56

編集2020/06/03 08:29

insert_sort関数のの第3引数に,desc関数の関数ポインタをコールバック関数として渡し,降順ソートしたいです。さらにsort_array.h内にdigit_sum関数、desc関数の条件を追加し、各桁の和で並び替える特殊なソートプログラムを実装したいです。
しかしどのようなコードを書けば指定できるのかが分かりません。ご教授お願いいたします。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include "sort_array.h" 4 5void read_data(char *fn, int *arr, int n){ 6 FILE *fp; 7 if((fp = fopen(fn, "r")) == NULL){ 8 fprintf(stderr, "ファイル%sが開けません\n", fn); 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 *fn, int *arr, int n){  16 FILE *fp; 17 if((fp = fopen(fn, "w")) == NULL){ 18 fprintf(stderr, "ファイル%sが開けません\n", fn); 19 exit(1); 20 } 21 for(int i = 0; i < n; i++) fprintf(fp, "%d\n", arr[i]); 22 fclose(fp); 23} 24 25int main(int argc, char* argv[]){ 26 int N = atoi(argv[1]); 27 int *scores = (int *) malloc(N*sizeof(int)); 28 read_data(argv[2], scores, N); 29 30 // ここでinsert_sort関数のの第3引数に,desc関数の関数ポインタをコールバック関数として渡し,降順ソートしたい 31 32 write_result(argv[3], scores, N); 33}

sort_array.hの中身↓

int digit_sum(int num){ /* ここに 引数numの各桁を分離し,その和を返すdigit_sum関数を定義したい*/ } int desc(void *p, void *q){ /* ここに第2引数の和の方が大きい時に正の値を返す比較関数desc第2引数の和を計算する時にdigit_sum関数を呼び出す */ } 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ページで確認できます。

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

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

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

cateye

2020/06/02 13:58

何故、ヘッダファイル(sort_array.h)なんでしょう?
episteme

2020/06/03 09:38

...考えることを諦めてないか?
guest

回答2

0

関数の名前cmpにしてしまった(^^;
どうせヘッダに書いてincludeするなら、
分割する必要性も無いのでまとめて書いてみました。

#include <stdio.h> #include <stdlib.h> int cmp(void *p1, void *p2) { int x = *(int *)p1, y = *(int *)p2; int tmp1,tmp2; for (tmp1 = 0; x; tmp1 += x % 10, x /= 10); for (tmp2 = 0; y; tmp2 += y % 10, y /= 10); return tmp1 - tmp2; } 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; } } 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]); int *scores = (int *) malloc(N * sizeof(int)); read_data(argv[2], scores, N); insert_sort(scores, N, cmp); write_result(argv[3], scores, N); return 0; }

投稿2020/06/02 14:37

PingHermit

総合スコア478

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

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

rft3

2020/06/03 13:10

回答、ありがとうございます!よければ分割していないものも書いていただけませんか?
PingHermit

2020/06/03 15:18

? 意味不明です。 分割してあったのをまとめただけですが。 普通ヘッダファイルに関数定義は書かないので。 ヘッダには、関数宣言を書くことはありますが。
guest

0

ベストアンサー

insert_sort(なんやら, かんやら, desc);
とすればいいです

投稿2020/06/02 14:23

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問