B Bioinformatis sk C++ scriptting i Xubunttu 

O Opslag til

Dyybd D degå åen ndee B infform Bioi maatisk k S iptiingg i Scri X bun Xub ntu u 122.100 (V Vol.. 1)) Henrik D. Dahlerup, D Februar F 20155 kontakt: henrik@ddah h hlerup.com

Bemærrk - Nye progrrammeringssproog, så

Anvendte bøger: "Samss Publishingg"-books.

som C++, er i dag genkendt af flere som yderst anvendelig til sttørrere bioinforrmatiske opgaver. På trods af dette findes f der ikkee litteratur som m helt konkret - ned i detaljer - viserr eksempler på disse muligheder. Dette er muligvis fordi udviklingeen af dette sprog gårr så stærkt, at hvad var foresllået i går, er megett mindre effek ktivt i dag. Dette D dokument vil, på trods af d dette, bidrage med pler. Alt dette bliver b konkrete ned-i--detaljer-eksemp her udført i Xubuntu X C++ veersion 4.6.3. Ud dover dette er der maange steder anvvendt talesprog hvor der ikke tagess hensyn til d den bioinforma atiske termologi. Denn ne tilgang har tiil hensigt at gøre det nemmere at geennemskue den praktiske værd di af disse til tider ab bstrakte bioinforrmatiske værktø øjer brugt til at analyysere DNA, RNA A og proteiner.

Copyright ©2014 © Henrik k D. Dahlerup p 

Bioinformatisk C++ scripting i Xubuntu

Indhold  Et lynhurtigt overblik ........................................................................................................................ 3 Bioinformatisk C++ i dette dokument............................................................................ 3 Bioinformatisk scripting-struktur i Xubuntu .................................................................. 5 Konkret C++ programmering .......................................................................................................... 6 C++ programmering ....................................................................................................... 7 Strukturen i et C++ program ........................................................................................ 13 Variabler og konstanter ................................................................................................ 24 Ekspressioner og statement'er ...................................................................................... 39 Organiser dig via funktioner ........................................................................................ 62 Objekt-orienteret programmering ................................................................................ 90 Mere program flow..................................................................................................... 119 Overblik og opsamling ............................................................................................... 145 Brugen af pointers ...................................................................................................... 164 Brugen af referencer ................................................................................................... 189  

Anvendelse

- Her er brugt simple og meget praktiske forklaringer som gør det nemt at forklare det fremlagte videre til andre, uden at tale forbi dem - hvis du for eksempel er hjælpelærer på et bioinformatisk kursus eller lignende. 

 Copyright ©2014 Henrik D. Dahlerup  2   

Bioinformatisk C++ scripting i Xubuntu

Et lynhurtigt overblik  Her er en lynhurtig præsentation af nogle mønstre i C++ bioinformatisk scripting som er gode at kunne genkende under programmering eller computer-analyser af DNA, RNA og proteiner.

Bioinformatisk C++ i dette dokument   Nedenfor præsenteres nogle af de C++ scriptings-redskaber som dette dokument primært tager udgangspunkt i. Som du vil opdage bliver nedenfor viste redskaber rent praktisk anvendt i alle scripts præsenteret i dette dokument. De dækker det første område af C++ som der bliver fortalt om her. Du kan på den måde som udgangspunkt slå op her til at starte med, men også når du (imens eller senere) laver dine egne scripts som kan analysere DNA, RNA og proteiner. Vær opmærksom på at siden scripts kræver en amerikansk punktum og komma notation er dette også konsistent anvendt i teksten i dette dokument. Bemærk - Hvis den første halve side nedenfor ikke giver mening for dig, spring da videre til side 6 og vend tilbage hertil senere.   Operator fremgang (precedence) med mere. Trin Operatorer 1 (høj) ( ) . [ ] –> :: 2 * & ! ~ ++ –– + – størrelsen af new og delete 3 .* –> * 4 */% 5 +– 6 << >> 7 < <= > >= 8 == != 9 & 10 ^ 11 | 12 && 13 || 14 ?: 15 = *= /= += –= %= <<= >>= &= ^= |= 16 (lav) ,

