это может быть немного длинно, поэтому извините заранее.
Я студент C, и мне поручено составить программу, которая вычисляет основную c арифметику c комплексных чисел. Я должен представить список команд (простой printf) и получить ввод от пользователя с именем и значениями команды.
комплексное число является структурой, и есть только 6, названных от A до F:
typedef struct complex{
float real;
float img;
}complex, *complexPTR
например: чтобы умножить комплексное число на действительное число, пользователь введет mult_comp_real A,2.5
.
, команда ввода mult_comp_real
должна иметь пробел между ней и первым значением A
.
между каждым значением должна быть запятая, и любое количество пробельных символов допускается, поэтому что-то вроде mult_comp_real A , 2.5
в порядке.
Моя главная проблема в том, что мне нужно выводить ошибку для каждой возможной ошибки ввода, например, если пользовательская команда ввода недопустима (multComp_rel
), пропущены параметры (mult_comp_real A
) или дополнительный текст (исключая пробелы) в конце командной строки (mult_comp_real A,2.5abc
) .
Что касается потока программы, я решил сначала прочитать ввод имени команды mult_comp_real
. оттуда я могу сказать с помощью if-elses
, какая команда была введена и какие ожидаемые значения (2 комплексных, 2 действительных числа, их комбинация и т. д. c.).
оттуда я хочу прочитайте значения в правильный тип данных и напечатайте ошибку, если было введено слишком мало аргументов или если значения имеют недопустимый тип.
наконец, я хочу проверить оставшуюся часть ввода для любого лишнего текста мусора это не пробел, и выведите ошибку, если такой текст существует.
большинство моих попыток основывались на scanf для чтения команды и значений и fget c для проверки на наличие дополнительного текста, но я Я видел достаточно постов, в которых говорится, если это возможно - избегать использования scanf, и теперь я понимаю, почему хех. разрешение или руководство: \
Вот фрагмент кода из основного, который читает имя команды и вводит правильный блок if:
void main(void){
complexPTR cmpxPTR;
cmpxPTR = (complexPTR) malloc(sizeof(complex)*6); /*allocates memory for 6 complex variables*/
int i;
for(i=0;i<6;i++){ /*initialize complex' values to 0*/
cmpxPTR[i].real=0;
cmpxPTR[i].img=0;
}
char c, choice[50];
do{
if(scanf(" %s", choice)==EOF){ /*reads the command name*/
printf("Error: Reached end of file. Program terminated.\n");
break;
}
if(strcmp(choice,"list")==0) /*prints the list.*/
printList();
else if(strcmp(choice,"read_comp")==0){ /*read_comp assign new values to complex number.*/
char cmplx;
float re, img;
if(scanf(" %c", &cmplx)!=1 || !isalpha(cmplx) || !isupper(cmplx)) /*invalid complex input*/
printf("ERROR: complex type \"%c\" is not a capital letter.\n", cmplx);
if(scanf(" , %f , %f",&re, &img)!=2) /*read real, img values to assign to complex variable cmplx*/
printf("ERROR: \"%f\" or \"%f\" are invalid numbers\n", re, img);
/*if((reminder=getchar()) != '\0' || reminder != EOF || reminder != '\n')
printf("ERROR: Extraneous text after end of command."); */
else{
printf("Command entered is: \"%s %c %.3g %.3g\".\n",choice, cmplx, re, img);
switch(cmplx){ /*send correct complex struct to read_comp for re-assignment*/
case 'A':
read_comp(cmpxPTR+(cmplx-'A'), re, img);
break; /*, 1*/
case 'B':
read_comp(cmpxPTR+(cmplx-'A'), re, img);
break;
case 'C':
read_comp(cmpxPTR+(cmplx-'A'), re, img);
break;
case 'D':
read_comp(cmpxPTR+(cmplx-'A'), re, img);
break;
case 'E':
read_comp(cmpxPTR+(cmplx-'A'), re, img);
break;
case 'F':
read_comp(cmpxPTR+(cmplx-'A'), re, img);
break;
default:
printf("ERROR: Undefined complex variable\n"); /*such as G, a, 5 etc*/
break;
}
}
}
else if(strcmp(choice,"stop") != 0)
printf("ERROR: Undefined command.\n");
if(strcmp(choice,"stop") != 0)
printf("\nPlease enter another command:\n");
} while (strcmp(choice, "stop") && (c=getchar()!=EOF)); /*exit while loop only when choice="stop"*/
и read_comp просто:
void read_comp(complex* X, float real, float img){
X->real = real;
X->img = img;
return;
}