NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Po první volbě program proběhne a nic neudělá

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Ja Bu
Člen
Avatar
Ja Bu:31.8.2015 19:56

Ahoj, dělám na programu, který počítá změnu proměnný na základě zadaných hodnot. Potíž je v tom, že hned po zadaní první volby program proběhne aniž by něco udělal.
Mohl by mi někdo poradit co tam mam špatně nebo co mi tam chybí? Dík.

#include <stdio.h>
#include <stdlib.h>

void mezni_sklon_ke_spotrebe(void) {
    float m_s_k_s;
    printf("Zadejte mezni sklon ke spotrebe: ");
    scanf("%f", &m_s_k_s);
}

void mezni_sklon_k_importu(void) {
    float m_s_k_i;
    printf("Zadejte mezni sklon k importu: ");
    scanf("%f", &m_s_k_i);
}

void danova_sazba(void) {
    float d_sazba;
    printf("Zadejte danovou sazbu v %: ");
    scanf("%f", &d_sazba);
    d_sazba = d_sazba / 100;
}

void vypis(char text1[]) {
    float vysledek;
    printf("%s se zmenil(y) o %f Kc.", text1, vysledek);
}

void zadej_zmenu(char text2[]) {
    float zmena;
    printf("Zadejte zmenu %s v Kc:\n", text2);
    scanf("%f", &zmena);
}

void volba(int dolniMez, int horniMez) {
    int v;
    printf("Vase volba: ");
    scanf("%d", &v);
    while (v < dolniMez && v > horniMez) {
        printf("Tato volba nebyla v nabidce! Zadejte znovu a spravne: \n");
        scanf("%d", &v);
    }
}

