Permalänk

C++ Medelvärde

Hej!

Jag ska göra ett program som är uppbyggt av ett antal funktioner och göra diverse saker och en av de sakerna är att jag ska räkna ut medelvärdet på alla tal som jag knappar in. Jag har gjort en kod som beräknar medelvärdet ibland, men det är endast när jag t.ex. skriver in 1, 2, 3, 4, 5 som tal så beräknar den medelvärdet men när jag skriver in högre tal så blir det fel. Om någon vänlig själv vill kolla in koden jag gjort och se var felet ligger och ge en hint om vad det är skulle det uppskattas stort!!

//Fredrik

#include<iostream>
double tal, summa = 0, medel;
double fmedel(double x, double y)
{
double mv;
mv = (x) / y;
return mv;
}
void main()
{
tal = 1;
while (tal!=0)
{
std::cout << "Ange ett tal: ";
medel = fmedel(summa, tal);
std::cin >> tal;
if (tal != 0);
summa = summa + tal;
}

std::cout <<"Summan blir " << summa << std::endl;
std::cout << "Medelvardet blir " <<medel<< std::endl;
}

Permalänk
Medlem
Skrivet av FlowingPrana:

Hej!

Jag ska göra ett program som är uppbyggt av ett antal funktioner och göra diverse saker och en av de sakerna är att jag ska räkna ut medelvärdet på alla tal som jag knappar in. Jag har gjort en kod som beräknar medelvärdet ibland, men det är endast när jag t.ex. skriver in 1, 2, 3, 4, 5 som tal så beräknar den medelvärdet men när jag skriver in högre tal så blir det fel. Om någon vänlig själv vill kolla in koden jag gjort och se var felet ligger och ge en hint om vad det är skulle det uppskattas stort!!

//Fredrik

#include<iostream>
double tal, summa = 0, medel;
double fmedel(double x, double y)
{
double mv;
mv = (x) / y;
return mv;
}
void main()
{
tal = 1;
while (tal!=0)
{
std::cout << "Ange ett tal: ";
medel = fmedel(summa, tal);
std::cin >> tal;
if (tal != 0);
summa = summa + tal;
}

std::cout <<"Summan blir " << summa << std::endl;
std::cout << "Medelvardet blir " <<medel<< std::endl;
}

Tips 1: Använd [code]-taggar runt din kod så den blir snygg

#include<iostream> double tal, summa = 0, medel; double fmedel(double x, double y) { double mv; mv = (x) / y; return mv; } void main() { tal = 1; while (tal!=0) { std::cout << "Ange ett tal: "; medel = fmedel(summa, tal); std::cin >> tal; if (tal != 0); summa = summa + tal; } std::cout <<"Summan blir " << summa << std::endl; std::cout << "Medelvardet blir " <<medel<< std::endl; }

Tips 2: Programmera på engelska. Smaksak kanske, men om du ska börja koda professionellt kan jag garantera dig att det kommer föredras att du skriver [cmd]double sum[/double] istället

Tips 3: Jag tror du missuppfattat hur medelvärden beräknas. Ta en kik på Wikipedia!

Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk
Medlem
Skrivet av FlowingPrana:

Hej!

Jag ska göra ett program som är uppbyggt av ett antal funktioner och göra diverse saker och en av de sakerna är att jag ska räkna ut medelvärdet på alla tal som jag knappar in. Jag har gjort en kod som beräknar medelvärdet ibland, men det är endast när jag t.ex. skriver in 1, 2, 3, 4, 5 som tal så beräknar den medelvärdet men när jag skriver in högre tal så blir det fel. Om någon vänlig själv vill kolla in koden jag gjort och se var felet ligger och ge en hint om vad det är skulle det uppskattas stort!!

//Fredrik

#include<iostream>
double tal, summa = 0, medel;
double fmedel(double x, double y)
{
double mv;
mv = (x) / y;
return mv;
}
void main()
{
tal = 1;
while (tal!=0)
{
std::cout << "Ange ett tal: ";
medel = fmedel(summa, tal);
std::cin >> tal;
if (tal != 0);
summa = summa + tal;
}

std::cout <<"Summan blir " << summa << std::endl;
std::cout << "Medelvardet blir " <<medel<< std::endl;
}

Skrivet av GLaDER:

Tips 1: Använd [code]-taggar runt din kod så den blir snygg

#include<iostream> double tal, summa = 0, medel; double fmedel(double x, double y) { double mv; mv = (x) / y; return mv; } void main() { tal = 1; while (tal!=0) { std::cout << "Ange ett tal: "; medel = fmedel(summa, tal); std::cin >> tal; if (tal != 0); summa = summa + tal; } std::cout <<"Summan blir " << summa << std::endl; std::cout << "Medelvardet blir " <<medel<< std::endl; }

