problem ze średnią arytmetyczną w oparciu o tablice

0

Witam
Niedawno zacząłem bawić się w programowanie i postanowiłem zrobić sobie ćwiczenie.
Założenia programu to pobrać od użytkownika dane, a wypisać z nich średnią arytmetyczną.

        int x=0,wynik=0;
	int tablica[100];
	for(int a=0; a<100; ++a)tablica[a]=0;
	cout<<"SREDNIA ARYTMETYCZNA\n";
	for(int b=0;b<25;++b)cout<<"-";
	cout<<endl<<"Podawaj liczby a na koncu wpisz t  ";
	for(int c=0; c<100; ++c){cin>>tablica[c]; if(static_cast<char>(tablica[c]=='t')){x=(c-1); break;}}
	//for(int b=0; b<7; b++)cout<<endl<<tablica[b]<<endl;
	cout<<"\n\t\t"<<x;
	for(int a=0;a<100;++a)wynik += tablica[a];
	cout<<"\n\t\t"<<wynik;
	//cout<<"\n\n\t Wynik: "<<(wynik/x);
	_getch();'

Problem zaś polega na tym że chociaż nie wiem czego bym nie spróbował to zmienna X zawsze przyjmuje wartość zero. Nie mogę zrozumieć dlaczego. I tak już przeżyłem traumę i wielki zonk kiedy się okazało że break tak naprawdę wcale nie przerywa pętli :O (piszę w Visual Studio 2010 jeśli to ma znaczenie w tym wypadku)

PS jeszcze nie ogarnąłem tematu wskaźników, więc jeśli są tu potrzebne i to widać od razu to mnie nie bijcie :)

0

#Nie pisz długich linijek bo dostaniesz oczopląsu
#co to w ogóle mabyć:

if(static_cast<char>(tablica[c]=='t')) {
     x=(c-1);
     break;
}

tablica[c] zawiera liczbę, więc nie jest możliwe wyłuskanie na podstawie jakiego napisu została obliczona ta wartość, nie da się z tego wyciągnąć 't'! break działa, ale twój warunek jest bezsensu ('t' w kodzie ASCII reprezentowane jest przez liczbę 116, więc twój warunekt to if(tablica[c]==116) co jest bezsensu). Użycie cast też jest bezsensu. Najwyraźniej chciałeś zrobić coś takiego:

int c=0;
while(cin>>tablica[c])
     c++;
cin.clear();
cin.synch();
0

U mnie jeśli podam na wejście 't' to pętla się przerywa tak jak trzeba, nie rozumiem więc czemu warunek miałby być bez sensu.
cin.synch() nie chce się skompilować, błąd jest mniej więcej treści 'ta klasa nie posiada członka "synch"'

0

tylko ci się tak wydaje.
Wprowadzając nie liczbę (dowolne coś), gdy oczekujesz liczbę (cin>> cosTypuInt), wprowadzasz cin w stan błędu. Od tego momentu każda kolejna operacja na cin jest ignorowana, dopóki nie wyczyścisz tego błędu (cin.clear()).
cin.synch() - powoduje, wyczeszczenie pozostałych danych z bufora.
W moim kodzie masz warunek: czytaj dopóki da się przeczytać liczbę typu int (zwiększaj licznik danych o jeden po każdym sukcesie). Gdy wprowadzisz coś co nie da się przeczytać jako int pętla zostanie przerwana i czyszczę stan błędu na cin by można było wykonać kolejne operacje na cin.

Porównaj mój i swój kod, gdy wprowadzisz liczbę 116 lub gdy wprowadzisz cokolwiek co nie jest liczbą.

0

sync a nie synch ;]

0

Dzięki za pomoc i objaśnienia, rzeczywiście po prostu warunek był zły przez moją niewiedzę. Odnośnie samych założeń programu to akurat wystarczy zmienić sam warunek i wszystko już działa. (chodziło mi tylko o przerwanie ciągu podawanych liczb przez bodziec typu np. litera, dlatego jak tylko się to stanie program już nie korzysta z pobierania danych i czyszczenie bufora nic nie zmieni)

Temat do zamknięcia

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