Program ten szuka liczb pierwszych do pożądanej wartości, a Jako że wartości te mają być dość spore dane zapisywane są w osobnym pliku. Kompilator nie wykrywa błędów, ale kompilator to kompilator...
Pierwszy raz operuję na plikach(zresztą na wskaźnikach też) i chce się upewnić czy przez jakiś błąd wyprodukuje mi się plik-agresor zajmujący cały dysk(mały jak na dzisiejsze czasy) czy jakiś inny kwiatek.
oto kod:
#include <iostream>
#include <cmath>
#include <conio.h>
#include <fstream>
#include <stdio.h>
typedef unsigned __int64 Lng; /* notka do siebie: nie ignorować ŻADNEJ
możliwości c++. Że też ja jak debil cały
cały kod pisałem ze zwykłą nazwą a
alias wprowadziłem ... na koniec :/ */
void Zapisz(Lng* x, FILE* y) // dopisuje liczbę pierwszą na koniec pliku
{
fseek(y, 0, SEEK_END);
fwrite(x,sizeof(Lng),1,y);
}
bool Sprawdz(unsigned q, unsigned w, Lng* e, FILE* r) // sprawdza czy liczba pierwsza jest
{ // mniejsza od pierwiastka liczby sprawdzanej
fseek(r, ((q-1)*16), SEEK_SET);
fread(e,sizeof(Lng),1,r);
return(*e <= ceil(pow(w,0.5)) ? true : false);
}
void Wczytaj(unsigned a, FILE* b, Lng* c) // wczytuje daną liczbę pierwszą
{
fseek(b, ((a-1)*16), SEEK_SET);
fread(c,sizeof(Lng),1,b);
}
int main()
{
unsigned long u_Max; //najwyższa sprawdzana liczba
unsigned long u_Ile = 2; //liczba liczb pierwszych :)
Lng Prime=2; //chwilowo przechowywana liczba pierwsza
Lng* Prm = ″
std::cout<<"do jakiej liczby liczyc? - ";
std::cin>>u_Max;
std::cout<<std::endl;
FILE *plik;
plik=fopen("Prime.txt","ab"); //utworzenie lisry liczb pierwszych
fwrite(&Prm,sizeof(unsigned __int64),1,plik); //wprowadzenie pierwszych dwóch liczb pierwszych :)
Prime=3;
fwrite(&Prm,sizeof(unsigned __int64),1,plik);
bool b_Prim=true;
for(Lng i=5; i<=u_Max; i+=2) //sprawdzanie pierwszości liczb
{
b_Prim=true; //flaga
for(unsigned j=1; Sprawdz(j,i,Prm,plik); ++j) //właściwa pętla sprawdzająca
{
Wczytaj(j,plik,Prm);
if(i%Prime==0)
{
b_Prim=false; //jeśli się dzieli nie jest pierwsza
break;
}
}
if (b_Prim==true)
{
Prime=i;
Zapisz(Prm,plik); // dopisuje liczbę pierwszą na koniec pliku
++u_Ile;
}
}
for(unsigned i=0; i<=u_Ile-1; i++)
{
Wczytaj(i+1,plik,Prm);
std::cout<<Prime<<std::endl;
}
std::cout<<"ilosc liczb pierwszych - "<<u_Ile<<std::endl;
std::cout<<"gestosc - "<<static_cast<double>(u_Ile)/u_Max<<std::endl;
getch();
}
krytyka mile widziana :)