Pawlllosss Temat założony przez niniejszego użytkownika |
[C++] Obliczanie kwadratu liczb pierwszych » 2014-07-01 12:48:25 Witajcie bracie programiści! Jako, że przygotowuję się do matury z informatyki chciałem porozwiązywać jakieś zadania z poprzednich matur. Program ma za zadanie oczytać z pliku liczby.txt 500 liczb o długości nie większej niż 6 cyfr każda i wskazać, która z nich jest kwadratem liczby pierwszej. Podaje poprawne wyniki poza ostatnią liczbą, która jest na minusie i z tym mam problem: 5041 16 1369 32041 256 729 844561 10000 4 96721 9 942841 49 1849 528529 121 961 169 -741158448
|
Oto zawartość tego pliku: http://wklej.org/id/1406565/Oto mój kod źródłowy: #include <iostream> #include <fstream> #include <cstdlib>
using namespace std;
bool czykwadrat( int a ) { for( int i = 2; i * i <= a; i++ ) { if( i * i == a ) return true; } return false; }
int main() { int a, i = 0, tab[ 500 ]; ifstream plik; plik.open( "liczby.txt" ); while( plik.good() ) { plik >> a; if( czykwadrat( a ) ) { tab[ i ] = a; i++; } } for( int j = 0; j <= i; j++ ) { cout << tab[ j ] << endl; } system( "PAUSE" ); return 0; }
|
|
Monika90 |
» 2014-07-01 13:05:57 Nie sprawdzasz czy ta operacja plik >> a; zakończyła się sukcesem. |
|
Jacob99 |
» 2014-07-01 13:11:25 bool czykwadrat( int a ) { for( int i = 2; i * i <= a; i++ ) { if( i * i == a ) return true; } return false; }
|
Ta funkcja nie sprawdza czy a jest kwadratem liczby pierwszej, tylko sprawdza ogólnie czy a jest kwadratem jakiejś liczby z zakresu [a, n). |
|
Pawlllosss Temat założony przez niniejszego użytkownika |
» 2014-07-01 13:15:36 A to w takim razie nie wystarcza samo sprawdzanie czy z plikiem wszystko w porządku poprzez plik.good()? Nie wiem za bardzo jakby to miało wyglądać, bo np.taka zmiana nic mi nie daje: while( plik.good() ) { plik >> a; if( !plik.fail() ) { if( czykwadrat( a ) ) { tab[ i ] = a; i++; } } }
Przerobiłem swój kod, żeby jeszcze sprawdzał czy jest to kwadrat liczby pierwszej(dzięki za zwrócenie uwagi), ale dalej ostatnia cyfra jest minusowa. 5041 1369 32041 844561 4 96721 9 942841 49 1849 528529 121 961 169 -1010646592
|
#include <iostream> #include <fstream> #include <cstdlib>
using namespace std;
bool czypierwsza( int i ) { if( i < 2 ) return false; for( int j = 2; j * j <= i; j++ ) { if( i % j == 0 ) return false; } return true; }
bool czykwadrat( int a ) { for( int i = 2; i * i <= a; i++ ) { if( i * i == a ) { bool test = czypierwsza( i ); return test; } } return false; }
int main() { int a, i = 0, tab[ 500 ]; ifstream plik; plik.open( "liczby.txt" ); while( plik.good() ) { plik >> a; if( !plik.fail() ) { if( czykwadrat( a ) ) { tab[ i ] = a; i++; } } } ofstream wynik; wynik.open( "odpowiedz.txt" ); for( int j = 0; j <= i; j++ ) { cout << tab[ j ] << endl; wynik << tab[ j ] << endl; } system( "PAUSE" ); return 0; }
|
|
Jacob99 |
» 2014-07-01 13:27:20 Tym sprawdzasz czy udało się poprawnie otworzyć plik. chodzi o to, aby sprawdzić, czy udało się wczytać liczbę, czyli: plik.open( "liczby.txt" ); if( !plik.good() ) cout << "nie udało się otworzyc pliku!\n";
while( plik >> a ) { if( czykwadrat( a ) ) { tab[ i ] = a; i++; } } Do znalezienia liczb pierwszych dobrym sposobem jest sito Eratostenesa: sito eratostenesa- algorytm |
|
Pawlllosss Temat założony przez niniejszego użytkownika |
» 2014-07-01 13:40:26 Ja nie mogę, ale głupi błąd zrobiłem. Wygląda na to, że program obliczał wszystko dobrze. Błąd zrobiłem przy samym wyświetlaniu wyników z tablicy, wychodziło poza obszar... I takie pytanie w nawiązaniu do sprawdzania, czy liczba się wczytała dobrze, czyli w tym przypadku: while( plik >> a ) { /... }
Czy można w ten sam sposób postępować gdy wczytujemy łańcuchy znaków czy pojedyncze litery, aby sprawdzić czy wszystko dobrze się wczytało? |
|
Jacob99 |
» 2014-07-01 13:44:36 Tak. To jest ogólna metoda sprawdzania, czy wczytało się wszystko. Można dodatkowo sprawdzić strumień warunkiem while( plik >> a && !plik.fail() ) |
|
pekfos |
» 2014-07-01 13:51:43 Można dodatkowo sprawdzić strumień warunkiem
while( plik >> a && !plik.fail() )
|
Nie ma potrzeby ani sensu. |
|
« 1 » 2 |