Tyto stránky již nejsou udržovány. Obsah je postupně přesouván/aktualizován na adrese chytrosti.marrek.cz.

1/1

Zdrojové soubory z výuky

Na této stránce jsou k dispozici zdrojové soubory, které jsem vytvářel při výkladu během výuky. Nejsou to ukázkové a bezchybné zdrojové soubory. Ba naopak, jsou to pracovní neučesané verze, které vznikaly interaktivně ve výuce, často s cílem ukázat, že "takto se to nemá".

20110401-Fri-kalkulacka.c
   1 /*
   2  * Soubor:  20110401-Fri-kalkulacka.c
   3  * Datum:   01.04.2011 08:28
   4  * Autor:   Marek Nožka, nozka <@t> spseol <d.t> cz
   5  * Licence: GNU/GPL 
   6  * Úloha: 
   7  * Popis:   
   8  ****************************************************/
   9 #define _ISOC99_SOURCE
  10 #define _GNU_SOURCE
  11 #include <stdio.h>
  12 #include <stdbool.h>
  13 #include <math.h>
  14 #include <string.h>
  15 
  16 /* ***************    Makra    ******************** */
  17 #define STACKLEN 128
  18 
  19 /* ***************   Funkce    ******************** */
  20 
  21 void push(double number);
  22 double pop(void);
  23 void stackPrint(void);
  24 
  25 /****************************************************
  26  *               Hlavní program.
  27  ****************************************************/
  28 int main(void)
  29 {
  30     char enter[32];
  31     double number, x, y;
  32 
  33     while (scanf("%s", enter) != EOF) {
  34         if (sscanf(enter, "%lg", &number) == 1) {
  35             push(number);
  36 /*        } else if ( enter[0]== '+' ) {*/
  37         } else if (strcmp(enter, "+") == 0) {
  38             y = pop();
  39             x = pop();
  40             if (!isnan(x)) {
  41                 push(x + y);
  42                 stackPrint();
  43             } else {
  44                 push(y);
  45                 fprintf(stderr, "pro + jsou potřeba dva operandy\n");
  46             }
  47         } else if (strcmp(enter, "-") == 0) {
  48             y = pop();
  49             x = pop();
  50             printf(" >> %g\n", x - y);
  51             push(x - y);
  52         } else if (strcmp(enter, "*") == 0) {
  53             y = pop();
  54             x = pop();
  55             printf(" >> %g\n", x * y);
  56             push(x * y);
  57         } else if (strcmp(enter, "/") == 0) {
  58             y = pop();
  59             x = pop();
  60             printf(" >> %g\n", x / y);
  61             push(x / y);
  62         } else if (strcmp(enter, "ln") == 0) {
  63             x = pop();
  64             if (!isnan(x)) {
  65                 printf(" >> %g\n", log(x));
  66                 push(log(x));
  67             }
  68         } else if (strcmp(enter, "log") == 0) {
  69             x = pop();
  70             if (!isnan(x)) {
  71                 printf(" >> %g\n", log10(x));
  72                 push(log10(x));
  73             }
  74         } else if (strcmp(enter, "print") == 0) {
  75             stackPrint();
  76         } else {
  77             printf(" >> Neplatný vstup");
  78         }
  79     }
  80 
  81 
  82     return 0;
  83 }
  84 
  85 
  86 
  87 double stack[STACKLEN];
  88 int stackcount = 0;
  89 
  90 void push(double number)
  91 {
  92     if (stackcount < STACKLEN) {
  93         stack[stackcount] = number;
  94         stackcount++;
  95     }
  96 }
  97 
  98 double pop(void)
  99 {
 100     if (stackcount > 0) {
 101         stackcount--;
 102         return stack[stackcount];
 103     } else {
 104         return NAN;
 105     }
 106 }
 107 
 108 void stackPrint(void)
 109 {
 110     printf("[ ");
 111     for (int i=0; i<stackcount; i++) {
 112         printf("%g ",stack[i]);
 113     }
 114     printf("]\n");
 115 }
`--> stáhnout

Licence Creative Commons Valid XHTML 1.0 Strict Valid CSS! Antispam.er.cz Blog: Tlapicka.net