Behöver lite hjälp i C++

Drysen

Sporthoj® Gold™ account holder
Gick med
4 Dec 2006
Ort
Internationella Rymdstationen, ISS
Hoj
FoxP2
Går en kurs där jag försöker lära mig C++ och har nu kört fast. Läser just nu om funktioner och en utav övningarna som ingår i kursen förstår jag inte alls.

Programmet skall läsa in ett tal och sedan räkna ut siffersumman av talet. Dvs skriver man talet "123" så blir siffersumman 6 (1+2+3).

Men jag förstår inte hur funktionen fungerar alls.

Kod:

int ss(int a)
{
int s=0;

while (a>0)
{
s += a%10;
a /= 10;
}
return s;
}

int main()
{
int x, sifsum;

cout << "Ange ett tal, sa beräknar jag siffersumman\t";
cin >> x;

sifsum = ss(x);
cout << "\nSiffersumman = " << sifsum << endl;

return 0;
}

Vad händer här egentligen:
s += a%10;
a /= 10;

Jag hänger inte alls med på just den delen.
 
Last edited:
Är det % (modulus) operatorn som ställer till det? Det är i princip division som ger vad du får för rest, exempel.

123 % 10 = 3 då 123 är jämnt delbart upp till 120 och lämnar 3 som rest.
Sen tar du 123 / 10 = 12(eftersom det är en integer).
12 % 10 = 2, samma resonemang som ovan
12 / 10 = 1
1 % 10 = 1
1 / 10 = 0
3 + 2 + 1 = 6


Kanske inte världens bästa förklaring, jag är lite dålig på att förklara sånt här :tungan Modulo kan vara lite meckigt men det är fruktansvärt användbart i många fall, artikeln på wiki är helt ok.
http://en.wikipedia.org/wiki/Modulo_operation
 
Är det % (modulus) operatorn som ställer till det? Det är i princip division som ger vad du får för rest, exempel.

123 % 10 = 3 då 123 är jämnt delbart upp till 120 och lämnar 3 som rest.
Sen tar du 123 / 10 = 12(eftersom det är en integer).
12 % 10 = 2, samma resonemang som ovan
12 / 10 = 1
1 % 10 = 1
1 / 10 = 0
3 + 2 + 1 = 6


Kanske inte världens bästa förklaring, jag är lite dålig på att förklara sånt här :tungan Modulo kan vara lite meckigt men det är fruktansvärt användbart i många fall, artikeln på wiki är helt ok.
http://en.wikipedia.org/wiki/Modulo_operation

Blev lite klokare måste jag säga i alla fall. Tack! Återkommer säkerligen imorgon med följdfrågor då hjärnan just nu är helt ofokuserad.
 
Last edited:
Har kört totalt fast igen. Nu dock med min inlämningsuppgift. Försöker skriva en funktion som skall returnera ett tal till main. Funktionen skall beräkna addition (till att börja med i alla fall, ska skriva mera på funktionen sen så den multiplicerar och kvadratsummerar också beroende på tidigare val av användaren) genom att användaren väljer det. Och skall räkna på följande vis: Om användaren väljer talen 3 och 5 skall svaret bli 12. Funktionen skall alltså räkna alla tal mellan det lägsta samt det största, mao, 3+4+5=12.

Jag kommer dock inte på hur jag skall formulera loopen.

Just nu ser den bara ut så här. Testat lite små grejer men kommer inte riktigt nånstans.

int berakna(int u, int z)
{
int sv=0;

while (u<z)
{

}
return sv;
}

Tänker jag rätt om jag tänker att (u<z)?
Så när funktionen får parametrar så blir u=3 och z=5.
Antar att jag måste "plussa" på räknaren på någotvis också?

Kanske lite luddigt skrivet men suttit ett tag med det här nu och vet varken ut eller in. :död
 
Jag kommer dock inte på hur jag skall formulera loopen.

Så här kan du göra:

int berakna(int u, int z)
{
int sv=0;

while (u <= z)
{
sv += u;
u++;
}
return sv;
}

Eller samma sak fast med en for-loop:

int berakna(int u, int z)
{
int sv=0;

for (; u <= z; u++)
{
sv += u;
}
return sv;
}
 
Last edited:
Så här kan du göra:

int berakna(int u, int z)
{
int sv=0;

while (u <= z)
{
sv += u;
u++;
}
return sv;
}

Eller samma sak fast med en for-loop:

int berakna(int u, int z)
{
int sv=0;

for (; u <= z; u++)
{
sv += u;
}
return sv;
}

Det där var mycket enklare än vad jag trodde... måste sluta stirra mig blind. Tack för hjälpen i alla fall!
 
Är detta ok att return i if-satserna och sedan return 0 på slutet? Har jag inte return 0 på slutet för jag följande meddelande: Control reaches the end of a non-void function

int berakna (int u, int z, char op)
{

if (op == 'a')
{
int sv = 0;

while (u <= z)
{
sv += u; //Beräkning av addition.
u++;
}

return sv;
}

if (op == 'k')
{
int sv = 0;

while ( u <= z)
{
sv += u*u; //Beräkning kvadratsummering.
u++;
}

return sv;
}

if (op == 'm')
{
int sv = 1;

while ( u <= z)
{
sv *= u; //Beräkning multiplikation.
u++;
}

return sv;
}

return 0;
}
 
