• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sprawdzenie poprawności kodu źródłowego

Cloud VPS
0 głosów
460 wizyt
pytanie zadane 20 listopada 2017 w C i C++ przez kamil98u Nowicjusz (220 p.)
edycja 20 listopada 2017 przez kamil98u

Witam, czy mógłby ktoś sprawdzić poprawność kodu źródłowego? Celem programu były wygenerowanie wybranej ilości liczb, następnie posortowanie ich przez wybór, na koniec program miał wyświetlić czas, jaki był potrzebny do posortowania liczb.
 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
int main()
{
    int ilosc_liczb, max, i, j, pomoc;
    clock_t start, stop;
    printf("Podaj ilosc liczb do posortowania: \n");
    scanf("%d", &ilosc_liczb);
    srand(time(0));
    int *tablica= (int*)malloc(ilosc_liczb*ilosc_liczb);
    for (i=0; i<ilosc_liczb; i++)
    {
        tablica[i]=rand()%1000;
    }
    start=clock();
    for(i=0; i<ilosc_liczb; i++)
    {
        max=i;
        for (j=i+1; j<ilosc_liczb; j++)
        {
            if (tablica[j]<tablica[max])
                max=j;
        }
        pomoc=tablica[max];
        tablica[max]=tablica[i];
        tablica[i]=pomoc;
    }
    stop=clock();
    printf("Czas sortowania: %.1f \n", (((float)(stop-start)/1000000.0F)*1000));
    free(tablica);
    getch();
    return 0;
}

 

komentarz 20 listopada 2017 przez RAD Obywatel (1,810 p.)
Czy kolego nie mogłeś tego kodu wkleić do takiego magicznego "pojemnika" który jest na tej stronie. (code snippet) Proszę popraw to.
komentarz 20 listopada 2017 przez kamil98u Nowicjusz (220 p.)
Przepraszam, nie wiedziałem o tym ;)
komentarz 20 listopada 2017 przez RAD Obywatel (1,810 p.)
No i od razu lepiej :-)

3 odpowiedzi

+2 głosów
odpowiedź 20 listopada 2017 przez draghan VIP (106,230 p.)

Masz bład w obliczaniu ilości alokowanej pamięci:

malloc(ilosc_liczb*ilosc_liczb)

Ale poza tym jest w porządku.

komentarz 20 listopada 2017 przez kamil98u Nowicjusz (220 p.)
A jak to poprawić? Pierwszy raz wykorzystywałem, tę funkcję i miałem z nią "małe" problemy
komentarz 20 listopada 2017 przez draghan VIP (106,230 p.)

Musisz jej podać liczbę bajtów, które ma Ci zarezerwować. Ty chcesz mieć tablicę intów o liczbie elementów równej ilosc_liczb. A liczba bajtów, potrzebna na taką tablicę, to:

sizeof(int) * ilosc_liczb

 

+1 głos
odpowiedź 20 listopada 2017 przez mokrowski Mędrzec (158,800 p.)

Oprócz tego co napisali koledzy, już naprawdę szczegóły i po użyciu narzędzi sprawdzających dodatkowo kod:

  1. Sygnatura main jedna z dopuszczalnych: int main(void) lub int main(int argc, char ** argv). Ta druga może zawierać tablicę argv ale sygnatura int main() jest niedopuszczalna.
  2. Linia z malloc(...), nie może zawierać w standardzie c89 jednocześnie deklaracji tablicy i przypisania malloc(...) a jak wnoszę z deklarowania wcześniej wszystkich zmiennych, tego standardu się trzymałeś.
  3. scanf(...) w narzędziach lint, zgłasza konieczność umieszczenia: (void) scanf(...)
  4. srand(...) przyjmuje typ unsigned tak więc: srand((unsigned)time(0));
  5. Jeśli już wczytałeś <stdlib.h>, zwróć z main EXIT_SUCCESS czyli: return EXIT_SUCCESS;
  6. <conio.h> i getch() są funkcjami nieprzenośnymi. Lepiej uruchamiać w VS w trybie debug (<ctrl + F5> (albo F9) )
  7. Przyzwyczajenie deklarowania zmiennych "hurtem" w 1 linii, to złe przyzwyczajenie. Będziesz miał kiedyś wskaźnik i się zdziwisz.
  8. Preferuj pre-inkrementację gdzie to możliwe. W przypadku for(...) to jest obojętne (z punktu widzenia działania) a w większości asemblerów (nie tylko x86), generuje wydajniejszy kod.

Jeszcze raz, uwagi traktuj jako "upierdliwe szczególarstwo". No ale chciałeś wiedzieć :-)

0 głosów
odpowiedź 20 listopada 2017 przez obl Maniak (51,300 p.)

malloc przyjmuje rozmiar alokowanej pamięci w bajtach, więc zakładając, że chcesz alokować pamięć  dla ilosc_liczb typu int to powinieneś to zrobić tak:

malloc( sizeof(*tablica) * ilosc_liczb);

gdzie sizeof zwraca rozmiar zmiennej w bajtach.

Poza tym powinieneś sprawdzić najpierw czy użytkownik nie wpisał liczby zerowej lub ujemnej.

komentarz 20 listopada 2017 przez kamil98u Nowicjusz (220 p.)
Dziękuję bardzo ;)

Podobne pytania

0 głosów
2 odpowiedzi 707 wizyt
pytanie zadane 13 listopada 2017 w C i C++ przez artur96 Początkujący (250 p.)
+2 głosów
1 odpowiedź 450 wizyt
+1 głos
1 odpowiedź 2,100 wizyt

93,454 zapytań

142,449 odpowiedzi

322,718 komentarzy

62,833 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...