Tips 2: Programmera på engelska. Smaksak kanske, men om du ska börja koda professionellt kan jag garantera dig att det kommer föredras att du skriver [cmd]double sum[/double] istället

Tips 3: Jag tror du missuppfattat hur medelvärden beräknas. Ta en kik på Wikipedia!

Ja, precis. Programmet är inte konstruerat att räkna ut medelvärdet någonsin, det är ett rent sammanträffande att uträkningen sammanfaller med medelvärdet om man testar med att mata in t.ex. följden 1,2,3,4,5.

Det du vill göra är ju att dela med hur många tal som matats in och summerats, inte vad det senaste talet var.

Förmodligen då även lämpligt att namnge saker så att de heter vad de är. T.ex. "x" och "y" här gör det ju inte tydligare vad det är för värden som faktiskt förväntas skickas in när man läser koden.

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || MSI Ventus 3x 5080 || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk

okej jag trodde att genom funktione fmedel så beräknades medelvärdet genom x/y då (vad jag har trott) att x=sum och y=antal inmatningar, men det är det alltså inte då... Jag får kolla vidare och se! Tack!

Permalänk
Medlem
Skrivet av FlowingPrana:

okej jag trodde att genom funktione fmedel så beräknades medelvärdet genom x/y då (vad jag har trott) att x=sum och y=antal inmatningar, men det är det alltså inte då... Jag får kolla vidare och se! Tack!

Men vad skickar du in för värden, t.ex. vad är det för något som skickas in som "y"?
(Se även förslaget i tidigare inlägg att välja bättre namn än "x" och "y")

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || MSI Ventus 3x 5080 || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk

vad jag trott så har jag skickat in värdet summa till x och antal inmatningar (tal) till y. Ska tänka på att använda bättre namn också!

Permalänk
Medlem
Skrivet av FlowingPrana:

vad jag trott så har jag skickat in värdet summa till x och antal inmatningar (tal) till y. Ska tänka på att använda bättre namn också!

Jag fortsätter med lite ledande frågor... vad är "tal"?

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || MSI Ventus 3x 5080 || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av FlowingPrana:

okej jag trodde att genom funktione fmedel så beräknades medelvärdet genom x/y då (vad jag har trott) att x=sum och y=antal inmatningar, men det är det alltså inte då... Jag får kolla vidare och se! Tack!

Jo, medelvärdet är summan av talen / antal tal, men det är som sagt inte vad du faktiskt beräknar. Funktionen fmedel är dessutom onödigt komplicerad, den kan förenklas till enbart:

double fmedel(double x, double y) { return x / y; }

Och då finns det egentligen ingen större mening med funktionen eftersom det enda den gör är att dividera två tal, vilket du lika gärna kan göra direkt istället.

Du har även råkar skriva ett ; efter din if-sats, d.v.s.:

if (tal != 0); // Här slutar if-satsen p.g.a. ;, så den kollar att tal != 0 och gör sen ingenting. summa = summa + tal; // Hör inte till if-satsen, kan även skrivas bättre som summa += tal;

Det finns för övrigt ingen orsak att kontrollera om tal är 0 eller ej innan du summerar, om tal skulle vara 0 så händer ju ändå inget om du adderar det till summa.

Permalänk

behöver jag göra tal i vektorer istället?

Permalänk
Medlem
Skrivet av evil penguin:

Jag fortsätter med lite ledande frågor... vad är "tal"?

Skrivet av FlowingPrana:

behöver jag göra tal i vektorer istället?

Inte nödvändigtvis...
Men du pratade om att du skulle skicka in "antal inmatningar", är det vad du skickar in i nuläget?

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || MSI Ventus 3x 5080 || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk

nej det är det ju inte då... så då behöver jag ordna så att antalet inmatningar registreras och dividera summan med det istället.

Permalänk
Medlem
Skrivet av FlowingPrana:

nej det är det ju inte då... så då behöver jag ordna så att antalet inmatningar registreras och dividera summan med det istället.

Helt rätt!

Visa signatur

Äsch...

Permalänk

Jag la till en for-loop som ordnade antal input. Dock så kan jag inte skriva in negativa tal, då hänger sig programmet. Kan man lösa det genom en if-sats eller är det något med for-loopen som behöver justeras?
int i;
input = 1;
while (input != 0)
{
for (i = 0; i <= input; i++) {
std::cout << "Ange ett tal: ";
medel = fmedel(summa, i);

std::cin >> input;
summa += input;
}
if (input != 0);
}

Permalänk
Hedersmedlem

Du bör stanna upp och fundera lite till. Vad vill du att input ska vara? Nu verkar du använda det som ett tal du vill lägga till summan men samtidigt ett antal nummer som du loopar över. Tänk över stegen, möjligen skriv ner och motivera vad varje rad är till för.

Permalänk

