Wyjątek w poszukiwaniu drugiej największej.

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ę.

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

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.

0

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

(!(i==10))

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

 jest łatwiejsze.
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;
} 
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?

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;
}
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.

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 :(

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.

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;
  }
0

Mój drugi, toporny kod nie zalicz tego samego testu:

 #include <iostream>
#include <list>
using namespace std;

int main() {
   list<int>lista;
   int temp=0;
   cin >> temp;
   lista.push_back(temp);
   int i=0;
   for (i=0; i!=9; i++)
   {
      cin >> temp;
      if (temp>=lista.front())
      lista.push_front(temp);
      else
      lista.push_back(temp);
   }
   lista.pop_front();
   list<int>ldwa;
   for (i=0; i!=9; i++)
   {
      if (lista.front()>=ldwa.front())
         ldwa.push_front(lista.front());
      else
         ldwa.push_back(lista.front());
      lista.pop_front();
 }  
 cout << ldwa.front();
      
}
 

EDIT:
zrobione, wszystko działa:

#include<cstdio> 
#include<vector> 
#include<algorithm> 
#define ll long long
using namespace std; int main() { 
   vector<ll int>A(10);
    for(int i=0;i<10;i++)
     {
         scanf("%lld",&A[i]);
       } 
    sort(A.begin(),A.end()); printf("%lld",A[8]);
    }
0

Z tego co napisałeś o zadaniu, twój kod działa źle, bo dla: 0 0 0 0 0 0 0 0 1 1 daje 1, a 1 nie jest największą liczbą mniejszą od największej.
Dlatego przy zadaniach zazwyczaj są przykładowe inputy i outputy które pozwalają wykluczyć takie błędy w rozumowaniu.

0

Dzięki za pomoc. Obydwa kody są dobre, tylko trzeba wstawić long long inta, wtedy wszystko działa :)

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