• 締切済み

複素数の和、差、積、商を計算できる関数を作成し、以下のような実行結果を実現できるプログラムを作成せよ。 但し、複素数の各値は任意に指定できるものとせよ。 <実行結果> 複素数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 である。

みんなの回答

回答No.1

たぶん,非標準機能は使っていないはず。 ただ,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; }