Bardzo prosty program, nie chce się zakończyć po wpisaniu wskazanej liczby.

0

Cześć. To mój pierwszy post, jestem bardzo początkujący, programowaniem zająłem się kilkanaście dni temu.
Mam do napisania taki program:

Napisać program, który ma odczytywać sekwencję liczb całkowitych z terminala i wyliczać częstotliwość wystąpień przecięć zera we wczytywanym strumieniu wejściowym.
Przecięcie zera następuje każdorazowo, gdy po wartości dodatniej następuje wartość ujemna lub po wartości ujemnej dodatnia (także, gdy między tymi wartościami pojawia się
jedno lub więcej zer).
W przypadku wykroczenia wyliczanej częstotliwości poza zadany przedział na wyjściu programu powinien pojawić się odpowiedni komunikat. W szczególności:
pod uwagę mają być brane jedynie liczby z przedziału od -10 do 10 oraz liczba 99 oznaczająca koniec strumienia danych; pozostałe wartości są uznawane za niepoprawne i pomijane;
częstotliwość ma być określana jako liczba wystąpień przecięcia zera w kolejnych grupach złożonych z 99 liczb - wartość częstotliwości spoza przedziału od 5 do 8 uznawana
jest za niepoprawną i powoduje pojawienie się na wyjściu programu odpowiedniego komunikatu; w pozostałych przypadkach nie jest generowany żaden komunikat.

Mój kod wygląda tak: (te komunikaty pisałem dla pomocy, żeby wiedzieć gdzie jest program przy testowaniu)

 #include <stdio.h>

#define STOP 99
#define WIELKOSC_GR 10
#define L_MIN -10
#define L_MAX 10
#define CZEST_MIN 5
#define CZEST_MAX 8

int main () {
int a, b, i=0, z=0;
printf ("Podawaj liczby\n");
	do{

	scanf ("%d", &a);
	if (i==WIELKOSC_GR){
	printf ("koniec grupy\n");
		if (z>=CZEST_MIN && z<=CZEST_MAX) 
                {
		printf ("poprawna czestotliwosc\n");
		a=0, b=0, i=0, z=0;
		}
	else 
	printf ("niepoprawna czest\n"); 
	return 0; }

	else {
		printf ("nie koniec grupy, podano dopiero %d liczb\n", i);
		if (a>=L_MIN && a<=L_MAX) {
		printf ("dobra wartosc liczby\n");
			if (a==0)
				i++;
				else
				{
				i++;
					if (a*b<0) 
					{
						z++;
						printf ("przeciecie zera. liczba przeciec: %d\n", z);
						b=a;		
					}
						else
						printf ("nie ma przeciecia. aktualnie przeciec: %d\n", z); 
						b=a;
					}
					}
		else 
		printf ("zla wartosc\n");
		a=0;
		}
	}
	while (a!=STOP);
	return 0;
}

Gdzie jest problem? Ano, niestety gdy wpisuję 99 czyli mój STOP program dalej wykonuje pętlę- dlaczego? Napisałem dla porówanania takie coś:

 #include <stdio.h>

int main () {
int a;

do 
{
     scanf ("%d", &a);
     printf ("L");
} 
while (a!=5);
}

i tu pętla działa okej, wpisuję liczby, wyświetla się znak, ale gdy wpiszę 5 program kończy działanie.
Proszę o pomoc co robię źle. I wyrozumiałość, naprawdę nie mam doświadczenia.
Pozdrawiam.

0
 a=0;
                }
        }
        while (a!=STOP);

Za każdym razem przypisujesz 0 do a, więc warunek zawsze będzie spełniony.

Chyba już rozumiem co chciałeś zrobic. Jeśli piszesz instrukcje warunkowe if i else to musisz je zamknąć w klamrze { }. Jeśli tego nie zrobisz instrukcja warunkowa zawiera tylko pierwszą linijkę.

0

Polecam zapoznać się z debuggerem oraz formatuj kod lepiej

a=0, b=0, i=0, z=0;

po co zerujesz zmienna a? Przecież podajesz ją w scanfie

0
fasadin napisał(a):

Polecam zapoznać się z debuggerem oraz formatuj kod lepiej

a=0, b=0, i=0, z=0;

po co zerujesz zmienna a? Przecież podajesz ją w scanfie

tu jest kolejny problem którego nie umiem rozwiązać: mianowicie gdy częstotliwość jest OK, program powinien zaczynać nową grupę liczb. Myślałem że da się to zrobić przez wyzerowanie wszystkich wartości, ale program też kończy działanie. OK, jak formatować? Jakieś wskazówki?

mrhyd napisał(a):

Jeśli piszesz instrukcje warunkowe if i else to musisz je zamknąć w klamrze { }. Jeśli tego nie zrobisz instrukcja warunkowa zawiera tylko pierwszą linijkę.

Zmieniłem, zamknąłem, nadal nie kończy działania po wpisaniu 99, tylko uznaje że 99 jest większe od 10 i je pomija.

0

W ogóle nie przypisuj 0 do a, bo po co?
A jeśli chodzi o zakończenie programu, to wiesz do czego służy return? A jeśli chcesz kończyć program tylko w jednym przypadku to jeszcze raz przeczytaj co pisałem o klamrach.

0

gdy podajesz 99 to tutaj:

 
if (a>=L_MIN && a<=L_MAX)

warunek nie będzie spełniony i przechodizsz to bloku else w którym zerujesz zmienną a po czym sprawdzasz czy jest ona nierówna 99. Oczywiscie warunek będzie spełniony i pętla będzie się cały czas wykonywać.

0
robcio napisał(a):

gdy podajesz 99 to tutaj:

 
if (a>=L_MIN && a<=L_MAX)

warunek nie będzie spełniony i przechodizsz to bloku else w którym zerujesz zmienną a po czym sprawdzasz czy jest ona nierówna 99. Oczywiscie warunek będzie spełniony i pętla będzie się cały czas wykonywać.

Dzięki wielkie, o to chodziło! Również pozostałym dziękuję za przydatne rady.
Pozdrawiam.

0

A jeśli chodzi o kończenie programu to dalej nie wiem, jak sprawić, żeby po obliczeniu poprawnej częstotliwości prosił o nową grupę liczb... Wiem że return kończy funkcję i zwraca wartość. Ale nie wiem jak to zastosować do swojego programu.

0
 else {
        printf ("niepoprawna czest\n"); 
        return 0;
}

Naucz się do czego służą klamry.

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