Wyjście z pierwszej pętli po wpisaniu wyrazu "stop"

0

Witam, przygotowując się do pierwszych egzaminów z programowania natrafiłem na mały problem. Napisałem program i chcę, aby po wpisaniu wyrazu "stop" program wychodził z pierwszej pętli, jednak tak się nie dzieje. Oto kod programu:

int main()
{
    int i, j, max_cena, cmp, cena[50];
    char nazwa[50][20], tab[50][20], stop[]="stop";

    for(i=0;i<50;i++)
    {
        printf("\nPodaj nazwe towaru nr %d: ", i+1);
        fgets(nazwa[i],20,stdin);
        if(strcmp(nazwa, stop) == 0)
        break;
        else
        {printf("\nPodaj cene towaru: ");
        scanf("%d", &cena[i]);}
        fflush(stdin);
    }
    i=0;
    for(i=0;i<50;i++)
    {
        if(max_cena<cena[i])
        max_cena=cena[i];
    }
    i=0;
    for(i=0;i<50;i++)
    {
        if(cena[i]>max_cena/2)
        strcpy(tab[j], nazwa[i]);
        j++;
    }
    i=0;
    for(i=0;i<j;i++)
    {
        printf("\n%s", tab[i]);
    }


    return 0;
}

Co jest tutaj nie tak? Dzięki za ewentualne zainteresowanie :)

dodanie znacznika <code class="c"> - fp

0
if(strcmp(nazwa, stop) == 0)

Tutaj pewnie jest błąd, wyświetl sobie na ekran 'nazwa'. Zapewne warunek nie jest prawdziwy.

dodanie znacznika <code class="c"> - fp

1

Poczytaj uważnie o fgets

stop[]="stop\n";
1

Wczytujesz do nazwa[i], a odczytujesz nazwa...

1

Po pierwsze to skup się na wartosci max_cena bo są w niej smieci jako, że jest to zmienna lokalna maina, i nie mozesz o tak jej sobie porownywac....
Problemy do rozpatrzenia (inne) błędy mogą być dwa(oba na raz):

  1. fgets może pobierac znaki z wejscia rownież z \n, ktorego w stop nie ma. Tego nie pamietam, ale to mozesz to sobie wygooglowac
 if(strcmp(nazwa[i], stop) == 0)
0

Dobra, zastąpiłem funkcję fgets, funkcją scan f, teraz pętla wygląda tak:

 for(i=0;i<50;i++)
    {
        printf("\nPodaj nazwe towaru nr %d: ", i+1);
        scanf("%s", &nazwa[i]);
        if(strcmp(nazwa[i], stop) == 0)
        break;
        else
        {printf("\nPodaj cene towaru: ");
        scanf("%d", &cena[i]);}
    }

faktycznie po wpisaniu "stop" wyrzuca z pętli, chwilę myśli i pojawia się komunikat, że program.exe przestał działać :/

1

Już ci już mówiono wyżej: - scanf("%s",nazwa[i]);
Na przyszłość jak nie rozumiesz tego co ci mówią to od razu mów którego słowa nie rozumiesz zamiast ignorować pomoc.

0

Kod całego programu jeszcze raz, po wszystkich uwagach, które zrozumiałem:

int main()
{
    int i, j, max_cena, cmp, cena[50];
    char nazwa[50][20], tab[50][20], stop[]="stop";

    for(i=0;i<50;i++)
    {
        printf("\nPodaj nazwe towaru nr %d: ", i+1);
        scanf("%s", nazwa[i]);
        if(strcmp(nazwa[i], stop) == 0)
        break;
        else
        {printf("\nPodaj cene towaru: ");
        scanf("%d", &cena[i]);}
    }
    i=0;
    for(i=0;i<50;i++)
    {
        if(max_cena<cena[i])
        max_cena=cena[i];
    }
    i=0;
    for(i=0;i<50;i++)
    {
        if(cena[i]>max_cena/2)
        strcpy(tab[j], nazwa[i]);
        j++;
    }
    i=0;
    for(i=0;i<j;i++)
    {
        printf("\n%s", tab[i]);
    }


    return 0;
}
 

Program dalej nie działa, prosiłbym o konkretne wskazanie co jest źle i najlepiej jeszcze jakby ktoś mógł napisać na co to zmienić. Tak jak mi radziliście poczytałem o fgets, wiem, że tam na końcu zapisuje jeszcze znak, oprócz wprowadzonego tekstu, zmieniłem w tym porównaniu dwóch napisów, bo tam było źle i zmieniłem fgets na scanf tak jak radził _13th_Dragon. Jednak dalej nie potrafię sprawić, aby program zadziałał prawidłowo.
SIRKOLPOL sugerował, że nie mogę porównywać zmiennej max_cena, może tu jest błąd?
Dodam jeszcze "polecenie" do tego zadania:

Dane: tablica nazw towarów(teksty) oraz tablica cen (liczby). Ilość elem.<50. Ostatni towar
ma nazwę stop, cena dowolna. Wczytać dane, utworzyć tablicę nazw towarów, których
cena>max_cena/2. Wyświetlić tę tablicę.

Tyle co zrozumiałem to poprawiłem, dzięki za każdą wskazówkę :)

1
  1. kiedy tylko możesz zamienić x++ na ++x - zrób to.
  2. kiedy szukasz max_cena - brak początkowej inicjalizacji
  3. kiedy szukasz max_cena pętla powinna być do ilości wczytanych
  4. nazywaj zmienne sensownie

        if(cena[i]>max_cena/2) // lepiej użyj if(2*cena[i]>max_cena)
        strcpy(tab[j], nazwa[i]); // to wewnątrz tego if'a
        j++; // zaś to jest poza if'em, będzie wykonane na każdym kroku pętli
1

U mnie grzecznie wyszedł z pętli i rozpoczął wyświetlanie krzaczków, w końcu nie ma tam 50 wartośći. Moim zdaniem powinieneś dodać dodatkową zmienną pamiętającą ile danych wprowadziłeś przed stop-em, oraz poprawić wyświetlanie

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