Webbservern.se

Användararea  [inloggning krävs]

Ansökan

Om servern

 Användarnas www-sidor

 Loggbok

 Nyhetsbrev

 Om webbservern.se

 Senast ändrade filer

 Webbserverinfo (CV)

 Villkor

Webbapplikationer

 MD5/Jämför filer

 Väder

 Webbkamera

Handboken

 Backup
 Bandbredd
 CVS
 Databas (MySQL)
 E-post
 E-postlistor
 Lösenord
 Programmering
 Programvara
 Quota
 SFTP och SCP
 SSH
 VNC
 WWW


sök på webbservern.se

Handboken / Programmering / C++

Allmänt om C/C++ samt dess historia

C/C++ är dominerande inom många områden. De flesta operativsystem och välkända programvaror är skrivna i C/C++. De utgör förstahandsvalet för många programmeringsprojekt mycket tack vare att de är välkända men även på grund av dess snabbhet. I jämförelser konstateras det att C/C++ generellt sett är avsevärt mycket snabbare än Java för att ta ett exempel. Det har naturligtvis med att göra att C/C++ inte körs via en tolk som fallet är med Java.

Hittills har jag skrivit "C/C++". Det kan ju verka lite förbryllande med denna beteckning så låt oss redan nu reda ut vad som döljer sig bakom detta.

C utvecklades vid Bell Labs år 1969-1973. Mellan 1979 och 1985 vidareutvecklade Bjarne Stroustrup C och skapade C++. C++ är ett tillägg till C men är inte helt bakåtkompatibelt, all C-kod är alltså inte giltig C++-kod (även om välskriven C-kod tenderar att vara giltig C++-kod). C++ stöder alla programmeringstekniker som finns i C och alla program skrivna i C går att skriva på på ungefär samma sätt i C++.

Skillnaden mellan C och C++ är tydligast inom dessa områden:

  • in-/utmatning
  • minnesallokering
  • filhantering

C++ har även funktionalitet som inte återfinns i C, till exempel möjligheter till objektorienterad programmering.

Hädanefter kommer jag enbart att skriva C++ även om koden skulle vara giltig C-kod.

Denna guides syfte

Denna guide är förstås långt ifrån heltäckande, om det var syftet skulle jag inte kunna göra så mycket annat den närmsta evigheten. Avsikten är snarare att ge ett smakprov och så pass mycket information att det går att komma igång lite grand och vid behov leta mer information på egen hand.

När det är möjligt används samma exempel som i Java-kapitlet så att det är lätt att jämföra.

C++ på webbservern - utvecklingsmiljö och kompilering

Emacs är den rekommenderade utvecklingsmiljön för C++-kodande på webbservern. Om man vill använda en grafisk utvecklingsmiljö så går det även att använda Eclipse som finns installerat, men det är nog klokare att köra detta lokalt istället.

Som kompilator används GCC. Vilken version som körs kan du kontrollera själv genom kommandot gcc --version.

Vi tar ett exempel på hur det kan gå till vid C++-programmerande i Emacs. Om du inte förstår kortkommandona rekommenderas Emacs-kapitlet.

  • Emacs startas, eventuellt anges filnamnet direkt vid starten: emacs myProgram.cpp
  • Koden knappras in.
  • Dags att kompilera, det går bra inifrån Emacs: M-x compile
  • Som kompileringskommando anger du: g++ myProgram.cpp -o myProgram
  • Om kompileringen gick bra kan du provköra programmet, även det inifrån Emacs: M+!
  • Som "shell command" anger du: ./myProgram

Nu är vi redo att utforska grunderna i C++.

Grunderna

Det finns ett antal konstruktioner som man förväntar sig av ett modernt högnivåprogrammeringsspråk; till exempel variabler, flödesstyrning, upprepning med loopar, funktioner, felhantering och kanske även möjligheter till objektorienterad programmering. Lite av detta kommer att gås igenom nedan.

Ett komplett program

Liksom i Java-kapitlet börjar vi med ett komplett, men simpelt, program. Det kan vara bra att känna till strukturen för ett komplett C++-program om du vill provköra någon kodsnutt nedan. Byt då bara ut innehållet i main-metoden.

#include <iostream.h>
int main () {
  cout << "Hello World!";
  return 0;
}

