Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sortowanie bąbelkowe, problem z wyswietlaniem liczb jedna pod drugą...

Ostatnio zmodyfikowano 2014-11-02 18:17
Autor Wiadomość
rychu.zks
Temat założony przez niniejszego użytkownika
Sortowanie bąbelkowe, problem z wyswietlaniem liczb jedna pod drugą...
» 2014-11-02 16:22:10
Cześć czy wiecie jak w tym programie wyświetlać liczby jedna pod drugą te wylosowane i te posortowane?
endl próbowałem to coś nie działa, dodam ze ja dopiero zaczynam się bawić w takie rzeczy :)




#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

int main (int argc, char *argv[])
{
int r,d,i,j,N;
int tab[200000]={0};
int temp;
if (argc==3)
        {
        r=atof(argv[1]);
        N=atof(argv[2]);
        }
else
        {
   
        printf("Program ktory losuje i sortuje liczby z przedzialu 0...r\n\r");
        printf("Podaj liczby:\n\r");
        printf("r=");
        scanf("%d", &r);
        printf("N=");
        scanf("%d", &N);
        }

if (r >= 0)
        ;
else
        {
        printf("Nieprawidlowe dane!");
        printf("\nNacisnij dowolny klawisz");
        getch();
        return 0;
        }

if (N > 0)
        ;
else
        {
        printf("Nieprawidlowe dane!");
        printf("\nNacisnij dowolny klawisz");
        getch();
        return 0;
        }
//Losowanie
printf("WYLOSOWANE LICZBY:\n\r");
for(i=0;i<N;i++)
{
d=rand()%r;
printf("%4d",d);
tab=d;
}
//Sortowanie
printf("\n");
for(i=0;i<N-1;i++)
for (j=i+1;j<N;j++)
if (tab[j]<tab)
{
temp=tab;
tab=tab[j];
tab[j]=temp;
}
printf("POSORTOWANE LICZBY:\n\r") ;

for(i=0;i<N;i++)
{
printf("%4d",tab);
}
printf("\nNacisnij dowolny klawisz...");
getch();
return 0;
}
P-119854
Atexor
» 2014-11-02 18:17:58
Witaj,
Na początek, jak możesz kod umieszczaj w znacznikach [ cpp ] [ /cpp ] (bez spacji wewnątrz).
Zaś do do programu:
1. Po co robisz takie coś?
C/C++
if( argc == 3 )
{
    r = atof( argv[ 1 ] );
    N = atof( argv[ 2 ] );
}

2. Kiedy chcesz określić ile elementów ma być losowanych, to nie ma sensu tworzyć tablicy int tab[200000]={0}, bo najzwyczajniej albo marnujesz pamięć, bo nie wykorzystasz całej tablicy, albo ktoś będzie chciał wylosować np. 200005 elementów i wtedy jest problem. Najlepiej po podaniu liczby określającej liczbę elementów stworzyć tablicę o rozmiarze N-1 (indeks w tablicach zaczyna się od 0, nie od 1).
3. Po co tworzysz warunek, że if (r >= 0) to ma nie robić nic, w przeciwnym wypadku ma robić else, że jest błąd? Lepiej od razu zrobić, że jeśli liczba jest mniejsza od zera to wywala błąd stosowną informację. Jeśli wczytasz dodatnią liczbę, to wtedy ifa pomija.
4. Jak możesz to staraj się robić odpowiednie wcięcia, łatwiej wtedy wychwycić ew. brak klamry zamykającej i łatwiej się czyta kod.
5. Losowanie w przedziale [a,b] ma troszkę inny wzór: liczba = a + rand() % (b - a + 1);
6. Nie podobała mi się zbytnio sposób w jaki używasz sortowania bąbelkowego. Trochę go poprawiłem.
7. Dziwnie wyświetlasz posortowane liczby... Skąd program ma wiedzieć co to jest samo "tab" i że po nim ma wyświetlić kolejny element? Najlepiej w pętli for zrobić tab[ i ] i inkrementując i (i++) czytasz w środku kolejne elementy.
8. Nie musisz korzystać z dodatkowej zmiennej "d". Wystarczy przypisywanie do tab[ i ] odpowiedniej wylosowanej liczby z rand'a.
9. Jak widzisz, to za każdym razem wpisując np. przedział do r=30 i N=15 liczb będzie ci "losować" takie same liczby. A to dlatego, że funkcja rand nie ma "do czego się odwołać" przy losowaniu. Dlatego też dodaj (na początku funkcji main) tzw. ziarno generatora tzn. srand(time(NULL));. Wtedy też losowanie będzie na podstawie aktualnego zegara systemowego i za każdym razem będą inne liczby. Pamiętaj, aby wtedy dodać bibliotekę <time.h>.
10. Jeśli możesz (np. uczysz się dla siebie, nie z wymogów, że musi być C) to radzę się uczyć C++. Mówiąc kolokwialnie i w uproszczeniu jest to o wiele bardziej rozwinięta wersja C i pozwala na więcej, łatwiej, przyjemniej ;)


Postaraj się samemu poprawić błędy, ale jakby coś było nie tak, to możesz spojrzeć tutaj:

C/C++
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
    int r, i, j, N;
    int temp;
   
    printf( "Program ktory losuje i sortuje N liczb z przedzialu [0...r]\n\r" );
    printf( "Podaj liczby:\n\r" );
    printf( "r=" );
    scanf( "%d", & r );
    printf( "N=" );
    scanf( "%d", & N );
   
    if( r < 0 )
    {
        printf( "Nieprawidlowe dane!" );
        printf( "\nNacisnij dowolny klawisz" );
        getch();
        return 0;
    }
   
    if( N < 0 )
    {
        printf( "Nieprawidlowe dane!" );
        printf( "\nNacisnij dowolny klawisz" );
        getch();
        return 0;
    }
   
    int tab[ N - 1 ]; //tworzenie tablicy o rozmiarze N-1, poniewaz numeracja w tablicach jest od 0-wego elementu
   
    //Losowanie
    printf( "WYLOSOWANE LICZBY:\n\r" );
    for( i = 0; i < N; i++ )
    {
        tab[ i ] = 0 + rand() %( N - 0 + 1 ); //losowanie liczb calkowitych z przedzialu [a,b] wyraza sie takim wzorem:   liczba = a + rand() % (b - a + 1);
        printf( "%d\n", tab[ i ] ); // \t jesli chcesz tabulatora uzyc zamiast osobnej linii
    }
    //Sortowanie
    printf( "\n" );
   
    for( i = 0; i < N - 1; i++ )
    {
        for( j = 0; j < N - 1 - i; j++ )
        if( tab[ j ] > tab[ j + 1 ] )
        {
            temp = tab[ j + 1 ];
            tab[ j + 1 ] = tab[ j ];
            tab[ j ] = temp;
        }
    }
    printf( "POSORTOWANE LICZBY:\n\r" );
    for( i = 0; i < N; i++ )
    {
        printf( "%d\n", tab[ i ] );
    }
    printf( "\nNacisnij dowolny klawisz..." );
    getch();
    return 0;
}
P-119864
« 1 »
  Strona 1 z 1