Evaluerings-rækkefølge venstre-til-højre højre-til-venstre venstre-til-højre venstre-til-højre venstre-til-højre venstre-til-højre venstre-til-højre venstre-til-højre venstre-til-højre venstre-til-højre venstre-til-højre venstre-til-højre venstre-til-højre højre-til-venstre højre-til-venstre venstre-til-højre

Forklaring: Operatorerne i starten af tabellen har en højere precedence end operatorerne under. I ekspressioner der begynder med argumenter i det mest indre sæt af parenteser (hvis nogen), evaluer programmerne operatorerne af højere precedence før de evaluer operatorer af lavere precedence. Unary plus (+) og unary minus (–) er ved trin 2 og har precedence over aritmetisk plus og minus ved trin 5. & symbolet i trin 2 er address-of operatoren; & symbolet i trin 9 er bitwise AND operatoren. * symbolet i trin 2 er pointer-dereference operatoren; * symbolet i trin 4 er gangeoperatoren. Hvis der mangler parenteser, er operatorer på samme trin evalueret ifølge deres venstretil-højre eller højre-til-venstre evaluerings-rækkefølge. Operatorer som kan blive overloaded * / + % ^

&

|

~

!

,

=

<

>

 Copyright ©2014 Henrik D. Dahlerup  3   

Bioinformatisk C++ scripting i Xubuntu

14: { 15: std::cout << “In main\n” ; 16: DemonstrationFunction(); 17: std::cout << “Back in main\n”; 18: return 0; 19: } $ program1_9 In main In Demonstration Function Back in main $ Funktionen DemonstrationFunction() er defineret på linjerne 6–8. Når den er call'et, printer den en besked til consol-skærmen og returner derefter. Linje 13 er begyndelsen på det aktuelle program. I linje 15, printer main() en besked der siger at det er i main(). Efter printningen af beskeden, call'er linje 16 DemonstrationFunction(). Dette call medfører at flow'et af programmet skal gå til DemonstrationFunction() funktionen i linje 5. Enhver kommando i DemonstrationFunction() er så execut'et. I denne situation, består hele funktionen af koden i linje 7, som printer en anden besked. Når DemonstrationFunction() er færdig (linje 8), returner program-flow'et til hvor den var call'et fra. I denne situation, returner programmet til linje 17, hvor main() printer dens sluttelige linje. Brugen af funktioner Funktioner returner enten en værdi eller så returner de 'void', som betyder at de ikke returner noget som helst. En funktion der lægger to integer'er sammen kan returner en sum og ville så derved blive defineret til at returner en integer værdi. En funktion som kun printer en besked har ingenting den skal returner og vil derfor blive declared til at returner 'void'. Funktioner indeholder en header og en body. Header'en indeholder, på tur, returnerings-type, funktionsnavnet, og parametrene til denne funktion. Parametrene til en funktion gør det muligt for værdier at blive pass'et ind i funktionen. Hertil, også hvis funktionen skulle lægge to numre sammen, ville numrene være parametrene af funktionen. Her er et eksempel på en typisk funktionsheader som declare'er en funktion med navnet Sum der modtager to integer værdier (first og second) samt også returner en integer værdi: int Sum( int first, int second) En parameter er en declaration for hvilken type af værdi der vil blive pass'et i; Den faktiske værdi pass'et i, når funktionen er call'et er refereret til som et argument. Mange programmører bruger termen parameter og argumenter som synonymer. Skelnen imellem disse to termer er ikke kritisk i din programmering i C++. Body'en af en funktion består af en åben brace, nul eller flere statement'er og en lukkende brace. Statement'er består af den arbejdende del af funktionen. En funktion kan returner en værdi ved at bruge en return statement. Værdien returneret skal være af typen declared i funktions-header'en. Hertil medfører denne statement at funktionen exit'ter. Hvis du ikke sætter en return statement ind i din funktion, vil den automatisk returner void (ingenting) i enden af funktionen. Hvis en funktion er forventet at returner en værdi, men at den ikke indeholder et return statement, producer nogle compilers en advarsel eller en fejl-besked. Opstillingen nedenfor viser en funktion som tager to integer-parametre og returner en integer-værdi. Et program som viser en simpel funktion.  Copyright ©2014 Henrik D. Dahlerup  20   

