problem z kompilatorami

luk17

Nowicjusz
Dołączył
11 Marzec 2007
Posty
74
Punkty reakcji
0
Miasto
Krakow
Czesc
Mam wielki problem otoz napisalem taki program:
Kod:
#include<iostream>
#include<time.h>
#include<stdlib.h>

using namespace std;

void babelek(long int tab[],int ile)
{
    
   int i,k,pom;
   //babelek:D

   if(ile!=0)
   {for(k=0;k<ile;k++){
       for(i=0;i<=ile;i++)
       {
          if(tab[i]>tab[i+1])
          {
             pom=tab[i];
             tab[i]=tab[i+1];
             tab[i+1]=pom;
            
          }
       }
   }}
   
                 
}

main()
{
    srand(time(NULL));

    time_t pierwsze;
    time_t drugie;
    
    int ile,k,wybor;
    long double dif;

  long int *tab = new long int[ile];
  
    cout<<"Wpisz dla ilu liczb "<<endl;
    cin>>ile;
    
    
    
    for(k=0;k<ile;k++)
   {
                  tab[k]=((rand()%201)-100);
   }
   
 system("CLS");  
 for(int i=0;i<ile;i++)
   cout<<tab[i]<<endl;
  //wybor sortowania 
   cout<<"Wybierz metode sortowania: \n"<< "1. sortowanie babelkowe"<<endl;
   cin>>wybor; 
   switch(wybor)
{
   case 1:
        system("CLS");
    time(&pierwsze);
 cout<<"\nPierwszy czas to: "<<pierwsze<<endl;
 
  babelek(tab,ile);
  
  time(&drugie);
   dif=difftime(drugie,pierwsze);
   cout<<"\nDrugi czas to: "<< drugie;
   cout<<"\nWszystko zajelo: "<<dif/60<<"sec"<<endl;
  break;
} 
   system("pause");
}

u mnie na kompilatorze (dev c++) albo jak wpisze liczbe 160 to wyskakuje mi blad i ze okno sie samo zamknie(
Program sortowanie.exe bo tak nazwalem przestal dzialac. Program przestal dzialac poprawnie z powodu wystapienia problemu. System windows zamknie program i powiadomi cie jesli istnieje dostepne rozwiazanie
) a jak dam mniejsza liczbe to mi przechodzi i albo pod koniec ten sam komunikat albo program sie konczy ale nie pokazuje mi czasu w jakim wykonal sie program. Najciekawsze jest to ze wyslalem kumplowi i u niego chodzilo super.
 

CristianoRonaldo9

Nowicjusz
Dołączył
17 Marzec 2010
Posty
37
Punkty reakcji
1
Witaj w świecie c++ :)

Rady:
- reinstal systemu
- inny kompilator

Musisz być naprawdę Pro skoro od razu sugerujesz przeinstalować system albo kompilator. Czy ty robisz to w takich sytuacjach? ;-D

Wracając do tematu:

Problem tkwi w kodzie:
Kod:
{for(k=0;k<ile;k++){
       for(i=0;i<=ile;i++)
       {
          if(tab[i]>tab[i+1])
Mianowicie wykraczasz poza zakres tablicy i to o 2 elementy (i może być == ile -> to jeden, i+1 to drugi), w efekcie czego jeździsz nie po swojej pamięci.
 

iwans

Nowicjusz
Dołączył
29 Marzec 2008
Posty
515
Punkty reakcji
1
Wiek
32
Miasto
Gdańsk
Kod:
#include<iostream>
#include<time.h>
#include<stdlib.h>

using namespace std;

void babelek(long int tab[],int ile)
{
    
   int i,k,pom;
   //babelek:D

   if(ile!=0)
   {
             for(k=0;k<ile;k++)
             {
                                for(i=0;i<=ile;i++)
                                {
                                                   if(tab[i]>tab[i+1])
                                                   {
                                                                      pom=tab[i];
                                                                      tab[i]=tab[i+1];
                                                                      tab[i+1]=pom;
                                                   }
                                }
             }
   }             
}

main()
{
    srand(time(NULL));

    time_t pierwsze;
    time_t drugie;
    
    int ile,k,wybor;
    long double dif;

  
    cout<<"Wpisz dla ilu liczb "<<endl;
    cin>>ile;
    
    long int *tab = new long int[ile];
    time(&pierwsze);
    
    for(k=0;k<ile;k++)
   {
                  tab[k]=((rand()%201)-100);
   }  
   
   system("CLS");
   cout<<"\nPierwszy czas to: "<<pierwsze<<endl;
 
   babelek(tab,ile);
   for(int i=0;i<ile;i++)
   cout<<tab[i]<<endl;
  
   time(&drugie);
   dif=difftime(drugie,pierwsze);
   cout<<"\nDrugi czas to: "<< drugie;
   cout<<"\nWszystko zajelo: "<<dif/60<<"sec"<<endl;
   system("pause");
}

To jest twój kod działający. Czy dobrze nie wiem:p. Po cholere tworzysz tablice dynamiczną przed podaniem jakiej wielkości ona ma być?? Zgaduje, że tutaj błędy wyskakiwały.

Po drugie obliczanie czasu źle ci działa. Zaraz napisze cały ten kod od nowa, działający i edytuje post.

Kod:
#include<iostream>
#include<time.h>
#include<stdlib.h>

using namespace std;

void sort(long int tab[],int ile)
{
     int i=0;
     long int p;
     bool zm=false;
     
     while(true)
     {
                if(tab[i]>tab[i+1])
                {
                                   p=tab[i];
                                   tab[i]=tab[i+1];
                                   tab[i+1]=p;
                                   zm=true;
                }
                i++;
                if(i==ile&&zm==false) break;
                if(i==ile&&zm==true)
                {
                                    zm=false;
                                    i=0;
                }
     }
                
}           

int main()
{
    srand(time(NULL));
    
    int ile,k;
    
    clock_t start;
  
    cout<<"Wpisz dla ilu liczb "<<endl;
    cin>>ile;
    long int *tab = new long int[ile];
    while(true)
    {
    start=clock();
    
    for(k=0;k<=ile-1;k++)
                  tab[k]=((rand()%201)-100); 
   
   system("CLS");
 
   sort(tab,ile-1); //-1 ponieważ tablica zaczyna się od 0, czyli 40 elementowa tablica będzie miała indexy od 0 do 39.
   
   clock_t koniec=clock();
   
   for(int i=0;i<=ile-1;i++)
           cout<<tab[i]<<endl;
   cout<<"\nPierwszy czas to: "<<start;
   cout<<"\nDrugi czas to: "<< koniec<<endl;
   cout<<koniec-start<<endl;
   int czas=(koniec-start)/CLOCKS_PER_SEC;
   int milisec=koniec-start;
   while(true)
   {
              if(milisec<1000) break;
              milisec/=10;
   }
   cout<<"\nWpisywanie losowych wartości + sortowanie zajeło: "<<czas<<"."<<milisec<<" sec"<<endl;
   system("pause");
    }
}

Nie wiem czy czas oblicza dobrze ale zdaje się, że tak. Na pewno lepiej niż u ciebie :p

Sortowanie 120 000 elementów zajeło mi moją wersją programu 155 sekund
 
Do góry