Chaotyczne działanie programu

0

Witam, program działa dość dziwnie, mam na myśli to że za pierwszym razem wykonywanie działań przebiega poprawnie, lecz potem zaczyna wariować. Dlaczego tak się dzieje?

#include <stdio.h>
char wybor_dzialania(void);
float pierwsza(void);
float druga(void);
char dzialanie(char ch, float a, float b);

int main(void)
{
    float liczba1, liczba2;
    char wybor;
    while((wybor = wybor_dzialania()) != 'k')
    {
        liczba1 = pierwsza();
        liczba2 = druga();
        dzialanie(wybor, liczba1, liczba2);
    }
    return 0;
}



char wybor_dzialania(void)
{
    char ch;
    printf("a. dodawanie    b. odejmowanie\n");
    printf("c. mnozenie     d. dzielenie\nk. koniec\n");
    ch = getchar();


    return ch;
}

float pierwsza(void)
{
    float liczba;
    char ch;
    printf("Podaj liczbe: \n");
    while ((scanf("%f", &liczba)) != 1)
    {
        while ((ch = getchar()) != '\n')
            putchar(ch);
        printf(" nie jest liczba\nJeszcze raz...");
    }
    return liczba;
}

float druga(void)
{
    float liczba;
    char ch;
    printf("Podaj liczbe: \n");
    while ((scanf("%f", &liczba)) != 1)
    {
        while ((ch = getchar()) != '\n')
            putchar(ch);
        printf(" nie jest liczba\nJeszcze raz...");
    }
    return liczba;
}

char dzialanie(char ch, float a, float b)
{
    switch (ch)
    {
        case 'a' :  printf("%f + %f = %f\n", a, b, a + b);
                    break;
        case 'b' :  printf("%f - %f = %f\n", a, b, a - b);
                    break;
        case 'c' :  printf("%f * %f = %f\n", a, b, a * b);
                    break;
        case 'd' :  printf("%f / %f = %f\n", a, b, a / b);
                    break;
        default  :  printf("Blad!\n");
    }
}
 
1

Co zaczyna wariować może coś konkretnego -,- ?

char dzialanie(char ch, float a, float b)
{
    switch (ch)
    {
        case 'a' :  printf("%f + %f = %f\n", a, b, a + b);
                    break;
        case 'b' :  printf("%f - %f = %f\n", a, b, a - b);
                    break;
        case 'c' :  printf("%f * %f = %f\n", a, b, a * b);
                    break;
        case 'd' :  printf("%f / %f = %f\n", a, b, a / b);
                    break;
        default  :  printf("Blad!\n");
    }
}
 

Tu nic nie zwracasz

Nie rozumiem jeszcze dlaczego robisz te same dwie funkcje tylko o roznych nazwach...

I warto nauczyć używać się debugera do takich rzeczy ;d

2

Nie napisałeś jakie są objawy...
Szklana kula mówi że gdzieś przy wczytywaniu zostaje w buforze znak \n i getchar go później łyka zamiast pytać o działanie.

0

Nie wiem co to jest debugger, ale zaraz to sprawdzę.

@Shalom Masz racje, to musi być to tylko nie wiem za bardzo jak się tego pozbyć bo jest tak:
Wybieram rodzaj działania i wtedy podaje dwie liczby, liczy i daje wynik. Za drugim razem natomiast jest tak że wyświetla menu, ale nie czeka na wybór tylko od razu chce liczbe pierwsza i druga. Po podaniu przechodzi w Switchu do default bo wczytuje tego entera. Mógłby ktoś podpowiedzieć jak mam wyrzucić tego entera z bufora?

EDIT: Próbowałem nadać zmiennej ch początkową wartość w funkcji ale nie działa i tak jak powinno

0

EDIT:
Pff załapałem jakie to było głupie, czekaj zara ogarne xd

0
MoorfoxD napisał(a):

char wybor_dzialania(void)
{
    printf("a. dodawanie    b. odejmowanie\n");
    printf("c. mnozenie     d. dzielenie\nk. koniec\n");
 
 
 
    return getchar();
}
 

Sprawdz czy nie da rady tak
Ale tylko sprawdz to moja absurdalna propozycja xd

Niestety ale jest tak samo jak wcześniej.

1

Niedotlenienie jakieś miałem :P Jedna z tych byskłotliwych myśli da się lepiej a jednak wychodzi ze nie ma totalnie sensu

 
char wybor_dzialania(void)
{
    char ch;
    printf("a. dodawanie    b. odejmowanie\n");
    printf("c. mnozenie     d. dzielenie\nk. koniec\n");
do{
   ch = getchar();
    }while(ch=='\n');
 
    return ch;
}
0

scanf(' %c', &input);

A czy to możliwe, żeby mój kompilator nie miał debuggera?

Kompilatory same w sobie raczej rzadko mają debuggery...

0
  • oczywiście tam ma być " %c" :P
1

Kompilatory same w sobie raczej rzadko mają debuggery

Żebyś dobrze zrozumiał tą ironie chodzi mu o to, że kompilator to kompilator a debugger to debugger dwa inne narzędzia kompilator to nie zbiór narzędzi a jedno konkretne narzędzie co innego twoje środowisko pracy może dostarczać kompilator debugger ale wcale nie musi. Twoje pytanie powinno brzmieć "czy możliwe jest, że debuggera nie było w pakiecie z kompilatorem"

0

Dzięki wielkie za pomoc;) Teraz chodzi jak powinno.

1 użytkowników online, w tym zalogowanych: 0, gości: 1