Bioinformatisk C++ scripting i Xubuntu

+

b

;

Selvom den sidste variation er tilladt er det mindre læseligt. White-space kan blive brugt til at gøre dine programmer mere læsebare og nemmere at vedligeholde eller det kan bruges til at danne god kode. Blokke og compound statement'er Alle steder du kan sætte en enkelt statement, kan du også sætte en compound statement også kaldt en blok. En blok begynder med en åben brace ({) og ender med en lukket brace (}).4Selvom hver statement i blokken skal ende med et semikolon, ender selve blokken ikke med et semikolon som vist i følgende eksempel: { temp = a; a = b; b = temp; } Denne blok af kode agere som en statement og udskifter værdierne i variablerne a og b. Bemærk følgende: • Afslut altid dine statements med et semikolon. • Brug white-space til at gøre din kode mere læsebar. • Husk at når du sætter en åben brace skal den altid lukkes senere i din kode. Ekspressioner Alt som evaluere til en værdi er en ekspression i C++. En ekspression siges at returner en værdi. Hertil statement'et 3+2; returner værdien 5, så det er en ekspression. Alle ekspressioner er statement'er. Her er 3 eksempler på ekspressioner: 3.2 PI SecondsPerMinute

// returns the value 3.2 // float constant that returns the value 3.14 // int constant that returns 60

Med udgangspunkt i at PI er en dannet konstant som er initialiseret til 3.14 og SecondsPerMinute er en konstant ligmed 60, alle 3 af disse statements er ekspressioner. Ekspressionen: x = a + b; lægger ikke kun a og b sammen men assign'er resultatet til x, men returner også værdien af denne assignment (værdien af x). Denne assignment statement er også en ekspression. Enhver ekspression kan blive brugt på den højre side af en assignment operator. Dette inkluder assignment statement'et lige vist. Følgende er tilladt i C++: y = x = a + b; Denne linje er evalueret i følgende rækkefølge: Læg a til b. Assign resultatet af ekspressionen a + b til x. Assign resultatet af assignment ekspressionen x = a + b til y.  Copyright ©2014 Henrik D. Dahlerup  40   

Bioinformatisk C++ scripting i Xubuntu

4: int main() 5: { 6: using namespace std; 7: 8: int x, y, z; 9: cout << “Enter two numbers.\n”; 10: cout << “First: “; 11: cin >> x; 12: cout << “\nSecond: “; 13: cin >> y; 14: cout << “\n”; 15: 16: if (x > y) 17: z = x; 18: else 19: z = y; 20: 21: cout << “After if test, z: “ << z; 22: cout << “\n”; 23: 24: z = (x > y) ? x : y; 25: 26: cout << “After conditional test, z: “ << z; 27: cout << “\n”; 28: return 0; 29: } $ program3_16 Enter two numbers. First: 5 Second: 8 After if test, z: 8 After conditional test, z: 8 $ Tre integer-variabler er dannet: x, y og z. De første to indeholder værdierne fra brugeren. if statement'et i linje 16 tester for at se hvilken en er større og assign'er den større værdi til z. Denne værdi er printet i linje 21. Forholds-operatoren i linje 24 gennemfører den samme test og assign'er z den større værdi. Den er læst således: “Hvis x er større end y, returner da værdien af x; Ellers, returner da værdien af y”. Værdien returneret er assign'et til z. Denne værdi er print'et i linje 26. Som du kan se, er forholdsstatement'et en kortere løsning i forhold til if...else statement'et. Bemærk følgende: •

Husk at parenteser gør din kode nemmere at læse.



Relationelle operatorer returner altid sand eller falsk. Hertil enhver ikke-nul værdi er opfattet som sand. Relationelle operatorer returner sand eller falsk, men hver ekspression returner en værdi og disse værdier kan også blive evalueret i et if statement. Her er et eksempel: if ( (x = a + b) == 35 )  Copyright ©2014 Henrik D. Dahlerup  60 

 

