C++ nybörjare funktioner och vektorer

Permalänk
Medlem

C++ nybörjare funktioner och vektorer

Hej, håller på med en Uppgift och beskrivningen är:
skapa en funktion i c++ med följande huvud

float medel (int v[], int n)

Funktionen ska alltså ta en heltalsvektor som inparameter och returnera medelvärdet av talen i vektorn. Parametern n anger antalet element i vektorn.
Skriv också ett huvudprogram (main) i vilket du deklarerar en hetalsvektor med 10 element. Programmet ska anropa funktionen medel och skriva ut medelvärdet av talen i vektorn. Välj själv om vektorn tilldelas värden av programmet självt eller om värdena matas in av användaren när programmet körs.
Tips använd typomvandling.

Jag har kommit en ganska bra bit på vägen med programmet känns det som. Vilket är följande.

#include <iostream> #include <clocale> float medel(int v[], int n) { float summa = 0.0; //Här nollställer man summan så att vi börjar additionen från noll float medel; for (int i = 0; i <n; i++) { summa = summa + n; } medel = summa / n; return (float)medel; // för att inte returnera medel som en int sätter man (float)/(double) framför för en typomvandling } int main() { setlocale(LC_ALL, "swedish"); int n[10], summa = 0; for (int i = 0; i <=10; i++) { std::cout << "Skriv in tio tal: "; std::cin >> n[i]; } medel(n, 10); //Här kallar jag på min funktion std::cout << "Medelvärdet blir : " << summa/10; std::cin.ignore(); std::cin.get(); return 0; }

Dock blir det ju inte riktigt som tänkt så något fel gör jag men kan inte riktigt hitta det, jag kan ju även skriva tal 11 gånger istället för 10 som jag trodde att man bara skulle kunna. Sedan räknar den inte ut medelvärdet heller den säger att det blir 0 bara.

Ifall någon vill hjälpa på något sätt så uppskattas det väldigt mycket.

Permalänk
Medlem
Skrivet av blewz:

