123456789
This commit is contained in:
commit
8af65458e1
20
Makefile
Normal file
20
Makefile
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
CFLAGS= -std=c99 -g
|
||||||
|
|
||||||
|
all: calculator
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
gcc -c -o $@ $< $(CFLAGS)
|
||||||
|
|
||||||
|
calculator.o: calculator.c
|
||||||
|
gcc -c calculator.c -o calculator.o
|
||||||
|
main.o: main.c
|
||||||
|
gcc -c main.c -o main.o
|
||||||
|
calculator: main.o calculator.o
|
||||||
|
gcc main.o calculator.o -o calculator
|
||||||
|
clean:
|
||||||
|
rm *.o calculator
|
||||||
|
|
||||||
|
test: calculator.c tests/test.c
|
||||||
|
gcc calculator.c tests/test.c tests/unity.c -Itests -o test
|
||||||
|
./test
|
||||||
|
|
157
calculator.c
Normal file
157
calculator.c
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
#include "calculator.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
struct stack* create_stack() {
|
||||||
|
|
||||||
|
struct stack* s = calloc(1,sizeof(struct stack));
|
||||||
|
|
||||||
|
s-> array = (float*) calloc(STACK_SIZE,sizeof(float));
|
||||||
|
s-> size = 0;
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
void delete_stack(struct stack* stack) {
|
||||||
|
|
||||||
|
free(stack->array);
|
||||||
|
free(stack);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Ulozenie hodnoty do zasobnika.
|
||||||
|
* Funkcia upravi velkost zasobnika a vlozi novu hodnotu.
|
||||||
|
*
|
||||||
|
* Zabezpecte pomocou funkcie assert aby program spadok ak v zasobniku nie je dost miesta.
|
||||||
|
*
|
||||||
|
* @arg zasobnik do ktoreho sa ma hodnota ulozit.
|
||||||
|
* @arg hodnota, kotra sa ma ulozit.
|
||||||
|
*/
|
||||||
|
void push_stack_value(struct stack* stack,float value) {
|
||||||
|
|
||||||
|
if (stack->size >= STACK_SIZE)
|
||||||
|
{ //Dynamic allocation
|
||||||
|
|
||||||
|
float* new_array = (float*) calloc(stack->size+1,sizeof(float));
|
||||||
|
|
||||||
|
memcpy(new_array,stack->array,stack->size*sizeof(float));
|
||||||
|
|
||||||
|
new_array[stack->size++] = value;
|
||||||
|
|
||||||
|
stack -> array = new_array;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
stack-> array[stack->size++] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vybratie hodnty zo zasobnika. Funkcia zmensi velkost zasobnika.
|
||||||
|
* Zabezpecte, aby program spadol ka v asobniku nie je doststok hodnot. (velkost nesmie byt mensia ko nula)
|
||||||
|
*
|
||||||
|
* @arg zasobnik
|
||||||
|
*
|
||||||
|
* @retrun hodnota na vrchu zasobnika.
|
||||||
|
*/
|
||||||
|
float pop_stack_value(struct stack* stack) {
|
||||||
|
|
||||||
|
assert(stack->size>0);
|
||||||
|
|
||||||
|
float val = stack->array[stack->size-1];
|
||||||
|
stack-> array[stack->size--]=0;
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vypis obsahu zasobnika.
|
||||||
|
*/
|
||||||
|
void print_stack(struct stack* stack) {
|
||||||
|
int i;
|
||||||
|
for ( i = 0; i < stack-> size; i++)
|
||||||
|
|
||||||
|
printf("%.2f ",stack->array[i]);
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool is_float(char* str) {
|
||||||
|
|
||||||
|
return
|
||||||
|
(str[0]=='+'||str[0]=='-'||str[0]=='*'||str[0]=='/')
|
||||||
|
? false : true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cela polska kalkulacka.
|
||||||
|
*/
|
||||||
|
void polish_calculator() {
|
||||||
|
|
||||||
|
char* input= calloc(100,sizeof(char));
|
||||||
|
struct stack* stack = create_stack();
|
||||||
|
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
|
||||||
|
scanf("%s",input);
|
||||||
|
|
||||||
|
if (is_float(input))
|
||||||
|
{
|
||||||
|
push_stack_value(stack,atof(input));
|
||||||
|
print_stack(stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
if (stack->size<2)
|
||||||
|
{
|
||||||
|
printf("Nedostatok hodnot v stacku\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
switch(input[0])
|
||||||
|
{
|
||||||
|
|
||||||
|
case '+':
|
||||||
|
push_stack_value(stack,pop_stack_value(stack)
|
||||||
|
+ pop_stack_value(stack));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '-':
|
||||||
|
push_stack_value(stack,pop_stack_value(stack)
|
||||||
|
- pop_stack_value(stack));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '*':
|
||||||
|
push_stack_value(stack,pop_stack_value(stack)
|
||||||
|
* pop_stack_value(stack));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '/':
|
||||||
|
push_stack_value(stack,pop_stack_value(stack)
|
||||||
|
/ pop_stack_value(stack));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: printf("Nespravny operand\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
print_stack(stack);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
free(input);
|
||||||
|
delete_stack(stack);
|
||||||
|
|
||||||
|
}
|
24
calculator.h
Normal file
24
calculator.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef CALCULATOR_H
|
||||||
|
#define CALCULATOR_H
|
||||||
|
|
||||||
|
#define STACK_SIZE 1024
|
||||||
|
|
||||||
|
struct stack {
|
||||||
|
float* array;
|
||||||
|
int size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stack* create_stack();
|
||||||
|
|
||||||
|
void delete_stack(struct stack* stack);
|
||||||
|
|
||||||
|
void push_stack_value(struct stack* stack,float value);
|
||||||
|
|
||||||
|
float pop_stack_value(struct stack* stack);
|
||||||
|
|
||||||
|
void print_stack(struct stack* stack);
|
||||||
|
|
||||||
|
void polish_calculator();
|
||||||
|
|
||||||
|
#endif // CALCULATOR_H
|
||||||
|
|
Loading…
Reference in New Issue
Block a user