• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie maturalne w C++

Object Storage Arubacloud
+1 głos
4,240 wizyt
pytanie zadane 7 stycznia 2016 w C i C++ przez stivi212 Nowicjusz (230 p.)

Cześć

Jestem co prawda w 3 gim, ale interesuje się programowaniem i natrafiłem na takie zadanie z matury:

W pliku o nazwie liczby.txt umieszczono w kolejnych wierszach 500 liczb całkowitych dodatnich, po jednej w wierszu, z których każda liczba ma co najwyżej 6 cyfr. Napisz program, za pomocą którego otrzymasz tylko te liczby z pliku liczby.txt, które są kwadratami liczb pierwszych. Na przykład liczba 49 jest kwadratem liczby pierwszej – 49 = 72 . Wyniki zapisz w pliku zad_5.txt.

Nie potrafiłem sam tego napisać, więc znalazłem program i chciałem go przeanalizować, ale gdy go uruchomiłem okazuje się, że nie działa poprawnie, a ja nie wiem co trzeba poprawić. Bardzo proszę o wskazanie błędu i ewentualną poprawę :) 

Tak wygląda program:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std; 
int main()
{

double  liczba;
double pierw;
int pierwcalk;
bool  pierwsza;   
char  tekst[500];

ifstream plik("liczby.txt");

ofstream wynik ("zad5.txt");

if (plik.is_open()){

   while(!plik.eof()){
      plik.getline(tekst,100);

// konwersja tekstu na double

      liczba = strtod(tekst, NULL);

// obliczenie pierwiastka

      pierw = sqrt(liczba);

      pierwcalk = (int)pierw;

      if(pierw == pierwcalk){

// sprawdzenie czy pierwsza

         pierwsza = 0;

         for (int i=2; i<pierw; i++){

            if(pierwcalk%i==0){

                   pierwsza = 1;

            }

         }

         if(pierwsza == 0){

// kontrolne wypisanie na ekran

            cout << liczba << endl

// zapis do pliku

            wynik << liczba <<endl;

         }

   }

   }

   plik.close();

   wynik.close();

}   
system("PAUSE");

return EXIT_SUCCESS;

}

Chodzi mi o to, że wypisuje mi 9 i 4 a przeciez to nie sa liczby 1...

Pozdrawiam

2 odpowiedzi

0 głosów
odpowiedź 7 stycznia 2016 przez Mesiak Bywalec (2,380 p.)
A to nie miały być kwadraty liczb pierwszych? Przecież 9 to 3 do kwadratu, a 3 to liczba pierwsza tak samo 4, to 2 do kwadratu a 2 jest liczbą pierwszą więc w czym problem?
komentarz 7 stycznia 2016 przez stivi212 Nowicjusz (230 p.)
.... zabijcie mnie... Jak się kiedys naucze czytac ze zrozumieniem to będzie cud..

Przepraszam ze takim czymś Ci zająłem głowe, ale jak już tu jestem to możesz napisać jak zrobić to samo używając 'string' ?

I jaka jest różnica jak użyje 'string' a 'char' ?
komentarz 7 stycznia 2016 przez Mesiak Bywalec (2,380 p.)
Nie mam pojęcia zbytnio :D Ja tylko znalazłem ten błąd ;D
komentarz 7 stycznia 2016 przez kantekand Obywatel (1,180 p.)
char to pojedynczy znak np. 'a'

string to ciąg znaków 'akwarium'

 

char tablica[500] - jest to tablica, która ma 500 elementów, a te elementy są znakami

czytaj to tak:

typ nazwa_tablicy[rozmiar]
0 głosów
odpowiedź 8 stycznia 2016 przez stivi212 Nowicjusz (230 p.)
Teraz kolejny problem...

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;

int main(){
    
    double liczba;
    double pierw;
    int pierwcalk;
    bool pierwsza;
    char tekst[500];
    
    ifstream plik("dane.txt");
    ofstream wynik("zadanie_6.txt");
    
    if (plik.is_open()) {
        
        while(!plik.eof()) {
            plik.getline(tekst,100);
            
            liczba=strtod(tekst,NULL);
            
            pierw= sqrt(liczba);
            pierwcalk= (int)pierw;
            
            if(pierw==pierwcalk){
                
                pierwsza=0;
                
                for(int i=2;i<pierw;i++){
                    
                    if(pierwcalk%i==0){
                        
                        pierwsza=1;
                    }
                    
                }
                if(pierwsza==0){
                    cout<<liczba<<endl;
                    
                    wynik<<liczba<<endl;
                    
                }
                
            }
            
        }
        
        plik.close();
        wynik.close();
    }
    
    
}

dlaczego wypisuje mi zera i 1?
komentarz 8 stycznia 2016 przez pietrzakacper Mądrala (7,480 p.)

Wypisuje 0 i 1 ponieważ przypisujesz zmiennej pierwsza wartość 0 przed pętlą for. A dla pierw o wartości 1 lub 0 program nawet nie wchodzi do pętli for która sprawdza czy pierw jest liczbą pierwszą. Dodaj przed pętlą for:

  if(pierw==0||pierw==1)pierwsza=1;

 

Podobne pytania

0 głosów
3 odpowiedzi 1,447 wizyt
pytanie zadane 9 lutego 2016 w C i C++ przez Dronojad Obywatel (1,980 p.)
0 głosów
1 odpowiedź 2,862 wizyt
pytanie zadane 27 lutego 2018 w C i C++ przez Scypyon Gaduła (3,450 p.)
0 głosów
0 odpowiedzi 1,141 wizyt

92,617 zapytań

141,466 odpowiedzi

319,783 komentarzy

61,999 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...