Värmdö Gymnasium Datainstitutionen Programmering A 110123 Lektion C1 Grunder Att programmera handlar mycket om att lära sig att analysera det problem eller den funktion man vill att programmet ska ha, och översätta det från talspråk till programkod. Många tar vägen över denna via s.k. pseudokod, ett mellanting mellan vanligt språk och programkod. I dagens första lektion ska du dels bekanta dig med de verktyg du ska använda för att skriva dina program, dels lära dig de första stegen i det programmeringsspråk som kallas C++. Men allra först programspråkens historia. OBS! All teori i detta och följande dokument kompletteras med genomgångar på lektionerna. Så det är viktigt att närvara och göra egna anteckningar. Programspråk (de större) FORTRAN 1954 1:A HÖGNIVÅSPRÅKET COBOL 1959 ekonomi ALGOL 1960 påverkat senare språk SIMULA 1967 möjligt att skriva objektorienterade program PASCAL 1971 undervisningsspråk, TURBOPascal C ca 1973 ”högnivåspråk på låg nivå” Smalltalk 1980 objektorienterande, interpreteras Ada 1983 amerikanska försvaret, ISO-standard C++ 1985 utökning av C, Bjarne Stroustrup (AT&T) JAVA 1995 Sun Microsystem, plattformsoberoende, interpreteras, C++ förebild Börja programmera Nu ska du börja så smått med att programmera. Programmering innebär 1. 2. 3. att du först gör klart för dig vilket problem som ska lösas. Vad ska programmet göra? Vilka data ska matas ut från programmet? Vilka data måste matas in i programmet för att det ska fungera? att du därefter tänker igenom hur programmet ska konstrueras (i stora drag) och gör en stegvis beskrivning, en s.k. algoritm, som datorn kan använda sig av för att ge rätt utdata från de indata du matar in. En sån beskrivning kallas ofta för pseudokod. att du till sist skriver själva koden i programmeringsspråk, samt testkör och dokumenterar programmet. Dokumentationen bör dels innehålla en handledning för användaren, dels en konstruktionsbeskrivning som underlättar för den som ska underhålla programmet. Första programmet Vi kommer i denna kurs att ta hjälp av en färdig miljö där många saker är tillrättalagda. På samma sätt som när vi ska skriva vanlig textdokument så utnyttjar vi t ex Word-programmet. Här använder vi ett freewareprogram som heter Dev-C++ från Bloodshed. Till din hjälp för att komma in i miljön se häftet ”Snabbintro Dev-C++”. Vårt första program: #include <iostream> //inkludera ett paket med saker för utskrift och inläsning // inkludera ett paket med bl a hantering av system("PAUSE") #include <stdlib.h> // för att komma åt de nya standardpaketen utan .h-ändelser using namespace std; int main() { //utskrift på skärmen cout<<"Hej svejs!"<<endl; system(”PAUSE”); //så att fönstret ligger kvar till man tycker på en tangent return 0; } Sida 1 (7) Värmdö Gymnasium Datainstitutionen Programmering A 040108 Vägen till ett körbart program Editorn Kompilatorn Länkaren här skriver vi programtexten, dvs källkoden sparar som en *.cpp fil kollar att syntaxen stämmer med givna regler och en *.obj fil skapas översätter koden till en objektfil, den vanliga texten (källkoden) översätts till maskinkod sätter ihop flera objektfiler till ett körbart en *.exe fil skapas program, dvs en exekverbar fil den exekverbara filen startas och programmet körs Andra programmet Ex. Du vill skriva ett program som ska räkna ut kostnaden för en bokbeställning. Här vill vi mata in antal och pris. En expeditionsavgift på 50 kr ska också läggas till. Slutligen ska kostnaden skrivas ut. 1. Indata i detta fall: antal och pris, som vi förkortar a respektive p. Utdata är kostnaden, som vi förkortar k. Problemställningen framgår av texten ovan. 2. Algoritm (pseudokod): Mata in antal a och priset p Kostnaden k beräknas som a∗p+50 Skriv ut k 3. Nu börjar vi översätta pseudokoden till programkod. Variabeltyper Här kommer en lista på några typer av variabler som man kan deklarera, och vilka sorts tal de kan lagra: Typ Betyder Talområde long double flyttal, reellt tal (decimaltal) double flyttal, reellt tal (decimaltal) float long int flyttal, reellt tal (decimaltal) heltal (positiva och negativa) int heltal (positiva och negativa) Här: -2147483648 till 2147483647 short int signed char heltal (positiva och negativa) Tecken men lagras som heltal -32768 32767 -128 127 ca. 2,2*10-308 – 1,8*10308 15 siffrors noggrannhet Antal bytes 16 8 4 4 2 eller 4 * här: 4 2 1 * Antal bytes beror på implementationen i varje dator. För heltalen finns också varianter som bara hanterar positiva tal, dessa har unsigned framför sig som t.ex. unsigned char och unsigned int. Det är viktigt att du håller koll på att dina tal håller sig innanför variabeltypens gränser, eftersom kompilatorn i allmänhet inte gör det. Skulle dina beräkningar råka överskrida dessa, kan du få oväntade resultat.. (T ex när short int används.) Sida 2 (7) Värmdö Gymnasium Datainstitutionen Programmering A 040108 Andra programmet, koden Pseudokoden i exemplet ovan blir följande programkod (kallas ofta för källkod). //Exempel 2 #include <iostream> //inkludera ett paket med saker för utskrift och inläsning #include <stdlib.h> // inkludera ett paket med bl a hantering av system("PAUSE") using namespace std; // för att komma åt de nya standardpaketen utan .h-ändelser int main() //huvudfunktionen, endast ett per program { int a; //deklaration av en variabel för heltal double p, k; //deklaration av variabler för flyttal cout << ”Mata in antal böcker : ”; //skriv på skärmen cin >> a; //läs in från skärmen cout << ”Mata in bokpriset : ”; cin >> p; k=a*p+50; //gör en beräkning och lagra resultatet i variabeln k cout << ”Kostnaden blir ” << k << ” kronor” << endl; system(”PAUSE”); return 0; //skriv ut } För att en programsnutt ska bli mera lättläst (framför allt för någon som inte skrivit programmet), kan man lägga in s.k. kommentarer i programmet, som inte kompilatorn bryr sig om när man kompilerar koden. För att få kompilatorn att strunta i resten av raden, skriver man // (dubbelt snedstreck). Allt som står efter detta kommer då att hoppas över. Om man istället vill lägga in en lång kommentar som sträcker sig över flera rader, kan man inleda med /* och avsluta med */. Allting mellan dessa två markeringar kommer då att ignoreras av kompilatorn. Prioritet När du skriver matematiska uttryck så har olika operatorer olika prioritet, dvs behandlas av datorn i en viss förutbestämd ordning. (Samma som i matematiken.) Prioritetsnivå 1 (högst prioritet) 2 3 4 5 (lägst) Operator ( ) * / + < > = tilldelning Operatorer på samma nivå har samma prioritet. För operatorer på samma nivå utförs de i ordningen vänster till höger, utom för tilldelningsoperatorn där de utförs från höger till vänster. Parenteser kan på vanligt sätt bryta ordningen. Ex 1 x=2,5 + 12,0 / 2,0 / (2,0 + 1,0) z=y=3+2 x= z= y= Sida 3 (7) Värmdö Gymnasium Datainstitutionen Programmering A 040108 Omvandlingar Om vi blandar olika typer i uttryck sker omvandlingar enligt nedanstående regler. X op Y med op menas här en aritmetisk operator som t ex +-/* dvs X+Y , X-Y , X/Y , X*Y Om X och Y är av samma typ blir resultatet av den typen. Om X och Y är av olika typ omvandlas den lägre typen (den som står under i tabellen Variabeltyper) till den högre. Därefter sker beräkningen och resultatet blir av den högre typen. T ex 4,5 + 4 (decimaltal + heltal) ger efter hopslagning ett decimaltal eftersom double står ovanför int X = Y dvs vid tilldelning Om X och Y är av olika typ omvandlas Y till X’s typ. (Konstigheter kan uppstå om man överskrider talområdet vid omvandlingen.) T ex : int x; double y; y=44,5; x=y; // Här får x värdet 44 eftersom ett decimaltal omvandlas till heltal genom att decimalerna suddas bort Ex.2 double x; x=8,0/3 + 8/3 Æ x= /* Ledtråd: 8,0/3 Æ 8,0/3,0 Æ 2,666 8/3 Æ 2 (typen heltal, resultatet trunkerat, dvs decimalsiffrorna stryks) Ex3 double d=0, b=0; d=d+1/100; detta ger d= b=b+1,0/100; detta ger b= Svar till ovanstående exempel: Ex1 : x=4,5 z=5, y=5 Ex2 : x=4,666 Ex3 : d=0 b=0,01 Extra för den snabbe, hit kan du återkomma senare i kursen om du inte hinner med detta just nu Standardfunktioner i biblioteket math För att komma åt dessa inkluderas cmath (#include <math.h>) . Alla funktioner returnerar ett flyttal ( t ex double). Både x och y ska vara av typen flyttal. ( t ex z=pow(x,y); ) pow(x,y) xy sqrt(x) roten ur x sin(x), cos(x), tan(x) exp(x) x anges i radianer ex (exponentialfunktionen) Sida 4 (7) */ Värmdö Gymnasium Datainstitutionen Programmering A 040108 Övningar Övning C1.1 Du ska få börja med att skriva ett mycket enkelt program, som ska skriva ut ditt namn på skärmen. Skriv in programmet och gör nödvändiga ändringar. //Ett enkelt program som skriver ut ditt namn #include <iostream> #include <stdlib.h> using namespace std; int main() { cout << ”Kalle Kula”; system(”PAUSE”); return 0; } När du skrivit in programmet är det dags att köra det. Kör aldrig ett program som du skapat eller ändrat utan att först sparat dina ändringar (ibland råkar man tyvärr ut för att datorn kraschar, och då kan det vara lite tråkigt om man inte sparat på länge…). Spara programmet som namn.cpp. Programmet kompileras, (länkas) och körs om det inte finns några syntaxfel (språkfel). Övning C1.2 Skriv in följande enkla program och spara det med namnet prod1.cpp. Kör sedan programmet och kontrollera att du får en korrekt utskrift. Pröva sedan med några andra värden för tal1 och tal2. Får du alltid en korrekt produkt? //Ett enkelt program med heltalsvariabler #include <iostream> #include <stdlib.h> using namespace std; int main() { int tal1, tal2, produkt; tal1=5; tal2=11; produkt=tal1*tal2; cout << ”Produkten är”<<produkt; system(”PAUSE”; return 0; } Övning C1.3 Ändra i föregående program så att du får lite mera utskrift. Spara sedan programmet som prod2.cpp. Du ska få följande utskrift när du kör programmet (om du har samma tal som i övningen ovan). RESULTAT ============ Produkten är 55 Övning C1.4 Du ska nu förbättra programmet ytterligare. Den stora nackdelen med programmet är att man som användare inte kan påverka vilka tal som multipliceras med varandra. Ändra programmet så att man själv får mata in tal1 och tal2, och spara sedan programmet som prod3.cpp. En körning av programmet ska se ut enligt följande: Ange första talet: (Här ska man få skriva in ett tal, t.ex. 24, och trycka RETUR) Ange andra talet: (Samma sak här, t.ex. 17…och sedan ska resultatet skrivas ut:) RESULTAT ============ Produkten av 24 och 17 är 408 Sida 5 (7) Värmdö Gymnasium Datainstitutionen Programmering A 040108 Övning C1.5 Du ska nu ändra ännu mer i programmet, så att man förutom produkten av talen får ut även summan, differensen och kvoten av dessa. Spara programmet som uppg5.cpp. Om du t.ex. matar in 30 och 10 ska du få följande utskrift: RESULTAT ============ Produkten : 30 * 10 = 300 Summan : 30 + 10 = 40 Differensen : 30 – 10 = 20 Kvoten : 30 / 10 = 3 Testa programmet och kontrollera om det verkligen fungerar för alla tal. Om inte (det gör det inte), försök fundera ut varför. Övning C1.6 Läs in tre decimaltal a, b och c och beräkna och skriv ut deras medelvärde (a+b+c)/3. Övning C1.7 Läs in ett belopp och aktuell momssats i procent. Skriv ut momsbeloppet. Övning C1.8 Deklarera två variabler A och B och tilldela dessa värden. Skriv sedan de satser som gör att A och B byter värde med varandra. Ledtråd: Det måste till någonting extra. NU KOMMER 3 SVÅRA UPPGIFTER Övning C1.9 Den här uppgiften behöver du inte skriva något program till, bara med hjälp av tidigare teori i detta häfte ta reda på svaren. Ange resultat och typ för vart och ett av de aritmetiska uttrycken nedan. Tal skrivna utan decimaler är heltal. Operatorn % heter modulo och betyder resten vid heltalsdivision. T ex 7%3 blir 1 (3 tas bort 2 gånger, då återstår 1). a) 17/5 b) 17%5 c) 39/3 d) 15/0 e) 3/2*2 f) 18.0/5 g) 15.0/5 h) 18.0/5 i) sqrt(25) Övning C1.10 Skriv ett program som läser in ett datum som ett åttasiffrigt tal, t.ex. 20000107, och skriver ut datumet på följande sätt: 7/1-2000. Övning C1.11 Skriv programkod för att beräkna följande uttryck i C++. Deklarera variabler som flyttal. Läs in lämpliga värden och beräkna resultatet. (Kolla att programmet räknar rätt!!) a) v = 2⋅ y2 + b) s = 1 + sin x c) t=e 4x 3 x +3 Sida 6 (7) Värmdö Gymnasium Datainstitutionen Programmering A 040108 Minitest G-nivå: 1. Nämn 3 högnivåspråk. 2. Vilka är de tre stegen till ett körbart program? Vilka filer skapas? 3. Vad är pseudokod? Ge ett exempel. 4. Vilken variabeltyp är vanligast för heltal? 5. Vilken variabeltyp är vanligast för decimaltal? 6. Vad blir x i följande programkod: x=2,5 + 12,0 / 2,0 / (2,0 + 1,0)' 7. Vad blir x i följande programkod: x=8,0/3 + 8/3 8. Skriv ett program som läser in tre decimaltal a, b och c och beräkna och skriver ut medelvärdet (a+b+c)/3. VG-nivå: 1. Vilket var det första högnivåspråket. 2. Vilka två högnivåspråk är vanligast(används mest) idag? 3. Vad är kompilatorns respektive länkarens uppgift? 4. Ange resultat och typ för vart och ett av de aritmetiska uttrycken nedan. Tal skrivna utan decimaler är heltal. a) 17/5 b) 17%5 c) 18.0/5 5. Skriv ett program som läser in ett datum som ett åttasiffrigt tal, t.ex. 20000107, och skriver ut datumet på följande sätt: 7/1-2000. 6. Skriv programkod för följande uttryck i C++. Deklarera variablerna x, y, ARC som flyttal. ARC = 2 ⋅ y 2 + 4x3 3 Läxa Läs detta häfte och gör minitestet.. Lös övningarna genom att skriva kod på papper eller programmera på datorn. Sida 7 (7)