Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Matt91111

{rozwiazane}[C] Problem z sortowaniem

Rekomendowane odpowiedzi

Mam napisać zadanko, które wg. mnie powinno już działać; jako że teoria mija się z praktyką to wywala błąd w funkcji swap(...) <== za jej pomocą mam zamienić wartości, funkcja ta mam mieć taką postać jaką mam; wiem wiem można by je zamienić za pomocą innej funkcji, ale w treści zadania było powiedziane żeby jej użył :C

 

Konkretnie to jest wywoływana funkcja posrtuj_tablice(..., ...) i tam wywala przy wywołaniu swap(..., ...)

Debuger pokazuje że OBA argumenty w wywołaniu swap(...) są przekazywane jako adresy :hmm: (czyli ok)

 

Testowałem wczesniej tą funkcje w main() dla dwuargumentowej tablicy i działała :E

 

Kod:

Patrz posty niżej UPDATE 1

 

Z góry Wielkie dzięki za pomoc ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kreppy pasta chyba.

swap

 [b]swap[/b]

b to tag na pogrubienie :E

bez tego kompiluje się a jak to liczby są losowane i czy to działa jak powinno to nie wiem nie chce mi się myśleć przed kolosem z programowania :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kreppy pasta chyba.

swap

 [b]swap[/b]

b to tag na pogrubienie :E

bez tego kompiluje się a jak to liczby są losowane i czy to działa jak powinno to nie wiem nie chce mi się myśleć przed kolosem z programowania :E

Chciałem podkreślić coby było bordziej widocne :E

 

PS. Fixed :lol2:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

obyś chociaż umiał wyjaśnić na czym polega ta sztuczka ze xor-swapem ;)

IMHO na współczesnym procku gorsza od mov-mov

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

obyś chociaż umiał wyjaśnić na czym polega ta sztuczka ze xor-swapem ;)

IMHO na współczesnym procku gorsza od mov-mov

Muszę się podporządkować Pani dr. C:

Gdyby to ode mnie zależało to wgl bym języka C nie używał :E

 

UPDATE 1:

Algorytm sortowania zawalił, zmieniłem kod ale w miejscu niektórych wartości mam "0" z niewiadomych przyczyn :hmm:

Większość sortowanych danych bez problemu a tu na 30 elementów średnio w 3/4 miejscach ni stąd ni stamtąd "0" :E

 

// potrzebne:
#include <stdio.h> // aby wyswietlac komunikaty w konsoli
//#include <stdlib.h>
#include <time.h> // aby moc wygenerowac losowe liczby
#include <stdbool.h>// aby uzywac typu "bool"
#include <limits.h>// aby pobrac maksymalna wartosc dla typu "int"

#define ILOSC_ELEMENTOW_TABLICY 30

void swap(int *first, int *second);
int losoj_wartosc(int max);
void wyswietl_tablice(int tablica[], int n);
bool czy_liczba_wystepuje_w_tablicy(int tablica[], int n, int wartosc, int index);
bool posortuj_tablice(int tablica[], int n);

int main()
{
   int i, zarodek;
   time_t tt;

   zarodek = time(&tt); srand(zarodek); //inicjacje konieczne dla losowego generowania liczb
   // zrodlo:
   // https://pl.wikibooks.org/wiki/C/rand


   int tablica[iLOSC_ELEMENTOW_TABLICY];
   int temp;

   for(i = 0; i < ILOSC_ELEMENTOW_TABLICY; i++) {

       while(true) {
           temp = losoj_wartosc(30); //losujemy funkcje w przedziala od 0 do 30, gdzie 30 to ustalony parametr
           // nie mozemy ustawic wartosci mniejszej niz 30
           // poniewaz liczby nie moga sie powtarzac

           if( !czy_liczba_wystepuje_w_tablicy(tablica // tablica w ktorej sprawdzamy
                                               ,ILOSC_ELEMENTOW_TABLICY
                                               ,temp // losowa wartosc do sprawdzenia
                                               ,-1 )//sprawdzamy czy wartosc nie powtarza sie w calej tablicy
              )
           {
               //jezeli liczba nie wystepuje w sprawdzanej tablicy to przypisujemy losowa wartosc
               tablica[i] = temp;
               break; // wychodzimy z petli while i losujemy wartosc do kolejnego elementu tablicy
           } else {
               // jezeli liczba wystepuje to losujemy do skutku
               continue;
           }
       }
       //printf("%d i ==> \n", i);
   }


   printf("tablice przed sortowaniem: \n");
   wyswietl_tablice(tablica, ILOSC_ELEMENTOW_TABLICY);//wyswietlamy tablice

   if( !posortuj_tablice(tablica, ILOSC_ELEMENTOW_TABLICY) ) {
       printf("Nie udalo sie posrtowac tablicy! \n");
       system("pause");
       return 1;
   }

   printf("tablice po sortowaniu: \n");
   wyswietl_tablice(tablica, ILOSC_ELEMENTOW_TABLICY);

   //printf("przed zmiana: pierwszy el. %d, drugi el. %d", ar[0], ar[1]);

   //swap(&ar[0], &ar[1]);

   //printf("po zamianie: pierwszy el. %d, drugi el. %d", ar[0], ar[1]);

   //printf("Hello world!\n");
   return 0;
}

void wyswietl_tablice(int tablica[], int n) {
   int i;

   for(i = 0; i < n; i++) {
       printf("element %d, index %d, wartosc=%d \n"
              , i + 1 // element tablicy = index + 1
              , i // index
              , tablica[i]); // wartosc
   }
}

// wylosowanie liczby z zakresu okreslonego w parametrze "max"
int losoj_wartosc(int max) {
   return rand() % max;
}

