Witam Robię od zadanie i po kilku nie udanych próbach skończyły mi się pomysły aby wyznaczyć drugi co do wielkości element z ciągu czy mógłby mi ktoś pomóc dziękuje :)
Zapamiętujesz dwa największe elementy i sobie je aktualizujesz po napotkaniu każdego kolejnego elementu ciągu. Albo zapisujesz cały ciąg i sobie go sortujesz/wkładasz do sortowanego kontenera (np multiset)
dziękuje lecz zapomniałem dodać że jestem początkującym i moje możliwości nie wykraczają ponad pętle i if itp. A nie chcę w sieci gotowca szukać
To się dobrze składa - pętle i instrukcje warunkowe to wszystko co potrzebujesz do wykonania tego zadania :-)
Jak podszedłbyś do tego problemu ręcznie (na kartce)?
chciałem wyznaczyć liczbę największą i kombinować lecz nie wychodziło nie chodzi mi o gotowiec lecz nie mam pomysłu
Let me rephrase.
Przychodzi do Ciebie szef, daje kartkę z wypisanymi 20 liczbami i każe Ci wyznaczyć (ręcznie!) drugą co do wartości z nich.
Jak podchodzisz do tematu?
wyznaczam największą następnie szukam drugiej w kolejności
Ok, a w jaki sposób szukasz drugiej w kolejności
?
nie wiem czy o to chodzi ale patrząc odejmując od ciągu największą i szukając jej na nowo
Najprościej , wyznasz MAX z ciągu 1...n. Zapisz wartość. Usuń tą wartość z listy / pomiń ją / wyznacz MAX z ciągu zapisz.
I masz tym sposobem dwa maksy. Większy jest 1-wszym, 2-gi drugim
dziękuje :) jeszcze pytanie jak od tablicy odjąć jedną wartość ? t[n]-maxi ? zakładając że maxi to największa z ciągu a n to wielkość tablicy ?
Można zrobić to prościej. W pierwszym przebiegu szukasz indeksu największej wartości. W drugim przebiegu szukasz największej wartości pomijając indeks obliczony w poprzednim przebiegu.
ok dziękuje a jak pominąc tą pierwszą największą wartość ??
ifem. W pierwszym przebiegu liczysz np indeks_największej_wartości
. W drugim przebiegu robisz kolejną pętlę, np z indeksem indeks
i w środek wstawiasz ifa if (indeks != indeks_największej_wartości)
.
dziękuje bardzo :)
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
int n;
cin>>n;
int tablica[n];
for(int i=0 ; i<n ; i++)
{
cin>>tablica[i];
}
int maxi=0;
int a=0;
for(int i=0 ; i<n ; i++)
{
if(tablica[i]>maxi)
{
maxi=tablica[i];
}
}
for(int i=0 ; i<n ; i++)
{
if(i!=maxi)
{
i=tablica[i];
cout<<i;
}
}
cout<<maxi;
return 0;
}
Mam coś takiego i nie działa poprawnie w czym jest błąd ?
Twoja zmienna maxi
wcale nie reprezentuje indeksu tablicy, tylko wartość pod tym indeksem (maxi=tablica[i];
).
w pierwszym for chciałem wyznaczyć pierwszą największą mam rozumieć że to jest źle ?
Tak, jest źle - raz traktujesz maxi
jak wartość (if(tablica[i]>maxi)
), a raz jak indeks (if(i!=maxi)
).
czyli jeżeli dobrze rozumiem maxi ma zostać tylko zmienną
indeksem
, tak ;-)
czyli ostatecznie jak to poprawić moja głowa już nie nadąża tutaj zmienić if(tablica[i]>maxi) to maxi ? jeżeli tak to na co ?
if (tablica[i] > tablica[maxi]) {
maxi = i;
}
Warunek if(i!=maxi)
także jest zły - pomyśl dlaczego.
aktualnie wyznacza mi najmniejszą i drugą najmnijeszą
if(i!=maxi) czy to wina tego ?
Przeanalizuj tę drugą pętlę swojego kodu i powiedz czy realizuje ona obydwa warunki postawione w założeniu:
W drugim przebiegu szukasz największej wartości pomijając indeks obliczony w poprzednim przebiegu.
ona chyba nie pomija tej wartości największej tak ?
Ty mnie pytasz?
Przecież to Ty napisałeś ten kod - powinieneś wiedzieć co robi :-)
korzystałem z rad kilku użytkowników i wszystko się mi już pomieszało :P ten if jest trochę bez sensu
nie wiem tylko jak zapisać to aby program pominął tą jedną wartość
Powoli.
Druga pętla ma realizować dwa warunki:
- Znajdywać największą liczbę.
- Znajdywać liczbę różną od
maxi
.
Jak zapisałbyś obydwa warunki w kodzie?
(protip: pierwsza pętla realizuje już pierwszy warunek)