float medel(int v[], int n) { ... return (float)medel; // för att inte returnera medel som en int sätter man (float)/(double) framför för en typomvandling }

(float)medel har ingen effekt här, medel är ju redan en float.

Skrivet av blewz:

for (int i = 0; i <=10; i++) { std::cout << "Skriv in tio tal: "; std::cin >> n[i]; }

Den här for-loopen börjar på 0 och fortsätter så länge som i är mindre eller lika med 10. Räkna på fingrarna från 0 till 10 och se hur långt du kommer

Skrivet av blewz:

medel(n, 10); //Här kallar jag på min funktion std::cout << "Medelvärdet blir : " << summa/10;

Här anropar du funktionen, men du tilldelar inte resultatet till något. Sen skriver du ut variabeln summa som du tidigare satt till 0, så utskriften kommer så klart säga 0.

Låt mig för övrigt citera mig själv från en av dina tidigare trådar:

Skrivet av perost:

De få minuter det tar att lära sig grunderna i debugging kommer spara dig mycket tid under kursens gång.

Permalänk
Medlem

@perost: Tack igen för tipset om debugging, sitter och kollar med det nu och kollar uppe vid min

float medel(int v[], int n) { float summa = 0.0; //Här nollställer man summan så att vi börjar additionen från noll float medel; for (int i = 0; i <=n; i++) { summa = summa + n; } medel = summa / n; return medel; // för att inte returnera medel som en int sätter man (float)/(double) framför för en typomvandling }

och det jag kan se just nu är ju att den " summa = summa + n " plussar på 10 i varje varv och det är ju inte rätt var jag fattar för den borde ju plussa på de tal jag skrivit in. Men det gör den ju inte så jag tänker att "summa = summa + n" är fel på något sätt trodde man kunde skriva n[i]. Men då få "expression must have pointer-to-object type" error. får klura lite mer så får vi se om jag kommer fram till något mer vettigt vad ska ska ändra på.

Permalänk
Medlem
Skrivet av blewz:

och det jag kan se just nu är ju att den " summa = summa + n " plussar på 10 i varje varv och det är ju inte rätt var jag fattar för den borde ju plussa på de tal jag skrivit in. Men det gör den ju inte så jag tänker att "summa = summa + n" är fel på något sätt trodde man kunde skriva n[i]. Men då få "expression must have pointer-to-object type" error. får klura lite mer så får vi se om jag kommer fram till något mer vettigt vad ska ska ändra på.

Ah, det missade jag. Felet beror på att du försöker använda n som en vektor, men det är ju v som är vektorn i funktionen.

Permalänk
Medlem

Har provat ändra lite mer men av någon anledning så skickar medel ut ett negativt tal typ -858993460
De lilla jag provat ändra på men blir inte så mycket klokare är

#include <iostream> #include <clocale> float medel(int v[], int n) { float summa = 0.0; //Här nollställer man summan så att vi börjar additionen från noll float medel = 0.0; for (int i = 0; i <=9; i++) { summa = summa + v[i]; } medel = summa / v[9]; return medel; } int main() { setlocale(LC_ALL, "swedish"); int n[10]; int summa = n[10]; for (int i = 0; i <=9; i++) { std::cout << "Skriv in tio tal: "; std::cin >> n[i]; } medel(n, 10); //Här anropar jag på min funktion std::cout << "Medelvärdet blir : " << summa; std::cin.ignore(); std::cin.get(); return 0; }

läst igenom flera gånger i boken om for loopen men jag ser inte vad jag gör för fel. Sen när jag kör debuggning så stegar jag med f11 så ser ju att den iallafall räknar ihop de tal jag skrivit in sen händer något vid medel som jag inte fattar. Jag blandar ju förmodligen ihop något men jag har då svårt att hitta felet. Vet att det här är ju viktiga grunder som man bör klara av att hitta och klara själv men just nu sitter då jag fast.

Permalänk
Medlem
Skrivet av blewz:

Har provat ändra lite mer men av någon anledning så skickar medel ut ett negativt tal typ -858993460
De lilla jag provat ändra på men blir inte så mycket klokare är

#include <iostream> #include <clocale> float medel(int v[], int n) { float summa = 0.0; //Här nollställer man summan så att vi börjar additionen från noll float medel = 0.0; for (int i = 0; i <=9; i++) { summa = summa + v[i]; } medel = summa / v[9]; return medel; } int main() { setlocale(LC_ALL, "swedish"); int n[10]; int summa = n[10]; for (int i = 0; i <=9; i++) { std::cout << "Skriv in tio tal: "; std::cin >> n[i]; } medel(n, 10); //Här anropar jag på min funktion std::cout << "Medelvärdet blir : " << summa; std::cin.ignore(); std::cin.get(); return 0; }

läst igenom flera gånger i boken om for loopen men jag ser inte vad jag gör för fel. Sen när jag kör debuggning så stegar jag med f11 så ser ju att den iallafall räknar ihop de tal jag skrivit in sen händer något vid medel som jag inte fattar. Jag blandar ju förmodligen ihop något men jag har då svårt att hitta felet. Vet att det här är ju viktiga grunder som man bör klara av att hitta och klara själv men just nu sitter då jag fast.

Först och främst bör du omedelbart åtgärda din indentering. Det är mycket jobbigare för oss att läsa kod med felaktig indentering eller annan inkonsekvent formatering. Men till problemen:

  1. I main där du anropar medel tar du aldrig tillvara på resultatet. Förslagsvis sparar du det i en variabel med namnet average eller liknande.

    float average = medel(n, 10);

    Du kan även skriva ut medelvärdet direkt om du inte behöver spara det.

    std::cout << medel(n, 10) << std::endl;

  2. I medel dividerar du med arrayens 9:e element istället för antal element n, så den kommer inte ge något vettigt resultat.

  3. Du har hårdkodat längden till 10 i medel. Se till att längden n du får som parameter används istället.

  4. Namnet n på din array är inte särskilt beskrivande. Använd tal eller något i den stilen så man förstår vad den används till.

  5. Varför skapar du variabeln summa och sätter värdet på den till det 10:e elementet i n? Särskilt illa blir det eftersom n bara har längden 10 och därmed inte har något 10:e element, så du läser något till synes slumpartat ur minnet och använder det till absolut ingenting förutom att skriva ut där du borde skriva ut medelvärdet. Du ska inte beräkna någon summa i main, så ta bort den.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem

@LemonIllusion: Tack för dina råd, och ber om ursäkt ifall jag skriver koden felaktig, det är inget som läraren sagt något om än då detta som många andra läser på distans så vet inte om läraren bryr sig eller tänker på det då. Men jag ska försöka bättre mig på den biten också. Jag tror jag fattar lite mer nu tack vare dig @LemonIllusion.
Nu lyckades jag få till det med hjälp av dina råd.

ps. kan du ge något exempel på hur jag kan skriva koden på rätt indentering sätt ?
tack för hjälpen.

Permalänk
Medlem
Skrivet av blewz:

@LemonIllusion: Tack för dina råd, och ber om ursäkt ifall jag skriver koden felaktig, det är inget som läraren sagt något om än då detta som många andra läser på distans så vet inte om läraren bryr sig eller tänker på det då. Men jag ska försöka bättre mig på den biten också. Jag tror jag fattar lite mer nu tack vare dig @LemonIllusion.
Nu lyckades jag få till det med hjälp av dina råd.

ps. kan du ge något exempel på hur jag kan skriva koden på rätt indentering sätt ?
tack för hjälpen.

Det är mest två saker som sticker ut i din formatering. Den första är att du har en tom rad mellan for-uttrycket och det tillhörande blocket, vilket kan ge upphov till förvirring. Den andra är indenteringen som efter for-loopen i main inte har rätt nivå, utan är en tabb för långt in. Vid varje inledande måsvinge ska indenteringsnivån ökas med ett steg och vid varje avslutande måsvinge ska indenteringsnivån minskas med ett steg.

Om man vill kan man även placera måsvingarna på samma rad som tillhörande uttryck. Vissa föredrar detta och vissa föredrar att ha dem på raden under. Så länge man inte blandar fungerar båda precis lika bra. Exempel:

if (myBool) { doStuff(); } else { doOtherStuff(); }

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem
Skrivet av LemonIllusion:

Särskilt illa blir det eftersom n bara har längden 10 och därmed inte har något 10:e element

Ska man vara lite petig så har ju vektorn faktiskt ett 10:e element eftersom den innehåller just 10 element, men däremot inget element med index 10 eftersom indexeringen börjar på 0. Det var säkert det du menade, men kan vara värt att påpeka eftersom array-indexering i C++ ofta är lite förvirrande för nybörjare.

Permalänk
Medlem
Skrivet av perost:

Ska man vara lite petig så har ju vektorn faktiskt ett 10:e element eftersom den innehåller just 10 element, men däremot inget element med index 10 eftersom indexeringen börjar på 0. Det var säkert det du menade, men kan vara värt att påpeka eftersom array-indexering i C++ ofta är lite förvirrande för nybörjare.

Bra poäng, det var lite otydligt uttryckt. Jag ska försöka hålla mig till "elementet vid index 10" i framtiden för att undvika förvirring.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem

@LemonIllusion: & @perost Tack för era tips och råd, det är alltid uppskattat när man får lite extra hjälp Trevlig helg på er.

Permalänk
Medlem

Då alla redan hjälpt dig kan jag visa lite "modernare" metod för att göra detta:

#include <iostream> #include <vector> #include <chrono> #include <random> float medel(std::vector<int>& in){ if(in.size()<=0) // Om vektorn är tom skicka bara svar 0.0 direkt. return 0.0; int sum=0; // Vi gör en cast vid return därav kan vi ta emot större vektorer att ta medelvärdet på. for(auto& i:in) sum+=i; // bara plussar alla element från vektorn till sum variablen. return (float)sum/in.size(); // dela summan med antal element i vektorn, sedan returera vi denna divsions "svar". } // Auto test.... int main(){ std::vector<int> test(10); // Skapar en vektor med 10 element. std::mt19937 generator (std::chrono::system_clock::now().time_since_epoch().count()); // init slumpgenerator. for(auto& i:test){ // Loopar igenom vektor i=generator()%100; // setter element i from vektorn till ett slumptal (mellan 0-99). } std::cout << "The mean value iss: " << medel(test) << std::endl; // kalla på vår medelvärdes funktion, som vi skriver ut det vi fått tillbaka från. return 0; }

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem

Här är en kort version.

#include <iostream> #include <vector> #include <numeric> #include <random> #include <algorithm> int main() { srand(time(0)); std::vector<int> testVec(10); std::generate(testVec.begin(), testVec.end(), []() { return std::rand() % 100; }); std::cout << "Medelvärde: " << (double)std::accumulate(testVec.begin(), testVec.end(), 0) / testVec.size() << std::endl; }

Permalänk

@MrDoggo: Jag utgår ifrån att du läst hela tråden och funderat över var och varför TS gör tankevurpor. Självklart slipper hen en del av problematiken genom att använda funktionalitet i standardbiblioteket, men får du inte intrycket att några av de saker som TS behöver öva på är just for-loopar och array-indexering? På vilket sätt anser du att ditt inlägg förde TS framåt i sin utveckling?

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

@MrDoggo: Jag utgår ifrån att du läst hela tråden och funderat över var och varför TS gör tankevurpor. Självklart slipper hen en del av problematiken genom att använda funktionalitet i standardbiblioteket, men får du inte intrycket att några av de saker som TS behöver öva på är just for-loopar och array-indexering? På vilket sätt anser du att ditt inlägg förde TS framåt i sin utveckling?

Tråden var redan löst dock, sedan kommer ytterligare en skribent och gör en lösning med nya standarden. Samma logik borde väl isf applicera på den skribenten, så varför inte påpeka samma sak till denne som var först med att skriva en alternativ lösning? Eftersom det hände, tänkte jag att jag kommer med ett smidigt sätt att göra det på också. Ställer samma fråga tillbaka, varför skulle TS gå bakåt i utvecklingen av att jag tillför till tråden?

Varför skulle inte ett diskuterat ämne gynnas av att flera kommer med input? Trådar är inte bara för trådskapare, utan för folk som bara är intresserad av ämnet och läser diskussioner. Varför denna negativitet?

Permalänk

@MrDoggo: Asdfghs har i sitt inlägg huvudsakligen bytt ur for-looparna mot range-baserade for-loopar men behåller så mycket av TS lösning så det är lätt att känna igen sig och kunna ta till sig den nya typen av loop och se fördelar med att man själv inte behöver hålla reda på storleken utan att kompilatorn fixar det åt dig. Den nya slumptalsgeneratorn är dock lite överkurs.

Din lösning består bara av överkurs. Trådens rubrik är "C++ nybörjare funktioner och vektorer" så det är för TS, sannolikt, helt okända delar av standardbiblioteket och en helt ny konstruktion i form av lambdat. Du kan hävda att du också bara ville illustrera andra sätt att lösa samma problem, men du har på intet sätt förklarat vad accumulate eller generate gör eller fördelarna med att använda dem. Detta hjälper varken TS eller andra intresserade av ämnet att lära sig nya saker.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

@MrDoggo: Asdfghs har i sitt inlägg huvudsakligen bytt ur for-looparna mot range-baserade for-loopar men behåller så mycket av TS lösning så det är lätt att känna igen sig och kunna ta till sig den nya typen av loop och se fördelar med att man själv inte behöver hålla reda på storleken utan att kompilatorn fixar det åt dig. Den nya slumptalsgeneratorn är dock lite överkurs.

Din lösning består bara av överkurs. Trådens rubrik är "C++ nybörjare funktioner och vektorer" så det är för TS, sannolikt, helt okända delar av standardbiblioteket och en helt ny konstruktion i form av lambdat. Du kan hävda att du också bara ville illustrera andra sätt att lösa samma problem, men du har på intet sätt förklarat vad accumulate eller generate gör eller fördelarna med att använda dem. Detta hjälper varken TS eller andra intresserade av ämnet att lära sig nya saker.

Du hjälper inte mycket nu när du går off-topic heller, vad har du för ursäkt till det? Förstår inte varför du är på mig. Man är ju nybörjare för att man ska lära sig, därav brukar man ägna mycket tid åt dokumentationen och där kan man lätt kolla vad std::accumulate och std::generate är.

Vem är du att säga vad som är meningslöst för andra som vill lära sig när du skriver "Detta hjälper varken TS eller andra intresserade av ämnet att lära sig nya saker."? Vad vet du om det?

Sedan är ju forum just för diskussion, om någon inte förstår kan de ju fråga så svarar någon. Åter igen så anser jag att du är den som kommer med onödig off-topic nu och rent utav är lite otrevlig mot mig utan anledning.