K&R The C Programming Language 1.7 hjälp

Permalänk
Medlem

K&R The C Programming Language 1.7 hjälp

Hej jag läser just nu UNIX bibeln, men har lite problem då jag inte har en blekaste anning om vad programmet i ett av exemplerna gör. Det är exemplet på sidan 24, "1.7 Functions" för att vara precis. Här är deras förklaring:

Citat:

So far we have only used functions like printf, getchar and putchar that have been provided for us; now it's time to write a few of our own. Since C has no exponentiation operator like ** of Fortran, let us illustrate the mechanics of function definition by writing a function power(m, n) to raise an integer m to a positive integer power n. That is, the value of power(2,5) is positive powers of small integers, but it's good enough for illustration.

Vad menar dom med "power"? (Jag vet att det betyder kraft, men jag fattar inte vad kraft betyder i det här sammanhanget)

Här är exempel koden so jag även har frågor om:

#include <stdio.h> int power(int m, int n) main() { int i; for (i = 0; i < 10; ++i) printf("%d %d %d\n", i, power(2,i),power(-3,i)); return 0; } int power(int base, int n) { int i, p; p = 1; for (i = 1; i <= n, ++i) p = p * base; return p; }

Okey, varför deklarerar man först funktionen power och sedan skriver man "int power..." igen? Borde det inte räcka med "power..." bara för den deklarerades som en integer innan ju? Sedan förstår jag inte heller de flesta variablarna här, "m", "n", "p", "base" vad står de för? Sedan i functionen power, vad precis är det den returnar med "return p", jag ser inte var nånstans "p" ens används?

Visa signatur

Nybörjar guide: Xonotic 1on1 | FX-4100 Black Edition X4 @ 3,6GHz, MSI GTX650 1GB OC, Crossair VENGEANCE 8GB @ 1600 MHz, och lite annat skrot ;)

Permalänk
Hedersmedlem

Fråga 1
Exponentiation — "2 to the power of 5" är ett sätt att säga "2 upphöjt till 5", dvs 2⁵ i vanligare matematisk notation, dvs 32.

Fråga 2
Se begreppet function prototype för att se varför de deklarerar funktionens namn och argument, men utan "själva funktionen", högst upp i filen. Notera också att Wikipedias enda referens till den artikeln är just K&R, så du kan nog hitta mer information i din bok .

Fråga 3
p deklareras som `int` högst upp i `power()`. p sätts till 1 som standard innan loopen, och därefter multipliceras p med base, och detta görs n gånger. Om base är 2 och n är 5 så genererar loopen p enligt nedanstående värden steg för steg:

  1. 1 ⋅ 2

  2. (1 ⋅ 2) ⋅ 2

  3. (1 ⋅ 2 ⋅ 2) ⋅ 2

  4. (1 ⋅ 2 ⋅ 2 ⋅ 2) ⋅ 2

  5. (1 ⋅ 2 ⋅ 2 ⋅ 2 ⋅ 2) ⋅ 2

och som vi ser så är sista raden (värdet på p när loopen slutar och p returneras) samma sak som just 2 ⋅ 2 ⋅ 2 ⋅ 2 ⋅ 2, dvs 2⁵ = 32. Att p definieras som 1 till en början gör att argumentet "upphöjt till 0" fungerar, t ex `power(2, 0)`, då alla tal upphöjt till 0 är 1.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av klr:

Hej jag läser just nu UNIX bibeln, men har lite problem då jag inte har en blekaste anning om vad programmet i ett av exemplerna gör. Det är exemplet på sidan 24, "1.7 Functions" för att vara precis. Här är deras förklaring:

Vad menar dom med "power"? (Jag vet att det betyder kraft, men jag fattar inte vad kraft betyder i det här sammanhanget)

Här är exempel koden so jag även har frågor om:

#include <stdio.h> int power(int m, int n) main() { int i; for (i = 0; i < 10; ++i) printf("%d %d %d\n", i, power(2,i),power(-3,i)); return 0; } int power(int base, int n) { int i, p; p = 1; for (i = 1; i <= n, ++i) p = p * base; return p; }

Okey, varför deklarerar man först funktionen power och sedan skriver man "int power..." igen? Borde det inte räcka med "power..." bara för den deklarerades som en integer innan ju? Sedan förstår jag inte heller de flesta variablarna här, "m", "n", "p", "base" vad står de för? Sedan i functionen power, vad precis är det den returnar med "return p", jag ser inte var nånstans "p" ens används?

power = namnet på funktionen (hade kunnat vara vilket namn som helst)
power hänvisar till, som ovanstående skribent skriver "upphöjt till". t.ex. 2^4 m.m.

varför int deklarerars flera gånger vet jag inte.

Koden du skriver gör följande:

Loop i main som loopar 10 gånger. Varje gång kallas funktionen power och värdena 2 respektive "i" skickas in. funktionen power returnerar sedan värdet av 2 upphöjt i "i". (samt -3 upphöjt i "i")

Visa signatur

R5 2600 | RTX 2060 Super | SSD | 16 GB RAM | Gigabyte DS3H| 750 WATT

Permalänk
Medlem

Aha, tack. Tänkte väl att de inte mena "kraft" med "power".

Visa signatur

Nybörjar guide: Xonotic 1on1 | FX-4100 Black Edition X4 @ 3,6GHz, MSI GTX650 1GB OC, Crossair VENGEANCE 8GB @ 1600 MHz, och lite annat skrot ;)

Permalänk
Hedersmedlem
Skrivet av klr:

Aha, tack. Tänkte väl att de inte mena "kraft" med "power".

Vän av ordning som inte kan vara tyst noterar att power faktiskt översätts till effekt i fysiksammanhang . Kraft är force. Jag medger dock att "power" i mindre exakta sammanhang kan översättas till "kraft", men var bara tvungen att anmärka. Carry on.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Som andra sa "x to the power of y" är x upphöjt till y.

Angående att int power() skulle vart deklarerad flera gånger. Det är den inte.

Det första är en forward declaration, det andra är implementationen. Power deklareras som metod för att main() ska kunna anropa den. Tänk att kompilatorn börjar på rad 0 och läser neråt. Då behövs en s.k forward declaration. Man hade kunnat byta plats på metoderna och skippa första deklarationen.

Rätta mig om jag har fel men man kan lösa detta på flera sätt.. En header-fil hade gjort så man slipper göra en forward declaration kanske

Visa signatur

AMD 7700X (EK 240mm AIO) | ROG Strix B650E-F Gaming | Gigabyte RX 6800 XT 16GB OC | Kingston Fury 32GB DDR5 5600mhz | Kingston Fury Renegade M2 2TB | Alienware AW2723DF 280hz