Permalänk

c++ funktioner, skicka värde?

Tjabba tjena! Har en uppgift i programmering 1 och gillar ämnet än så länge, men har fastnat och läst boken jag fick och sånt men fattar verkligen inte vad som är fel. Har provat mig fram och läst lite här på forumet, får just nu bara ett error vilket är "previous definition^".

Programmet ska va att du skriver in ett antal tal så räknar det programmet ut medelvärde, minsta, högsta och näst högsta värde.
fick det att funka utan funktioner men det är funktioner uppgiften är i fokus på ^^

Om ni hade tänk visa en kod som funkar så skriv det först innan bild på koden, vill gärna tänka lite själv innan jag ser facit eller så:D
tack på förhand!

här är min kod:

#include <iostream> using namespace std; float funktion1 (float inp) { int max = INT_MIN; int nst = INT_MIN; int min = INT_MAX; int sum = 0; int antal = 0; float inp = 0; while (true) { if (inp == 0) { break; } if (inp > max) { nst=max; max = inp; } if (inp > nst && inp < max) { nst = inp; } if (inp < min) { min = inp; } sum += inp; antal++; } return inp; } int main () { int max = INT_MIN; int nst = INT_MIN; int min = INT_MAX; int sum = 0; int antal = 0; float inp = 0; cout << "Skriv in ett antal tal, avsluta med 0:" << endl; cin >> inp; inp = funktion1(inp); cout << "Summa är: " << sum << endl; cout << "Medelvärde är: " << (double)sum/(double)antal << endl; cout << "Störst tal är: " << max << endl; cout << "Näst störst tal är: " << nst << endl; cout << "Minst tal är: " << min << endl; return 0; }

Permalänk
Medlem

Det första och mest uppenbara felet du gör är att du hanterar lokala variabler fel.
Variabler som deklareras inuti en funktion syns bara inifrån den funktionen. Så den variabel min du deklarerar inuti funktion1() är inte samma variabel som den min som finns i main().
De min och max värden du räknat ut och sparat inuti funktion1() kommer därför att bara försvinna i tomma intet så fort funktionsanropet avslutas.

Permalänk
Skrivet av Erik_T:

Det första och mest uppenbara felet du gör är att du hanterar lokala variabler fel.
Variabler som deklareras inuti en funktion syns bara inifrån den funktionen. Så den variabel min du deklarerar inuti funktion1() är inte samma variabel som den min som finns i main().
De min och max värden du räknat ut och sparat inuti funktion1() kommer därför att bara försvinna i tomma intet så fort funktionsanropet avslutas.

Ah ok, jag antar att det inte bara är att ändra variablerna i funktionen till nått annat som att ge dem storbokstav eller nått?
så hela den listan med INT min och det är onödigt?

jag vet att jag jag behöver formella parametrar och aktuella parametrar, men har lite svårt att greppa det. jag tror mest mitt tankesätt är fel också haha.

är jag helt fel eller är det på rätt håll?

tack för svar!

Permalänk
Medlem

En funktion ska gärna göra en specifik sak och ha ett namn som är relevant. Flytta tillbaka loopen till main och gör flera små mindre funktioner som anropas i loopen. Exempelvis en funktion "max" som tar in två värden och returnerar det största av dem, en funktion "min" och en som räknar ut medelvärde.

Permalänk
Medlem
Skrivet av MhatteBoi:

Ah ok, jag antar att det inte bara är att ändra variablerna i funktionen till nått annat som att ge dem storbokstav eller nått?
så hela den listan med INT min och det är onödigt?

jag vet att jag jag behöver formella parametrar och aktuella parametrar, men har lite svårt att greppa det. jag tror mest mitt tankesätt är fel också haha.

är jag helt fel eller är det på rätt håll?

tack för svar!

Det spelar ingen roll vad du döper dina variabler inuti funktion1 till.
Problemet är att de variabler som du deklarerat inuti funktionen inte är samma variabler som du deklarerat inuti main.

Det är som två helt olika lådor med helt eget innehåll. Det enda som kommer att påverkas är variabeln inp eftersom du skickar den som en parameter till funktionen samt skriver över dess värde i main med returvärdet.

Ett annat problem du har är att din funktion aldrig kommer att returnera något (såvida du inte skickar in 0).
Varför tror du att du behöver en while inuti din funktion?

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Skrivet av smurfzg:

En funktion ska gärna göra en specifik sak och ha ett namn som är relevant. Flytta tillbaka loopen till main och gör flera små mindre funktioner som anropas i loopen. Exempelvis en funktion "max" som tar in två värden och returnerar det största av dem, en funktion "min" och en som räknar ut medelvärde.

aaah! det gör det lite lättare att förstå det i boken hahaha, jag ska se vad jag kan göra;)

tack för svar mannen!

Permalänk
Medlem

