Föreläsningsanteckningar OOP-föreläsning 4, tisdag 11 september 2007 ==================================================================== Idag ==== 1. Referenser i C 2. Kort om mallar (på engelska: templates) 3. Default-värden på parametrar 4. main-funktionen: parametrar och returvärde 1. Referenser i C ================= referenser.cpp -------------- #include using namespace std; int main() { int i; int* p = &i; int& r = i; i = 7; *p = 7; r = 7; cout << i << *p << r << endl; } parametrar-1.c -------------- #include void arrayminmax(double a[], int antal, double *minp, double *maxp) { int i; *minp = *maxp = a[0]; for (i = 1; i < antal; ++i) { if (a[i] < *minp) *minp = a[i]; else if (a[i] > *maxp) *maxp = a[i]; } } int main(void) { double arrayen[] = { 1.3, 2.4, 1.8 }; double min, max; arrayminmax(arrayen, 3, &min, &max); printf("Min = %.2f\n", min); printf("Max = %.2f\n", max); return 0; } parametrar-2.cpp ---------------- #include using namespace std; void arrayminmax(double a[], int antal, double& minp, double& maxp) { int i; minp = maxp = a[0]; for (i = 1; i < antal; ++i) { if (a[i] < minp) minp = a[i]; else if (a[i] > maxp) maxp = a[i]; } } int main() { double arrayen[] = { 1.3, 2.4, 1.8 }; double min, max; arrayminmax(arrayen, 3, min, max); cout << "Min = " << min << endl; cout << "Max = " << max << endl; } byt-1.cpp --------- #include using namespace std; #include "student.h" void byt_student(Student& s1, Student& s2) { Student temp = s1; s1 = s2; s2 = temp; } int main() { Student a, b; a.las(); b.las(); byt_student(a, b); a.skriv(); b.skriv(); } byt-2.cpp --------- #include using namespace std; void byt_namn(string& s1, string& s2) { string temp = s1; s1 = s2; s2 = temp; } int main() { cout << "Ge första namnet: "; string forsta; getline(cin, forsta); cout << "Ge andra namnet: "; string andra; getline(cin, andra); byt_namn(forsta, andra); cout << "Första namnet är nu: " << forsta << endl; cout << "Andra namnet är nu: " << andra << endl; } byt-3.cpp --------- #include using namespace std; #include "student.h" void byt(Student& s1, Student& s2) { Student temp = s1; s1 = s2; s2 = temp; } void byt(string& s1, string& s2) { string temp = s1; s1 = s2; s2 = temp; } int main() { Student a, b; a.las(); b.las(); byt(a, b); a.skriv(); b.skriv(); cout << "Ge första namnet: "; string forsta; getline(cin, forsta); cout << "Ge andra namnet: "; string andra; getline(cin, andra); byt(forsta, andra); cout << "Första namnet är nu: " << forsta << endl; cout << "Andra namnet är nu: " << andra << endl; } 2. Kort om mallar (på engelska: templates) ========================================== byt-4.cpp --------- #include using namespace std; #include "student.h" template void byt(T& s1, T& s2) { T temp = s1; s1 = s2; s2 = temp; } int main() { Student a, b; a.las(); b.las(); byt(a, b); a.skriv(); b.skriv(); cout << "Ge första namnet: "; string forsta; getline(cin, forsta); cout << "Ge andra namnet: "; string andra; getline(cin, andra); byt(forsta, andra); cout << "Första namnet är nu: " << forsta << endl; cout << "Andra namnet är nu: " << andra << endl; } 4. main-funktionen: parametrar och returvärde ============================================= slumpa.cpp ---------- #include using namespace std; int main(int argc, char* argv[]) { int antal, sidor; if (argc == 1) { sidor = 6; antal = 1; } else if (argc == 2) { antal = atoi(argv[1]); sidor = 6; } else if (argc == 3) { antal = atoi(argv[1]); sidor = atoi(argv[2]); } else { cerr << "Skriv: slumpa [ ANTAL [ SIDOR ] ]" << cerr; return EXIT_FAILURE; } srand((unsigned int)time(NULL)); for (int i = 0; i < antal; ++i) cout << rand() % sidor + 1 << endl; } slumpa-2.cpp ------------ #include #include using namespace std; int main(int argc, char* argv[]) { int antal, sidor; if (argc == 1) { sidor = 6; antal = 1; } else if (argc == 2) { istringstream ss(argv[1]); ss >> antal; sidor = 6; } else if (argc == 3) { istringstream ss1(argv[1]); ss1 >> antal; istringstream ss2(argv[2]); ss2 >> sidor; } else { cerr << "Skriv: slumpa [ ANTAL [ SIDOR ] ]" << cerr; return EXIT_FAILURE; } srand((unsigned int)time(NULL)); for (int i = 0; i < antal; ++i) cout << rand() % sidor + 1 << endl; } slumpa-3.cpp ------------ #include #include using namespace std; int main(int argc, char* argv[]) { int sidor; if (argc == 1) { sidor = 6; } else if (argc == 2) { istringstream ss(argv[1]); ss >> sidor; } else { cerr << "Skriv: slumpa [ SIDOR ]" << endl; return -1; } srand((unsigned int)time(NULL)); return rand() % sidor + 1; } Körexempel ---------- > ./slumpa-3 > echo $status 2 > ./slumpa-3 > echo $status 4 > ./slumpa-3 10 6 Skriv: slumpa [ SIDOR ] > echo $status 255 Makefile -------- CC = gcc CCC = g++ CFLAGS += -Wall -std=c99 CPPFLAGS += -Wall LDLIBS += -lm byt-1: byt-1.o student.o person.o g++ -$(CPPFLAGS) -o byt-1 byt-1.o student.o person.o $(LDLIBS) byt-3: byt-3.o student.o person.o g++ -$(CPPFLAGS) -o byt-3 byt-3.o student.o person.o $(LDLIBS) byt-4: byt-4.o student.o person.o g++ -$(CPPFLAGS) -o byt-4 byt-4.o student.o person.o $(LDLIBS) Körexempel ---------- > make byt-1 g++ -Wall -c -o byt-1.o byt-1.cpp g++ -Wall -c -o student.o student.cpp g++ -Wall -c -o person.o person.cpp g++ --Wall -o byt-1 byt-1.o student.o person.o -lm