logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

C++: Insertion Sort nie działa dla losowych wartości w tablicy tau_1

Giro82 20 Lip 2009 12:53 1337 4
REKLAMA
  • #1 6800746
    Giro82
    Poziom 10  
    Posty: 20
    Ocena: 1
    Problem polega na tym że zaimplementowany algorytm sortowania przez wstawianie (funkcja insertion_sort) działa poprawnie dla tablicy ze stałymi wartościami a nie działa (w moim przypadku ;-)) dla tablicy z wartościami losowymi (tablica tau_1).
    Kompilator żadnych błędów nie wywala a pisze program w Builderze ver 6.
    Ma ktoś pomysł gdzie moze być błąd?
    Poniżej fragment kodu.Załaczyłem też cały kod programu.
     void insertion_sort(double x[],int length)  //sortowanie przez wstawianie 
    {
      int i,j;
      double temp;
      for(j=1;j<length;j++)
      {
         temp=x[j];
         i=j-1;
         while(x[i]>temp && i>=0)
         {
                   x[i+1]=x[i];
             i--;
         }
         x[i+1]=temp;
      }
    }
    //-----------------------
    srand(time(NULL));
    
    double uni_dyst;
    uni_dyst=(double)rand()/RAND_MAX;
    if (uni_dyst==0)uni_dyst=0.0000000001 ;
    
    double tau_1[6];
    int k;
            for (k=0;k<6;k++)
            {
            tau_1[k]=-r_DS_SMa*sigma_DS(epsilon_DS_SMa,mikro_DS_SMa)*log(uni_dyst);
            StringGrid1->Cells[k+1][2]=AnsiString(tau_1[k]);
            }
    
    insertion_sort(tau_1,6);
    
    
    Załączniki:
    • fMIMO_Channel_1.cpp (3.52 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • REKLAMA
  • #3 6802165
    Giro82
    Poziom 10  
    Posty: 20
    Ocena: 1
    Właśnie widze że jakieś śmieci google dodało.

    Dodano po 3 [godziny] 44 [minuty]:

    Dzięki Dr. Ma za linki. Przejrzałem je i nadal nie wiem gdzie mam błąd.
    Rozumiem jak działa algorytm sortowania i ten zaimplementowany w programie działa poprawnie (testowałem go na tablicy wypełnionej konkretnymi wartosciami). Natomiast gdy chce posortować tablice wypełnianą wartosciami przypadkowymi (w def. tablicy tau_1[] ukryty jest rand()) to wynik sortowania jest błędny.
    Może znajdzie się ktoś kto rzuci okiem na kod programu.
    Nadmieniam że jestem początkujacym programistą i mozliwe że popełniam jakąs szybką do wychwycenia (dla sprawnego programisty)gafe.
  • REKLAMA
  • #4 6805487
    Dr. Ma
    Poziom 12  
    Posty: 99
    Ocena: 3
    U mnie też hula przez wartości narzucone z góry:

    
    #include <iostream>
    #include<conio.h>
    #define elementy 6
    
    using namespace std;
    
    void jakies_sortowanie(int x[],int length)
    {
      int kk,i;
      for(int j=1;j<length;j++)
      {
         kk=x[j];
         i=j-1;
         while(x[i]>kk && i>=0)
         {
                   x[i+1]=x[i];
             i--;
         }
         x[i+1]=kk;
      }
    }
    
    int main()
    {
    cout << "--------------------------\n"
         << "Sorowanie przez wstawianie\n"
    	 << "--------------------------\n\n\n";
      int A[elementy]={8,5,3,1,9,11};
      int x;
    
      cout<<"Nieposorotwana lista\n";
      for(x=0;x<elementy;x++)
      {
           cout<<A[x]<<endl;
      }
      jakies_sortowanie(A,elementy);
      cout<<"\n\nPosortowana lista wyglada tak ooo: \n\n";
      for(x=0;x<elementy;x++)
      {
           cout<<A[x]<<endl;
      }
      getch();
      getch();
      return 0;
    }
    
    


    No to może się trzeba zastanowić nad tym aby elementy były wybierane logowo. HYYYYYY

    Dodano po 35 [minuty]:

    Nie chciało mi się sprawdzac tego wszystkiego co napisałeś, napisałem Ci taki oto program, ale musisz sobie wyjątek napisać mam nadzieje że potrafisz.

    
    # include <iostream>
    # include <conio.h>
    
    using namespace std;
    
    void sort_jakis_tam(int tab[], int n);
    
    
        main(){
        int tab[20];
        int n;
        cout<<"Ile liczb bedziemy sortowac: \n\n";
        cin>>n;
    
    
            for(int i=0;i<n;i++){
            cout<<"Dajesz liczby " << i + 1  << " i naciskaj ENTER\n";
            cin>>tab[i];
        }
    
        sort_jakis_tam(tab, n);
    }
    
    void sort_jakis_tam(int tab[], int n)
    
    
        {
        	int a[30];
        	a[0] = tab[0];
        	for (int i = 1; i < n; i++)
    
    
            	{
            		int temp = tab[i];
            		int j = i - 1;
            		while (( a[j] > temp) && (j>=0))
    
    
                		{
                			a[j+1] = a[j];
                			j--;
                		}
                		a[j+1] = temp;
                	}
                	for (int k = 0; k < n; k++)
    
    
                    	{
                    		tab[k] = a[k];
                }
    
                cout<<"Nacisnij ENTER aby zobaczyc posortowane liczby\n\n";
    
    
                    for(int x=0;x<n;x++){
                    cout<<"Posortowana liczba " << x + 1 << " to: "<<tab[x]<< "\n";
                    getch();
                    
                    
                }
    
            }
    
    


    Jak nie będziesz potrafil to daj znać może się zmusze żeby rzucić okiem na to co napisałes.

    Pozdrawiam
    Dr. Ma
  • #5 6819034
    Giro82
    Poziom 10  
    Posty: 20
    Ocena: 1
    Czytałem troche o tych wyjatkach (http://www.intercon.pl/~sektor/cbx/advanced/exceptions.html ), przejrzałem podręcznik C++ Builder Ćwiczenia i napisałem obsługe wyjątku. Niestety nic to nie pomogło.
    Może źle ją napisałem a może nie o to chodzi. Może problem jest w zmiennych losowych (o rozkł. normalnym i równomiernym) jakie są wykorzystywane przy opisie tablicy tau_1[].
    Zredukowałem kod programu maksymalnie jak się da (duzo kodu nie zostało) do fragmentu z tą nieszczęśna tablicą.
    
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "fMIMO_Channel_1.h"
    
    #include <alloc.h>
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define PI 3.141592654
    #define r_DS_SMa 1.4
    #define epsilon_DS_SMa 0.288
    #define mikro_DS_SMa -6.80
    
    
    double gngauss(double mean, double sigma) {    // zmienna o rozkladzie normalnym (Gaussowskim)
    
        double u, r;
        u = (double)rand() / RAND_MAX;
        if (u == 1.0) u = 0.999999999;
    
        r = sigma * sqrt( 2.0 * log( 1.0 / (1.0 - u) ) );
    
        u = (double)rand() / RAND_MAX;
        if (u == 1.0) u = 0.999999999;
    
        return( (double) ( mean + r * cos(2 * PI * u) ) );
    }
    //////////////////////////////////////////////////////////////////////////////////////
    double sigma_DS(double epsilon_DS, double mikro_DS){
    
            return((double)(pow(10,epsilon_DS * gngauss(0,1)+ mikro_DS)));
    }
    //////////////////////////////////////////////////////////////////////////////////////
    
    void insertion_sort(double *x, int length)
    {
     for(int j=1; j<length ;++j)        //od drugiego elementu do ostatniego
      {
       double temp = x[j];             //zapamietaj wartość elementu
       int i=j-1;                        //indeks poprzednika
       while((i>=0) && (x[i]>temp)) //dopóki istnieje poprzednik
        {                                //i jego wartość jest większa
         x[i+1] = x[i];      //przesuń poprzedni element w prawo
         --i;
        }
       x[i+1] = temp;               //wstaw i-ty element w odpowiednim miejscu
      }
    }
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    
    int i;
             for (i=1; i < 7; i++)
            {
              StringGrid1->Cells[i][1]="N/A";
              StringGrid1->Cells[i][2]="N/A";
            }
           StringGrid1->Cells[0][1]="Moc";  
           StringGrid1->Cells[0][2]="Opoz";
           StringGrid1->Cells[0][3]="Opoz sort";
           StringGrid1->Cells[0][4]="Opoz wzgl";
           StringGrid1->Cells[1][0]="N_1";
           StringGrid1->Cells[2][0]="N_2";
           StringGrid1->Cells[3][0]="N_3";
           StringGrid1->Cells[4][0]="N_4";
           StringGrid1->Cells[5][0]="N_5";
           StringGrid1->Cells[6][0]="N_6";
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    Close();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    srand(time(NULL));
    
    double uni_dyst;                      // zmienna o rozkladzie rownomiernym  w <0,1>
    uni_dyst=(double)rand()/RAND_MAX;
    if (uni_dyst==0)uni_dyst=0.0000000001 ;
    
    double tau_1[6];
    int k;
            for (k=0;k<6;k++)
            {
            tau_1[k]=-r_DS_SMa*sigma_DS(epsilon_DS_SMa,mikro_DS_SMa)*log(uni_dyst);
            StringGrid1->Cells[k+1][2]=AnsiString(tau_1[k]);
            }
    try
    {
    insertion_sort(tau_1,6);
    }
    catch(...)
    {
    }
    int l;
            for (l=0;l<6;l++)
            {
            StringGrid1->Cells[l+1][3]=AnsiString(tau_1[l]);
            }
    }
    
    //---------------------------------------------------------------------------
    

    Załączyłem też komplet plików jakie Builder wygenerował może rzuci ktoś okiem i a nóż a widelec bład znajdzie ;-).

    Pozdrawiam
    Giro82
    Załączniki:
    • MIMO Channel_test_3.rar (351.07 KB) Musisz być zalogowany, aby pobrać ten załącznik.
REKLAMA