Bioinformatisk C++ scripting i Xubuntu

Bemærk at statement'et i dette eksempel using namespace std; har været lagt til i linje 10, uden for nogen som helst specifik funktion. Dette gør statement'et global til denne fil og hertil er namespace også brugt inde i alle funktionerne som er declared inde i denne fil. I body'en af main programmet, er 8 lokale variabler declared. I linjerne 14–17, er 4 af disse værdier initialiseret og i linjerne 29–32 er de andre 4 assign'et med resultatet pass'et fra de første 4 til Double() funktionen. Bemærk at når Double() er call'et, skelner den call'ende funktion ikke imellem hvilken en der call'es til; Den pass'er bare et argument ind og den korrekte bliver nu startet. Compileren undersøger argumenterne og vælger hvilken en af de 4 Double() funktioner den call'er. Output'tet afslører at hver af de 4 var call'et på tur, som du ville forvente. Specielle emner om funktioner Netop fordi funktioner er så centrale i programmering, rejser nogle specielle emner sig som måske er brugbare når du møder utraditionelle problemer. Hvis de bruges på en fornuftig måde kan inline funktioner hjælpe dig med at effektivisere dine programmer. Funktions-recursion er en af disse skønne eksotiske stykker af programmering, som ind imellem kan løse ikke nemt løste problemer. OUTPUTANALYSIS Inline funktioner Når du definer en funktion, danner compileren et sæt instruktioner i hukommelsen. Når du call'er funktionen, hopper execution'en af programmet til disse instruktioner og derefter returner funktionen og execution'en hopper tilbage til den næste linje i den call'ende funktion. Hvis du call'er funktionen 10 gange, vil dit program hoppe til det samme sæt af instruktioner hver gang. Dette betyder at der findes kun en kopi af funktionen og ikke 10. En lille forbedring vil opstå i hopningen ind og ud af funktionerne. Det viser sig at nogle funktioner er meget små, som er en eller to linjer af kode og en forbedring i effektiviteten kan opnås hvis programmet kan undgå at lave disse hop hvor de kun skal execute en eller to instruktioner. Når programmører taler om effiktivitet, mener de normalt hastighed; Programmet kører hurtigere hvis funktions-call'et kan blive undgået. Hvis en funktion er declared med nøgleordet inline, danner compileren ikke en rigtig funktion; Den kopiere koden fra inline funktionen direkte ind i den call'ende funktion. Ingen hop er gennemført; Det er lige som hvis du havde skrevet statementerne af funktionen direkte ind i den call'ene funktion. Bemærk at inline funktionerne kan medføre at programmet ender op med at køre langsommere. Hvis funktionen er call'et 10 gange, er inline koden kopieret ind i de call'ende funktioner hver af disse 10 gange. Den lille forbedring i hastighed kan ende op med at du i stedet fornemmer at det går langsommere på grund af den øgede størrelse af det execut'ede program. Nu til dags optimerende compilere kan næsten med sikkerhed gøre et bedre job i at bestemme hvordan programmet skal køres end dig; og det er derfor generelt en god ide ikke at declare en funktion inline med mindre den kun er en eller to statement'er i længde. Når du er i tvivl udelad da inline. Bemærk - Optimering er en svær udfordring, men der er hjælp at hente via debuggers og profilers. Husk det er også bedre at skrive læsebar kode end at forsøge at skrive kode som måske kan sætte hastigheden lidt op, men som er ulæselig. I sidste ende går det sikkert ikke stærkere med ulæselig kode. Det er nemmere at få læsebar kode til at køre stærkere fordi du vil altid senere kunne gå ind i koden og sætte dine nye justeringer som vil øge hastigheden. Opstillingen nedenfor viser brugen af en inline funktion.

 Copyright ©2014 Henrik D. Dahlerup  80   

Bioinformatisk C++ scripting i Xubuntu