// przyklad implementacji zamiany z wykladu, z uzyciem operatora xor
void swap(int *first, int *second)
{
   *first ^= *second;
   *second ^= *first;
   *first ^= *second;
}

bool czy_liczba_wystepuje_w_tablicy(int tablica[], //tablicy w ktorej bedziemy szukac wartosci
                                   int n, //ilosc elementow tablicy
                                   int wartosc,//wartosc ktorej szukamy
                                   int index) { // jeżeli ustalimy -1 to szukamy w calej tablicy
                                       // jezeli ustalimy "index" ROZNY OD -1 to ominiemy w sprawdzaniu
                                       // tablice o ustalonym indeksie
   int i;

   // sprawdzamy poprawnosc wykluczonego indeksu
   if( (index > n)  // jezeli wartosc wykluczonego indeksu jest wieksza od ilosci indeksow w tablicy
       ||           // lub
       (index < -1) // wartosc wykluczonego indeksu jest mniejsza od
   ) {
       printf("Wartosc indeksu ktorego chcemy wykluczyc \n jest wieksza lub mniejsza od wartosci indeksow tablicy");
       return true;
   }

   if( index == -1 ) // sprawdza czy liczba wystepuje w calej tablicy
   //if( !(index == -1) ) // sprawdza czy liczba wystepuje w calej tablicy
   {
       for(i = 0; i < n; i++) { // iteracja elementow tablicy
           if(tablica[i] == wartosc) // jezeli wartosc wystepuje w tablicy zwraca "true"
               return true;
           }
   } else { // sprawdza czy liczba istnieje w tablicy poza konkretnym indexem, ktory jest pomijany
       for(i = 0; i < n; i++) {
           if(i == index) { // jezeli obecnie porownywany index jest indexem do ominiecia, to go pomijamy
               continue;
           } else { // jezeli nie to sprawdzamy dalej
               //printf("i(c) =====> %d \n", i);
               //printf("index =====> %d \n", index);

               //printf("tablica[i] =====> %d \n", tablica[i]);
               //printf("wartosc =====> %d \n", wartosc);
               //printf("\n");

               //if(tablica[i] == wartosc)
                   //return true;
                   //printf("b =====> %d \n", wartosc);
               }
           }
   }

   return false;
}

bool posortuj_tablice(int tablica[], int n) {
   int i = 0, j = 0, // liczniki petli
   temp = INT_MAX, // wartosc obecnie porownywana, zainicjowana maksymalna wartosca dostepna dla typu "int"
   min = 0; //wartosc minimalna z calego zakresu tablicy

   int* adres_indexu;

   //insertion_sort(tablica,ILOSC_ELEMENTOW_TABLICY);
   //return true;

   while(j < n) {

       temp = INT_MAX; //ustawiamy ponownie
       for(i = j; // jezeli do "i" przypiszemy wartosc "j" to pozwoli to uniknac sprawdzania juz sprawdzonych indeksow tablicy
           i < n;
           i++) {
               if(tablica[i]<temp) {
                   temp = tablica[i];//ustawiamy najmniejsza znaleziona wartosc
                   adres_indexu = &tablica[i];//ustawiamy jej adres
               }
           }

       swap(&tablica[j], adres_indexu);//dokonujemy zamiany
       j++;
   }

   return true;

   /*
   while(j < n) {
        for(i = j; // jezeli do "i" przypiszemy wartosc "j" to pozwoli to uniknac sprawdzania juz sprawdzonych indeksow tablicy
            i < n;
            i++)
        {
           if(tablica[i] < temp)
               {
                   if(czy_liczba_wystepuje_w_tablicy(tablica, ILOSC_ELEMENTOW_TABLICY, temp, i)) {
                   // jezeli liczba wystepuje w tablicy, poza obecnie sprawdzanym indexem
                       return false; // niezgodne z trescia polecenia
                   }

                   printf("i =====> %d \n", i);

                   temp = tablica[i];
                   adres_indexu = &tablica[i];
               }
       }

       //zamieniamy wartosc obecnie porownywanego indexu z najmniejsza wartoscia znaleziona
       swap(&tablica[j], adres_indexu); //zamieniamy wartosc porownywana z najmniejsz znaleziona wartoscia
       j++;
   }

   return true;
   */
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Większość sortowanych danych bez problemu a tu na 30 elementów średnio w 3/4 miejscach ni stąd ni stamtąd "0"

No to jedziesz z debugiem :)

 

Sprawdź czy przypadkiem nie próbujesz zamieniać ze sobą tej samej liczby. Przy tej metodzie zamiany zmiennych i tym samym adresie pamięci, wartość się wyzeruje. Jest to opisane w Wikipedii.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
' date='06 Grudzień 2016 - 16:31' timestamp='1481038289' post='14416105']

No to jedziesz z debugiem :)

 

Sprawdź czy przypadkiem nie próbujesz zamieniać ze sobą tej samej liczby. Przy tej metodzie zamiany zmiennych i tym samym adresie pamięci, wartość się wyzeruje. Jest to opisane w Wikipedii.

Na wykładzie nie było to dziabnięte :heu:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Protip: na studiach nie będziesz wszystkiego dostawać na tacy. Wykład ma być wprowadzeniem do zgłębienia danego tematu, a nie wyczerpującym źródłem informacji.

Jeżeli tylko rozumiesz ideę tego swapa to jest to oczywiste ;)

 

Stąd warto używać asercji w kodzie, np.

assert(first != second);

 

Nie wiem jakiego środowiska używasz, ale np. w visualu gdy warunek asercji nie jest spełniony od razu dostaje się komunikat, i można od razu skoczyć w debugerze do miejsca które spowodowało błąd i podejrzeć stan zmiennych.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...