Crossreferenzliste



  • Moinsen,

    wir sollen in der Schule eine Crossreferenzliste erstellen. Sie soll ein Programm ein lesen, alle Wörter aus einer Textdatei heraussuchen und sie wieder geben und die Zeilennummer wiedergeben, wenn das Wort mehrmals auftaucht, dann soll die Zeilennummer, zu den anderen Zeilennummern hintereinander stehen.
    Beispiel:
    Textdatei ->
    "Dies ist eine Textdatei
    "

    Unser Lehrer hat es uns überlassen, ob wir dieses Problem mit verketteten Listen lösen oder mit Arrays. Da ich aber keine verketteten Listen kann, weil es einfach nicht in mein Köpfchen möchte, entschied ich mich für Arrays

    Das Programm ist insoweit fertig, das er mir alle Wörter einzelnd untereinander ausgibt, diese soll er in eine Funktion wortEinfuegen(); schreiben.

    Dann kamen meine Überlegungen, das ganze in einem Structarray ablaufen zulassen, aber es kam dabei kein Ergebnis heraus.

    Könnt ihr mir vllt Tipps geben wie ich das ganze handhaben muss, so das ich über die Arrays die Ausgabe erziele, das nach dem Wort die Zeilenangabe dahinter steht, jetzt ohne die doppelten Wörter zusammenzuführen?

    Bitte keine Komplettlösungen, das kann ich mit meinem Gewissen net vereinaberen, weils benotet wird ^^



  • geh schrittweise vor:
    schreib dir eine struktur, die in etwa so aussieht:
    struct wort
    {
    char* w; // speichert ein wort
    int zeilen_nummer; // speichert die zeilennummern, in denen das wort w steht
    }wort;

    durchlaufe die datei mit fgets und erzeuge für jedes wort in einer zeile die obige struktur, die du in einem strukturarray speicherst. sortiere das strukturarray nach den wörtern und entferne doppelte einträge. sortiere das array nach zeilennummern und lass dir alles ausgeben.
    schon hattu gewonnen!

    mfg,
    f.s.



  • genau so hatte ich das vor aber nachdem ich die arrays gespeichert habe, und jeweils den struct ausgegeben habe, kam kein wort raus und als zeilennummer 0.

    Ich versuch es nochmal und dann poste ich den quellcode^^



  • HIer mein Programm, ich finde den Fehler einfach nicht, er speichert zwar alles ins Array, aber gibt es nicht aus, bzw. glaube ich er speichert alles rein.

    #include<stdio.h>
    #include<string.h>
    
    void suchen_in_datei();
    void wortEinfuegen(char *,int zeilenAnzahl, int k);
    
    struct wort {
    	char wort[100];
    	int zeilenlaenge;
    
    }wort;
    
    struct wort ab[100];
    
    void suchen_in_datei()
    {
    	char abfrage[40];
    	FILE *f;
    	int  n = 0;
    	char c = 0;
    	int  k = 0;
    	int  l = 0;
    	int zeilenAnzahl = 0;
    	char zeile[100];
    	char wort[100];
    	char *w=wort;
    	int trennzeichen=1;
    	char datei[30];
    	int maxWort = 0;
    
    	printf("----------------------------------------------\n");
    	printf("           ~ Crossreferenz ~                  \n");
    
    	f = fopen("textfile.txt", "r");
    
    	while(c!=EOF)
    	{
    		c=fgetc(f);
    		if(c=='\n') zeilenAnzahl++;
    
    		if(c>='A' && c<='Z' || c>='a' && c<='z' || c=='$' || c=='_'
    				|| c>='0' && c<='9')
    		{
    			*w=c;
    			w++;
    			trennzeichen=0;
    		}
    
    		else if(trennzeichen==0)
    		{
    			*w=0;
    			if(strlen(wort)>1)
    			{
    				wortEinfuegen(wort,zeilenAnzahl, k);
    				printf("%s\n",wort);
    			}
    			w=wort;
    			trennzeichen=1;
    		}
    	}
    
    	fclose(f);
    
    	scanf("%s", abfrage);
    
    	printf("----------------------------------------------\n");
    	printf("          ~ Ausgabe Struct-Array ~            \n");
    
    	for(k = 1; k < 100; k++){
    		printf("%14s | ", ab[k].wort);
    		printf("%5i |\n", ab[k].zeilenlaenge);
    	}
    
    }
    
    void wortEinfuegen(char *s,int zeilenAnzahl, int k)
    {
    
      strcpy(ab[k].wort, s);
      ab[k].zeilenlaenge = zeilenAnzahl;
    
      k++;
    
    }
    
    int main() {
    
    	int main_aktion = 0;
    
    	do {
    		printf("----------------------------------------------\n");
    		printf("| Suche in Datei                     |   1    \n");
    		printf("----------------------------------------------\n");
    		printf("| Beenden                            |   0    \n");
    		printf("----------------------------------------------\n");
    		scanf("%d", &main_aktion);
    
    		if(main_aktion == 1) {
    			suchen_in_datei();
    		}else if(main_aktion == 0) {
    			printf("Ende ...");
    		}else {
    			main_aktion = 0;
    			printf("Ende ...");
    		}
    
    	}while(main_aktion != 0);
    
    	}
    

    Liegt zufällig nicht daran das ich es mit fgetc gemacht habe? Dürfte aber eigentlich nicht sein^^



  • Ich habe nochmal etwas probiert und zwar die funktion weggelassen und gleich alles in die if geschrieben und sie da es funktioniert? Aber warum funktioniert es auf einmal?^^

    #include<stdio.h>
    #include<string.h>
    
    void suchen_in_datei();
    void wortEinfuegen(char *,int zeilenAnzahl, int k);
    
    struct wort {
    	char wort[100];
    	int zeilenlaenge;
    
    }wort;
    
    struct wort ab[100];
    
    void suchen_in_datei()
    {
    	char abfrage[40];
    	FILE *f;
    	int  n = 0;
    	char c = 0;
    	int  k = 0;
    	int  l = 0;
    	int zeilenAnzahl = 0;
    	char zeile[100];
    	char wort[100];
    	char *w=wort;
    	int trennzeichen=1;
    	char datei[30];
    	int maxAnzahl = 0;
    
    	printf("----------------------------------------------\n");
    	printf("           ~ Crossreferenz ~                  \n");
    
    	f = fopen("textfile.txt", "r");
    
    	while(c!=EOF)
    	{
    		c=fgetc(f);
    		if(c=='\n') zeilenAnzahl++;
    
    		if(c>='A' && c<='Z' || c>='a' && c<='z' || c=='$' || c=='_' || c>='0' && c<='9')
    		{
    			*w=c;
    			w++;
    			trennzeichen=0;
    		}
    
    		else if(trennzeichen==0)
    		{
    			*w=0;
    			if(strlen(wort)>1)
    			{
    				strcpy(ab[k].wort, wort);
    				ab[k].zeilenlaenge = zeilenAnzahl;
    				k++;
    				printf("%s\n",wort);
    				maxAnzahl++;
    			}
    			w=wort;
    			trennzeichen=1;
    		}
    	}
    
    	fclose(f);
    	printf("%d", maxAnzahl);
    	scanf("%s", abfrage);
    
    	printf("----------------------------------------------\n");
    	printf("          ~ Ausgabe Struct-Array ~            \n");
    
    	for(k = 0; k < maxAnzahl; k++){
    		printf("%36s | ", ab[k].wort);
    		printf("%5i |\n", ab[k].zeilenlaenge+1);
    	}
    
    }
    
    int main() {
    
    	int main_aktion = 0;
    
    	do {
    		printf("----------------------------------------------\n");
    		printf("| Suche in Datei                     |   1    \n");
    		printf("----------------------------------------------\n");
    		printf("| Beenden                            |   0    \n");
    		printf("----------------------------------------------\n");
    		scanf("%d", &main_aktion);
    
    		if(main_aktion == 1) {
    			suchen_in_datei();
    		}else if(main_aktion == 0) {
    			printf("Ende ...");
    		}else {
    			main_aktion = 0;
    			printf("Ende ...");
    		}
    
    	}while(main_aktion != 0);
    
    	}
    

    Entschuldigung wegen dem 3. aufeinanderfolgenden Post, aber ich kann nicht editieren, da ich Gast bin^^



  • #include <stdio.h>
    #include <stdlib.h> // strerror, errno
    #include <string.h>
    
    #define LINELEN_MAX 100
    #define WORDLEN_MAX LINELEN_MAX
    #define LINES_MAX	30 
    
    #define WORDS_MAX 1000
    
    int is_wordseparator ( char c )
    {
    	return isspace(c) || c == '.' || c == ',' || c == ';' || 
    						c == '!' || c == '?' || c == '\n';
    }
    
    void exit_on_error ( char* );
    
    struct Word
    {
    	char word [WORDLEN_MAX+1];
    	unsigned lines [LINES_MAX];
    	unsigned n;
    }Word;
    
    struct Wordlist
    {
    	unsigned n;
    	struct Word words[WORDS_MAX];
    }Wordlist;
    
    struct Word* find_word ( struct Wordlist* pwlist, char* word )
    {
    	unsigned i = 0;
    	if ( word == NULL || pwlist->n == 0 )
    		return NULL;
    	while ( i < pwlist->n )
    	{
    		if ( 0 == strcmp ( word, pwlist->words[i].word ))
    			return &pwlist->words[i];
    		i++;
    	}
    	return NULL;
    }
    
    int have_line_nr ( struct Word* pw, unsigned line_nr )
    {
    	unsigned i = 0;
    	while ( i < pw->n )
    		if ( pw->lines[i++] == line_nr )
    			return 1;
    	return 0;
    }
    
    char* get_word ( char* line, char* word, int size )
    {
    	unsigned i = 0;
    	if ( line == NULL || *line == 0 )
    		return NULL;
    	memset ( word, 0, size );
    	while ( *line )
    	{
    		if (is_wordseparator(*line))
    		{
    			while (is_wordseparator(*line))
    				line++;
    			break;
    		}
    		if ( i == WORDLEN_MAX )	
    		{
    			errno = 34; // ERANGE
    			exit_on_error ( "Word too long." );
    		}
    		word[i++] = *line++;
    	}
    	if( !*line )
    		return NULL;
    	return line;
    }
    
    int read_line (FILE* fp, char* buf, int size)
    {
    	static int line_nr = 0;
    	memset(buf,0,size);
    	if ( NULL == fgets ( buf, LINELEN_MAX, fp ))
    	{
    		if (ferror(fp))
    			exit_on_error (NULL);
    		line_nr = -1;
    	}
    
    	return ++line_nr;
    }
    
    void register_word ( struct Wordlist* pwlist, char* word, unsigned line_nr )
    {
    	struct Word* pw = NULL;
    
    	if ( pwlist->n == WORDS_MAX )
    	{
    		errno = 34; // ERANGE
    		exit_on_error ( "Structarray full." );
    	}
    	pw = find_word ( pwlist, word );
    	if ( pw && have_line_nr (pw, line_nr))
    		return;
    	if ( pw == NULL )
    		pw = &pwlist->words[pwlist->n++];
    	if ( pw->n == LINES_MAX )
    	{
    		errno = 34; // ERANGE
    		exit_on_error ( "Line-number-array full." );
    	}
    
    	pw->lines[pw->n++] = line_nr; 
    	strcpy(pw->word, word);
    }
    
    void view_result ( struct Wordlist wlist )
    {
    	unsigned i = 0, j = 0;
    	while ( i < wlist.n )
    	{
    		j = 0;
    		fprintf ( stdout, "%s ", wlist.words[i].word );
    		while ( j < wlist.words[i].n ) 
    			fprintf ( stdout, "%u ", wlist.words[i].lines[j++] );
    		puts("");
    		i++;
    	}
    }
    
    int main (void)
    {
    	char* fname = "test.txt";
    	char line[LINELEN_MAX+2] = {0};
    	char word[WORDLEN_MAX+1] = {0};
    	char* pline = line;
    	int line_nr = 0;
    
    	struct Wordlist wlist = {0};
    
    	FILE* fp = fopen ( fname, "rb" );	
    	if ( fp == NULL )
    		exit_on_error ( fname );
    	while ( 0 != ( line_nr = read_line (fp, line, sizeof(line))))
    	{
    		pline = line;
    		while ( NULL != ( pline = get_word (pline, word, sizeof(word))))
    		{
    			if(*word)	
    				register_word ( &wlist, word, line_nr );
    		}
    		if(*word)	
    			register_word ( &wlist, word, line_nr );
    	}
    	view_result (wlist);
    	fclose(fp);
    	return 0;
    }
    
    void exit_on_error ( char* msg )
    {
    	if ( msg )
    		fprintf( stderr, "%s %s\n", msg, strerror(errno) );
    	else 
    		fprintf( stderr, "%s\n", strerror(errno) );
    	fcloseall ();
    }
    

    mfg,
    cOuNtOr


Anmelden zum Antworten