40: 41: // create a cat, set its age, have it 42: // meow, tell us its age, then meow again. 43: int main() 44: { 45: Cat Frisky; 46: Frisky.SetAge(5); 47: Frisky.Meow(); 48: std::cout << “Frisky is a cat who is “ ; 49: std::cout << Frisky.GetAge() << “ years old.\n”; 50: Frisky.Meow(); 51: return 0; 52: } $ program5_2 Meow. Frisky is a cat who is 5 years old. Meow. $ Bemærk følgende: • Brug public accessor metoder. • Få adgang til private member variabler inde fra class member funktioner. • Declare helst ikke member variabler public hvis du ikke har brug for det. • Forsøg ikke at bruge private member variabler fra udenfor en klasse. DON’T Linjerne 5–13 indeholder definitionen på Cat klassen. Linje 7 indeholder nøgleordet public, som fortæller compileren at hvad følger efter er et sæt af public members. Linje 8 indeholder deklarationen af public accessor metoden GetAge(). GetAge() giver adgang til private member variablen itsAge, som er declared i linje 12. Linje 9 indeholder public accessor funktionen SetAge(). SetAge() tager en integer som et argument og sætter itsAge til værdien af dette argument. Linje 10 indeholder deklarationen af klasse-metoden Meow(). Meow() er ikke en accessor funktion. Her er den en generel metode som printer ordet “Meow” til skærmen. Linje 11 begynder den private sektion, som inkluder kun deklarationen i linje 12 af private member variablen itsAge. Klasse deklarationen afsluttes med en lukkende brace og semikolon i linje 13. Linjerne 17–20 indeholder definitionen for member funktionen GetAge(). Denne metode tager ingen parametre og den returner en integer. Bemærk i linje 17 at klasse-metoder inkluder klassenavnet efterfulgt af to koloner og funktionens navn. Denne syntaks fortæller compiler'en at GetAge() funktionen du definer her er den som du declared i Cat klasse. Med en undtagelse af denne header linje, er GetAge() funktionen dannet på samme måde som enhver anden funktion. GetAge() funktionen tager kun en linje; Den returner værdien i itsAge. Bemærk at main() funktionen kan ikke få adgang til itsAge netop fordi itsAge er private til Cat klassen. main() funktionen har adgang til den public metode GetAge(). Netop fordi GetAge() er en member funktion af Cat klassen, har den fuld adgang til itsAge variablen. Denne adgang gør det muligt for GetAge() at returner værdien af itsAge til main(). Linje 25 indeholder definitionen på SetAge() member funktionen. Du kan se at denne funktion tager en integer værdi, kaldt age, og returner ikke nogen som helst anden værdi, som er indikeret med void. SetAge() tager værdien af age parameteren og assign'er den til itsAge i linje 29. Netop  Copyright ©2014 Henrik D. Dahlerup  100   

Bioinformatisk C++ scripting i Xubuntu

I C++ er et mærke et navn efterfulgt af et (:). Mærket er placeret til venstre af et statement. Et hop er gennemført ved at skrive goto efterfulgt af navnet af mærket. Opstillingen nedenfor illustrerer denne primitive måde at loop'e på. Et program som loop'er via nøgleordet goto. 1: // A program that 2: // loops using goto 3: #include 4: 5: int main() 6: { 7: using namespace std; 8: int counter = 0; // initialize counter 9: loop: 10: counter ++; // top of the loop 11: cout << “counter: “ << counter << endl; 12: if (counter < 5) // test the value 13: goto loop; // jump to the top 14: 15: cout << “Complete. Counter: “ << counter << endl; 16: return 0; 17: } $ program6_1 counter: 1 counter: 2 counter: 3 counter: 4 counter: 5 Complete. Counter: 5. $ I linje 8 er counter initialiseret til nul. Et mærke kaldt loop marker i linje 9, starten af loop'et. counter er incremented og dens nye værdi er printet i linje 11. Værdien af counter er testet i linje 12. Hvis værdien er mindre end 5, er if statement'et sand og goto statement'et er execut'et. Dette medfører at program-execution'en hopper tilbage til loop mærket i linje 9. Programmet fortsætter indtil counter er ligmed 5, hvor den nu “falder igennem” loop'et og det sluttelige output er printet. Du skal undgå goto Som en regel undgås goto og det er med en god årsag. goto statement'et kan medføre et hop til enhver placering i din source kode, baglæns og forlæns. En ukontrolleret brug af goto statement'er har medført programmer der er umulige at læse kendt som “spaghetti kode”. goto statement'et For at bruge goto statement'et, skriver du goto efterfulgt af et mærke-navn. Dette medfører et hop uden test til mærket. Eksempel: if (value > 10) goto end; if (value < 10) goto end; cout << “value is 10!”;  Copyright ©2014 Henrik D. Dahlerup  120   

