Siffersumman av ett tal i Pascal
Jag har skrivit detta program med hjälp av "rekursiv funktion" i Pasal. Programmet ska räkna ut siffersumman av ett tal som ska matas in i programmet. Men efter compiling får jag detta svar 'segmentation fault'. Kan någon förklara vad det är som jag gjort fel och hur jag kan fixa det i så fall?
program digit_sum;
var
r,y,f,n:longint;
function sum(x:longint):longint;
begin
if x<10 then
sum:=x
else
r:=x mod 10;
y:=(x-r) div 10;
sum:=r+sum(y);
end;
begin
write('Enter a number: ');
read(n);
f:=sum(n);
write('The sum of digits is ',f);
end.
Du fastnar i en oändlig loop till programmet kraschar.
postitlapp skrev:Du fastnar i en oändlig loop till programmet kraschar.
Hur? Vad behöver jag ändra på?
Marx skrev:postitlapp skrev:Du fastnar i en oändlig loop till programmet kraschar.
Hur? Vad behöver jag ändra på?
När x < 10 så utförs inte satsen efter "else", men de två efter det utförs. "else" omfattar bara en sats. Du får använda begin-end runt det som står efter "else".
Eftersom indenteringen är sabbad här (inte ditt fel, pluggakutens) så ser man inte hur det ser ut för dig, men om du använder nån editor som hjälper till med indenteringen, så ska första satsen efter "else" vara inskjuten, och resten inte, så då ser man tydligt att det är fel (om man har gjort såna fel tidigare).
Det finns ytterligare ett problem. I funktionen sum så sätts värdet på den globala variabeln r varje gång vilket gör att programmet fungerar endast för ensiffriga eller tvåsiffriga tal. Gör variablerna r och y till lokala variabler i funktionen sum för att lösa detta.
Råd 1: använd globala variabler endast om du är tvungen.
Råd 2: tillåt inte funktioner att ändra värdet på globala variabler.
Laguna skrev:Marx skrev:postitlapp skrev:Du fastnar i en oändlig loop till programmet kraschar.
Hur? Vad behöver jag ändra på?
När x < 10 så utförs inte satsen efter "else", men de två efter det utförs. "else" omfattar bara en sats. Du får använda begin-end runt det som står efter "else".
Eftersom indenteringen är sabbad här (inte ditt fel, pluggakutens) så ser man inte hur det ser ut för dig, men om du använder nån editor som hjälper till med indenteringen, så ska första satsen efter "else" vara inskjuten, och resten inte, så då ser man tydligt att det är fel (om man har gjort såna fel tidigare).
Tack! Nu är problemet löst.