Archived page.

This is an archived copy of my old (academic) homepage formerly hosted at Chalmers. It is no longer being updated.

Go to the new page.



Uppgift

Konstruera ett C-program som ber användaren att skriva in längder för två sidor, a och b. Beräkna sedan c enligt Pythagoras sats:

  • c^2 = a^2 + b^2

Anm: Använd flyttal för a, b, och c!

I standardbiblioteket <math.h> finns funktionen sqrt() som beräknar kvadratroten av ett tal. Skriv ditt program i valfri texteditor och kompilera och kör programmet. Ditt program behöver bara klara av en enda beräkning.


Meta-Information

  • I påföljande uppgifter får man inte använda Dev-C++, därför kan det vara bra att genomföra denna uppgift i Terminalen!
  • Testa kompilera med och utan debug-information.

Lösning - Kod

-- {File: program1.c - Language: C99} --  1 /* Program, version 1 - Uppgift Inledande C-programmering  2  *  3  * Frågar användare efter två tal, beräknar L^2-normen av dessa, och skriver  4  * ut resultatet.  5  */  6  7 #include <math.h>                   // sqrt() & co.  8 #include <stdio.h>                  // printf(), scanf(), ...  9 10 11 /* main(): "huvudfunktion" - programmet startar här! 12  */ 13 int main() 14 { 15     double a, b, c;                        // deklarera variabler a, b och c 16 17     printf( "Ange kateterna: " );      // skriv ut text 18     scanf( "%lf %lf", &a, &b );        // läs in två double-flyttal (%lf) 19 20     c = sqrt( a*a + b*b ); 21     printf( "Hypotenusa: %g\n", c );   // skriv ut resultat med nyrad (\n) 22 23     return 0; 24 }


Lösning - Kompilering

Kompilera med gcc i terminal:

-- {Language: shell} -- gcc -o program program1.c

⟹ Kompilerar källkoden i 'program1.c' till 'program'. I Windows vill man nog kompilera ett 'program.exe'.

Vanliga Fel:

  • "program1.c:(.text+0x79): undefined reference to `sqrt'"

    I Linux krävs att man länkar mot '-lm'. Kommandot blir då

    -- {Language: shell} -- gcc -o program program1.c -lm


GDB - Debugga

Vill man använda GDB för att debugga programmet, får man kompilera det med extra debug-information, genom att t.ex. lägga till flaggan -g3:

-- {Language: shell} -- gcc -g3 -o program program1.c -lm

Man startar då programmet med gdb:

-- {Language: shell} -- gdb ./program gdb -tui ./program

Med flaggan -tui kan man få något slags minimalistiskt GUI i terminalen.

I GDB kan man då t.ex. göra följande:

  • break scanf - sätter breakpoint när man anropar scanf
  • run - starta programmet
  • bt - skriv ut en backtace. Detta ger information om var i programmet man befinner sig.
  • step - stega till nästa rad i källkoden
  • print c - skriver ut värdet av variabel 'c' (om det finns en sådan!)
  • set variable c = 100 - ändrar värdet av variabel 'c' till 100.
  • continue - fortsätt vanlig exekvering från nuvarande position
  • break 17 - sätter breakpoint på rad 17
  • watch a - bryt då värdet av variabel 'a' ändras. OBS: variabel 'a' måste finnas i nuvarande scope.