Är detta ok att return i if-satserna och sedan return 0 på slutet? Har jag inte return 0 på slutet för jag följande meddelande: Control reaches the end of a non-void function

Är ingen expert men jag tycker det är ok iaf. Det funkar ju.
 
Är detta ok att return i if-satserna och sedan return 0 på slutet? Har jag inte return 0 på slutet för jag följande meddelande: Control reaches the end of a non-void function

Eftersom du deklarerat att metoden skall returnera en int måste den givetvis göra så..
Koden som den ser ut innehåller tre fristående "if-satser"
if (op == 'a') {kod & return}
if (op == 'k') {kod & return}
if (op == 'm') {kod & return}

Vad kompilatorn beträffar kan det ju hända att inget av villkoren besannas(om op är något annat än 'a', 'k' eller 'm'. Därför måste det ju finnas minst en return-sats som ligger utanför if-satserna, alltså måste du ha return 0 sist i metoden för att säkra att metoden ALLTID returnerar en giltig int.
 
Last edited:
Eftersom du deklarerat att metoden skall returnera en int måste den givetvis göra så..
Koden som den ser ut innehåller tre fristående "if-satser"
if (op == 'a') {kod & return}
if (op == 'k') {kod & return}
if (op == 'm') {kod & return}

Vad kompilatorn beträffar kan det ju hända att inget av villkoren besannas(om op är något annat än 'a', 'k' eller 'm'. Därför måste det ju finnas minst en return-sats som ligger utanför if-satserna, alltså måste du ha return 0 sist i metoden för att säkra att metoden ALLTID returnerar en giltig int.

Detta gäller även om jag i en tidigare funktion gjort så att användaren anger ifall han vill ha 'a', 'k' eller 'm' och kan endast ange 'a', 'k' eller 'm' för att kunna gå vidare till nästa funktion?
 
Last edited:
Detta gäller även om jag i en tidigare funktion gjort så att användaren anger ifall han vill ha 'a', 'k' eller 'm' och kan endast ange 'a', 'k' eller 'm' för att kunna gå vidare till nästa funktion?

Ja, vad jag vet kan inte kompilatorn känna till den yttre funktionen som endast skickar a, k eller m utan den kollar bara så att varje funktion och alla dess grenar returnerar ett värde.
 
Ja, vad jag vet kan inte kompilatorn känna till den yttre funktionen som endast skickar a, k eller m utan den kollar bara så att varje funktion och alla dess grenar returnerar ett värde.

Ok, tack så mycket för hjälpen alla! Kommer säkerligen återkomma i senare skeden med mera frågor för man får svar på SH snabbare än av läraren :banana
 
Detta gäller även om jag i en tidigare funktion gjort så att användaren anger ifall han vill ha 'a', 'k' eller 'm' och kan endast ange 'a', 'k' eller 'm' för att kunna gå vidare till nästa funktion?

En metod måste göra det som den är deklarerad att göra, i det här fallet säger den att den skall returnera en int oavsett vilka parametrar som skickas in. Se deklarationen som ett "löfte". Står det deklarerat att den skall returnera ett värde av en viss datatyp så måste den göra så även om den inte får in någon av de önskade parametrarna.
Som utvecklare har man ofta bara funktionsdeklarationerna att utgå ifrån och då måste man kunna lita på dem. Att få ut fel int, typ en 8:a istället för den förväntade 12:an kan ge logiska följdfel. Skulle man däremot få ut ett null/nil eller inget alls istället för en int så skulle programmet troligen krascha = sämre.
 
Last edited:
En metod måste göra det som den är deklarerad att göra, i det här fallet säger den att den skall returnera en int oavsett vilka parametrar som skickas in. Se deklarationen som ett "löfte". Står det deklarerat att den skall returnera ett värde av en viss datatyp så måste den göra så även om den inte får in någon av de önskade parametrarna.
Som utvecklare har man ofta bara funktionsdeklarationerna att utgå ifrån och då måste man kunna lita på dem. Att få ut fel int, typ en 8:a istället för den förväntade 12:an kan ge logiska följdfel. Skulle man däremot få ut ett null/nil eller inget alls istället för en int så skulle programmet troligen krascha = sämre.

Ah, okej. Tack för en bra förklaring!
 
Varför inte en switch sats

{
switch(op)
{
case "a":
{
while (u <= z)
{
sv += u; //Beräkning av addition.
u++;
}
}
break;

case "k":
{

}
break;

case "m":
{

}
break

default:
{

}
}
return sv;
}
 
Nyheter
Nicky Hayden-specialversion – såld för 2,5 miljoner

En exklusiv motorcykel med ...

BMW Motorrad Vision CE

På IAA Mobility 2025-mässan...

Höstrusch för våra fotografer

Inte bara sommarmånaderna, ...

Jonathan Rea avslutar sin racingkarriär

Efter nästan två decennier ...

Yamaha debuterar med V4 i MotoGP

Yamaha har meddelat att för...

Hojmys i Ugglans Park

Ända sedan början av 90-tal...

MC-mässan 2026

MC-Mässan är tillbaka 23–25...

Bike kör Stark Varg EX!

Under hösten kommer Bike gö...

Customhoj Bike Show 2026

Den 23 till 25 januari körs...

Racing på Kjula Dragway till helgen

Den kommande helgen (23-24 ...

Back
Top