Тема: Керніган і Рітчі, вправа 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;
}