En sak till som kan orsaka svårt spårbara problem är att du igenom "using namespace std;" har alla funktioner och variabler i din namespace som syns ifrån iostream, vilket i din konkreta fall kan (men inte nödvändigtvis behöver, beroende på vilken compiler och tillhörande implementation av STL du använder) innehålla en definition av bl.a. std::min och std::max (se t.ex. [1]) som du försöker redefinera som int min i din kod. Så jag skulle rekommendera att du inte använder `using namespace std;` för nuvarande och skriver istället std::cin, std::cout, std::endl osv. - eller så kan du skriva "using std::cout, std::cin, std::endl;" i början istället för "using namespace std;" så behöver du inte ändra alla cin till std::cin osv.

using namespace std är lite overkill i många fall om man inte än vet vad man gör Lite som "from x import *" i Python, för de som kommer från det hållet.
Se också [2].

[1] https://stackoverflow.com/questions/19897722/why-can-stdmax-a...
[2] https://www.quora.com/Why-do-many-people-use-std-cout-instead...

PS: jag hade inte möjlighet just nu att testa eller reproducera just felet du kom på, i princip behöver man oftast se lite mer detaljer av felmeddelandet; men tipps ovan lär ändå hjälpa dig att undvika en hel del problem som inte har med det du försöker lösa att göra, som namespaces, scope etc.

Visa signatur

Louqe Ghost S1 | Ryzen 5600X | 32 GB DDR4-3600 | Asus Strix X470-I | RTX2080Ti FE

Permalänk
Skrivet av noMad17:

Det spelar ingen roll vad du döper dina variabler inuti funktion1 till.
Problemet är att de variabler som du deklarerat inuti funktionen inte är samma variabler som du deklarerat inuti main.

Det är som två helt olika lådor med helt eget innehåll. Det enda som kommer att påverkas är variabeln inp eftersom du skickar den som en parameter till funktionen samt skriver över dess värde i main med returvärdet.

Ett annat problem du har är att din funktion aldrig kommer att returnera något (såvida du inte skickar in 0).
Varför tror du att du behöver en while inuti din funktion?

tror att jag behöver en while för att få det att funka med att göra så att mata in 0 avslutar eller så!

ska prova dela upp det som en annan påpekade och ha att funktionen gör mer specifika grejer, när jag ser det på det viset så kan jag hänga med lite mer det som görs i boken!

Permalänk
Medlem
Skrivet av MhatteBoi:

Tjabba tjena! Har en uppgift i programmering 1 och gillar ämnet än så länge, men har fastnat och läst boken jag fick och sånt men fattar verkligen inte vad som är fel. Har provat mig fram och läst lite här på forumet, får just nu bara ett error vilket är "previous definition^".

Programmet ska va att du skriver in ett antal tal så räknar det programmet ut medelvärde, minsta, högsta och näst högsta värde.
fick det att funka utan funktioner men det är funktioner uppgiften är i fokus på ^^

Om ni hade tänk visa en kod som funkar så skriv det först innan bild på koden, vill gärna tänka lite själv innan jag ser facit eller så:D
tack på förhand!

här är min kod:

#include <iostream> using namespace std; float funktion1 (float inp) { int max = INT_MIN; int nst = INT_MIN; int min = INT_MAX; int sum = 0; int antal = 0; float inp = 0; while (true) { if (inp == 0) { break; } if (inp > max) { nst=max; max = inp; } if (inp > nst && inp < max) { nst = inp; } if (inp < min) { min = inp; } sum += inp; antal++; } return inp; } int main () { int max = INT_MIN; int nst = INT_MIN; int min = INT_MAX; int sum = 0; int antal = 0; float inp = 0; cout << "Skriv in ett antal tal, avsluta med 0:" << endl; cin >> inp; inp = funktion1(inp); cout << "Summa är: " << sum << endl; cout << "Medelvärde är: " << (double)sum/(double)antal << endl; cout << "Störst tal är: " << max << endl; cout << "Näst störst tal är: " << nst << endl; cout << "Minst tal är: " << min << endl; return 0; }

Skrivet av physicalist:

En sak till som kan orsaka svårt spårbara problem är att du igenom "using namespace std;" har alla funktioner och variabler i din namespace som syns ifrån iostream, vilket i din konkreta fall kan (men inte nödvändigtvis behöver, beroende på vilken compiler och tillhörande implementation av STL du använder) innehålla en definition av bl.a. std::min och std::max (se t.ex. [1]) som du försöker redefinera som int min i din kod. Så jag skulle rekommendera att du inte använder `using namespace std;` för nuvarande och skriver istället std::cin, std::cout, std::endl osv. - eller så kan du skriva "using std::cout, std::cin, std::endl;" i början istället för "using namespace std;" så behöver du inte ändra alla cin till std::cin osv.

using namespace std är lite overkill i många fall om man inte än vet vad man gör Lite som "from x import *" i Python, för de som kommer från det hållet.
Se också [2].

[1] https://stackoverflow.com/questions/19897722/why-can-stdmax-a...
[2] https://www.quora.com/Why-do-many-people-use-std-cout-instead...

