1

Тема: Стефан Кочан, вправа 6.4, простий калькулятор

Вітаю форумчани!
Завдання вправи полягає в тому, що треба написати простий калькулятор, який би оперував із змінними типу int.
Я трошки ускладнив завдання і написав програму для роботи зі змінними типу float.

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define MAX 1024

static char line[MAX];
static float a, b;
int getline(void);
int input(void);

int main(int argc, char *argv[])
{
    while(getline()){
    switch(input()){
        case 1:
            printf("%f\n", a + b);
            break;
        case 2:
            printf("%f\n", a - b);
            break;
        case 3:
            printf("%f\n", a / b);
            break;
        case 4:
            printf("%f\n", a * b);
            break;
        default:
            printf("Unknown operation\n");
            break;
    }
    }
    return 0;
}

int getline(void){
    int c, i;
    for(i = 0; i < MAX-1 && (c = getchar()) != '\n' && c != EOF; i++){
        line[i] = c;
    }
    if(c == EOF)
        return 0;
    line[i] = '\n';
    line[i++] = '\0';
    return i;
}

int input(void){
    int i, j, ns, op, negative;
    //op:
    //0 = wrong operation
    //1 = plus
    //2 = minus
    //3 = divide
    //4 = times
    //negative:
    //for minus sign
    //ns:
    //0 = operator a is free
    //1 = operator b is free
    char toconv[512];

    i = j = ns = op = negative = 0;
    while(line[i] != '\0'){
        if(isdigit(line[i])){
            j = 0;
            while(isdigit(line[i]) || line[i] == '.'){
                toconv[j] = line[i];
                i++;
                j++;
            }
            toconv[j] = '\0';
            printf("toconv: %s\n", toconv);
            if(ns){
                b = atof(toconv);
                if(negative){
                    b *= -1;
                    negative = 0;
                }
                printf("b = %f\n", b);
                ns = 0;
            } else {
                a = atof(toconv);
                if(negative){
                    a *= -1;
                    negative = 0;
                }
                printf("a = %f\n", a);
                ns = 1;
            }
        } else {
            switch(line[i]){
                    case '+':
                        op = 1;
                        printf("+: there is addition\n");
                        break;
                    case '-':
                        if(isdigit(line[i+1])){
                            printf("-: there is negative number\n");
                            negative = 1;
                        }
                        else{
                            printf("-: there is subtraction\n");
                            op = 2;
                        }
                        break;
                    case '/':
                        printf("/: there is dividing\n");
                        op = 3;
                        break;
                    case '*':
                        printf("*: there is multiplication\n");
                        op = 4;
                        break;
                    case ' ':
                        break;
                    default:
                        printf("Wrong operation: %c\n", line[i]);
                        op = 0;
                        break;
                }
        }
        i++;
    }
    return op;        
}

2

Re: Стефан Кочан, вправа 6.4, простий калькулятор

Оптимізацію робити будете? :)

http://s17.postimage.org/uiwliujpr/image.jpg

З.І: чиста сішка - обов'язкова умова у даній вправі, чи тут допускається суміш С/С++?

3

Re: Стефан Кочан, вправа 6.4, простий калькулятор

Та я просто розшарив те, що зробив.
Оптимізую, так.

4

Re: Стефан Кочан, вправа 6.4, простий калькулятор

keithfay написав:

Та я просто розшарив те, що зробив.
Оптимізую, так.

То й новіші версії постіть. Ця задачка - гарний приклад для поступого відточування стилю та концептуального мислення. :)

5 Востаннє редагувалося Ярослав (22.02.2013 19:12:41)

Re: Стефан Кочан, вправа 6.4, простий калькулятор

v2.0

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define MAX 1024

static char line[MAX];
static float a, b;
int getline(void);
int input(void);

int main(int argc, char *argv[])
{
    while(getline()){
    switch(input()){
        case 1:
            printf("%f\n", a + b);
            break;
        case 2:
            printf("%f\n", a - b);
            break;
        case 3:
            printf("%f\n", a / b);
            break;
        case 4:
            printf("%f\n", a * b);
            break;
        default:
            printf("Unknown operation\n");
            break;
    }
    }
    return 0;
}

int getline(void){
    int c, i;
    for(i = 0; i < MAX-1 && (c = getchar()) != '\n' && c != EOF; i++){
        line[i] = c;
    }
    if(c == EOF)
        return 0;
    line[i] = '\n';
    line[i++] = '\0';
    return i;
}

int input(void){
    int i, j, ns, op, negative;
    //op:
    //0 = wrong operation
    //1 = plus
    //2 = minus
    //3 = divide
    //4 = times
    //negative:
    //for minus sign
    //ns:
    //0 = operator a is free
    //1 = operator b is free
    char toconv[512];

    i = j = ns = op = negative = 0;
    while(line[i] != '\0'){
        if(isdigit(line[i])){
            j = 0;
            while(isdigit(line[i]) || line[i] == '.'){
                toconv[j] = line[i];
                i++;
                j++;
            }
            toconv[j] = '\0';
            printf("toconv: %s\n", toconv);
            if(ns){
                b = atof(toconv);
                if(negative){
                    b *= -1;
                    negative = 0;
                }
                printf("b = %f\n", b);
                ns = 0;
            } else {
                a = atof(toconv);
                if(negative){
                    a *= -1;
                    negative = 0;
                }
                printf("a = %f\n", a);
                ns = 1;
            }
        } else {
            switch(line[i++]){
                    case '+':
                        op = 1;
                        printf("+: there is addition\n");
                        break;
                    case '-':
                        if(isdigit(line[i+1])){
                            printf("-: there is negative number\n");
                            negative = 1;
                        }
                        else{
                            printf("-: there is subtraction\n");
                            op = 2;
                        }
                        break;
                    case '/':
                        printf("/: there is dividing\n");
                        op = 3;
                        break;
                    case '*':
                        printf("*: there is multiplication\n");
                        op = 4;
                        break;
                    case ' ':
                        break;
                    default:
                        printf("Wrong operation: %c\n", line[i]);
                        op = 0;
                        break;
                }
        }
    }
    return op;        
}

Тут я виправив помилки, які були зазначені на скріні вище. Проте, шановний Bartash, що ви мали на увазі під оптимізацією?

6

Re: Стефан Кочан, вправа 6.4, простий калькулятор

keithfay написав:

Тут я виправив помилки, які були зазначені на скріні вище. Проте, шановний Bartash, що ви мали на увазі під оптимізацією?

Те і малося на увазі: вдосконалення коду, посилення його гнучкості, зручності, розширення можливостей. :)