Tack för hjälpen, det hjälpte!
Men, när ett problem löses uppstår ett annat. Jag beräknar medelsumman och summan av talen, men efter att jag fått det så ska man välja om man vill avsluta genom att trycka 0, och om man inte gör det så ska det börja om igen. Problemet är dock att när jag startar om igen och skriver in nya tal som ska beräknas, så läggs de talen till på den gamla summan och medelvärdet när jag vill att det blir helt nytt...

#include<iostream> double summa = 0, medel, dN = 1, dN2, dEnd=0, dSum=0; int i; double fmedel(double dSum, int iI); void utskrift1(double dEnd); void utskrift2(double dSum); void inlasning(void); void main() { inlasning(); utskrift1(dEnd); } void utskrift1(double dEnd) { std::cout << "==============" << std::endl; std::cout << "program slut!" << std::endl; std::cout << "==============" << std::endl; } void utskrift2(double dSum) { std::cout << "Summan blir " << summa << std::endl; std::cout << "Medelvardet blir " << medel << std::endl; } void inlasning () { while (dN != 0) { std::cout << "Ange hur manga tal, ange 0 for avslut: "; std::cin >> dN; for (i = 0; i < dN; i++) { std::cout << "Ange tal " << i + 1 << ": "; std::cin >> dN2; summa += dN2; medel = fmedel(summa, dN); } if (dN != 0) { utskrift2(dSum); } } } double fmedel(double dSum, int iI) { return dSum / iI; }

Permalänk
Medlem
Skrivet av FlowingPrana:

Tack för hjälpen, det hjälpte!

Som jag skrev i mitt första inlägg, snälla, använd [code]-taggar.

Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk

vad är det?

Permalänk
Medlem
Skrivet av GLaDER:

Tips 1: Använd [code]-taggar runt din kod så den blir snygg

#include<iostream>

Skrivet av FlowingPrana:

vad är det?

Se min post ovan.

Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk

hur får du koden att se ut så då? ursäkta mig men jag är helt grön på sånt här

Permalänk
Medlem
Skrivet av FlowingPrana:

hur får du koden att se ut så då? ursäkta mig men jag är helt grön på sånt här

Du skriver

[ code]
Din kod här...
[/code]

