Wyjątek w poszukiwaniu drugiej największej.

Odpowiedz Nowy wątek
2011-10-12 20:04

Rejestracja: 8 lat temu

Ostatnio: 2 tygodnie temu

Lokalizacja: Wrocław

0

Witam!

Czy możecie mi pomóc w znalezieniu wyjątku, dla poszukiwań drugiej największej z 10?

#include <iostream>

using namespace std;

int main() {
int najwieksza=0, mniejsza=0, wczytana=0, i=0;

for (i=0; (!(i==10)); i=i+1)
{
    cin >> wczytana;
    if (wczytana>=najwieksza && wczytana>=mniejsza)
    {
            mniejsza=najwieksza;
            najwieksza=wczytana;
    }
        else
        {
            if (wczytana>=mniejsza && wczytana<najwieksza)
            {   
                mniejsza=wczytana;

    }   
    }   
}
    cout << mniejsza;
} 

Dziękuję.

Pozostało 580 znaków

Krycho
2011-10-12 20:20
Krycho
0

Upakuj wczytane liczby do tablicy dorob funkcje zwracajaca najwiekszy element/2 elem. tej tablicy i tyle. Max szuka sie zazwyczaj przez zalozenie ze pierwszy elem. jest najwiekszy i porownywanie z kolejnymi elem. Jesli ktorys wiekszy to masz nowe max. Dla drugiego elem. mozna np. podobny algorytm z tym zalozeniem ze max2 jest mniejszy lub rowny max1

Pozostało 580 znaków

2011-10-12 20:26

Rejestracja: 8 lat temu

Ostatnio: 2 tygodnie temu

Lokalizacja: Wrocław

0

Przecież porównuję z największym. Chodzi o to, że ja nie wiem, dlaczego ten kod nie działa i chciałbym się tego dowiedzieć, żeby uniknąć pomyłek w przyszłości. Zalicza 9/10 testów.

Pozostało 580 znaków

2011-10-12 20:34

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

0

Poślij test którego nie zalicza.
I nie wiem kto cie tego

(!(i==10))

nauczył. Sądzę, że i!=10


 jest łatwiejsze.
Jeszcze krócej i<10 - lukasz1235 2011-10-12 20:45

Pozostało 580 znaków

2011-10-12 20:39

Rejestracja: 8 lat temu

Ostatnio: 2 tygodnie temu

Lokalizacja: Wrocław

0

Właśnie nie wiem, czego mi nie zalicza :) Wiem tylko, że czegoś. Trochę bardziej klarownie:


#include <iostream>
using namespace std;
int main() {
int najwieksza=0, mniejsza=0, wczytana=0, i=0;
for (i=0; i!=10; i++)
{
    cin >> wczytana;
    if (wczytana>=najwieksza)
    {
        mniejsza=najwieksza;
        najwieksza=wczytana;
     }
    if (wczytana>=mniejsza && wczytana<najwieksza)
        mniejsza=wczytana;  
}
    cout << mniejsza;
} 
edytowany 3x, ostatnio: merlinnot, 2011-10-12 20:47

Pozostało 580 znaków

2011-10-12 20:47

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

0

Algorytm wygląda na poprawy (aczkolwiek mógłby być ładniej napisany). Rozumiem, że jest on na jakiegoś spoja albo konkurs. Może problem nie tkwi w algorytmie, tylko w danych wejściowych których ty nie potrafisz obsłużyć? Czy w specyfice danych jest napisane, ze są większe od zera?

Pozostało 580 znaków

2011-10-12 20:52

Rejestracja: 8 lat temu

Ostatnio: 2 tygodnie temu

Lokalizacja: Wrocław

0

" 10 liczb naturalnych (nie większych niż 10^17), oddzielonych spacjami." Cytat z zadania :)
Nie, nie jest to na konkurs, nie prosiłbym o pomoc w takiej sprawie. Mi też wydaje się, że wszystko ok, ale jest kilka osób, którym zaliczyło wszystkie testy, więc coś musi być nie tak. Mogę spróbować long long int...

Znalazłem!
1 3 9 5 6 4 3 2 6 55 78
Ale czemu to nie działa...

EDIT:
Mam błąd: on wczytywał 9, a nie 10 liczb. Teraz nie działają 3 testy...

#include <iostream>
using namespace std;
int main() {
int najwieksza=0, mniejsza=0, wczytana=0, i=0;
for (i=0; i!=11; i++)
{
    cin >> wczytana;
    if (wczytana>=najwieksza)
    {
        mniejsza=najwieksza;
        najwieksza=wczytana;
     }
    if (wczytana>=mniejsza && wczytana<najwieksza)
        mniejsza=wczytana;  
}
    cout << mniejsza;
}
edytowany 2x, ostatnio: merlinnot, 2011-10-12 21:03

Pozostało 580 znaków

2011-10-12 21:15

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

0

Ja tam widze 11 liczb podanych.
Troche o działaniu pętli for:
1: nadanie zmiennej wartości podanej jako 1'szy argument
2: sprawdzenie czy warunek podany jako 2'gi argument zwraca true, jeżeli zwraca przechodzimy do 3, jeżeli nie to kończymy pętlę
3: wykonanie kodu między nawiasami { }
4: wykonanie kodu podanego jako 3'ci argument, zazwyczaj inkrementacja zmiennej
5: przejście do pkt 2
a więc

for(i = 0; i != 10; i++) {}

wykona się 10 razy.
Błąd jest w zadaniu, "1 3 9 5 6 4 3 2 6 55 78" to 11 liczb oddzielonych spacjami.

Pozostało 580 znaków

2011-10-12 21:23

Rejestracja: 8 lat temu

Ostatnio: 2 tygodnie temu

Lokalizacja: Wrocław

0

Rzeczywiście. Palców mi zabrakło do liczenia :)
Teraz wygląda tak:

 #include <iostream>
using namespace std;
int main() {
int najwieksza=0, mniejsza=0, wczytana=0, i=0;
for (i=0; i!=10; i++)
{
   cin >> wczytana;
   if (wczytana>=najwieksza)
   {
      mniejsza=najwieksza;
      najwieksza=wczytana;
   }
   else 
   {
      if (wczytana<najwieksza && wczytana>=mniejsza)
      mniejsza=wczytana;
   }
}
cout << mniejsza;
} 

I nadal nie działa :(

Nawet Google się tym zainteresowało :} - merlinnot 2011-10-12 21:25

Pozostało 580 znaków

2011-10-12 21:27

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

0

Taa, a nie lepiej wprowadzić wszystkie wartości do tablicy, posortować malejąco i wypisać dwie pierwsze liczby? A jak kilka pierwszych będzie takich samych, to pierwszą mniejszą od tej liczby.


Idiots, idiots everywhere.
edytowany 1x, ostatnio: allocer, 2011-10-12 21:28

Pozostało 580 znaków

2011-10-12 21:45

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

0

Dla zestawu który podałeś działa, z tym że dla pierwszych 10 liczb a 11 jest decydująca.
Propozycje przerobienia algorytmu:
1: sortowanie przez wstawianie zrealizowane podczas czytania liczb
2: zmiana struktury kodu

/*m - mniejsza;
x - najwieksza;
w - wczytana*/
if(w > m)
  {
  if(w > x)
     {
     m = x;
     x = w;
     }
  else
     m = w;
  }
edytowany 2x, ostatnio: piszczu, 2011-10-12 22:12

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0