int main() {
    int v;
    float konstanta, m_s_k_s, vysledek, zmena, d_sazba, m_s_k_i;
    printf("Program pro vypocet zmeny multiplikatoru v ekonomice.\n");
    printf("V kolika sektorove ekonomice chcete pocitat?.\n");
    printf("2 - Dvousektorova\n");
    printf("3 - Trisektorova\n");
    printf("4 - Ctyrsektorova\n");
    volba(2, 4);
    switch (v) {
        case 2:
            printf("Jakou hodnotu chcete vypocitat?\n");
            printf("1 - Vydajovy multiplikator\n");
            printf("2 - Investicni multiplikator\n");
            volba(1, 2);
            mezni_sklon_ke_spotrebe();
            konstanta = (1 - m_s_k_s);
            switch (v) {
                case 1:
                    zadej_zmenu("investic");
                    vysledek = zmena / konstanta;
                    vypis("Duchod");
                    break;
                case 2:
                    zadej_zmenu("duchodu");
                    vysledek = zmena * konstanta;
                    vypis("Investice");
                    break;
            }
            break;
        case 3:
            printf("Jakou hodnotu chcete vypocitat?\n");
            printf("1 - Vydajovy multiplikator\n");
            printf("2 - Investicni multiplikator\n");
            printf("2 - Multiplikator vladnich vydaju\n");
            printf("3 - Danovy mltiplikator\n");
            printf("4 - Multiplikator transferovych plateb\n");
            volba(1, 4);
            danova_sazba();
            mezni_sklon_ke_spotrebe();
            konstanta = 1 - m_s_k_s * (1 - d_sazba);
            switch (v) {
                case 1:
                    printf("Pomoci ceho chcete vypocitat vydajovy multiplikator?\n");
                    printf("1 - Investic\n");
                    printf("1 - Vladnich vydaju\n");
                    printf("2 - Dani\n");
                    printf("3 - Transferovych plateb\n");
                    volba(1, 3);
                    switch (v) {
                        case 1:
                            zadej_zmenu("investic nebo vladnich vydaju");
                            vysledek = zmena / konstanta;
                            vypis("Duchod");
                            break;
                        case 2:
                            zadej_zmenu("dani");
                            vysledek = zmena * (-m_s_k_s) / konstanta;
                            vypis("Duchod");
                            break;
                        case 3:
                            zadej_zmenu("transferovych plateb");
                            vysledek = zmena * (m_s_k_s) / konstanta;
                            vypis("Duchod");
                            break;
                    }
                    break;
                case 2:
                    zadej_zmenu("duchodu");
                    vysledek = zmena * konstanta;
                    vypis("Investice nebo vladni vydaje");
                    break;
                case 3:
                    zadej_zmenu("duchodu");
                    vysledek = zmena * konstanta / (-m_s_k_s);
                    vypis("Dane");
                    break;
                case 4:
                    zadej_zmenu("duchodu");
                    vysledek = zmena * konstanta / m_s_k_s;
                    vypis("Transferove platby");
                    break;
            }
            break;
        case 4:
            printf("Jakou hodnotu chcete vypocitat?\n");
            printf("1 - Vydajovy multiplikator\n");
            printf("2 - Investicni multiplikator\n");
            printf("2 - Multiplikator vladnich vydaju\n");
            printf("2 - Multiplikator exportu\n");
            printf("3 - Danovy mltiplikator\n");
            printf("4 - Multiplikator transferovych plateb\n");
            printf("5 - Multiplikator importu\n");
            volba(1, 5);
            danova_sazba();
            mezni_sklon_ke_spotrebe();
            mezni_sklon_k_importu();
            konstanta = 1 - m_s_k_s * (1 - d_sazba) + m_s_k_i;
            switch (v) {
                case 1:
                    printf("Pomoci ceho chcete vypocitat vydajovy multiplikator?\n");
                    printf("1 - Investic\n");
                    printf("1 - Vladnich vydaju\n");
                    printf("1 - Exportu\n");
                    printf("2 - Dani\n");
                    printf("3 - Transferovych plateb\n");
                    printf("4 - Importu\n");
                    volba(1, 4);
                    switch (v) {
                        case 1:
                            zadej_zmenu("investic, vladnich vydaju nebo exportu");
                            vysledek = zmena / konstanta;
                            vypis("Duchod");
                            break;
                        case 2:
                            zadej_zmenu("dani");
                            vysledek = zmena * (-m_s_k_s) / konstanta;
                            vypis("Duchod");
                            break;
                        case 3:
                            zadej_zmenu("transferovych plateb");
                            vysledek = zmena * (m_s_k_s) / konstanta;
                            vypis("Duchod");
                            break;
                        case 4:
                            zadej_zmenu("importu");
                            vysledek = (-zmena) / konstanta;
                            vypis("Duchod");
                            break;
                    }
                    break;
                case 2:
                    zadej_zmenu("duchodu");
                    vysledek = zmena * konstanta;
                    vypis("Investice, vladni vydaje nebo export");
                    break;
                case 3:
                    zadej_zmenu("duchodu");
                    vysledek = zmena * konstanta / (-m_s_k_s);
                    vypis("Dane");
                    break;
                case 4:
                    zadej_zmenu("duchodu");
                    vysledek = zmena * konstanta / m_s_k_s;
                    vypis("Transferove platby");
                    break;
                case 5:
                    zadej_zmenu("duchodu");
                    vysledek = (-zmena) * konstanta;
                    vypis("Import");
                    break;
            }
            break;
    }
    return 0;
}
 
Odpovědět
31.8.2015 19:56
Avatar
David Novák
Tvůrce
Avatar
David Novák:31.8.2015 20:07

Nevrátí se ti žádná volba, protože ji ukládáš jen v lokální proměnné.

Tento kód ti do hlavní funkce nepředá žádnou hodnotu.

volba(2, 4);

Máš dvě možnosti, jak to udělat. Použít globální proměnnou (horší) nebo přečtenou volbu vracet jako návratovou hodnotu.. Použij druhou možnost:

int volba(int dolniMez, int horniMez) {
    int v;
    printf("Vase volba: ");
    scanf("%d", &v);
    while (v < dolniMez && v > horniMez) {
        printf("Tato volba nebyla v nabidce! Zadejte znovu a spravne: \n");
        scanf("%d", &v);
    }
    return v;
}

A v main pak funkci volej takto:

v = volba(2, 4);
Nahoru Odpovědět
31.8.2015 20:07
Chyba je mezi klávesnicí a židlí.
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na David Novák
David Novák:31.8.2015 20:09

To stejné samozřejmě platí i pro ostatní funkce - nikde si tu načtenou hodnotu neuložíš..

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
31.8.2015 20:09
Chyba je mezi klávesnicí a židlí.
Avatar
Ja Bu
Člen
Avatar
Ja Bu:31.8.2015 22:12

Supr, dík.

 
Nahoru Odpovědět
31.8.2015 22:12
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.