PS: jag hade inte möjlighet just nu att testa eller reproducera just felet du kom på, i princip behöver man oftast se lite mer detaljer av felmeddelandet; men tipps ovan lär ändå hjälpa dig att undvika en hel del problem som inte har med det du försöker lösa att göra, som namespaces, scope etc.

Nu tog jag en till titt på din kod och insåg vad som orsakade just felet med "previous definition" eller kanske hellre "previously declared" - du har deklarerat "inp" två gånger, nämligen först i funktionsdeklarationen som parameter: "float funktion1(float inp)" och sen igen några rad under det i själva funktionen, "float inp=0". Ta bort "float" om du vill bara sätta variablen till 0, men då behöver du inte heller ha det som argument till din funktion då vad än du överlämnar till funktionen blir ändå 0 i det rådet då. Så ta helt bort det andra. Men som andra redan sa måste du skriva om funktionen helt ändå för att åstadkomma det du vill göra.

Men fel gör man för att lära sig mer du är på rätt väg skulle jag säga. Lycka till!

Visa signatur

Louqe Ghost S1 | Ryzen 5600X | 32 GB DDR4-3600 | Asus Strix X470-I | RTX2080Ti FE

Permalänk
Skrivet av smurfzg:

En funktion ska gärna göra en specifik sak och ha ett namn som är relevant. Flytta tillbaka loopen till main och gör flera små mindre funktioner som anropas i loopen. Exempelvis en funktion "max" som tar in två värden och returnerar det största av dem, en funktion "min" och en som räknar ut medelvärde.

sen är det också att programmet ska ju göra allt och inte bara att jag tar det största talet så funktionerna ska isåfall vara i loopen?
behöver ju att det som jag matar in gå till alla funktioner liksom

Permalänk
Medlem
Skrivet av MhatteBoi:

sen är det också att programmet ska ju göra allt och inte bara att jag tar det största talet så funktionerna ska isåfall vara i loopen?
behöver ju att det som jag matar in gå till alla funktioner liksom

Ja, men det är inte ett problem heller.
Varje iteration i loopen behöver göra flera saker, men var sak ska ha sin funktion och beroende på sak behöver de olika parametrar. Det är sant att de flesta kommer behöver inp som parameter men exempelvis medelvärde behöver ju inte det, den behöver en uppdaterad summa och antal istället.

Permalänk

Om någon orkar eller vill göra en kod med kanske 1 eller 2 funktioner i samma stil som mig så hade det varit väldigt snällt för min hjärna är fan cp just nu haha xD bara så jag kan se hur det ska se ut typ! hade varit väldigt uppskattat!

Mvh smoothbrain

Permalänk
Medlem
Skrivet av MhatteBoi:

Om någon orkar eller vill göra en kod med kanske 1 eller 2 funktioner i samma stil som mig så hade det varit väldigt snällt för min hjärna är fan cp just nu haha xD bara så jag kan se hur det ska se ut typ! hade varit väldigt uppskattat!

Mvh smoothbrain

#include <iostream> int max(float inp, int max) { if (inp > max) { return inp; } return max; } int main () { int max = INT_MIN; int nst = INT_MIN; int min = INT_MAX; int sum = 0; int antal = 0; float inp = 0; std::cout << "Skriv in ett antal tal, avsluta med 0:" << endl; while (true) { std::cin >> inp; if (inp == 0) { break; } max = max(inp,max) if (inp > nst && inp < max) { nst = inp; } if (inp < min) { min = inp; } sum += inp; antal++; } std::cout << "Summa är: " << sum << endl; std::cout << "Medelvärde är: " << (double)sum/(double)antal << endl; std::cout << "Störst tal är: " << max << endl; std::cout << "Näst störst tal är: " << nst << endl; std::cout << "Minst tal är: " << min << endl; return 0; }

Typ nåt sånt där, fortsätt med att byta ut if satserna med funktionsanrop så som det är gjort med max. Har inte testat koden, bara skrivit i forumet så du får debugga den också.

Permalänk
Skrivet av smurfzg:

#include <iostream> int max(float inp, int max) { if (inp > max) { return inp; } return max; } int main () { int max = INT_MIN; int nst = INT_MIN; int min = INT_MAX; int sum = 0; int antal = 0; float inp = 0; std::cout << "Skriv in ett antal tal, avsluta med 0:" << endl; while (true) { std::cin >> inp; if (inp == 0) { break; } max = max(inp,max) if (inp > nst && inp < max) { nst = inp; } if (inp < min) { min = inp; } sum += inp; antal++; } std::cout << "Summa är: " << sum << endl; std::cout << "Medelvärde är: " << (double)sum/(double)antal << endl; std::cout << "Störst tal är: " << max << endl; std::cout << "Näst störst tal är: " << nst << endl; std::cout << "Minst tal är: " << min << endl; return 0; }

Typ nåt sånt där, fortsätt med att byta ut if satserna med funktionsanrop så som det är gjort med max. Har inte testat koden, bara skrivit i forumet så du får debugga den också.

Tack så jättemycket! Det blir perfekt!