Lösningsförslag till datorövning 2 i Programmeringsmetodik ---------------------------------------------------------- Övning 2 A ---------- // ovning2a.c #include int main(void) { int tal; int *talpekare; printf("Skriv ett heltal: "); scanf("%d", &tal); // Sätt variabeln talpekare att peka på variabeln ta talpekare = &tal; // Skriv ut det som talpekare pekar på printf("Talet: %d\n", *talpekare); return 0; } Övning 2 B ---------- // ovning2b.c // Kräver en modernare C-dialekt än den i Visual Studio 2010 #include void medel_och_spridning(double talarray[], int antal, double *medelp, double *spridningp) { double min = talarray[0]; double max = talarray[0]; double summa = 0; for (int i = 0; i < antal; ++i) { if (talarray[i] < min) min = talarray[i]; if (talarray[i] > max) max = talarray[i]; summa += talarray[i]; } *medelp = summa / antal; *spridningp = max - min; } int main(void) { double medel; double spridning; double talarray[] = {2.3, 1.2, 3.4, 5.6, 4.5}; medel_och_spridning(talarray, 5, &medel, &spridning); printf("Medel = %.2f\n", medel); printf("Spridning = %.2f\n", spridning); return 0; } Övning 2 C ---------- // ovning2c.c #include // Innehåller deklaration av malloc #include int main(void) { double *talpekare; talpekare = malloc(sizeof(double)); printf("Skriv ett reelt tal: "); scanf("%lf", talpekare); // Eller: &*talpekare printf("Talet gånger 3: %f\n", *talpekare * 3); free(talpekare); return 0; } Övning 2 D ---------- // ovning2d.c // Kräver en modernare C-dialekt än den i Visual Studio 2010 #include // Innehåller deklaration av malloc #include int main(void) { char *fornamn = malloc(30 + 1); char *efternamn = malloc(30 + 1); // Läs in namnen printf("Förnamn: "); fgets(fornamn, 30 + 1, stdin); printf("Efternamn: "); fgets(efternamn, 30 + 1, stdin); // En varning: Nu innehåller namnvariablerna radslutstecken! // Byt innehåll i pekarvariablerna, så de pekar tvärtom char* temp = fornamn; fornamn = efternamn; efternamn = temp; // Skriv ut strängarna -- tänk på att radslutstecknen ligger kvar! printf("Förnamn: %s", fornamn); printf("Efternamn: %s", efternamn); // Frigör minnet free(efternamn); free(fornamn); return 0; } Övning 2 E ---------- // ovning2e.c // Kräver en modernare C-dialekt än den i Visual Studio 2010 // Funkar inte i C++. Övning 1: Varför? Övning 2: Fixa! #include #include struct Measure { int nr; double x; struct Measure *next; }; int main(void) { struct Measure *first = NULL; int nr; // Läs första mätvärdesnumret printf("Mätvärdesnummer: "); scanf("%d", &nr); while (nr != 0) { // Allokera minne struct Measure *new = malloc(sizeof(struct Measure)); // Lägg in värden i posten new->nr = nr; printf("Ange mätvärdet X: "); scanf("%lf", &new->x); new->next = first; // Sätt first att peka på den nyss skapade posten first = new; // Läs nästa mätvärdesnummer, så vi vet om vi ska fortsätta printf("Mätvärdesnummer: "); scanf("%d", &nr); } // while // Skriv ut alla mätvärdena, räkna, och frigör minnet int antal = 0; double summa = 0; struct Measure *this = first; while (this != NULL) { printf("Nr %d, X = %f\n", this->nr, this->x); antal++; summa += this->x; struct Measure *doomed = this; this = this->next; free(doomed); } // Skriv ut medlet printf("Medel: %f\n", summa / antal); return 0; } Övning 2 F ---------- // ovning2f.c // Kräver en modernare C-dialekt än den i Visual Studio 2010 // Funkar inte i C++. Övning 1: Varför? Övning 2: Fixa! #include #include struct Measure { int nr; double x; struct Measure *next; }; double search(int wanted_nr, struct Measure* list) { struct Measure *this = list; // Man kan använda "list" i stället while (this != NULL) { if (this->nr == wanted_nr) return this->x; this = this->next; } return -1.0; // Ja, vad ska vi göra här egentligen? } // search int main(void) { struct Measure *first = NULL; int nr; FILE* tsin = fopen("xindata.txt", "r"); if (tsin == NULL) { fprintf(stderr, "Kunde inte öppna filen xindata.txt\n"); exit(EXIT_FAILURE); } // Läs första mätvärdesnumret fscanf(tsin, "%d", &nr); while (nr != 0) { // Allokera minne struct Measure *new = malloc(sizeof(struct Measure)); // Lägg in värden i posten new->nr = nr; fscanf(tsin, "%lf", &new->x); new->next = first; // Sätt first att peka på den nyss skapade posten first = new; // Läs nästa mätvärdesnummer, så vi vet om vi ska fortsätta fscanf(tsin, "%d", &nr); } // while int wanted_nr; // Läs första mätvärdesnumret printf("Ange sökt mätvärdesnummer: "); scanf("%d", &wanted_nr); double the_x = search(wanted_nr, first); printf("X = %f\n", the_x); // Frigör minnet struct Measure *this = first; while (this != NULL) { struct Measure *doomed = this; this = this->next; free(doomed); } return 0; } // main