- 締切済み
や
複素数の和、差、積、商を計算できる関数を作成し、以下のような実行結果を実現できるプログラムを作成せよ。 但し、複素数の各値は任意に指定できるものとせよ。 <実行結果> 複素数1の実数部を入力してください。 1 複素数1の虚数部を入力してください。 2 複素数2の実数部を入力してください。 3 複素数2の虚数部を入力してください。 4 演算の種類を選択してください。 和(複素数1+複素数2):1 差(複素数1-複素数2):2 積(複素数1*複素数2):3 商(複素数1/複素数2):4 1 計算結果は 4.000 +j 6.000 である。 <実行結果> 複素数1の実数部を入力してください。 2.3 複素数1の虚数部を入力してください。 4.6 複素数2の実数部を入力してください。 5 複素数2の虚数部を入力してください。 13 演算の種類を選択してください。 和(複素数1+複素数2):1 差(複素数1-複素数2):2 積(複素数1*複素数2):3 商(複素数1/複素数2):4 2 計算結果は -2.700 +j -8.400 である。 <実行結果> 複素数1の実数部を入力してください。 1 複素数1の虚数部を入力してください。 2 複素数2の実数部を入力してください。 3 複素数2の虚数部を入力してください。 4 演算の種類を選択してください。 和(複素数1+複素数2):1 差(複素数1-複素数2):2 積(複素数1*複素数2):3 商(複素数1/複素数2):4 3 計算結果は -5.000 +j 10.000 である。 <実行結果例4> 複素数1の実数部を入力してください。 1 複素数1の虚数部を入力してください。 2 複素数2の実数部を入力してください。 3 複素数2の虚数部を入力してください。 4 演算の種類を選択してください。 和(複素数1+複素数2):1 差(複素数1-複素数2):2 積(複素数1*複素数2):3 商(複素数1/複素数2):4 4 計算結果は 0.440 +j 0.080 である。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Yune-Kichi
- ベストアンサー率74% (465/626)
たぶん,非標準機能は使っていないはず。 ただ,Digital Mars C/C++でしかチェックしていないので,非標準機能を本当に使っていない自信はなかったりしますが。 なお,U+0020二つをU+3000に置き換えています。 #include <complex.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> double get_double () { char buffer[256]; _Bool new_line = 1; while ((fgets(buffer, sizeof(buffer), stdin)) != 0) { if (strlen(buffer) == 0) { new_line = 1; continue; } if (buffer[strlen(buffer) - 1] != '\n') { // 255文字を超えるような入力があったら,一行分読み飛ばす new_line = 0; continue; } if (!new_line) { new_line = 1; continue; } char * ptr; double val = strtod(buffer, &ptr); if (ptr == 0 || *ptr != '\n') { // 変換失敗っぽいときはやり直し continue; } return val; } // 入力が途絶えたら強制終了 exit(EXIT_FAILURE); } int get_int_range(int min_value, int max_value) { char buffer[256]; _Bool new_line = 1; while ((fgets(buffer, sizeof(buffer), stdin)) != 0) { if (strlen(buffer) == 0) { new_line = 1; continue; } if (buffer[strlen(buffer) - 1] != '\n') { // 255文字を超えるような入力があったら,一行分読み飛ばす new_line = 0; continue; } if (!new_line) { new_line = 1; continue; } char * ptr; long val = strtol(buffer, &ptr, 10); if (ptr == 0 || *ptr != '\n') { // 変換失敗っぽいときはやり直し continue; } if (val < min_value || max_value < val) { continue; } return (int)val; } // 入力が途絶えたら強制終了 exit(EXIT_FAILURE); } int main (void) { puts("複素数1の実数部を入力してください。"); double val1 = get_double(); puts("複素数1の虚数部を入力してください。"); double val2 = get_double(); puts("複素数2の実数部を入力してください。"); double val3 = get_double(); puts("複素数2の虚数部を入力してください。"); double val4 = get_double(); // 二つの複素数に変換 double _Complex vals[2]; vals[0] = val1 + val2 * I; vals[1] = val3 + val4 * I; puts("演算の種類を選択してください。"); puts("和(複素数1+複素数2):1"); puts("差(複素数1-複素数2):2"); puts("積(複素数1*複素数2):3"); puts("商(複素数1/複素数2):4"); int op = get_int_range(1, 4); double _Complex result; switch (op) { case 1: result = vals[0] + vals[1]; break; case 2: result = vals[0] - vals[1]; break; case 3: result = vals[0] * vals[1]; break; case 4: result = vals[0] / vals[1]; break; } printf("%.3f + j%.3f\n", creal(result), cimag(result)); return 0; }