Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

c++ problemy z sortowaniem

Giro82 20 Lip 2009 12:53 1010 4
  • #1 20 Lip 2009 12:53
    Giro82
    Poziom 8  

    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.

    Code:
     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);

    0 4
  • #3 20 Lip 2009 23:11
    Giro82
    Poziom 8  

    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.

    0
  • #4 21 Lip 2009 16:42
    Dr. Ma
    Poziom 12  

    U mnie też hula przez wartości narzucone z góry:

    Code:

    #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.

    Code:

    # 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

    0
  • #5 25 Lip 2009 10:26
    Giro82
    Poziom 8  

    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ą.

    Code:

    //---------------------------------------------------------------------------

    #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

    0
    Załączniki: