Lösningsförslag till datorövning 4, Programmering C. /* uppg4a.c */ #include #include int main() { int index, vektor[4]; /* Loopa framlänges, läs tal*/ for (index = 0; index < 4; index++) { printf("Ge vektor[%d]: ", index); scanf("%d", &vektor[index]); } /* Loopa baklänges, skriv tal */ for (index = 3; index >= 0; index--) { printf("%5d", vektor[index]); } printf("\n"); getch(); return 0; } /* uppg4b.c */ #include #include int main() { int index; double vektor[5], min, max, summa; /* Loopa läs tal*/ for (index = 0; index < 5; index++) { printf("Ge vektor[%d]: ", index); scanf("%lf", &vektor[index]); } /* Sätt startvärden för variabler */ min = vektor[0]; max = vektor[0]; summa = vektor[0]; /* Loopa igenom resten av vektorn */ for (index = 1; index < 5; index++) { summa = summa + vektor[index]; if ( min > vektor[index] ) { min = vektor[index]; } else if ( max < vektor[index] ) { max = vektor[index]; } } printf("Största = %.2f\nMinsta = %.2f\nSumma = %.2f\n", max, min, summa); getch(); return 0; } /* uppg4c.c */ #include #include /* slumpa */ #include /* starta slumpa */ #include #define ANTAL 100 int main() { int index, min_index, right, temp; int vektor[ANTAL]; srand((unsigned)time(NULL)); /* Slumpa ANTAL stycken tresiffriga tal, och skriv 10 tal per rad */ for (index = 0; index < ANTAL; index++) { vektor[index] = 100 + rand() % 900; if ( index % 10 == 0 ) { /* Ordna ny rad */ printf("\n"); } printf("%5d", vektor[index]); } /* Sortera vektorn */ for (index = 0; index < ANTAL - 1; index++) { /* Sök det minsta bland de till höger om index */ min_index = index; for (right = index + 1; right < ANTAL; right++) { if ( vektor[right] < vektor[min_index] ) { min_index = right; } } /* Byt så att minsta hamnar vid index. OM det behövs */ if ( min_index > index ) { temp = vektor[min_index]; vektor[min_index] = vektor[index]; vektor[index] = temp; } } /* Skriv ut vektorn, 10 tal per rad */ printf("\n\nSorterad vektor:\n"); for (index = 0; index < ANTAL; index++) { if ( index % 10 == 0 ) { /* Ordna ny rad */ printf("\n"); } printf("%5d", vektor[index]); } /* Radslutstecken även efter sista raden */ printf("\n"); getch(); return 0; } /* uppg4d.c */ #include #include int main() { char buf[80 + 1]; int index; printf("Skriv sträng med ord: "); gets(buf); /* Loopa till strängslut */ for (index = 0; buf[index] != '\0'; index++) { if ( buf[index] == ' ' ) { printf("\n"); } else { printf("%c", buf[index]); } } printf("\n"); getch(); return 0; } /* uppg4e.c */ #include #include /* strlen-funktionen */ #include int main() { char buf[80]; int index; printf("Skriv en sträng: "); gets(buf); /* Loopa igenom hela strängen baklänges */ for (index = strlen(buf) - 1; index >= 0; index--) { printf("%c", buf[index]); } printf("\n"); getch(); return 0; } /* uppg4f.c */ #include #include int main() { struct medlem_s { int nr; char namn[40 + 1]; int telnr; } medlem; printf("Skriv namn: "); gets(medlem.namn); printf("Skriv nr och telnr: "); scanf("%d%d", &medlem.nr, &medlem.telnr); /* Skriv ut det inlästa */ printf("Medlemsnummer: %d\nNamn: %s\nTelefonnummer: %d\n", medlem.nr, medlem.namn, medlem.telnr); getch(); return 0; } /* uppg4g.c */ #include #include int main() { struct rtal { int taljare; int namnare; } tal1, tal2, summa; char tecken; printf("Skriv bråktal a / b: "); scanf("%d%c%d", &tal1.taljare, &tecken, &tal1.namnare); printf("Skriv annat bråktal a/b: "); scanf("%d%c%d", &tal2.taljare, &tecken, &tal2.namnare); /* Beräkna summabråk, skriv ut */ summa.taljare = tal1.taljare * tal2.namnare + tal2.taljare * tal1.namnare; summa.namnare = tal1.namnare * tal2.namnare; printf("%d/%d + %d/%d = %d/%d\n", tal1.taljare, tal1.namnare, tal2.taljare, tal2.namnare, summa.taljare, summa.namnare); getch(); return 0; } /* uppg4h.c */ #include #include int main() { double diametrar[] = {1.80, 2.15, 2.50, 2.80, 3.15, 3.45, 3.80, 4.15, 4.50, 4.80, 5.45, 6.15, 6.80, 7.50, 8.15}; int index; double diameter; printf ( "Skriv en diameter: "); scanf("%lf", &diameter); /* Sök index med närmast större diameter */ index = 0; while ( (index < 15) && (diameter >= diametrar[index]) ) { index = index + 1; } if ( index == 15 ) { printf("Det fanns ingen skruv med större diameter\n"); } else { printf("%.2f är närmast större skruvdiameter.\n", diametrar[index]); } getch(); return 0; } /* uppg4i.c */ #include #include int main() { struct medlem_s { int nr; char namn[40 + 1]; int telnr; } medlemmar[10]; int antal, medlemsnr, index; /* while-loop som upprepat läser poster, avslutas då 10 poster lästs in ELLER om medlemsnr 0 läses in */ antal = 0; printf("Skriv nr (0 avslutar): "); scanf("%d", &medlemmar[antal].nr); while ( ( antal < 10 ) && ( medlemmar[antal].nr != 0 ) ) { printf("Skriv telnr: "); scanf("%d", &medlemmar[antal].telnr); getchar(); /* rensa undan ENTER-tecknet */ printf("Skriv namn: "); gets(medlemmar[antal].namn); /* Läs bara in nästa medlemsnr om det finns plats */ antal = antal + 1; if ( antal < 10 ) { printf("Skriv nr (0 avslutar): "); scanf("%d", &medlemmar[antal].nr); } } /* Läs in medlemsnummer, men bara om det finns poster */ if ( antal > 0 ) { printf("\nGe ett medlemsnummer: "); scanf("%d", &medlemsnr); printf("\n"); /* Sök posten med medlemsnumret */ index = 0; while ( ( index < antal ) && ( medlemmar[index].nr != medlemsnr ) ) { index = index + 1; } /* Skriv postdata om hittad */ if ( index < antal ) { printf(" Nr: %-5d Namn: %-50s%d\n", medlemmar[index].nr, medlemmar[index].namn, medlemmar[index].telnr); } else { printf(" Det finns ingen medlem med nr: %d\n", medlemsnr); } } else { printf("Det blev inga poster inlagda.\n"); } getch(); return 0; } /* uppg4j.c */ #include #include #include /* strlen */ int main() { char buf[10]; int index, faktor, summa; printf("Skriv sifror: "); gets(buf); /* Sökt loop-lösning */ summa = 0; faktor = 1; for (index = strlen(buf) - 1; index >= 0; index-- ) { summa = summa + ( buf[index] - '0' )*faktor; faktor = faktor * 10; } puts("Efter looplösning:"); printf("2 * %s = %d\n", buf, 2*summa); /* Enklare, läs från strängen som från tangentbordet */ sscanf(buf, "%d", &summa); puts("Efter sscanf:"); printf("2 * %s = %d\n", buf, 2*summa); getch(); return 0; } /* uppg4k.c */ #include #include #include #include int main() { int nytt_nr, antal, index, right; int rad[7]; /* Logiska variabler, utnyttjas för att hejda loop som försöker stoppa in nytt_nr i rad */ int nr_fanns_redan, instoppat; srand((unsigned)time(NULL)); /* Slumpa första */ rad[0] = 1 + rand() % 35; antal = 1; /* Slumpa resten, håll rad sorterad */ while ( antal < 7 ) { nytt_nr = 1 + rand() % 35; /* Försök stoppa in nytt_nr */ index = 0; nr_fanns_redan = 0; instoppat = 0; while ( !( instoppat || nr_fanns_redan ) ) { if ( index == antal ) { /* OK, nytt_nr ska ligga sist */ rad[antal] = nytt_nr; instoppat = 1; } else { nr_fanns_redan = ( rad[index] == nytt_nr); if ( !nr_fanns_redan ) { if ( nytt_nr < rad[index] ) { /* Ok stoppa in här */ /* Flytta först allt öster om index 1 steg österut */ for (right = antal; right > index; right--) { rad[right] = rad[right - 1]; } rad[index] = nytt_nr; instoppat = 1; } else { /* Kolla nästa index */ index = index + 1; } } } } if ( instoppat ) { /* OK, fanns inte förut*/ antal = antal + 1; } } /* Skriv ut raden */ for (index = 0; index < 7; index++) { printf("%5d", rad[index]); } printf("\n"); getch(); return 0; } /* uppg4k.c -- alternativ lösning */ #include #include #include #include int main() { int tagna_tal[36]; /* Vi utnyttjar 1..35 */ int antal; int tal; for (tal = 1; tal <= 35; ++tal) tagna_tal[tal] = 0; srand((unsigned)time(NULL)); for (antal = 0; antal < 7; ++antal) { do { tal = 1 + rand() % 35; } while (tagna_tal[tal] == 1); tagna_tal[tal] = 1; } for (tal = 1; tal <= 35; ++tal) { if (tagna_tal[tal] == 1) { printf("%5d", tal); } } printf("\n"); getch(); return 0; }