hulp nodig...

Status
Niet open voor verdere reacties.

dennisvz

Gebruiker
Lid geworden
19 okt 2011
Berichten
5
Beste Mensen,

Ik moet een C programmatje schrijven die de regels van een tekstfile op lengte sorteert...
Maar jullie begrijpen het al ik ben hier niet zo'n ster in....

Ik heb dit...
[cpp]
#include <stdio.h>
#include <stdlib.h>
#define RLE 255

int main (int argc, char *argv [])




{
char regel [RLE];
FILE *test;
int i=0;
char zin[50][RLE];
int lengte[RLE];
int x;

test = fopen (argv [1], "r");

if (test == NULL) // foutmelding
{
printf ("leesfout\n");
return -1;
} // if

while (fgets (regel, RLE, test) != NULL)
{
strcpy(zin, regel);
lengte=strlen(zin);
i++;

}
printf("\nDe zinnen uit de tekstfile zijn in gelezen en zijn hieronder op \nlengte gesorteerd, ze worden daarna in een tekstfile weggeschreven.\n\n\n");
[/cpp]
Wat ik nou met doen is de tekst op lengte sorteren, afdrukken op het scherm en wegschrijven naar een file...
..
 
Laatst bewerkt door een moderator:
[CPP]#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
bool Minder_Lang (const string& s1, const string& s2)
{
return s1.length() < s2.length();
}

int main () {
string line;
vector<string> lines;

ifstream myfile ("test.txt");
if (myfile.is_open())
{
while ( myfile.good() )
{
getline(myfile,line);
lines.push_back(line);
}
myfile.close();
}
else cout << "Kan bestand niet openen\n";

sort (lines.begin(), lines.end(),
Minder_Lang);
int i;
for (i=0;i<lines.size() ;i++)
cout << lines <<endl;

system("pause");
return 0;
}[/CPP]

:d

[edit]Is dit by the way huiswerk?[/edit]
 
Laatst bewerkt:
Hoi ja dit is inderdaad huiswerk, maar ik doe dit in de avond dus ik heb niet altijd tijd om alle vakken uit te pluizen. Ik heb nu even herfstvakantie..

Maar dit is C++ zeker? Ik ben met C bezig.

Groet

[CPP]#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
bool Minder_Lang (const string& s1, const string& s2)
{
return s1.length() < s2.length();
}

int main () {
string line;
vector<string> lines;

ifstream myfile ("test.txt");
if (myfile.is_open())
{
while ( myfile.good() )
{
getline(myfile,line);
lines.push_back(line);
}
myfile.close();
}
else cout << "Kan bestand niet openen\n";

sort (lines.begin(), lines.end(),
Minder_Lang);
int i;
for (i=0;i<lines.size() ;i++)
cout << lines <<endl;

system("pause");
return 0;
}[/CPP]

:d

[edit]Is dit by the way huiswerk?[/edit]
 
"Maar jullie begrijpen het al ik ben hier niet zo'n ster in...."

Wat heb je gedaan om C te leren? Zelf kan ik geen C, wel PHP maar dit ziet er vrij basis uit. En dan vraag ik me af in hoeverre je C kunt programmeren??
Deze trouwens al doorgelezen:
Helpmij en huiswerkvragen
 
Dit voorbeeld was in C++.

Volgens mij is er voor je probleem vrij veel te vinden op het internet, of niet? :confused:
 
Een mogelijke oplossing in C:

[cpp]
int Compare(const void *str1, const void *str2)
{
return (strlen(*(char **)str1) - strlen(*(char **)str2));
}

int main()
{

// < lees regels in >
qsort(lines, numberOfLines, sizeof(char *), Compare);

return 0;
}
[/cpp]
 
Hallo Cod_NL

Bedankt voor de info, ik was me ook aan het verdiepen in de fsort functie.
Ik heb de lengte van de zinnen en de zinnen afzonderlijk in een array gezet.
Ook heb ik er een counter aan vast gehangen aan hoeveel zinnen het programmaa heeft gescand.

Kan je voor mij info erachter zetten via //
Ik zie dat je veel gebruik maakt van pionters voor mij is dat nog niet duidelijk.
Alvast bedankt!

Groet


Een mogelijke oplossing in C:

[cpp]
int Compare(const void *str1, const void *str2)
{
return (strlen(*(char **)str1) - strlen(*(char **)str2));
}

int main()
{

// < lees regels in >
qsort(lines, numberOfLines, sizeof(char *), Compare);

return 0;
}
[/cpp]
 
Ik ben nu zover alleen hij loopt nu vast, ik denk bij de compare functie in return naar de array van zin. Alleen ik weet niet wat er anders moet.



[cpp]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RLE 255



int Compare(const void *str1, const void *str2)
{

return (strlen(*(char **)str1) - strlen(*(char **)str2));
}


int main (int argc, char *argv[])
{
char regel[RLE];
FILE *test;
char teller1=0;
int i=0;
char zin[50][RLE];
int lengte[RLE];
int x;

test = fopen (argv [1], "r");

if (test == NULL) // foutmelding
{
printf ("leesfout\n");
return -1;
}

while (fgets (regel, RLE, test) != NULL)
{
strcpy(zin, regel);
lengte=strlen(zin);
i++;
teller1++;
}
printf("\nEr staat %i zinnen in de file", teller1);
printf("\n\nDe zinnen uit de tekstfile zijn in gelezen en zijn hieronder op \nlengte gesorteerd");

qsort(zin, teller1, sizeof(char *), Compare);



int k=0;
do
{
puts(zin[k]); // Kopieren naar beeldscherm
k++;
}
while (lengte[k]!=0);

return 0;
}[/cpp]
 
Laatst bewerkt door een moderator:
het is nu gelukt, bedankt voor de info..

[cpp]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RLE 255


int vergelijken(const void *string1, const void *string2) //Functie buiten main, vergelijking van de strings
{
return (strlen((char *)string2) - strlen((char *)string1)); //Teruggave van de functie.
}


int main (int argc, char *argv[])
{
FILE *tekst; //Identifier file.
char regel[RLE]; //Array regel.
char teller=0; //Teller van de regels.
char zin[RLE][RLE];
int lengte[RLE];
int x;
int i=0;

tekst = fopen (argv [1], "r");

if (tekst == NULL) //Foutmelding bij inhoud van bestand
{
printf ("leesfout\n"); //Tekst bij foutmelding
return 0;
}

while (fgets (regel, RLE, tekst) != NULL) //Inlezen van de tekst terwijl tot dat er geen tekst meer is.
{
strcpy(zin, regel); //Kopiëren van de zin.
lengte=strlen(zin); //Bepalen van de lengte van de zin.
i++; //Deze counter geeft een waarde voor het opslaan van de zinnen.
teller++; //Teller van de regels.
}
fclose (tekst); //Sluiten van de gelzen tekstfile
printf("\nEr staat %i regels in de file\n\n", teller);
printf("De regels uit de tekstfile zijn in gelezen en zijn hieronder op lengte\ngesorteerd, ook worden ze weggeschreven in 'uitvoerfile.txt' in de map\nbij de oorspronkelijke tekst.\n\n\n");

qsort(zin, teller, sizeof(*zin), vergelijken); //De functie voor het vergelijken van de zinnen.



int k=0; //teller voor het printen van de zinnen naar het scherm en uitvoerfile.

do
{
puts(zin[k]); //Presenteren op beeldscherm
tekst = fopen ("uitvoerfile.txt","a"); //Openen van nieuwe .txt file.
fputs (zin[k], tekst); //Schrijven naar nieuwe file.
close (tekst); //Sluiten van .txt bestand
k++; //Counter voor het plaatsen van de zinnen in de file.
}
while (lengte[k]!=0); //Zolang de lengte > is dan 0.


return 0;
}[/cpp]
 
Laatst bewerkt door een moderator:
Graag code tags gebruiken als je lange codes plaatst. Ik heb nu [cpp] gebruik in jou berichten.
 
@dennisvz: wanneer het invoerbestand te groot is zal je programma wel crashen. Verder is in je huidige versie een lege regel ook een regel en tel je het new-line character ook mee als teken, ik weet niet of dat ook de bedoeling is?

Ook zou je gewoon zelf een sorteer functie kunnen schrijven. Iets als:


[cpp]
#include <stdio.h>
#include <stdlib.h>

const int RLE = 255;

void Sort(char lines[][RLE], int length)
{
int sorted, i;

do
{
sorted = 1;

for (i = 1; i < length; ++i)
{
int len1 = strlen(lines[i-1]);
int len2 = strlen(lines);

if (len1 > len2)
{
char temp[RLE];

strncpy(temp, lines[i-1], len1 + 1);
strncpy(lines[i-1], lines, len2 + 1);
strncpy(lines, temp, len1 + 1);

sorted = 0;
}
}
}
while (sorted == 0);
}

int main(int argc, char **argv)
{
if (argc != 2)
{
// laat zien hoe het programma gebruikt moet worden
return -1;
}

const char *filename = argv[1];
FILE *inputFile = fopen(filename, "r");

if (inputFile == NULL)
{
perror(filename);
return -1;
}

const int MAX_LINE_INDEX = 50;

char lines[MAX_LINE_INDEX][RLE], line[RLE];
int index = 0, i, len;

while (fgets(line, RLE, inputFile) && index < MAX_LINE_INDEX)
{
len = strlen(line);

for (i = 0; i < len; ++i)
if (line == '\n')
line = '\0', --len;

if (len == 0)
continue;

strncpy(lines[index++], line, len + 1);
}

fclose(inputFile);

// toon info

Sort(lines, index);

FILE *outputFile = fopen("uitvoerfile.txt", "w");

for (i = 0; i < index; ++i)
{
printf("%i. %s\n", i + 1, lines);
fputs(lines, outputFile);
putc('\n', outputFile);
}

fclose(outputFile);

return 0;
}
[/cpp]
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan