Принятие уравнений в качестве пользовательского ввода в c

Я ломал голову над этой проблемой со вчерашнего дня, и я надеялся, что кто-то может указать мне правильное направление. Я новичок в C, и мы должны создать программу, в которой пользователь вводит ряд линейных уравнений, которые необходимо решить с помощью правила Крамера. Математика не проблема, однако я не уверен, как получить коэффициенты из всего уравнения, состоящего из символов и целых чисел.

Пользовательский ввод должен выглядеть как ряд линейных уравнений, таких как:

-3x-3y-1z=6

2x+3y+4z=9

3x+2y+4z=10

Это было бы просто, если бы нам разрешалось вводить только коэффициенты, но, к сожалению, необходимо ввести все уравнение. Можно считать, что в уравнении нет пробелов, порядок переменных будет тот же, и уравнения верны.

Я думал о сохранении всего уравнения в массиве и поиске каждой переменной (x, y, z), а затем поиске int перед переменной, но я не могу определить способ преобразования этих найденных переменных в целые числа.

Любая помощь приветствуется. Заранее спасибо.


person Namlitiv    schedule 14.03.2014    source источник
comment
Используйте stdlib.h и преобразование строк. cplusplus.com/reference/cstdlib   -  person this    schedule 15.03.2014
comment
(с опозданием на несколько лет, извините, но...) Является ли -y=4 допустимым уравнением (ср. 0x-1y+0z=4)?   -  person pmg    schedule 15.09.2018


Ответы (3)


//ax+bx+cz=d, -999 <= a,b,c,d <= 999
int a, b, c, d, i ,j;
char A[5], B[5], C[5], D[5], str[22];
char *pntr;

printf("Enter equation: ");
fgets(str, 21, stdin);

pntr = A;
i = j = 0;
while(1){
    if(str[i] == 'x'){pntr[j] = '\0'; pntr = B; j = 0; i++; continue;}
    else if(str[i] == 'y'){pntr[j] = '\0'; pntr = C; j = 0; i++; continue;}
    else if(str[i] == 'z'){pntr[j] = '\0'; pntr = D; j = 0; i += 2; continue;}
    else if(str[i] == '\n' || str[i] == '\0'){pntr[j] = '\0'; break;}

    pntr[j] = str[i];

    i++;
    j++;
}

a = atoi(A);
b = atoi(B);
c = atoi(C);
d = atoi(D);

printf("%d %d %d %d \n", a, b, c, d);

Вальтер

person γηράσκω δ' αεί πο    schedule 15.03.2014

Вы можете разделить x/y/z/= с помощью strtok, а затем использовать atoi для преобразования char* в int.

Прочитайте man strtok и man atoi для получения дополнительной информации (функции из stdlib).

person tcollart    schedule 14.03.2014

Ваша идея сработает. Однажды я сделал это в очень похожем проекте в школе, это был кошмар, но это (вроде как) сработало. Вам понадобится некоторая логика, чтобы прочитать более одного числа, если только вы не хотите ограничивать себя коэффициентами меньше двух цифр. Если я правильно помню, я начал читать символы, пока не нашел переменную в выражении, затем я преобразовал и присвоил найденное значение этой переменной для разрешения.

Чтобы преобразовать ваши символы в целые числа, вы можете использовать atoi() , которая получает строку символов и возвращает соответствующее целое число.


Если вы готовы потратить дополнительное время и если вы работаете под *nix, вы можете изучить территорию регулярных выражений с помощью regex.h. Вы минимизируете свой код, но это будет непросто, если вы раньше не работали с регулярными выражениями.

person ArthurChamz    schedule 15.03.2014