i ditt inlägg; fast du tar bort mellanslaget mellan [ och code. Du kan även citera inlägg och se exakt hur en användare skrev sitt inlägg.

Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk

tack!

Permalänk
Medlem
Skrivet av FlowingPrana:

void inlasning () { while (dN != 0) { <gör grejer> if (dN != 0) { utskrift2(dSum); } } }

Ovan blir lite av en tankevurpa va? Hur ska du "nå" if-satsen?

Jag vet inte hur du kör din kod, men det här är ett klockrent exempel där en IDE med brytpunkter (break points) är väldigt bra att ha. Då kan du se exakt hur din kod exekverar och förstå "vilka vägar den tar".

Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk
Medlem
Skrivet av GLaDER:

Ovan blir lite av en tankevurpa va? Hur ska du "nå" if-satsen?

"gör grejer" inkluderar ju "std::cin >> dN;" så man kommer ju till if-satsen med det senaste dN-värdet innan while-villkoret evalueras igen?

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || MSI Ventus 3x 5080 || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

Hur kommer det sig att du inte inkluderar 0 i din medelvärdesberäkning? Det påverkar ju medelvärdet i allra högsta grad...

Visa signatur

WS: R7 2700x | RTX 2070S | Corsair AX860W | Lian Li PC-O11 Dynamic
Unraid: R7-2700X | GTX1050 | 3U chassi med 20 diskplatser
Servrar: 3x NUC 10 i5 ESX-kluster

Permalänk
Medlem
Skrivet av whisky:

Hur kommer det sig att du inte inkluderar 0 i din medelvärdesberäkning? Det påverkar ju medelvärdet i allra högsta grad...

Uppgiften säger troligtvis att 0 ska användas för att signalera att användaren inte vill mata in fler tal, så 0 räknas inte. Nu gör inte den uppdaterade koden detta, men det är nog tanken i alla fall.

Permalänk
Medlem
Skrivet av FlowingPrana:

Tack för hjälpen, det hjälpte!
Men, när ett problem löses uppstår ett annat. Jag beräknar medelsumman och summan av talen, men efter att jag fått det så ska man välja om man vill avsluta genom att trycka 0, och om man inte gör det så ska det börja om igen. Problemet är dock att när jag startar om igen och skriver in nya tal som ska beräknas, så läggs de talen till på den gamla summan och medelvärdet när jag vill att det blir helt nytt...

#include<iostream> double summa = 0, medel, dN = 1, dN2, dEnd=0, dSum=0; int i; double fmedel(double dSum, int iI); void utskrift1(double dEnd); void utskrift2(double dSum); void inlasning(void); void main() { inlasning(); utskrift1(dEnd); } void utskrift1(double dEnd) { std::cout << "==============" << std::endl; std::cout << "program slut!" << std::endl; std::cout << "==============" << std::endl; } void utskrift2(double dSum) { std::cout << "Summan blir " << summa << std::endl; std::cout << "Medelvardet blir " << medel << std::endl; } void inlasning () { while (dN != 0) { std::cout << "Ange hur manga tal, ange 0 for avslut: "; std::cin >> dN; for (i = 0; i < dN; i++) { std::cout << "Ange tal " << i + 1 << ": "; std::cin >> dN2; summa += dN2; medel = fmedel(summa, dN); } if (dN != 0) { utskrift2(dSum); } } } double fmedel(double dSum, int iI) { return dSum / iI; }

Om du sätter variabeln summa = 0 på en rad ovanför raden:

std::cout << "Ange hur manga tal, ange 0 for avslut: ";

Funkar det som du vill då?

Visa signatur

Ryzen 7 7800X3D | ASUS TUF Gaming B650-Plus WIFI | Kingston 32GB (2x16GB) DDR5 6GT/s CL30 FURY Beast | Kingston Fury Renegade M.2 NVMe SSD Gen 4 2TB | MSI RTX 4060 8GB | Fractal Design Define S | MSI MPG A850G 850W | Thermalright Phantom Spirit 120 SE | Windows 11 Pro | AOC 27" AGON AG276QZD2 OLED QHD 240 Hz

Permalänk

ja uppgiften säger att jag ska avsluta med 0. perost vad är det koden inte gör menar du?

Permalänk

joppis ja det gör det vad ni är snabba med att svara här! verkligen hjälpsamma! tack så mycket!!!

Permalänk
Medlem

Tips för dig som som nybörjare är att ta c++ (eller programmeringsspråk överhuvudtaget) ur ekvationen och skriva ner vad koden ska göra, både i ord och seudokod. Då kan du fokusera på att få logiken rätt utan att behöva tänka på syntax och liknande. kom själv ihåg att det var svårt när jag började programmera.

Denna koden har problem rent logikmässigt som andra redan påpekat.

{ while (dN != 0) { std::cout << "Ange hur manga tal, ange 0 for avslut: "; std::cin >> dN; for (i = 0; i < dN; i++) { std::cout << "Ange tal " << i + 1 << ": "; std::cin >> dN2; summa += dN2; medel = fmedel(summa, dN); } if (dN != 0) { utskrift2(dSum); } } }

Här har du dels kod som aldrig kommer att exekveras (Du kollar om (dN != 0) både i while och if) och potentiellt onödigt kod.
Börja med att göra seudokod så blir det enklare att se dessa typer av fel.

Här är suedokod för ett program som summerar tal tills "0" skrivs in. Då skrivs medelvärdet ut.

Program() { antal = 0; summa = 0; Mata in siffror tills 0 matas in { summera talen som matas in. summera ANTAL tal som matas in } skriv ut medelvärdet (dividera summan med antalet) }

Om du t.ex. vill summera summan efter varje inmatning så flyttar vi upp utskriften till loopen

Program() { antal = 0; summa = 0; Mata in siffror tills 0 matas in { summera talen som matas in. summera ANTAL tal som matas in skriv ut medelvärdet (dividera summan med antalet) } }

Vill du att programmet återställs vid 0 för att sen fortsätta behöver du ändra villkoren i din while-loop

t.ex. kan vi ha att vi kör programmet till vi får in ett negativt tal (Bara för att ha ett enkelt stopvilkor) programmet återställer då värdena vid 0 istället för att avsluta helt.

Program() { antal = 0; summa = 0; Mata in siffror tills ett negativt tal matas in { om tal = 0{ nollställ antal nollställ summa } annars{ summera talen som matas in. summera ANTAL tal som matas in skriv ut medelvärdet (dividera summan med antalet) } } }

Har läst igenom dina kommentarer och är lite osäker på vad du vill att koden faktiskt ska göra. Ska den köras flera gånger eller bara en? ska man summera efter varje eller först när man trycker på 0 etc. Ta lite tid och tänk ut exakt vad du vill att programmet ska göra, det blir mycket enklare sen och risken att köra fast är mindre. Du kan också testa på "Rubber duck debugging"
https://en.wikipedia.org/wiki/Rubber_duck_debugging

Disclaimer: det var ett tag sedan jag programmerade i C++ så är inte helt hundra på alla syntaxer längre så kan inte hjälpa helt med sådana frågor men det är ju det man har google till

Permalänk
Medlem
Skrivet av FlowingPrana:

ja uppgiften säger att jag ska avsluta med 0. perost vad är det koden inte gör menar du?

Du har ändrat så att användaren måste ange hur många tal den vill mata in istället för att avsluta med 0.