På första raden finns en befallning till preprocessorn som kollar på koden innan kompilatorn kompilerar. Vi säger åt preprocessorn att inkludera en headerfil, iostream.h, som finns i standardbiblioteket C++. Denna headerfil ger oss tillgång till funktionen cout som vi använder några rader ner. Innan vi anropar cout ser vi på den andra raden att funktionen main börjar. Alla C++-program startar i början av main och slutar i slutet av main.

Objektet cout används för att mata ut en sträng, Hello World!, till standardutenheten vilket ofta är skärmen. Satsen avslutas med semikolon.

Avslutningsvis noterar vi att måsvingarna, { och }, visar var funktionen main börjar och slutar. Måsvingarna avgränsar ett kodblock.

Variabler och datatyper

C++ är liksom Java statiskt typat och du anger vilken datatyp variabeln ska ha. Vi har heltal (short, int, longfloat, double, long), tecken (char), strängar (string) och den boolska datatypen (bool).

Vi tar några exempel på hur variabler kan deklareras och initieras.

using namespace std;

short result1, result2;
int hair = 120000;
long gatesMoney, distanceToMoonInMillimetres = 384400000000;
double myror = 3.2E7; float average, height;
char favouriteLetter = 'J', tab = '\t';
string Land("Sverige");
bool isMore = false, isEmpty = true;

Lite aritmetik

Det är ingen slump att detta stycke påminner om motsvarande stycke i kapitlet om Java. Likheterna mellan språken rent syntaktiskt är många.

Dessa aritmetiska operatorer finns att tillgå.

OperatorBetydelse
+Addition
-Subtraktion
/Division
*Multiplikation
%Modulus

Det mesta fungerar som du man kan förvänta sig och det går bra att använda parenteser för att specificera evalueringsordningen (precedensen med ett fint ord). Exempel är bra.

double average, quantity = 50, total = 547.6;
average = total / quantity;

Modulusoperatorn kanske du inte stött på tidigare. Den ger dig dig resten vid en heltalsdivision. Exempelvis är "11 modulus 6" lika med 5.

int a = 11 % 6; // a = 5

Det finns ett gäng operatorer till men de kan du läsa om på annat håll. Lägg även märke till deras inbördes prioritetsordning.

Villkorsstyrning

If...else-kontruktionen är klassisk och ser ut enligt följande i ett småfjantigtill exempel

int grade = 3;
if (grade < 3) {
  cout << "Nja, inte riktigt bra.";
} else if (grade == 3) {
  cout << "Okej, det funkar.";
} else {
  cout << "Stabilt! Fortsätt så.";
}

I C++ finns även möjlighet att använda switch-konstruktionen. Det fungerar likadant som i Java men för säkerhets skull visar vi hur det ser ut.

short grade = 3;
switch(grade) {
  case(1): {
    cout << "Nja, inte riktigt bra.";
    break;
  }
  case(2): {
    cout << "Nja, inte riktigt bra.";
    break;
  }
  case(3): {
    cout << "Okej, det funkar.";
    break;
  }
  case(4): {
    cout << "Stabilt! Fortsätt så.";
    break;
  }
  default: {
    if (grade == 5) {
      cout << "Stabilt! Fortsätt så.";
    } else {
      cout << "Märkligt betyg.";
    }
    break;
  }
}

Det går även att hoppa runt i koden med hjälp av etiketter och goto etikett men det är inget som rekommenderas eftersom det ofta ger dålig överblick över koden och svårhittade buggar.

Loopar

En loop gör att du kan köra en sats eller ett block (ett gäng satser) upprepade gånger. Vi ska titta på tre konstruktioner: for, while samt do while. I alla dessa tre varianter kan break och continue användas. Break hoppar ut ur loopen medan continue hoppar till nästa iteration i loopen.

For

For-loopen är kompakt och praktiskt i många fall. Den används till exempel ofta för att itererar över en listas element. I det enkla exemplet nedan loopar vi runt 10 gånger och skriver ut vilken iteration vi befinner oss på för tillfället.

for (int i = 0; i < 10; i++) {
  cout << "Iteration: " << i << endl;
}

While

While-loopen är enkel till sin natur. Den ligger nära vårt vardagliga sätt att tänka: Gör si så länge ett villkor är uppfyllt.

int i = 0;
while (i < 10) {
  cout << "Iteration: " << i << endl;
  i++;
}

Do-While

Do-loopen nedan kontrollerar villkoret första gången efter att den har skrivit ut "Iteration: 0". I detta exempel är det oväsentligt men i andra tillämpningar kan det vara en viktigt skillnad.

int i = 0;
do {
  cout << "Iteration: " << i << endl;
  i++;
} while (i < 10);

