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; } }
回答2件
あなたの回答
tips
プレビュー