Bioinformatisk C++ scripting i Xubuntu

} Eksempel 2: switch (choice) { case 0: case 1: case 2: cout << “Less than 3!”; break; case 3: cout << “Equals 3!”; break; default: cout << “greater than 3!”; } Some programmers like to write: #define EVER ;; for (EVER) { // statements... } Bemærk - Hvis expression ikke matcher alle situations-statement'erne og hvis der er en default statement, skifter (switch) execution'en til default statement'et, ellers afslutter switch statement'et. Et uendeligt loop er et loop som ikke har et exit forhold. For at exit loop'et, skal et break statement bruges. Et program som viser et uendeligt loop. 1: //A program: 2: //Using a forever loop to manage user interaction 3: #include 4: 5: // prototypes 6: int menu(); 7: void DoTaskOne(); 8: void DoTaskMany(int); 9: 10: using namespace std; 11: 12: int main() 13: { 14: bool exit = false; 15: for (;;) 16: { 17: int choice = menu(); 18: switch(choice) 19: { 20: case (1): 21: DoTaskOne(); 22: break; 23: case (2): 24: DoTaskMany(2);  Copyright ©2014 Henrik D. Dahlerup  140   

Bioinformatisk C++ scripting i Xubuntu

int itsYearsOfService; int itsSalary; }; Skriv et program med en Employee klasse som laver to employees; sæt deres itsAge, itsYearsOfService og itsSalary; og print deres værdi. Du vil have brug for også at tilsætte koden for accessor metoder. Følgende er en mulig løsning: 1: // Employee.cpp 2: #include 3: #include “Employee.hpp” 4: 5: int Employee::GetAge() const 6: { 7: return itsAge; 8: } 9: void Employee::SetAge(int age) 10: { 11: itsAge = age; 12: } 13: int Employee::GetYearsOfService() const 14: { 15: return itsYearsOfService; 16: } 17: void Employee::SetYearsOfService(int years) 18: { 19: itsYearsOfService = years; 20: } 21: int Employee::GetSalary()const 22: { 23: return itsSalary; 24: } 25: void Employee::SetSalary(int salary) 26: { 27: itsSalary = salary; 28: } 29: 30: int main() 31: { 32: using namespace std; 33: 34: Employee John; 35: Employee Sally; 36: 37: John.SetAge(30); 38: John.SetYearsOfService(5); 39: John.SetSalary(50000); 40: 41: Sally.SetAge(32); 42: Sally.SetYearsOfService(8); 43: Sally.SetSalary(40000); 44: 45: cout << “At AcmeSexist company, John and Sally have “; 46: cout << “the same job.\n\n”; 47:  Copyright ©2014 Henrik D. Dahlerup  160   

Bioinformatisk C++ scripting i Xubuntu

