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ś?
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:
#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 ];
printf( "WYLOSOWANE LICZBY:\n\r" );
for( i = 0; i < N; i++ )
{
tab[ i ] = 0 + rand() %( N - 0 + 1 );
printf( "%d\n", tab[ i ] );
}
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;
}