Lösningsförslag till datorövning 3 i Programmeringsmetodik /* Uppg3a.c*/ /* tecklifo.c */ #include #include "lifo.h" /* typedef char datatyp */ int main() { char ch; linktyp *lp = NULL; /* läs tecken och stoppa in dem på stacken */ printf("Skriv en text (avsluta med RETURN) : "); ch = getchar(); while (ch != '\n') { push(&lp, ch); ch = getchar(); } /* Töm stacken och skriv ut tecknen */ while (lp != NULL) { ch = pop(&lp); putchar(ch); } return 0; } /* Uppg3b.c */ /* tallifo.c */ #include #include "lifo.h" /* typedef int datatyp */ int main() { int tal; linktyp *lp = NULL; FILE *tsin; /* läs från fil och stoppa in på stack */ tsin = fopen("tal.txt", "r"); while (fscanf(tsin, "%d", &tal) != EOF) push(&lp, tal); /* hämta från stack och skriv ut på skärm */ while (lp != NULL) { tal = pop(&lp); printf("%d ", tal); } printf("\n"); return 0; } /* Uppg3c.c */ /* realfifo.c */ #include #include "fifo.h" /* typedef float datatyp */ int main() { float x, sum = 0.0, medel; int nr = 0; linktyp *fp = NULL; /* läs, summera och stoppa in i kön */ printf("Reellt tal (avslut med 0) : "); scanf("%f", &x); while (x != 0.0) { sum += x; nr++; infifo(&fp, x); printf("Reellt tal (avslut med 0) : "); scanf("%f", &x); } /* beräkna medel */ medel = sum / nr; /* Töm kön, jfr med medel occch skriv ut avvikande tal */ while (fp != NULL) { x = utfifo(&fp); if ( x < 0.90*medel || x > 1.10*medel) printf("%f ", x); } printf("\n"); return 0; } /* Uppg3d.c */ /* realtwol.c */ #include #include "twolist.h" /* typedef float datatyp */ int main() { float x; FILE *tsin; headtyp *hp; linktyp *lp; /* läs från fil till lista */ newhead(&hp); tsin = fopen("retal.txt","r"); while(fscanf(tsin, "%f", &x) != EOF) { newlink(&lp); putlink(x,lp); inlast(lp, hp); } /* skriv listan */ lp = firstlink(hp); while (lp != NULL) { x = getlink(lp); printf("%f ", x); lp = succlink(lp); } /* Töm listan */ elimhead(&hp); return 0; } /* Uppg3e.c */ /* persreg.c */ #include #include "telpers.h" int main() { person p; FILE *bsinut; /* läs data till fil */ bsinut = fopen("telreg.dat", "ab+"); while (las_person(&p)) fwrite(&p, sizeof(person), 1, bsinut); /* skriv data från fil */ rewind(bsinut); fread(&p, sizeof(person), 1, bsinut); while (!feof(bsinut)) { printf("\n"); skriv_person(p); fread(&p, sizeof(person), 1, bsinut); } fclose(bsinut); return 0; } /* telpers.h */ typedef struct { char namn[31]; char tel[15]; } person; int las_person(person *pp); void skriv_person(person p); /* telpers.c */ #include #include "telpers.h" int las_person(person *pp) { printf("Namn : "); gets(pp->namn); if(pp->namn[0] =='\0') return 0; printf("Tel : "); gets(pp->tel); return 1; } void skriv_person(person p) { printf("Namn : %s\n", p.namn); printf("Tel : %s\n", p.tel); } /*Uppg3f.c */ /* perstwol.c */ #include "twolist.h" /* #include "telpers.h" typedef person datatyp; */ #include int main() { FILE *bsin; headtyp *hp; linktyp *lp; person p; /* läs från fil till lista */ bsin = fopen("telreg.dat", "rb"); newhead(&hp); fread(&p, sizeof(person), 1, bsin); while (!feof(bsin)) { newlink(&lp); putlink(p, lp); inlast(lp, hp); fread(&p, sizeof(person), 1, bsin); } fclose(bsin); /* skriv från lista */ lp = firstlink(hp); while (lp != NULL) { p = getlink(lp); skriv_person(p); lp = succlink(lp); } elimhead(&hp); return 0; } /* Uppg3g.c */ /* perstwol.c */ #include "twolist.h" /* #include "telpers.h" typedef person datatyp; */ #include #include int main() { FILE *bsin; headtyp *hp; linktyp *lp; person p; char soknamn[31]; int hittad = 0; /* läs från fil till lista */ bsin = fopen("telreg.dat", "rb"); newhead(&hp); fread(&p, sizeof(person), 1, bsin); while (!feof(bsin)) { newlink(&lp); putlink(p, lp); inlast(lp, hp); fread(&p, sizeof(person), 1, bsin); } fclose(bsin); /* plocka bort från lista */ printf("Sökt namn : "); gets(soknamn); lp = firstlink(hp); while (lp != NULL && !hittad) { p = getlink(lp); if (stricmp(soknamn, p.namn)==0) { hittad = 1; elimlink(&lp); } else lp = succlink(lp); } /* skriv från lista */ lp = firstlink(hp); while (lp != NULL) { p = getlink(lp); skriv_person(p); lp = succlink(lp); } elimhead(&hp); return 0; } /* Uppg3h.c */ /* perstwol.c */ #include "twolist.h" /* #include "telpers.h" typedef person datatyp; */ #include #include int main() { FILE *bsin; headtyp *hp; linktyp *lp; person p; char soknamn[31]; int hittad = 0; /* läs från fil till lista */ bsin = fopen("telreg.dat", "rb"); newhead(&hp); fread(&p, sizeof(person), 1, bsin); while (!feof(bsin)) { newlink(&lp); putlink(p, lp); inlast(lp, hp); fread(&p, sizeof(person), 1, bsin); } fclose(bsin); /* uppdatera tel för sökt person*/ printf("Sökt namn : "); gets(soknamn); lp = firstlink(hp); while (lp != NULL && !hittad) { p = getlink(lp); if (stricmp(soknamn, p.namn)==0) { hittad = 1; printf("Nytt telnr : "); gets(p.tel); putlink(p, lp); } else lp = succlink(lp); } /* skriv från lista */ lp = firstlink(hp); while (lp != NULL) { p = getlink(lp); skriv_person(p); lp = succlink(lp); } elimhead(&hp); return 0; } /* Uppg3i.c */ /* perstwol.c */ #include "twolist.h" /* #include "telpers.h" typedef person datatyp; */ #include #include int main() { FILE *bsin; headtyp *hp; linktyp *lp; person p; char sokrikt[10]; int hittad = 0, nyrikt = 0; /* läs från fil till lista */ bsin = fopen("telreg.dat", "rb"); newhead(&hp); fread(&p, sizeof(person), 1, bsin); while (!feof(bsin)) { newlink(&lp); putlink(p, lp); insort(lp, hp, jfr_personer); fread(&p, sizeof(person), 1, bsin); } fclose(bsin); /* sök efter personer med samma riktnummer*/ printf("Sökt riktnummer : "); gets(sokrikt); lp = firstlink(hp); while (lp != NULL && !hittad) { p = getlink(lp); if (strncmp(sokrikt, p.tel, strlen(sokrikt))==0) { hittad = 1; } else lp = succlink(lp); } /* skriv alla personer med sökt riktnr */ while (lp != NULL && !nyrikt) { skriv_person(p); lp = succlink(lp); if (lp != NULL) { p = getlink(lp); if (strncmp(sokrikt, p.tel, strlen(sokrikt)) != 0) nyrikt = 1; } } elimhead(&hp); return 0; } /* telpers.h */ typedef struct { char namn[31]; char tel[15]; } person; int las_person(person *pp); void skriv_person(person p); int jfr_personer(person p1, person p2); /* telpers.c */ #include #include #include "telpers.h" int las_person(person *pp) { printf("Namn : "); gets(pp->namn); if(pp->namn[0] =='\0') return 0; printf("Tel : "); gets(pp->tel); return 1; } void skriv_person(person p) { printf("Namn : %s\n", p.namn); printf("Tel : %s\n", p.tel); } int jfr_personer(person p1, person p2) { return strcmp(p1.tel, p2.tel) < 0; }