• No results found

C++ Funktioner 2

N/A
N/A
Protected

Academic year: 2021

Share "C++ Funktioner 2"

Copied!
5
0
0

Loading.... (view fulltext now)

Full text

(1)

C++ Funktioner 2

Teori

De funktioner som du skrivit hittills har använt s.k. värdeanrop, d.v.s. de argument som skickats med till funktionen har kopierats till för funktionen egna lokala kopior av variablerna. De förändringar av värdena som gjorts i funktionerna har då bara påverkat funktionens kopior, inte de ursprungliga variablerna i huvudprogrammet. Du ska nu få lära dig ett specialfall av motsatsen, ett s.k. referensanrop, när de argument man skickar till funktionen i själva verket är samma variabler som huvudprogrammet använder, fast under ett annat namn. Argumentet får alltså ett slags alias i funktionen, genom att man sätter ett

&-tecken framför parameternamnet.

Ex.

#include <iostream>

using namespace std;

void kvadrera(int &i) // funktionen kvadrera, som tar en referens till en heltalsvariabel

{ // i är alltså ett alias för tal i huvudprogrammet, ändrar man i så ändras tal i=i*i; // här kvadreras i, och alltså också tal i huvudprogrammet

}

main() {

int tal=25; // heltalsvariabeln tal sättes till 25 cout<<tal<<endl; // 25 skrivs ut på skärmen

kvadrera(tal); // tal skickas som referensparameter till funktionen kvadrera cout<<tal; // 625 skrivs ut på skärmen

system("PAUSE");

}

Teori

En funktion som tar ett fält som argument blir alltid ett referensanrop. Det innebär alltså att fältet själv inte kommer kopieras över till ett nytt fält som hör till funktionen (det som kallas värdeanrop, se tidigare), utan bara minnesadressen till den första "lådan" kopieras.

Om du har läst in ovanstående värden i fältet tallista och skickar den till funktionen

void changeboxzero(int lista[ ]) {

lista[0]=8;

}

med anropet changeboxzero(tallista), så kommer resultatet bli:

3 0

1 9

7

1 2 3

8 7 1 9

(2)

Ex.

#include <iostream>

using namespace std;

void kryptera(char str[]) //funktionen som krypterar strängen str {

for(int i=0;str[i]!='\0';i++) //ökar i tills fält nr i innehåller slutsträngtecken

str[i]++; //förskjutning av alla bokstäver ett steg

}

main() {

char text[50];

cout<<"Mata in en text som ska krypteras: ";

cin>>text;

kryptera(text); //anropar funktionen kryptera cout<<"Krypterad text:"<<endl<<text<<endl;

system("PAUSE");

}

Ett svårt Exempelprogram som innehåller båda nämnda finesser finns sist i häftet.

Läs

Läs även om referensparametrar i C++-manualen online, kap 7.

(3)

Öva Övning 1

Utöka miniräknaren och utnyttja switch-satsen i menyn.

Lägg till följande alternativ:

• läs in tal i en lista (Kan du lösa det du vill med en funktion som är av typen void!)

• skriv en funktion som beräknar medelvärdet av listans tal (Kan du lösa det du vill med en funktion som är av typen void!)

• skriv en funktion som dubblerar listans tal

• skriv en funktion som sorterar listan (stigande) Övning 2

Skriv en funktion som till argument tar en textsträng, räknar efter och skriver ut hur många stora resp.

små bokstäver som finns i textsträngen (i intervallen a-z och A-Z). Skriv sedan ett kort huvudprogram som testar funktionen för några olika strängar.

Övning 3

Skriv en funktion som genererar en LOTTO-rad. (7 tal mellan 1 och 35). Testa sedan funktionen med enkelt program.

Övning 4

Skriv en funktion som genererar en stryktips-rad och en annan funktion som skriver ut den snyggt ( se nedan). Testa sedan funktionen med enkelt program.

X 1 2 2 1 X osv.

Övning 5

Utöka programmet ovan med en funktion som rättar DIN tipsrad mot den RÄTTA och returnerar antal rätt. Funktionen ska vara av typen void. Referensparametrar ska användas.

Övning 6

I det s.k. rövarspråket dubbleras alla konsonanter och ett ’o’ placeras mellan de dubblerade

konsonanterna. Vokaler och övriga tecken är oförändrade. Skriv en funktion put_rovare som får en textsträng i rövarspråket som parameter. Funktionens uppgift är att skriva ut texten i klarspråk. Använd sedan funktionen för att skriva ett program där man matar in ett meddelande på rövarspråket och får ut det i klartext på skärmen. T.ex. ska inmatningen ”hohejoj alollolihohopopa!” ge resultatet ”hej allihopa!”.

Minitest G-nivå:

1. Skriv en funktion som till argument tar en textsträng, räknar efter och skriver ut hur många stora resp.

(4)

OBS! Det är inte meningen att du ska hänga med på allt. Det kan vara lärorikt att titta och sen själv testa vissa delar.

//funk_listor1.cpp

#include <iostream>

using namespace std;

void meny ();

char las_in_alternativ();

int las_in_lista(double lista[]);

double medelvarde (double lista[], int n);

void dubblera(double lista[], int n);

void skriv_ut_lista(double lista[], int n);

void las_in_lista2(double lista[10], int &x);

main () {

double resultat, lista[10];

int antal;

char svar='1';

while (svar!='0') {

meny();

svar=las_in_alternativ();

if (svar=='1')

{

antal=las_in_lista(lista) ; }

else if (svar=='2') {

resultat=medelvarde(lista, antal);

cout << " Medelvarde : " << resultat << endl;

} else if (svar=='3') {

dubblera(lista, antal);

skriv_ut_lista(lista, antal);

} else if (svar=='4') {

las_in_lista2(lista, antal) ; }

}

cout << endl << " HEJ DÅ" << endl;

system("PAUSE");

return 0;

}

//******************************************************

void meny () {

cout << endl << endl;

cout << "***** MENY *****" << endl;

cout << "################" << endl<<endl;

cout << " 1 läs in lista" << endl;

cout << " 2 beräkna medelvärde" << endl;

cout << " 3 dubblera talen i listan" << endl;

cout << " 4 läs in lista, alternativ 2" << endl;

cout << " 0 AVSLUTA" << endl;

cout << endl;

}

//******************************************************

(5)

char las_in_alternativ() {

char svar;

cout << endl << " Ange alternativ: " ; cin >> svar;

return svar;

}

//******************************************************

int las_in_lista(double lista[]) {

int stegare=0;

char svar;

while (true) {

stegare++;

cout<<" Ange ett tal: ";

cin>>lista[stegare-1];

cout<<"Vill du fortsätta: (j/n) ";

cin>>svar;

if ( svar!='j' ) return stegare;

} }

//******************************************************

double medelvarde (double lista[], int n) {

double sum=0;

for (int i=0; i<n; i++) sum+= lista[i];

return sum/n;

}

//******************************************************

void dubblera (double lista[], int n) {

for (int i=0; i<n; i++) lista[i]*=2;

}

//******************************************************

void skriv_ut_lista(double lista[], int n) {

for ( int i=0; i<n; i++) cout << lista[i]<<endl;

}

//******************************************************

void las_in_lista2(double lista[], int &x) {

int stegare=0;

char svar='j';

while (svar=='j') {

stegare++;

cout<<" Ange ett tal: ";

cin>>lista[stegare-1];

cout<<"Vill du fortsätta: (j/n) ";

cin>>svar;

if ( svar!='j' ) x=stegare;

} }

References

Related documents

avseende möjligheter som står till buds för främst Sametinget och samebyar, när det gäller att få frågan prövad om konsultationer hållits med tillräcklig omfattning

Enligt remissen följer av förvaltningslagens bestämmelser att det normalt krävs en klargörande motivering, eftersom konsultationerna ska genomföras i ärenden som får

Lycksele kommun ställer sig positiv till promemorians bedömning och välkomnar insatser för att stärka det samiska folkets inflytande och självbestämmande i frågor som berör

Länsstyrelsen i Dalarnas län samråder löpande med Idre nya sameby i frågor av särskild betydelse för samerna, främst inom.. Avdelningen för naturvård och Avdelningen för

Det behöver därför göras en grundläggande analys av vilka resurser samebyarna, de samiska organisationerna, Sametinget och övriga berörda myndigheter har och/eller behöver för

Länsstyrelsen i Norrbottens län menar att nuvarande förslag inte på ett reellt sätt bidrar till att lösa den faktiska problembilden gällande inflytande för den samiska.

Vi tror att det ofta uppstår problem när eleverna kommer till musikskolan för att de vill lära sig musik och istället för att börja med en välkänd låt får de börja

När de tre grupperna får diskutera frågan om vilka olika sorters stöd och hjälp de upplever att de får av sina lärare i matematik, så återkommer naturligtvis de tre typer som de