Vektorer

Vektorer kanske inte är den mest lyckade översättningen av arrayer men så brukar de kallas på svenska.

En vektor är en rad med element av en viss datatyp. Några exempel på vektordefinitioner:

int ages[4];
String names[10];

Det går även bra att tilldela vektorn värden i samband med definitionen.

int grades[] = {3,5,4,3,3}; //Vi fyller vektorn direkt.

Det går naturligtvis att komma åt enskilda element i vektorn genom att ange dess indexet.

int element3 = grades[2];

Funktioner

Funktioner är centrala i C++ liksom i många andra programmeringsspråk. En exempelfunktion visar upplägget.

double average (int persons, double totalAmount) {
  return (totalAmount / persons);
}

Det finns några saker att tänka på. Funktionerna ska deklareras och funktionens definition ska inte ligga i en annan funktion. Vi tar ett exempel där detta framgår tydligt. Det är ett moraliskt tveksamt program som hjälper tjuvar att räkna ut hur mycket pengar var och en ska få efter ett bankrån om de ska dela lika.

#include <iostream.h>

//Funktionsdeklarationen
double average (int persons, double totalAmount);

//Funktionen average som returnerar ett flyttal (double).
double average (int persons, double totalAmount) {
  return (totalAmount / persons);
}

int main () {

  int noOfPersons;
  double howMuchMoney;

  //Skriver ut resultatet
  cout << "Hur många personer? ";
  cin >> noOfPersons;
  cout << "Hur mycket pengar? [kr] ";
  cin >> howMuchMoney;
  cout << "Var och en får: " << average (noOfPersons, howMuchMoney) << " kr." << endl;
  return 0;
}

Att skicka argument till ditt program

Om du vill skicka värden till ditt program via kommandoraden på detta vis:

./mittProgram argument1 argument2

...så låter du main snappa upp dessa enligt följande:

#include <iostream.h>
int main (int argc, char *argv[]) {
  cout << "Hejhej " << argv[1] << "!" << endl;
  return 0;
}

Du refererar alltså till argumenten med hjälp av vektorn (array på engelska) argv[]. Det första argumentet är argv[1] och programmets namn är således argv[0].

Pekare

Det går inte att fly från pekarna i längden. Det är lika bra att förstå sig på dem.

En pekare är en datatyp som innehåller minnesadressen för en variabel. Med en pekare kan man sålunda manipulera variabeln direkt.

Ett till exempel någon? Varsågod.

int fruitsInMyBag;
int* pFruitsInMyBag = &fruitsInMyBag;

Vi har deklarerat en heltalsvariabel, fruitsInMyBag, som vi inte har tilldelat något värde men den har fått en minnesadress. Denna minnesadress går det att referera till genom att skriva en ampersand (&) innan variabelnamnet, &fruitsInMyBag. Eftersom pekaren pFruitsInMyBag ska peka på variabeln fruitsInMyBag:s minnesadress skriver vi int* pFruitsInMyBag = &fruitsInMyBag;. Du noterar även att i deklarationen av en pekare talar man om vilken datatyp den ska peka på och lägger på en asterisk (*) för att visa att det är en pekare.

Läsa/skriva till fil

För att läsa från en fil skapas en instans av klassen ifstream.

#include <iostream.h>
#include <fstream.h>

int main() {
  fstream myFile ("filnamn.txt");

  if (!myFile) {
    cout << "Problem problem!";
  }

//Nu kan vi läsa in filens innehåll i en buffer rad för rad och skriva ut innehållet på skärmen.

char buffer[256];

  while (!myFile.eof()) {
    myFile.getline (buffer, 100);
    cout << buffer << endl;
  }
  return 0;
}

Ett exempel som visar hur man skriver till en fil är på sin plats.

#include <iostream.h>
#include <fstream.h>

int main() {
  ofstream myFile ("filnamn.txt");

  if (myFile.is_open()) { {
    myFile << "Första raden.\n";
    myFile << "Andra raden.\n";
  }
  return 0;
}

I exemplen ovan hanterar vi textfiler. Det går bra att läsa binärfiler också men det tar vi inte upp här och nu.

Att gå vidare

Många områden inom C++-programmering har berörts flyktigt eller inte alls i detta kapitel. Nedan finns lite mer material att ta del av.

--------------
Den här filen ändrades senast Mittwoch, 07-Jun-2023 15:22:20 CEST. Exportera till pdf
Respons i någon form mailas till webmaster at webbservern.se