c++ czas wykonywania algorytmu - blad

0

Hej,

napisałem taki program i chce zmierzyc czas wykonania algorytmu

#include <iostream>
#include <conio.h>
#include <ctime>

#include <cstdlib>


using namespace std;
 
bool czypierwsza(int n)
{
bool wynik=true;
int dzielnik=2; 
 while (dzielnik*dzielnik<=n)
   {
     if ( n%dzielnik==0) wynik=false;
     dzielnik++; // jezeli liczba podzieli sie przez kolejne dzielniki zwracamy falsz (liczba nie jesy pierwsza)
   }
 return wynik;
}
void sito(bool *tab, unsigned int k)
{
  for (int i=2; i*i<=k; i++) // przeszukuje kandydatow na pierwsze
    {              
    if(!tab[i])        //jesli liczba jest pierwsza bo ma wartosc 0 w naszej tab
    for (int j = i*i ; j<=k; j+=i)
            tab[j] = 1;      //wielokrotnosc pierwszych ustawiamy na 1
    }
}
int sumacyfr10(int n)
{
  if(n>0)
    return n%10 + sumacyfr10(n/10);
 
  return 0;
}
int sumacyfr2(int n)
{
  if(n>0)
    return n%2 + sumacyfr2(n/2);
 
  return 0;
}

main ()
{
     int liczba, licznik=0, licznik2=0, suma2=0;
     char wybor;
     bool *tab;
     clock_t start, end;
     double czas;

    /* ofstream w1 ("1.txt");
     ofstream w2 ("2.txt");
     ofstream w3 ("3.txt"); */
     cout << "\t*******************************************************************\n"
     <<      "\t*** PROGRAM ZLICZA LICZY PIERWSZE Z PODANEGO PRZEDZIALU         ***\n"
     <<      "\t*** DODATKOWO MOZE ROZWIAZAC DODATKOWE PROBLEMY                 ***\n"
     <<      "\t*** Liczba super B pierwsza to taka ktore spelnia 3 warunki:    ***\n"
     <<      "\t*** - jest liczba pierwsza                                      ***\n"
     <<      "\t*** - suma cyfr tej liczby jest rowniez liczba pierwsza         ***\n" 
     <<      "\t*** - suma cyfr w zapisie binarnym jest takze liczba pierwsza   ***\n"
     <<      "\t*******************************************************************\n\n"; 
     
     cout << "Podaj przedzial zamkniety, w ktorym bedziemy szukac liczb pierwszych" << "\n(poczatek i koniec przedzialu oddziel spacja, <2...100000>: ";
     int p, k, p2;
     cin >> p >> k;
     p2=p;
     
     
    do {
     cout << "\nCzy przy okazji wypisac wszystkie liczby pierwsze oddzielone spacjami? (t/n) ";
     cin >> wybor;
    } 
    while (wybor!='t' & wybor!='T' & wybor!='n' & wybor!='N');
     if (p==2 & k<=100000 & k>p) {
               clock_t start, end; 
 double czas_obl; 
 
 start=clock();
                 tab = new bool [k]; 
                 for (int i=2;i<=k;i++) tab[i]=0;
     
                 sito (tab, k);
     
                 for(int i=2;i<=k;i++)
                 {
                        
                   if(!tab[i]) { 
                               licznik++  ;          
                               if (wybor=='t' || wybor=='T')
                                cout << i << " ";
                   }
                   
                 }
                 end=clock(); 
 czas_obl=1.000*(end-start)/CLK_TCK; // czas wyznaczany jest w sekundach
 

                 cout << "\nProblem rozostal rozwiazany za pomoca Sita Eratostenesa. Czas wykonywania to: " << czas_obl;
           //     printf( "%.4fsek.", difftime( czasStop, czasStart ) );
                
                }   
     else {
          if (p>=2 & k<=100000 & k>p)
          {
             for (p;p<=k;p++)
             {
              if (czypierwsza (p)) {                         
                              //if (czypierwsza ((sumcyfr (p, 10))) && czypierwsza ((sumcyfr (p,2))))
                              licznik++;
                              if (wybor=='t' || wybor=='T') cout << p << " ";
                                    }     
              }
              cout << "\nProblem rozostal rozwiazany za pomoca algorytmu CzyPierwsza. Czas wykonywania to: ";
          }     
          else cout << "Dane podane przez Ciebie sa nieprawidlowe!\n"; 
                  
         
         }
         cout << "\nTakich liczb jest: " << licznik << "\n";
         cout << "\nDodatkowe zadania do rozwiazania.\n0) Zakoncz wykonywanie programu.\n"
         << "1) Sprawdz ile jest liczb super B pierwszych w tym przedziale.\n"
         << "2) Sprawdz ile jest liczb ktorych suma cyfr jest liczba pierwsza.\n"
         << "3) Sprawdz czy suma wszystkich liczb super B pierwszych jest liczba pierwsza.\n";
         int wybor2;
         cin >> wybor2;
         switch( wybor2 )
         {
         case 0:
         cout << "Koniec programu\n";
         break;
         case 1:
              {
              int spr1, spr2;
              int licznik2=0;
              for (p2;p2<=k;p2++) {

             if (czypierwsza (p2) && czypierwsza (sumacyfr10 (p2)) && czypierwsza (sumacyfr2 (p2)))
                            //  cout << p2 << " ";
                              licznik2++;
                              }
              cout << "Liczb super B pierwszych jest: " << licznik2 << "\n";
              }
         break;
         case 2:
         for (p2;p2<=k;p2++)
         
             if (czypierwsza (sumacyfr10 (p2))) licznik2++;
             
         
         cout << "Takich liczb jest: " << licznik2;
         break;
         case 3:
              for (p2;p2<=k;p2++)
                  if (czypierwsza (p2)) suma2+=p2;
                  if (czypierwsza (suma2)) cout << "TAK" << "\n";
                  else cout << "NIE" << "\n";
         break;
         default:
         cout << "Wpisano zly argument!" << "\n";
         break;
    }
         getch();
         
//system ("pause");     
}
 

