Lösningsförslag till datorövning 3 i Programmeringsmetodik ---------------------------------------------------------- Övning 3 A ---------- // Medlem.h #define MAX_NAMN 30 #define MAX_TELEFON 20 class Medlem { private: int medlemsnummer; char namn[MAX_NAMN + 1]; char telefon[MAX_TELEFON + 1]; public: void las(); void skriv(); }; // Medlem.cpp #include #include #include "Medlem.h" // Kanske en lite väl ambitiös lösning på strängläsningen, // men det blir lite krångligt om alla fall ska hanteras rätt. void las_rad_med_max_langd(char *plats, int maxlangd) { int antal = 0; int c; while ((c = getchar()) != '\n' && c != EOF && antal < maxlangd) { plats[antal++] = c; } plats[antal] = '\0'; if (c != '\n' && c != EOF) { while ((c = getchar()) != '\n' && c != EOF) ; } } void Medlem::las() { printf("Ange medlemsnummer: "); scanf("%d", &this->medlemsnummer); while (getchar() != '\n') ; printf("Ange namnet: "); las_rad_med_max_langd(this->namn, MAX_NAMN); printf("Ange telefonnumret: "); las_rad_med_max_langd(this->telefon, MAX_TELEFON); } void Medlem::skriv() { printf("Medlemsnummer; %d\n", this->medlemsnummer); printf("Namn: %s\n", this->namn); printf("Telefon: %s\n", this->telefon); } // Medlemstest.cpp #include #include "Medlem.h" int main() { Medlem m; m.las(); m.skriv(); return 0; } Övning 3 B ---------- // uppgift3b.cpp -- använder std::list #include #include #include #include "Medlem.h" int main() { std::list heltalen; std::list flyttalen; std::list medlemmarna; printf("Fyller listorna...\n"); heltalen.push_front(2); flyttalen.push_front(0.2); flyttalen.push_back(0.3); heltalen.push_back(3); heltalen.push_front(1); flyttalen.push_front(0.1); // Nu bör heltalslistan se ut så här: 1-2-3 // Nu bör flyttalslistan se ut så här: 0.1-0.2-0.3 printf("Skriv tre medlemmar!\n"); for (int i = 0; i < 3; ++i) { Medlem m; m.las(); medlemmarna.push_back(m); } printf("Längd på heltalslistan: %d\n", (int)heltalen.size()); printf("Längd på flyttalslistan: %d\n", (int)flyttalen.size()); printf("Längd på medlemslistan: %d\n", (int)medlemmarna.size()); // "(int)" eftersom "size" egentligen returnerar en "size_t", inte en "int" printf("Tömmer listorna...\n"); heltalen.pop_front(); heltalen.pop_back(); flyttalen.pop_back(); flyttalen.pop_front(); heltalen.pop_back(); flyttalen.pop_front(); medlemmarna.clear(); printf("Längd på heltalslistan: %d\n", (int)heltalen.size()); printf("Längd på flyttalslistan: %d\n", (int)flyttalen.size()); printf("Längd på medlemslistan: %d\n", (int)medlemmarna.size()); // "(int)" eftersom "size" egentligen returnerar en "size_t", inte en "int" // Den här är egentligen redan tom. Vad händer nu? heltalen.pop_front(); return 0; } Övning 3 D ---------- // uppgift3d.cpp #include #include #include int main() { std::list flyttalen; printf("Fyller listan...\n"); flyttalen.push_back(0.1); flyttalen.push_back(0.2); flyttalen.push_back(0.3); // Nu bör flyttalslistan se ut så här: 0.1-0.2-0.3 printf("Visar listan: "); std::list::iterator i = flyttalen.begin(); std::list::iterator end = flyttalen.end(); while (i != end) { printf(" %f", *i); ++i; } printf("\n"); return 0; } Övning 3 E ---------- // uppgift3e.cpp #include #include #include int main() { std::list talen; int talet; printf("Mata in heltal. Avsluta med ett negativt tal.\n"); printf("Skriv ett tal: "); scanf("%d", &talet); while (talet >= 0) { talen.push_front(talet); printf("Skriv ett tal: "); scanf("%d", &talet); } printf("Tack.\n"); printf("Skriv nu ett tal att söka efter: "); int wanted; scanf("%d", &wanted); int antal = 0; std::list::iterator i = talen.begin(); std::list::iterator end = talen.end(); while (i != end) { if (*i == wanted) ++antal; ++i; } printf("Antal förekomster av talet %d i listan: %d\n", wanted, antal); return 0; }