[C] Problem laika ze switch

Witam!

Na wstępie zaznaczam, że jestem laikiem jeśli chodzi o programowanie i pewnie popełniłem jakiś zupełnie podstawowy błąd. Jak można zobaczyć po kodzie staram sie zrobić kalkulator walut, jednak mam problem z wyborami. Po wpisaniu temperatury przechodzę do dalszej części. Teraz, gdy wpiszę 1, 2 lub 3 cały program przestaje działać. Proszę was o to, żebyście pokazali mi błąd i pomogli się go pozbyć. Z góry dzięki :slight_smile:

 

KOD:

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

    int main(void) // zdeklarowanie funkcji main
{
    printf("Podaj temperature, ktora chcesz zamienic\n\n");
    float temp1;
    float temp2;
    int wybor2;

    scanf("%f", &temp1);

    printf("\nW jakiej jednostce jest ta temperatura?\n");
    printf("1.Celsjuszach\n");
    printf("2.Fahrenheitach\n");
    printf("3.Kelvinach\n\n");

    int wybor1;
    scanf("%f", &wybor1);


    switch(wybor1)
    {
        case '1':
                printf("\nNa jaka jednostke chcesz zamienic ta temperature?\n");
                printf("1.Fahrenheit\n");
                printf("2.Kelvin\n\n");

                scanf("%f", &wybor2);
            switch( wybor2)
                {
                case '1':
                    temp2 = 9*temp1/5+32;
                    printf("\nTa temperatura w Fahrenheitach wynosi %.1f\n", temp2);
                    break;
                case '2':
                    temp2 = temp1+273;
                    printf("\nTa temperatura w Kelvinach wynosi %.1f\n", temp2);
                    break;
                }
                break;
        case '2':
            printf("\nNa jaka jednostke chcesz zamienic ta temperature?\n");
            printf("1.Celsjusz\n");
            printf("2.Kelvin\n\n");

            scanf("%f", &wybor2);
            switch(wybor2)
                {
                case '1':
                    temp2 = 5/9*temp1-32;
                    printf("\nTa temperatura w Fahrenheitach wynosi %.1f\n", temp2);
                    break;
                case '2':
                    temp2 = temp1+273;
                    printf("\nTa temperatura w Kelvinach wynosi %.1f\n", temp2);
                    break;
                }
                break;
        case '3':
            printf("\nNa jaka jednostke chcesz zamienic ta temperature?\n");
            printf("1.Celsjusz\n");
            printf("2.Fahrenheit\n\n");

            scanf("%f", &wybor2);
            switch(wybor2)
                {
                case '1':
                    temp2 = 9*temp1/5+32;
                    printf("\nTa temperatura w Fahrenheitach wynosi %.1f\n", temp2);
                    break;
                case '2':
                    temp2 = temp1+273;
                    printf("\nTa temperatura w Kelvinach wynosi %.1f\n", temp2);
                    break;
                }
                 break;
    }

    return 0;
}

Z tego co wiedzę zapomniałeś zakończyć zewnętrzne instrukcje case instrukcją break.

Pobawiłem się z tym kodem i po poprawieniu dwóch rzeczy zaczął działać. Mianowicie:

  1. Jak pobierasz wybór użytkownika, to nie dajesz:

    scanf("%f", &wybor2);

tylko:

scanf("%d", &wybor2);

Twoja zmienna przechowująca wybór użytkownika jest typu int, więc za pomocą instrukcji scanf nie pobierasz wartości float(%f), tylko decimal(czyli int, więc &d). Popraw każdą instrukcję scanf, która pobiera wybór użytkownika z menu. Tylko nie ruszaj scanf, które pobierają wartość do zmiennej temp*, bo te zmienne są typu float, wiec musi zostać %f.

 

  1. W switch masz taką konstrukcję:

    switch(wybor1)
    {
    case ‘1’:
    //costam
    break;

Ponownie, zmienne wybor* są typu int, a ty usiłujesz w case’ach porównać ją do wartości typu char(‘1’ ma numer 49 w ASCII, więc ten case wykona się, jak zmienna wybor1 przyjmie wartość 49, czego oczywiście użytkownik raczej nie wybierze). Musisz dać:

switch(wybor1)
{
case 1:
//costam
break;

Wtedy ten case wykonuje się jak zmienna wybor1 przyjmie wartość 1, czyli tak jak powinno być.

 

Przynajmniej u mnie po poprawieniu tych dwóch rzeczy program zaczął działać normalnie.

@dragon321

Ze scanf nieźle namieszałem, ale zapamiętam już na przyszłość, by sprawdzić to 10 razy :slight_smile: Dzięki wielkie za pomoc.

Tak, to jeden z powodów, dla których wolę C++ - nie muszę się bawić z printf i scanf. Cóż, każdy koduje w tym, w czym lubi i w czym mu wygodnie, nie ma za co i pozdrawiam :slight_smile: