Problem z mierzeniem czasu

0

Cześć!
Mam do wykonania zadanie w który muszę zmierzyć czas, ale czas jest wyświetlany tylko przy "10" a przy innych wcale, czasem nawet ucina całego couta na końcu. Gdzie jest błąd? Głowie się nad tym od dwóch godzin i nie wiem co jest źle. Dziękuje za pomoc i pozdrawiam.

#include <iostream>
#include <windows.h>
#include <time.h>
#include <cstdlib>
#include <cmath>

using namespace std;

int ile;
int i = 0;
double czas;
clock_t start, stop;
int a;
int main()
{
    cout<<"Podaj liczbe: ";
    cin>>ile;

    int *liczby;
    liczby=new int[ile];
    int *rozwiazanie;
    rozwiazanie=new int[ile/2];
    int a = rozwiazanie[0];

    start=clock();
    srand(time(NULL));

    while (i<ile)
    {
        liczby[i]=rand()%ile+1;
        rozwiazanie [i]=abs((liczby[i]-liczby[i+1]));

        if (rozwiazanie[i]<a)
        {
            a=rozwiazanie[i];
            cout<<a<<" dla liczb: "<<i<<", "<<i+1<<endl;
        }

        i++;
    }
    stop=clock();


    czas=(double)(stop-start)/CLOCKS_PER_SEC;
    cout<<"Oto czas: "<<czas<<endl;
    delete [] liczby;
    return 0;
}
1

wypisz sobie wartość CLOCKS_PER_SEC a zrozumiesz w czym problem.
Spróbuj użyć std::chrono

2

czas jest wyświetlany tylko przy "10" a przy innych wcale, czasem nawet ucina całego couta na końcu.

Opisz jaśniej problem, nie wiadomo o co ci chodzi.

Z takich ogólnych uwag:

  • nie używaj zmiennych globalnych
  • C++ ma <chrono>, nie używaj <time.h>.
  • nie używaj new i delete
  • while (i<ile) chcesz użyć pętli for
    int *rozwiazanie;
    rozwiazanie=new int[ile/2];
    int a = rozwiazanie[0];

Jaką wartość ma a?

0
kq napisał(a):

czas jest wyświetlany tylko przy "10" a przy innych wcale, czasem nawet ucina całego couta na końcu.

Opisz jaśniej problem, nie wiadomo o co ci chodzi.

Z takich ogólnych uwag:

  • nie używaj zmiennych globalnych
  • C++ ma <chrono>, nie używaj <time.h>.
  • nie używaj new i delete
  • while (i<ile) chcesz użyć pętli for
    int *rozwiazanie;
    rozwiazanie=new int[ile/2];
    int a = rozwiazanie[0];

Jaką wartość ma a?

Probleme. jest to że gdy zaaplikuje w int ile liczbę 10 wyświetla mi czas zmierzony pętli. Jednak gdy próbuje zmierzyć jakąkolwiek inną wartość nic się nie wyświetla nawet 0. Zlikwidowałem "new" tak jak napisałeś i wyświetla mi:
C:\Users\Ja\Documents\c++nauka\zadaniedomowe\main.cpp|21|error: expected primary-expression before 'int'|
C:\Users\Ja\Documents\c++nauka\zadaniedomowe\main.cpp|23|error: expected primary-expression before 'int'|

Jeśli chodzi o "a" to używam go do przypisania najmniejszej różnicy pomiędzy dwoma ]randomowymi liczbami znajdującymi sie obok siebie w tablicy. Dlatego funkcja przypisuje wartości "a" z "rozwiazania", który pobiera różnice z tego działania "rozwiazanie [i]=abs((liczby[i]-liczby[i+1]));.". Reszte zmieniłem tak jak napisałeś na razie nie pomogło.

0

Nie odpowiedziałeś na moje pytanie - jaka jest wartość a po tamtym fragmencie kodu.

Sam błąd to zapewne nadpisywanie pamięci poza tablicą, ale utrudniasz jego diagnozę stylem kodowania. rozwiazanie=new int[ile/2]; - alokujesz ile/2 elementów, a potem do tej tablicy zapisujesz ile wartości.

0

wartość 'a' zależy od tego ile dam w int "ile". Gdy daję tysiąc to wynosi 1. Mój styl kodowania jest słaby niestety, bo od nie tak dawna się uczę.

0
    int *rozwiazanie;
    rozwiazanie=new int[ile/2];
    int a = rozwiazanie[0];

W jaki sposób a zależy od ile? (podpowiedź: nie zależy)

0

Miałem na myśli wartość 'a' po przeprowadzonej pętli. Przed nią wyświetla mi 16456176O.

0

Ok zmieniłem wartość int a = 1000001. Ponieważ używam go tylko do znalezienia najmniejszej wartości w pętli. Lecz nic to nie zmieniło wciąż mierzy mi czas tylko dla ile równego 10.

0

Jeśli tej wartości nie czytasz wcześniej to nie ma potrzeby aby ją jakkolwiek inicjalizować.

W każdym razie, problemem jest to, że alokujesz za mało miejsca. Użyj std::vector i będzie po problemie. Jeśli bardzo nie chcesz, to po prostu zaalokuj ile, a nie ile/2

0

Zaalokowałem ile i problem rozwiązny. Mam natomiast inne pytanie czy jest możliwość żeby wyświetlało mi tylko ostatnie cout<<a<<" dla liczb: "<<i<<", "<<i+1<<endl;. W sensie ostatnie, które zostanie uznane za najmniejsze. Próbowałem wpakować te dane w stringa w pętli i wyświetloć poza pętlą, ale ich nie mógło znaleźć. Jest opcja żeby to jakoś wykonać rozsądnie? Pozdrawiam i dziękuje za pomoc.

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