pomiar zaczyna sie tam pod petla do...while. Kiedy program sie wykonuje i przychodzi czas na wyswietleie czasu wyskakuje blad ze program przesatal dzialac. Widzi ktos tu jakis bląd? jakies uwagi co do kodu?

Pozdrawiam.

0

Wklej tu: http://ideone.com/

0

Oczywiście conio wraz z getch trzeba wywalić.

0

nadal wyskakuje błąd ;/

0

Czy ty nie umiesz przeczytać co pisze kompilator czy nie potrafisz korzystać z google?
http://msdn.microsoft.com/pl-pl/library/8001551c.aspx

0

spoko, tylko ze dla przedziałów od 2 do dowolnej liczby program wyswietla czas wykonywania jako 0, a dla przedziału 2-1000 w ogóle sie nie wykonuje w tym momencie tylko od razu zamyka.

0

Przeczytałeś ostrzeżenia?
Trzy z nich to błędy.

0

http://ideone.com/uWueI7 teraz gdy poprawilem wszystko kompilator deva nie zwraca zadnego bledu

1

Pamiętaj że clock() ma małą precyzje, przeważnie na typowym PC 1/18 sekundy.
Jak potrzebujesz mierzyć mniejsze czasy to albo API albo C++11 http://www.cplusplus.com/reference/chrono/

0

ok, teraz rozumiem. bede sobie musial radzic z taka dokladnoscia jaka jest. dzięki :)

0

Dla szybkich procesów:

clock_t x=clock();
while(x==clock()) {}
int i=0;
for(x=clock();x==clock();++i) fun(x);
// wykonano i razy w czasie CLOCKS_PER_SEC
// czyli czas 1/(CLOCKS_PER_SEC*i);

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