Тема: Керніган і Рітчі, вправа 5.10, робота з аргументами командного рядка
Перед тим, як я викладу код, я хочу сказати всім велике дякую! Я застряг на покажчиках і ніяк не міг виконати цю вправу, проте завдяки вашим підказкам і поясненням таки її написав.
Завдання полягає в тому, що агрументами командного рядку задається зворотній польський запис, наприклад 2 2 + 3 -5 * / =, який має обчислюватись так (2+2) / (3*(-5)) =.
Для вправи я використав стек так, як в книзі було показано раніше. В коді новачкам буде корисно подивитись на оператори, цикли, адресну арифметику, роботу із багатовимірними масивами і покажчики на масиви покажчиків. Досвідчені програмісти нічого корисного для себе тут, скоріш за все, не знайдуть.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX 1024
float stack[MAX];
float *ptr_s = stack;
void push_s(float);
float pop_s(void);
int main(int argc, char *argv[])
{
    float op;
    *argv++;
    while(--argc > 0){
        if( isdigit(**argv) || **argv == '.' || (**argv == '-' && (isdigit(*(*argv+1)) || *(*argv+1) == '.')) )
            push_s(atof(*argv));
        else
            switch(**argv){
                case '+':
                    printf("+\n");
                    push_s(pop_s() + pop_s());
                    break;
                case '-':
                    printf("-\n");
                    op = pop_s();
                    push_s(pop_s() - op);
                    break;
                case '*':
                    printf("*\n");
                    push_s(pop_s() * pop_s());
                    break;
                case '/':
                    printf("//\n");
                    if((op = pop_s()) != 0)
                        push_s(pop_s() / op);
                    else
                        printf("Null divisor\n");
                    break;
                case '=':
                    printf("%.4f\n", pop_s());
                    break;
                default:
                    printf("Unknown op: %s\n", *argv);
                    break;
            }
        argv++;
    }
    return 0;
}
void push_s(float s){
    printf("p: %.1f\n", s);
    if(ptr_s+1 > stack+MAX)
        printf("Stack overflow\n");
    else
        *ptr_s++ = s;
}
float pop_s(void){
    if(ptr_s-1 < stack){
        printf("Stack underflow\n");
        return 0;
    }
    else
        return *--ptr_s;
}






