Mikeros Temat założony przez niniejszego użytkownika |
Cout, a wynik programu » 2016-03-04 10:40:00 Czołem, jest to mój pierwszy post na tym forum. Przychodzę z problemem - jeśli taki już kiedyś się tutaj pojawił, to przepraszam. W C++ jestem początkujący. Przerabiam zadania maturalne. Jestem aktualnie na zadaniu 5. a) z arkusza w linku - http://cke.edu.pl/images/stories/mat3_07/inf_pr_cz2.pdf. Problem jest taki, że napisałem cały program, wszystko okej, z tym że wynik zmienia się w zależności od tego, czy w programie pojawia się cout (linia 76 - cout << "q3";), czy nie. Np. podając na samym początku wyznaczony w poleceniu przedział <2;1000>, z coutem wychodzi mi 51 (w przypadku pierwszego przedziału powinno być 50, ale to nieistotne), bez couta 130, podobnie z innymi podanymi przedziałami. Dodam, że piszę w najnowszym Dev C++. Przepraszam za takie nazwy zmiennych i słabe formatowanie, ale pisząc dla siebie nie uważam na to. #include <cstdlib> #include <iostream> #include <math.h> using namespace std; int pierwsza( int i1 ) { int s, j, pierwiastek, c, l = 0; pierwiastek = sqrt( i1 ); for( j = 2; j <= pierwiastek; j++ ) { c = i1 % j; if( c == 0 ) l = l + 1; } if( l == 0 ) { s = 1; } return s; } int sumapierwsza( int m ) { int suma = 0; double n; do { n = m / 10; m = m % 10; suma = suma + m; m = n; } while( n >= 1 ); return suma; } int sumabin( int x ) { int sumab = 0, y = 1, l = 0, w, i; do { y = y * 2; l = l + 1; } while( y <= x ); for( i = l - 1; i >= 0; i-- ) { w = x - pow( 2, i ); if( w >= 0 ) { sumab++; x = w; } } return sumab; }
int main() { int p, k, q1, q2, q3, w, e, qqq, q4; cin >> p; cin >> k; for( int i = p; i <= k; i++ ) { q1 = 0; q2 = 0; q3 = 0; qqq = 0; q1 = pierwsza( i ); w = sumapierwsza( i ); q2 = pierwsza( w ); e = sumabin( i ); q3 = pierwsza( e ); cout << "q3"; qqq = q1 + q2 + q3; if( qqq == 3 ) { q4++; } } cout << q4; return q4; }
|
|
mateczek |
» 2016-03-04 11:28:48 Nie masz zadeklarowanej początkowej wartości q4. Funkcja pierwsza zwraca losowe wartości gdy nie znajdzie liczby pierwszej (chyba o to chodzi) !!!! funkcja powinna zwracać True lub false?? czasami zwraca śmieci. bool czyPierwsza( int liczba ) { if( liczba == 1 ) return false; int max = sqrt( liczba ); bool pierwsza = true; for( int i = 2; i <= max; i++ ) { if( liczba % i == 0 ) { pierwsza = false; break; } } return pierwsza; }
Masz poprawiony kod choć nie wszystko poprawiłem #include <iostream> #include <cmath> using namespace std;
bool czyPierwsza( int liczba ) { if( liczba == 1 ) return false; int max = sqrt( liczba ); bool pierwsza = true; for( int i = 2; i <= max; i++ ) { if( liczba % i == 0 ) { pierwsza = false; break; } } return pierwsza; }
int sumaCyfr( int liczba, int base ) { int suma = 0; int cyfra; while( liczba ) { cyfra = liczba % base; liczba /= base; suma = suma + cyfra; } return suma; }
int main() { int p, k, w, e, q4 = 0; cin >> p; cin >> k; for( int i = p; i <= k; i++ ) { w = sumaCyfr( i, 10 ); e = sumaCyfr( i, 2 ); if( czyPierwsza( i ) && czyPierwsza( w ) && czyPierwsza( e ) ) q4++; } cout << q4 << endl; }
} |
|
mokrowski |
» 2016-03-04 11:29:02 Bardzo proszę, nazwij porządnie zmienne i zrób dobre formatowanie. Jak widać nie piszesz "dla siebie" bo inni także będą czytali kod :-) |
|
carlosmay |
» 2016-03-04 12:20:25 Jak widać wiedziesz się w pole. Kiepskie formatowanie i nazywanie zmiennych = utrudnione znalezienie błędu. Debugger to cudo do znajdowania takich problemów. |
|
Mikeros Temat założony przez niniejszego użytkownika |
» 2016-03-04 12:37:47 Nie przewidywałem, że wyjdą jakieś problemy, więc nazywałem zmienne jak leci, a temat wstawiłem trochę na szybko.
Co do początkowej wartości q4 - i z wartością początkową nic się nie zmieniło.
Funkcje: pierwsza - sprawdza, czy liczba jest liczbą pierwszą sumapierwsza - sprawdza, czy suma cyfr jest liczbą pierwszą sumabin - zamienia zapis liczby na binarny i sumuje cyfry z tego zapisu.
Wszystkie funkcje działają poprawnie, sprawdzałem to. Nadal dziwi mnie jednak to, że zwykłe wywołanie tekstu "q3" poprzez cout wpływa na inną zmienną. |
|
mateczek |
» 2016-03-04 12:49:39 dwa posty wyżej masz poprawiony kod nie wszystkie funkcje działały prawidłowo !!! właściwie funkcja sprawdzająca liczbę pierwszą mogła by być generatorem liczb pseudolosowych :P możesz ją sobie sprawdzić na sopju !!! jeśli mi nie wierzysz :P http://pl.spoj.com/problems/PRIME_T/ |
|
Mikeros Temat założony przez niniejszego użytkownika |
» 2016-03-04 12:54:40 Pisałem posta i kiedy wstawiałeś ten kod, więc nie zauważyłem. :)
Problem rozwiązałem już sam, a był nim brak nadania początkowej wartości 0 zmiennej s w funkcji pierwsza. Jak widać, przez taką głupotę nawet zwykły cout powoduje zawalenie całego programu. Z nadaną wartością dla s program działa jak trzeba. Wszystkim dzięki za pomoc i uwagi (do formatowania jednak będę musiał się przekonać :D). |
|
mateczek |
» 2016-03-04 12:59:58 problem był nie tylko w cout!!! wynik 51 też jest błędny jak sam powiedziałeś powinno być 50 (cout wprowadzał dodatkową losowość) |
|
« 1 » 2 |