вычислить значение выражения в строке

Рейтинг: 1Ответов: 0Опубликовано: 26.02.2023

Посчитать арифметическое выражение из строки.

Не понимаю, как выделить из строки число. Если его выделю, то приведу его к типу double при помощи atof.

UPD: Написал код, который работает в целом правильно. Но, хотелось бы исключить ситуации, когда 1) В начале (до считывания числа) есть операнды (плюс или факториал); 2) Между любыми двумя операндами нет числа (т.е. нет ситуаций типа !!, ++, !+, +! с точностью до пробелов). Буду благодарен, если дадите идею для этого. Код:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>

int check(FILE* fin){
    char c;
    while((c = fgetc(fin)) != EOF){
        if((c != ' ') && (c != '+') && (c != '!') && (c != '.') && (isdigit(c) == 0)){
            perror("Incorrect data!");
            return -1;
        }
    }
    rewind(fin);
    return 0;
}

int length(FILE* fin){
    int i = 0;
    while(fgetc(fin) != EOF){
        i++;
    }
    rewind(fin);
    return i;
}

double fact(double a){
    int tmp = 1;
    if(((int) a) != a){
        perror("Can't calculate factorial of a real number!");
        return -1;
    }
    else if(a == 0){
        return 0;
    }
    else{
        for(int i = 1; i <= ((int) a); i++){
            tmp *= i;
        }
        return tmp;
    }
}

double Process(char* str){
    double res = 0;
    double tmp = 0;

    while(*str){
        res += strtod(str, NULL);
        tmp = strtod(str, NULL);
        while(((*str != '!') && (*str != '+')) && *str) str++;
        if(*str == '!'){
            if(fact(tmp) == -1){
                return -1;
            }
            else{
                res-=tmp;
                res+=fact(tmp);
                *str++;
            }
        }
        else if(*str == '+'){
            *str++;
        }
    }
    return res;
}

int main(void){
    FILE* fin;
    char* str;
    int len;
    double res = 0;

    if((fin = fopen("input.txt", "rt")) == NULL){
    perror("Can't open input.txt");
    return -1;
    }

    if(check(fin) != 0){
        fclose(fin);
        return -1;
    }

    len = length(fin);
    if(len <= 0){
        perror("Incorrect length!");
        fclose(fin);
        return -1;
    }

    if((str = (char*) malloc(len * sizeof(char) + 1)) == NULL){
        perror("Memory wasn't allocated!");
        fclose(fin);
        return -1;
    }

    if(fgets(str, len+1, fin) == NULL){
        perror("Can't read string!");
        free(str);
        fclose(fin);
        return -1;
    }


    res = Process(str);
    if(res == -1){
        return -1;
    }
    printf("%lf", res);
    fclose(fin);
    free(str);

    return 0;
}

Ответы

Ответов пока нет.