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-kalkul.c
   1 /*
   2  * Soubor:  20110401-Fri-kalkul.c
   3  * Datum:   01.04.2011 10:04
   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 ZASPOC 32
  18 #define DELKA 32
  19 
  20 /* ***************   Funkce    ******************** */
  21 
  22 void push(double number);
  23 double pop(void);
  24 void tiskni(void);
  25 
  26 /****************************************************
  27  *               Hlavní program.
  28  ****************************************************/
  29 int main(void)
  30 {
  31     char vstup[DELKA];
  32     double cislo, x, y;
  33     while (scanf("%s", vstup) != EOF) {
  34         if (sscanf(vstup, "%lg", &cislo) == 1) {
  35             push(cislo);
  36 /*        } else if ( vstup[0]='+' ) {*/
  37         } else if (strcmp(vstup, "+") == 0) {
  38             y = pop();
  39             x = pop();
  40             if (isnan(x)) {
  41                 push(y);
  42                 fprintf(stderr, "potřebuji dva operandy\n");
  43             } else {
  44                 push(x + y);
  45                 tiskni();
  46             }
  47         } else if (strcmp(vstup, "-") == 0) {
  48             proved2(minus);
  49         } else if (strcmp(vstup, "*") == 0) {
  50             y = pop();
  51             x = pop();
  52             push(x * y);
  53             printf("%g\n", x * y);
  54         } else if (strcmp(vstup, "/") == 0) {
  55             y = pop();
  56             x = pop();
  57             push(x / y);
  58             printf("%g\n", x / y);
  59         } else if (strcmp(vstup, "ln") == 0) {
  60             x = pop();
  61             if (isnan(x)) {
  62                 push(y);
  63                 fprintf(stderr, "potřebuji dva operandy\n");
  64             } else {
  65                 push(log(x));
  66                 tiskni();
  67             }
  68         } else if (strcmp(vstup, "log") == 0) {
  69             x = pop();
  70             if (isnan(x)) {
  71                 push(y);
  72                 fprintf(stderr, "potřebuji dva operandy\n");
  73             } else {
  74                 push(log10(x));
  75                 tiskni();
  76             }
  77         } else if (strcmp(vstup, "**") == 0) {
  78             y = pop();
  79             x = pop();
  80             if (isnan(x)) {
  81                 push(y);
  82                 fprintf(stderr, "potřebuji dva operandy\n");
  83             } else {
  84                 push(pow(x,y));
  85                 tiskni();
  86             }
  87         } else if (strcmp(vstup, "print") == 0) {
  88             tiskni();
  89         } else {
  90             fprintf(stderr, "Neplatný vstup\n");
  91         }
  92     }
  93 
  94     return 0;
  95 }
  96 
  97 double zasobnik[ZASPOC];
  98 int pocet = 0;
  99 
 100 void push(double number)
 101 {
 102     if (pocet < ZASPOC) {
 103         zasobnik[pocet] = number;
 104         pocet++;
 105     }
 106 }
 107 
 108 double pop(void)
 109 {
 110     if (pocet > 0) {
 111         pocet--;
 112         return zasobnik[pocet];
 113     } else {
 114         return NAN;
 115     }
 116 }
 117 
 118 void tiskni(void)
 119 {
 120     printf("[ ");
 121     for (int i = 0; i < pocet; i++) {
 122         printf("%g ", zasobnik[i]);
 123     }
 124     printf("]\n");
 125 }
`--> stáhnout

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