[C++] sortowanie i porównywanie

Hej,

Mam problem z pewnym programem. Otóż mam do napisania:

funkcja dla danych liczbowych: n,a1,a2…an zwraca c takie, że w ciągu {a1…an} istnieją dokładnie 3 elementy większe od c.

wg. podpowiedzi kumpla zrobiłem to tak:

No i niby ok, mam program, wg. zasady działania powinno być ok, ale błędy w kodzie :<

#include 

#include

#include 


using namespace std;  


int funkcja(int n, int *tablica){

	int liczba, a;

  for(int i=0; i
	  cin >> liczba;

	  tablica[i] = liczba;

  }

  std::sort(tablica,tablica+n);

  int c = tablica[n-1];

  for(int i=0; i
  if (tablica[i] < c){

	  a=a++;

  }

  if (a = 3){

	  break;

  }

  }  

  return c;

}

jest to sama funkcja bo tylko to mialo być ;]

Co prawda nie programuje na codzień w c++ ale spróbuje ci pomóc.

  1. Pierwsza uwaga co do funkcji sort

http://en.wikipedia.org/wiki/Sort_(C%2B%2B - tutaj nieco inaczej jest użyta.

int c = tablica[n-1];

for(int i=n-2; i<=0; i--)

  {

    if (tablica[i] < c) // jeśli jest taki sam to nic się nie zmienia

    {

       a=a++;

       c = tablic[i];

    }

    if (a == 3){ //porówanie to dwa znaki '='

       break;

    }

  }
  1. zmienna a nie jest nigdzie zainicjowana

Skoro masz posortowaną tablicę to zwróć 4-ty element od końca i już.

Z tym że prościej tu zastosować prawostronny qsort, ponieważ zadanie sprowadza się do znalezienia 4-tej maksymalnej.

@[alex]

Wziąłbym jeszcze trzeci element od końca, żeby zobaczyć, czy ten czwarty od końca jest na pewno od niego mniejszy.

@[alex], matzu

też tak myślałem z pobraniem k-tego elementu od końca ale pytanie czy mają to być różne elementy (wszystkie) - wtedy musi być ta pętla czy tak jak zasugerowal @matzu trzy element nie konieczne różne, ale za to czy czwarty jest różny (czyli mniejszy), a jak nie to piąty… (znowu pętelka)

@grzelix

IMO nawet jeśli ten czwarty element nie będzie mniejszy od tego trzeciego, to nie trzeba sprawdzać tego piątego. Trzeba natomiast w takiej sytuacji wyrzucić wyjątek (coś w stylu ValueNotFoundException). Sądzę tak dlatego, że w treści zadania jest napisane “zwraca c takie, że w ciągu {a1…an} istnieją dokładnie 3 elementy większe od c” (tutaj zwracam uwagę na słowo dokładnie). Żeby jednak mieć pewność, czy nie trzeba sprawdzać tego piątego elementu, trzeba by spytać autora zadania.

Hmm…

Zmienna a jest zainicjowana:

int liczba, a;

I rzeczywiście nie doczytałem tego, że dokładnie 3 i nie pomyślałem co będzie jeśli będzie miał więcej.

czyli po przeróbce powinno byc tak:

dwie uwagi.

Nie. Zapoznaj się z tymi pojęciami:

http://pl.wikipedia.org/wiki/Deklaracja … rmatyka%29

http://pl.wikipedia.org/wiki/Definicja_ … mowanie%29

http://pl.wikipedia.org/wiki/Inicjalizacja_zmiennej

http://staff.iiar.pwr.wroc.pl/robert.wo … _MAG_6.doc

Nigdy(!) nie próbuj odczytywać zawartości zmiennej lokalnej*, przed przypisaniem do niej danych. Oczekujesz zapewne zera, a tu niespodzianka - śmieci. To, że jakimś cudem, zadziała w jednym przypadku, to nie znaczy, że tak będzie zawsze. Przykład, z życia wzięty: parę dni temu napisał do mnie kolega, miał program, dwie zmienne lokalne w funkcji, i tak, jak Ty, od razu chciał je inkrementować:

* w przypadku zmiennych globalnych sytuacja ma się inaczej:

http://edu.pjwstk.edu.pl/wyklady/pro/sc … ode37.html

int liczba, a = 0;[/code]

i już lepiej.

[code=php]a=a++; 

Tego zapisu nie rozumiem.

http://pl.wikipedia.org/wiki/C%2B%2B

więcej: http://cpp0x.pl/kursy/Kurs-C++/Poziom-1 … atyczne/13

Po prostu:

a++; [/code]

Jeżeli nie jest mniejszy to nie ma jak rozwiązać tego zadania, ponieważ nie podano co program ma zrobić w przypadku gdy rozwiązanie nie istnieje to niema co się wypierniczać z dodatkowymi zabezpieczeniami których nie wiadomo jak obsłużyć.