22: SimpleCat::SimpleCat() 23: { 24: itsAge = new int(2); 25: itsWeight = new int(5); 26: } 27: 28: SimpleCat::~SimpleCat() 29: { 30: delete itsAge; 31: delete itsWeight; 32: } 33: 34: int main() 35: { 36: using namespace std; 37: SimpleCat *Frisky = new SimpleCat; 38: cout << “Frisky is “ << Frisky->GetAge() 39: << “ years old “ << endl; 40: Frisky->SetAge(5); 41: cout << “Frisky is “ << Frisky->GetAge() 42: << “ years old “ << endl; 43: delete Frisky; 44: return 0; 45: } $ program7_7 Frisky is 2 years old Frisky is 5 years old $ Klassen SimpleCat er declared til at have to member variabler — begge er pointers til integers — i linjerne 18 og 19. Constructor'en (linjerne 22–26) initialisere pointers til hukommelsen i det frie lager og til default værdier. Bemærk, i linjerne 24 og 25, at en pseudoconstructor er call'et på den nye integer, som pass'er værdien ind for integer'en. Dette danner en integer på heap og initialisere dens værdi (i linje 24 til værdien 2 og i linje 25 til værdien 5). Destructor'en (linjerne 28–32) rengøre for den allokerede hukommelse. Netop fordi dette er destructor'en, er der ingen ide i assign'e disse pointers til nul fordi de vil ikke længere blive tilgængelige. Dette er et af de sikre steder at bryde reglen om, at deletet pointers bør være assign'et til nul, dog netop at følge reglen skader ikke. Den call'ende funktion (i denne situation er main()) ukendt med at itsAge og itsWeight er pointers til på det frie lager. main() fortsætter med at call'e GetAge() og SetAge() og detaljerne for hukommelses-styring er gemt i implementationen af klassen — som de bør. Når Frisky er deletet i linje 41 er dens destructor call'et. Destructor'er deleter hver af dens member pointers. Hvis disse, på tur, peger på objekter for andre bruger-defineret klasser, er deres destructor'er også call'et. Hvad du opnår her Brugen af pointers som var gennemført i opstillingen ovenfor ville være en smule skørt i et rigtigt program med mindre en god forklaring fandtes for at Cat objektet skulle indeholde dens deltagere via reference. I denne situation er der ikke en god grund til at bruge pointers til at få adgang til itsAge og itsWeight, men i andre situationer, kan dette give mening.  Copyright ©2014 Henrik D. Dahlerup  180   

Bioinformatisk C++ scripting i Xubuntu

9: { 10: int number, squared, cubed; 11: short error; 12: 13: cout << “Enter a number (0 - 20): “; 14: cin >> number; 15: 16: error = Factor(number, &squared, &cubed); 17: 18: if (!error) 19: { 20: cout << “number: “ << number << endl; 21: cout << “square: “ << squared << endl; 22: cout << “cubed: “ << cubed << endl; 23: } 24: else 25: cout << “Error encountered!!” << endl; 26: return 0; 27: } 28: 29: short Factor(int n, int *pSquared, int *pCubed) 30: { 31: short Value = 0; 32: if (n > 20) 33: Value = 1; 34: else 35: { 36: *pSquared = n*n; 37: *pCubed = n*n*n; 38: Value = 0; 39: } 40: return Value; 41: } $ program7_18 Enter a number (0-20): 3 number: 3 square: 9 cubed: 27 $ På linje 10 er number, squared og cubed defined som short integers. number er assign'et med en værdi baseret på bruger-input'tet i linje 14. I linje 16 er dette nummer og adresserne for squared og cubed pass'et til funktionen Factor(). I linje 32 undersøger Factor() den første parameter, som er pass'et via værdi. Hvis værdien er størrere end 20 (Den maksimale værdi som denne funktion kan håndtere), sætter den returneringsværdien, Value, til en simpel fejl-værdi. Bemærk at returnerings-værdien fra Function() er reserveret til enten denne fejl-værdi eller værdien 0, der indikere at alt gik godt, og bemærk at funktionen returner denne værdi i linje 40. De aktuelle værdier der er brug for, som er kvadratet og kubikken af number, er ikke returneret ved at bruge returnerings-mekanismen; I stedet er de returneret ved at ændre de pointers som var pass'et ind i funktionen. I linjerne 36 og 37 er pointer'erne assign'et med deres returnerings-værdi. Disse værdier er assign'et til de originale variabler ved brugen af indirection. Du ved netop dette fordi du bruger dereference  Copyright ©2014 Henrik D. Dahlerup  200   

Bioinformatisk C++ scripting i Xubuntu

