- 締切済み
C言語のqsortについて
下記の課題に取り組んでおり、qsortをファイルの行数分のみ出力するプログラムを書いているのですが if (strcmp(ad, "ASC") == 0) { qsort(sin,1000 , sizeof(sin[0]), cmp_u); if (sin[i][0] == 0) { break; } } else { qsort(sin, 1000, sizeof(sin[0]), cmp_d); if (sin[i][0] == 0) { break; } この書き方ではエラーが出てしまい、どなたか書き方を教えて頂けないでしょうか? 【課題】 電卓アプリケーションの作成 以下の機能を満たすアプリケーションを作成してください。 ※画面の表示やログの形式は原則として例示されている内容に従ってください。 1) 四則演算が出来ること 2) コンソールから計算対象となる数値と演算子を受け取る 例) 5 + 6 3) 結果をコンソール上に表示する 例) 11 4) 演算結果と実行した日、時間、秒をログファイルとして保存する ログの上限は1000行とする(上限を超過するケースはひとまず考慮しなくて良い) 例) log.txt に 以下の内容を記録 2015/04/27 14:30:51, 5 + 6, 11 5) コンソールからパラメータを受け取り、ログを実行時間の昇順/降順に並べ替えて コンソールに表示する 例) ASC を入力 2015/04/26 10:20:00, 5 + 6, 11 2015/04/27 14:30:51, 7 - 6, 1 2015/04/27 15:30:00, 7 + 8, 15 2015/04/28 14:30:51, 8 + 9, 17 例) DESC を入力 2015/04/28 14:30:51, 8 + 9, 17 2015/04/27 15:30:00, 7 + 8, 15 2015/04/27 14:30:51, 7 - 6, 1 2015/04/26 10:20:00, 5 + 6, 11 【現在のソースコード】 #include <stdio.h> #include <time.h> #include <string.h> #include <stdlib.h> static char ad[10]; int cmp_u(const void* a, const void* d) { return strcmp((char*)a, (char*)d); } int cmp_d(const void* a, const void* d) { return strcmp((char*)d, (char*)a); } int main() { int num1, num2; char op; float answer; int r,i,n; FILE* fp; char c[11]; char sin[1000][1000]; char ad[8]; fp = fopen("log.txt", "a+"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } while (1) { r = scanf("%d%c%d", &num1, &op, &num2); if (r != 3) { puts("input error"); return 1; } if (op == '+') { answer = num1 + num2; } else if (op == '-') { answer = num1 - num2; } else if (op == '*') { answer = num1 * num2; } else if (op == '/') { answer = (float)num1 / num2; } time_t t = time(NULL); struct tm* tm = localtime(&t); printf("%d/%02d/%02d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); printf("%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); printf("%d%c%d,%f\n", num1, op, num2, answer); fprintf(fp, "%d/%02d/%02d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); fprintf(fp, "%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); fprintf(fp, "%d%c%d,%f\n", num1, op, num2, answer); printf("計算を続けますか?"); scanf("%s\n", &c); if (strcmp(c, "no") == 0) { break ; } } fclose(fp); fp = fopen("log.txt", "r"); for (i = 0;i < 1000;i=i+1) { fgets(sin[i], sizeof(sin[0]), fp); //if (strcmp(sin, "NULL") == 0) { if (sin[i][0] == 0) { break; } } fclose(fp); printf("ASC or DESC: "); scanf(" %s", ad); if (strcmp(ad, "ASC") == 0) { qsort(sin,1000 , sizeof(sin[0]), cmp_u); if (sin[i][0] == 0) { break; } } else { qsort(sin, 1000, sizeof(sin[0]), cmp_d); if (sin[i][0] == 0) { break; } } for (i = 0;i < 1000;i = i + 1) { if (sin[i][0] == 0) { break; } printf("%s", sin[i]); } return 0; }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- redslove10
- ベストアンサー率41% (397/968)
まずは、やりたいことを、いきなりソースコードに書き下すのではなく、擬似コードで考えてみることをお勧めします。
- redslove10
- ベストアンサー率41% (397/968)
コンパイラーが当該箇所のエラーメッセージを出していると思うのですが、ループでない箇所から break しようとしている、ということです。 #他にも指摘したいところは沢山ありますけどね
補足
解答ありがとうございます。 すいません、変数cntへの格納が上手くいかなくて、修正点、教えて頂けないでしょうか? int cnt; for (i = 0;i < 1000;i=i+1) for(cnt = 0;cnt < 1000;cnt = cnt + 1) { fgets(sin[i], sizeof(sin[0]), fp); //if (strcmp(sin, "NULL") == 0) { if(sin[i][0] == 0) { break; } } if (strcmp(ad, "ASC") == 0) { qsort(sin, cnt , sizeof(sin[0]), cmp_u); }