Nybörjare C++ for loop vill inte köra

Trädvy Permalänk
Medlem
Registrerad
Jul 2018

Nybörjare C++ for loop vill inte köra

Hej,

jag har precis börjat med C++ och håller på med en uppgift till skolan.
Uppgiften är att låta användaren skriva in ett fritt antal nummer och programmet ska svara med summa, medelvärde, störst och näst störst. Allt ska vara olika funktioner som anropas i main.

Jag har nu fastnat på funktionen att räkna ut störst tal. Min nästlade for loop vägrar köras. Har bokstavligt talat gjort allt jag kan komma på inkl läst böcker och kollat mängder av trådar och tutorials. Men loopen jämför endast de två första talen och returnerar det största av dem.
Den går aldrig hela loopen. Vill tillägga att jag förstår att return 0; kanske bör tas bort, men då f-ckar programmet och jag har därför lagt den där så länge så for loopen iaf returnerar det största av två tal.

Kan nån vänlig själ säga var mitt problem ligger? Xcode markerar h++ som fel.
Funktionerna summering och inlasning fungerar utmärkt, men skickar med dem om det kanske redan är där felet gjorts.

int utraknstorsttal(int storsta)
{

int v, ST, STOR;
for (v=0; v<=list.size()-2; v++)
{
for (int h=v+1; h<=list.size()-1; h++) //felkod:increment never executed
{
if (list[h] < list[v])
{
ST = list[v];
list[v] = list[h];
list[h] = ST;
}

stor=list[h];
return stor;
}
}
return 0;
}

//Funktion Summering**********************
int summering (void)
{
double sum = 0;
for (size_t i=0; i<list.size(); i++)
sum += list [i];
return sum;
}

//Funktion inläsning***************************
void inlasning(void) //Inläsning av ett antal tal, talen sparas i list
{
int tal;
cout << "Ange ett antal tal, avsluta på 0: " <<endl;
do
{
cin>>tal;
cin.get();
list.push_back(tal);
}
while(tal != 0);

}

Tack på förhand

Trädvy Permalänk
Hedersmedlem
Plats
Uppsala
Registrerad
Jul 2001

Använd gärna code-taggar runt all kod, dvs [code] före och [./code] efter (utan punkten). Det blir väldigt svårläst utan.

I summering() har du olika typer; du returnerar en int, men summerar till en double.
Om du inte matar in extremt stora tal så bör alla typer vara int.

Edit: Grundfelet är som sagt att du returnerar "stor" varje gång inre loopen når slutet; därmed kan den aldrig någonsin köras mer än första iterationen.
Du har dock lite konstiga variabler också -- parametern "storsta" gör inget (och bör väl inte heller behövas), variableln "stor" som du använder finns inte (om koden kompilerar måste den vara global, dvs utanför funktionen, vilket jag inte rekommenderar), och lite sådant.

Ska funktionen enbart hitta det största talet, dvs returnerna 10 om indatan är [3, 10, 1, -3]? Isåfall kan du förenkla funktionen ganska rejält; du behöver enbart två variabler: en loop-counter och en som lagrar största värdet den stött på. Det räcker också att ha en loop, istället för två nästlade.

X370 Taichi / R7 1700 @ 3.75 GHz 1.2 V / 2x8 GB 3200 MHz CL16 / MSI GTX 1070 Gaming, OC / Samsung 960 EVO 500 GB / Corsair RM650x
LG G6 (H870)

Trädvy Permalänk
Medlem
Plats
Tomelilla
Registrerad
Okt 2001

@flamingothedingo:
Anledningen till felkoden är troligen

return stor;

Du returnerar värdet vid varje körning och lämnar således funktionen innan loopen hinner iterera.

Anledningen att du får fel utan return 0; är att du har deklarerat att utraknstorsttal() skall returnera en integer men om din lista inte är stor nog kommer du aldrig att returnera något.
Beroende på kompilator så brukar det bli spännande resultat om man inte returnerar ett värde när man deklarerat att det förväntas.

Trädvy Permalänk
Medlem
Registrerad
Jul 2018

Tack för snabba svar!!
Anledningen till att return stor; låg där den låg var för att systemet gick bananas om jag lade den utanför, men slutligen lyckades jag lägga den på rätt ställe med {} kring rätt loop och nu fungerar den som den ska.

Tack för all input om min kod, jag är som sagt väääldigt ny och det är lite klurigare än jag trodde.

Ang variablen stor (som nu heter storst) så skickas den tillbaka till main funktionen för att sedan skrivas ut i utskrift-funktionen så den används och fungerar. Jag tog dock bort parametern storsta efter tips.

Vad gäller att förenkla funktionen så handlar kapitlet i boken om sortering via loop inuti loop och jag antog därför att det är det läraren vill att vi gör. Men jag ska ta med mig ditt tips inför nästa gång, jag har förstått att man kan programmera samma utkomst på olika sätt.

Här är den fungerande koden för funktionen.

int utraknStorstTal() { int v, slask, storst; for (v=0; v<=list.size()-2; v++) { for (int h=v+1; h<=list.size()-1; h++) if (list[h] < list[v]) { slask = list[v]; list[v] = list[h]; list[h] = slask; storst=list[h]; } } return storst; }

Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011
Skrivet av Thomas:

Använd gärna code-taggar runt all kod, dvs [code] före och [./code] efter (utan punkten). Det blir väldigt svårläst utan.

[noparse] (för att slippa punkter och dylikt) och [cmd] (för läsbarhet) är två bra taggar som kan användas för att demonstrera BB-kod.

Skrivet med hjälp av Better SweClockers

Trädvy Permalänk
Medlem
Plats
Manchester
Registrerad
Dec 2007

Då du redan fått hjälpen att fixa problemet så vill jag ge dig en rekommendation.
Skriv gärna koden på engelska. Det har du mer nytta av i längden om du fortsätter med kodning oavsett programmeringsspråk. Vet att skolorna i Sverige lär ut med att göra det på svenska för att göra det enkelt att komma igång. (Både min C++ och C# lärare lärde ut på svenska)
Men tyvärr skapar problem när man jobbar med icke svensktalande personer. Vissa lärare kräver dock att man gör det på svenska så hör med din lärare.
Just my 2 cents.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2018

Jag brukar ha som tumregel att göra följande:
1. alltid kapsla med "curly braces"
2. Deklarera varje variabel individuellt (blir lättare om man skall typa om en enskild variabel)
3. Om du skall kolla en lista som inte ändrar storlek i en loop - beräkna storleken innan du använder liststorleken innan. Visserligen kan kodoptimerare ibland lösa det åt dig, men inte alltid och det har stor betydelse på stora listor.

Skrev om i C#, men det är minimal skillnad.

int utraknStorstTal(List<int> list) { int v; int slask; int storst = int.MinValue; int listsize = list.Count; for (v = 0; v <= listsize - 2; v++) { for (int h = v + 1; h <= listsize - 1; h++) { if (list[h] < list[v]) { slask = list[v]; list[v] = list[h]; list[h] = slask; storst = list[h]; } } } return storst; }

Det finns också en bugg i koden som kan ge fel svar under vissa förutsättningar - men du får lista ut vad den är på egen hand.