23: CAT & MakeCat(int age) 24: { 25: CAT * pCat = new CAT(age); 26: return *pCat; 27: } MakeCat returner en reference til CAT dannet i det frie lager. Der er ikke nogen måde at frigøre denne hukommelse og dette producer et hukommelses-tab. Løs ovenstående program. Følgende er en mulig løsning: 1: #include 2: using namespace std; 3: class CAT 4: { 5: public: 6: CAT(int age) { itsAge = age; } 7: ~CAT(){} 8: int GetAge() const { return itsAge;} 9: private: 10: int itsAge; 11: }; 12: 13: CAT * MakeCat(int age); 14: int main() 15: { 16: int age = 7; 17: CAT * Boots = MakeCat(age); 18: cout << "Boots is " << Boots->GetAge() << " years old"; 19: delete Boots; 20: return 0; 21: } 22: 23: CAT * MakeCat(int age) 24: { 25: return new CAT(age); 26: } Dette dokument fortsætter i volume 2.

 Copyright ©2014 Henrik D. Dahlerup  215   

SAMPLE In Depth Bioinformatic Xubuntu Scripting Vol. 1. Copyright ...

SAMPLE In Depth Bioinformatic Xubuntu Scripting Vol. ... opyright ©2014 Henrik D. Dahlerup. ddahlerup.com.pdf. SAMPLE In Depth Bioinformatic Xubuntu ...

471KB Sizes 0 Downloads 23 Views

Recommend Documents

SAMPLE Bioinformatic Xubuntu Scripting Vol. 2. Copyright ©2014 ...
SAMPLE Bioinformatic Xubuntu Scripting Vol. 2. Copyright ©2014 Henrik D. Dahlerup. ddahlerup.com.pdf. SAMPLE Bioinformatic Xubuntu Scripting Vol. 2.

sample paper Aptoinn nata sample model question paper - 1.pdf ...
Page 1 of 1. SAMPLE SET - 1. Note:These questions are the collections of student's contributions from different forums & websites. www.aptoinn.in. 917630 1689 / 98847 22837 / 91765 62187. NATA & J.E.E - B.Arch portions covered. We provide the student

Relax Magazine Vol.1
盛岡駅西口とマリオス展望台2012 · by Hiro Sasaki ©All Rights Reserved 2012 · Tokyo Dawn Records Positive Flow Remix Contest · 資優教育宣導短片− 覓一片 ...

Timestamp Sample Question 1 Sample Question 2 Check sessions ...
Page 1. Timestamp. Sample Question. 1. Sample Question. 2. Check sessions you are interested in attending. Your name: Your email address:

Depth of Knowledge in Music
Jan 30, 2009 - Measures the degree to which the knowledge ... for Science Education. Several .... balance, and expression without the aid of a teacher. 19 ...

Read [PDF] CCDE In-Depth Full Pages
CCDE In-Depth Download at => https://pdfkulonline13e1.blogspot.com/1539817199 CCDE In-Depth pdf download, CCDE In-Depth audiobook download, CCDE In-Depth read online, CCDE In-Depth epub, CCDE In-Depth pdf full ebook, CCDE In-Depth amazon, CCDE In

Sample-_IGC3#1.pdf
3.3 Persuasiveness / conciseness / technical content 10. 4 Report - Conclusions and ... 100. Page 3 of 17. Main menu. Displaying Sample-_IGC3#1.pdf. Page 1 ...

Sample Chapter 1 Study Guide.pdf
What was the impact of new crops and livestock in the Americas? (pp.19-20). New crops (bananas, sugar) and domestic livestock (pigs, sheep, and cattle) had a ...

TANCET 1 Sample Paper.pdf
MHD generator. 3. Fuel cell. 4. Atomic power plant. 53. Temporary metal forming process is. 1. Welding. 2. Brazing. 3. Mechanical bonding. 4. Soldering. 54.

English Sample Paper 1.pdf
There was a problem previewing this document. Retrying... Download. Connect more apps... Try one of the apps below to open or edit this item. English Sample Paper 1.pdf. English Sample Paper 1.pdf. Open. Extract. Open with. Sign In. Main menu.

Section 1: Multiple Choice Sample -
D. Design codes and standards employed. 2: All of the ... other company procedures or working practices, such as corporate standards. 3. ... established a small, metered rate of 0.5 kg/min of reactant B is continuously added to the solution.