Chaotyczne działanie programu

Chaotyczne działanie programu
Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
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?

Kopiuj
#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");
    }
}
 
MD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 280
1

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

Kopiuj
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

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
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.

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
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

MD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 280
0

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

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0
MoorfoxD napisał(a):
Kopiuj

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.

MD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 280
1

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

Kopiuj
 
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;
}
  • Rejestracja: dni
  • Ostatnio: dni
0

scanf(' %c', &input);

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

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

  • Rejestracja: dni
  • Ostatnio: dni
0
  • oczywiście tam ma być " %c" :P
MD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 280
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"

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.