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

Dominanta - lista jednokierunkowa

VPS Starter Arubacloud
0 głosów
375 wizyt
pytanie zadane 21 października 2015 w C i C++ przez pclolowicz Użytkownik (500 p.)

Cześć mam problem z funkcją która szuka dominanty. Do funkcji przekazywany jest wskaźnik do pierwszego elementu listy. Od razu uprzedzam, że problem muszę rozwiązać bez pomocy tablicy. Niestety nie mogę znaleźć błędu;(

void szukaj_dominanty(liczba *pierwsza)
{
       int ile_razy_wysetuje=0;
       int ktora_liczba_wysepuje_najczesciej=0;
       int licznik;
       liczba *temp = pierwsza;
       liczba *temp2 = pierwsza;
if(!pierwsza)
   {
       cout<<"Brak elementow na liscie!"<<endl;
       getch();
   }
else
 {
   while(temp)
    {
        while(temp2)
        {
            if(temp2->klucz==temp->klucz)
            {
                licznik++;
                if(licznik>ile_razy_wysetuje)
                {
                    ile_razy_wysetuje=licznik;
                    ktora_liczba_wysepuje_najczesciej=temp->klucz;
                }
            }
          temp2=temp2->nastepna;
        }
        temp2=pierwsza;
        licznik=0;
        temp=temp->nastepna;
    }
    cout<<"Liczba "<<ktora_liczba_wysepuje_najczesciej<<" wystepuje "<<ile_razy_wysetuje<<endl;
    getch();
 }
}

 

2 odpowiedzi

0 głosów
odpowiedź 21 października 2015 przez furas Maniak (53,800 p.)
Analizuję ten kod i wydaje się poprawny ale jeśli masz jakiś (krótki) przykład danych dla których źle liczy to może wstaw kilka `cout` aby wypisywało stan wszelkich zmiennych aby obserwować co dokładnie dzieje się w programie (krok po kroku). Możesz to wtedy takżę porównywać z "obliczeniami" wykonanymi na kartce. Może w ten sposób wyłapiesz sytuację, która powoduje problem.
0 głosów
odpowiedź 21 października 2015 przez pclolowicz Użytkownik (500 p.)
zmienna "ile_razy_wysetuje" pokazuje bardzo dziwne liczby np 4673826, zauważyłem również,że funkcja nie bierze pod uwagę pierwszego elementu listy.
komentarz 21 października 2015 przez furas Maniak (53,800 p.)
Teraz już widzę, że `licznik` nie jest wyzerowany na samym początku więc może mieć dowolną wartość co potem jest przenoszone do `ile_razy_wysetuje`. To powinno być widać gdy wstawisz `cout` przed wejściem do pierwszego `while` - dlatego powstawianie `cout` jest jakimś sposobem na rozwiązywanie problemów :)
komentarz 21 października 2015 przez furas Maniak (53,800 p.)
Może z pomoca `cout` uda się też namierzyć dlaczego nie bierze pod uwagę pierwszego elementu listy.
komentarz 21 października 2015 przez furas Maniak (53,800 p.)

Przy okazji: ponieważ formatowanie kodu i nazywanie zmiennych jest ważne przerobiłem kod na swój sposób. Nie sprawdzałem go jednak w działaniu.

Odpowiednie zmienne ustawiam tuż przed każdym `while` aby w jawny sposób było to widać (bez zaglądania wsteczy) i nie mieć wątpliwości czy to było zrobione.

Do tego puste linie i spacej wokół << , >>, = , == poprawiają czytelność. Oko łatwiej wyłapuje takie miejsca oddzielone pustym miejscem.

void szukaj_dominanty(liczba *pierwsza)
{
  int dominanta_ilosc;
  int dominanta_liczba;
  
  int licznik;
  
  liczba *temp1;
  liczba *temp2;
  
  if(!pierwsza)
  {
    cout << "Brak elementow na liscie!" << endl;
  }
  else
  {
    dominanta_ilosc = 0;
    dominanta_liczba = 0;
    
    temp1 = pierwsza;
    while(temp1)
    {
      licznik = 0; 
      
      // zliczanie takich samych elementow jak temp1->klucz
      temp2 = pierwsza;
      while(temp2)
      {
        if(temp2->klucz == temp1->klucz)
        {
          licznik++;
        }
        temp2 = temp2->nastepna;
      }

      // sprawdzanie czy jest ich wiecej niz innych
      if(licznik > dominanta_ilosc)
      {
        dominanta_ilosc = licznik;
        dominanta_liczba = temp1->klucz;
      }
      
      temp1 = temp1->nastepna;
    }
    
    cout << "Liczba " << dominanta_liczba << " wystepuje " << dominanta_ilosc << endl;
  }
 
  getch();
}

 

komentarz 22 października 2015 przez pclolowicz Użytkownik (500 p.)
Jesteście wielcy! Wszystko działa tak jak powinno.

Podobne pytania

0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 21 stycznia 2018 w C i C++ przez koot Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 449 wizyt
pytanie zadane 7 maja 2017 w C i C++ przez krzakurts Obywatel (1,470 p.)
0 głosów
1 odpowiedź 521 wizyt
pytanie zadane 6 listopada 2016 w C i C++ przez Łukasz ER Początkujący (420 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...