07. oktober 2003 - 18:40Der er
20 kommentarer og 1 løsning
Sortere fil indhold
Hej,
I mit forsøg på at lære C (ANSI C) er jeg stødt på et problem med at sortere indholdet af en fil alfabetisk. Jeg går ud fra at jeg skal have læst indholdet af filen ned i et array og derefter sortere arrayet. Det sidste kan formentlig også godt lade sig gøre, men jeg kan ikke få smidt indholdet ned i et array. Indholdet af filen ser f.eks. således ud:
Name: Allan Grade: 3 Name: Mette Grade: 6 Name: Thomas Grade: 4 Name: Jacob Grade: 2
Det skal altså sorteres alfabetisk så indholdet af filen kommer til at se således ud istedet:
Name: Allan Grade: 3 Name: Mette Grade: 6 Name: Jacob Grade: 2 Name: Thomas Grade: 4
Så 200 point til vedkommende der kan kode en løsning i ANSI C og kommentere den så jeg også kan forstå hvad der sker.
Hvad mangler du forklaring til: - brug af array af struct - indlæsning af linier fra fil - parsning af linie - quick sort (ufffff) - udskrivning af linier til fil ?
Jo du har lavet den en gang, bortset fra at denne gang skal der sorteres alfabetisk :)
Mht. forklaring. Jeg er helt med på hvordan du åbner filen, men er lidt i tvivl om hvordan resten fungerer. Ud fra ovenstående kan jeg dog godt se hvordan du skriver linierne til filen, men resten må du meget meget gerne forklare. Håber ikke det er alt for meget at bede om.
fp = fopen("list.dat", "r"); /* åben fil */ n=0; while(!feof(fp)) { /* så længe vi ikke har nået enden af filen */ if(fgets(line,sizeof(line),fp)) /* læs en linie */ { p1 = strstr(line,KEY1) + strlen(KEY1); /* find slut på "Name:" */ while(*p1==' ') p1++; /* skip eventuelle blanke således at vi er ved start af navn */ p2 = strchr(p1,' '); /* find mellemrum efter navn */ data[n].name = (char *)malloc(p2-p1); /* kopier navn udfra start og slut */ strncpy(data[n].name,p1,p2-p1); data[n].name[p2-p1] = '\0'; data[n].grade = atoi(strstr(line,KEY2)+strlen(KEY2)); /* find tart på karakter og konverter til int */ n++; } } fclose(fp); /* luk filen */
Den bygger på et princip om at man: - vælger en element - så putter man alle dem mindre på den ene side og alle dem større på den anden side - så sorterer man de 2 halvdele på samme måde
Der er 2 grunde til at jeg bruger en custom quick sort: - den er hurtigere på simple data typer - jeg ved at det ikke er første eller sidste element der bliver brugt pivot element (jeg er ikke sikker på at ANSI C definerer at det ikke være tilfældet)
Men i dette tilfælde er det måske upædagogisk fordi quick sort ikke bare lig er noget man forstå.
Beklager jeg ikke har svaret tidligere (har haft frygteligt meget om ørene), men ja, det ser ud til at give mening. Eneste lille spørgsmål er din brug af struct, hvad er det helt præcist du bruger den til?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.