/*
 * Soubor:  20110325-Fri-matematika.c
 * Datum:   25.03.2011 08:24
 * Autor:   Marek Nožka, nozka <@t> spseol <d.t> cz
 * Licence: GNU/GPL 
 * Úloha: 
 * Popis:   
 ****************************************************/
#define _ISOC99_SOURCE
#define _GNU_SOURCE
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

/* ***************    Makra    ******************** */
#define ARREYC 1024
#define PRIKLC 128

/* ***************   Funkce    ******************** */

int plus(char priklad[])
{
    int a = rand() % 100;
    int b = rand() % (100 - a);
    sprintf(priklad, "%2d + %2d", a, b);
    return a + b;
}

int minus(char priklad[])
{
    int a = (rand() % 99) + 1;
    int b = (rand() % 99) + 1;
    if (a < b) {
        int bagr = a;
        a = b;
        b = bagr;
    }
    sprintf(priklad, "%2d - %2d", a, b);
    return a - b;
}

int krat(char priklad[])
{
    int a = (rand() % 10) + 1;
    int b = (rand() % 10) + 1;
    sprintf(priklad, "%2d * %2d", a, b);
    return a * b;
}

int deleno(char priklad[])
{
    int a = (rand() % 10) + 1;
    int b = (rand() % 10) + 1;
    sprintf(priklad, "%2d : %2d", a * b, a);
    return b;
}


/****************************************************
 *               Hlavní program.
 ****************************************************/
int main(int argc, char *argv[])
{
    srand(time(NULL));
    // ukazatel na funkci, která přebírá řetězec a vrací integer

    typedef int (*OPERACE) (char *);
    OPERACE operace;

    // pole ukazatelů na funkkce
    OPERACE zadani[128];
    int zadanic = 0;            // proměnná uchovává počet prvků v poli zadani


    if (argc == 2) {
        char znak;
        int i = 0;
        while ((znak = argv[1][i]) != '\0') {
            if (znak == '+') {
                zadani[zadanic] = plus;
                zadanic++;
            } else if (znak == '-') {
                zadani[zadanic] = minus;
                zadanic++;
            } else if (znak == '*') {
                zadani[zadanic] = krat;
                zadanic++;
            } else if (znak == ':') {
                zadani[zadanic] = deleno;
                zadanic++;
            }
            i++;
        }
    }
    if (zadanic == 0) {
        zadani[0] = plus;
        zadani[1] = minus;
        zadani[2] = krat;
        zadani[3] = deleno;
        zadanic = 4;
    }

    int vysl = 0;
    int j = 0;
    char priklad[PRIKLC];
    while (j++ < 30) {
        operace = zadani[rand() % zadanic];
        vysl = operace(priklad);
        printf("%s = %d\n", priklad, vysl);
    }



    return 0;
}

