Programm zur Textanalyse < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) überfällig | Datum: | 14:07 Di 12.01.2010 | Autor: | Sanny |
Hallo, ich sitze schon seit Ewigkeiten an dem Programm und finde meine(n) Fehler nicht. Kann mir jemand helfen?
Buchstaben, Zeichen, Wortlänge und Satzlänge sollen gezählt werden.
#include <stdio.h> /* Ein- Ausgabe der C-Bibliothek laden */
#include <stdlib.h>
#include <string.h> /* Bibliothek zu String-Verarbeitung */
#include <vsconio.h> /* Borland Bildschirm-Bibliothek laden */
#include "fileread.h"
/******************************************************************************/
/* Vereinbahrung der Unterprogramme */
/******************************************************************************/
/* Unterprogramm zum Einlesen des Namens des zu Analysierenden Textes*/
void DateiName (int *fehler, char *txtname, int *Programmende);
/*Unterprogramm zum Einlesen der Textdatei in das varaible Feld*/
void einlesenTextdatei(char*txtName, char *(*Zeigerfeld)[26]);
/* Unterprogramm zum Analysieren des gegebenen textes*/
void textAnalyse (char *(*Zeigerfeld)[26]);
void Ausgabe(char *txtName);
/******************************************************************************/
/* main() Hauptprogramm */
/******************************************************************************/
int main(int argc, char *argv[]) {
int Programmende;
int fehler;
char *Zeigerfeld[26]; /*Zeigerfeld mit 26 Elementen */
char txtName[81]; /*Name des zu analysierenden Textes */
char dummy[81]; /*dummy, zum Anhalten des Programmes */
do{
clrscr(); /*Bildschirm löschen */
DateiName(&fehler, txtName, &Programmende);//Aufruf Unterprogramm DateiName
/*wenn Programmende ungleich 1 */
if(Programmende !=1 && fehler == 0) {
einlesenTextdatei(txtName, &Zeigerfeld);
textAnalyse(&Zeigerfeld); //Aufruf des Unterprogrammes einlesenTextDatei
Ausgabe(txtName); //Aufruf des Unterprogrammes Ausgabe
} // Ende "(Programmende !=1 && fehler == 0)"
}while (Programmende !=1); /*Ende while-Schleife*/
return 0; //Rückgabe zum Betriebssystem
}/*Ende main*/
/******************************************************************************/
/* Unterprogramm zum Einlesen des Namens der Textdatei */
/******************************************************************************/
void DateiName( int *fehler, char *txtName, int *Programmende) {
FILE *datei; // Zeiger auf Datei
char dateianfang[81]; // Anfang der Datei
char *pdanfg; // Zeiger auf das Feld Dateianfang
char *pdleer; // Zeiger auf leere Datei
char dummy[81];
*fehler =0;
printf(" Programm zur statischen Analyse von Texten"); /*Ausgabe von */
printf(" Name 1, Name 2, Name 3, Name [mm] 4\n\n"); [/mm] /*dem Text */
printf(" Eingabe Dateinmame [e=Ende, Return=TESTTEXT] : ");
gets(txtName); /*Einlesen des Dateinamens*/
pdanfg = dateianfang; // Zeiger auf Dateianfang zuweisen
[mm] if(txtName[0]=='\0') [/mm] strcpy(txtName, "TESTTEXT");
else { if(txtName[0] == 'e' && txtName[1] == [mm] '\0') [/mm] {*Programmende=1;}}
/*Wenn als Eingabe nur die return-Taste gedrückt wird Belegen des */
/*char-Feldes mit dem Text TESTTEXT zur Auswahl des Testtextes */
/* Bei Eingabe von 'e', wird Programmende auf "1" gesetzt */
if(*Programmende != 1){
datei=fopen(txtName, "r"); /*Datei öffnen*/
if(datei!= NULL) {
pdleer= fgets(pdanfg, 81, datei);
fclose(datei);
if(pdleer) *fehler = 0;
else *fehler =1;
}// Ende "(datei!= NULL)"
else *fehler = 1;
if ( *fehler == 1){
[mm] printf("\n [/mm] Fehler: Datei nicht gefunden oder Datei leer");
gets(dummy);
}// Ende "( *fehler == 1)"
}// Ende "if(*Programmende != 1)"
} /*Ende des Unterprogrammes DateiName*/
/******************************************************************************/
/* Unterprogramm zum Einlesen der Textdatei */
/******************************************************************************/
void einlesenTextdatei(char*txtName, char*(*Zeigerfeld)[26]) {
FILE *datei; /*Zeiger auf Datei*/
int strlaenge; /*Laenge des Kopierstrings*/
int laenge; /*Laenge des aktuellen Strings*/
int Laufindex; //Laufvariable für jedes einzelne Zeichen eines Strings
int zeileleer; //Merker für eine reelle Zeile
char dummy [81];
char kopierenZeile[81]; /*String zum kopieren der Zeilen*/
strlaenge=81; // Stringlänge auf 81
/*Zeigerfeld mit NULL vorbelegen*/
for (Laufindex=0; Laufindex<26 ; Laufindex++) (*Zeigerfeld)[Laufindex]=NULL;
Laufindex=0;
do { // Schleife zum Auslesen der kompletten Datei
zeileleer=0;
/* Aufruf Unterprogramm zum Lesen einer Dateizeile*/
getFileLine(txtName, kopierenZeile, strlaenge);
laenge = strlen(kopierenZeile); //Stringlänge festlegen
//Erzeugen des dynamischen Variablenfeldes
(*Zeigerfeld)[Laufindex] = (char*) calloc (laenge+1, sizeof( char));
// Aktuelle Zeile ins Vaiablenfeld kopieren
//Wenn die Letzte kopierte Zeile anders als die erste Zeile im Text ist
if(kopierenZeile[0]!=(*Zeigerfeld)[Laufindex-1][0])
//kopiere die Aktuelle Zeile
strcpy((*Zeigerfeld)[Laufindex], kopierenZeile);
//sonst Belege das Zeigerfeld mit NULL
else (*Zeigerfeld)[Laufindex]=NULL;
Laufindex ++; //erhöhen des Laufindex um 1
} while(kopierenZeile[0]!=(*Zeigerfeld)[Laufindex-2][0] &&
kopierenZeile[1]!=(*Zeigerfeld)[Laufindex-2][2]);
//widerhole solange das erste und zweite Zeichen der aktuellen
//Zeile ungleich der ersten Zeile
// Ausleseschleife beendet
}/*Ende des Unterprogrammes einlesenTextdatei*/
/******************************************************************************/
/* Unterprogramm Textanalyse */
/******************************************************************************/
void textAnalyse (char *(*Zeigerfeld)[26]) {
int bstab; // Variable für Buchstaben und Zeichen im String
int bstabmerker=0; //Variable für den Letzten Buchstabe in einer Zeile
int Laufindex; // Laufvariable
int Wortmerker=0; // Merker zur Erkennung von Wörtern
int zfeldlidx=0; // Laufvariable zum zählen der einzelnen Zeichen
int lidx; // Laufvariable im Feld
int zeichenf[27]; // Feld zum Zählen der einzelnen Buchstaben
char aktZeile[81]; // Aktuelle Zeile der Auswertung
char dummy[81];
char *ptrzeichen; // Zeiger auf die einzelne Zeichen im String
extern int zfeld[27]; // Feld fuer die Anzahl aller Zeichen
extern int sondersumme ; // Summe aller Sonderzeichen
extern int satzsumme; // Summe aller Sätze
extern int summwort; // Summe aller Wörter
extern int zeilenzahl; // Anzahl aller Zeilen
extern double buchstabensumme; // Summe aller Buchstaben
extern double Zeichensumme; // Summe aller Zeilen
// Zähler auf Null setzen
summwort=0, buchstabensumme=0, sondersumme=0, satzsumme=0, lidx=0;
// Feld mit 0 vorbelegen
for( Laufindex=0; Laufindex<27; Laufindex++ ) zfeld[Laufindex]=0;
do { // Schleife für die komplette Textanalyse
//Kopieren einer Zeile in den String aktZeile
strcpy(aktZeile , (*Zeigerfeld)[lidx]);
Laufindex=0; //Laufindex auf 0 setzen
while(aktZeile[Laufindex] != NULL) { //solange kein NULL gefunden wird
bstab=aktZeile[Laufindex]; //aktuelles Zeichen auf bstab kopieren
zfeldlidx=0; //Laufindex auf 0 setzen
//solange zfeldlaufindex kleiner 26 -- Schleife zum Zählen jedes
while(zfeldlidx<26) { //einzelnen Buchstabens
if(bstab==65+zfeldlidx || bstab==97+zfeldlidx) zfeld[zfeldlidx]++;
zfeldlidx++; //zfeldlidx um 1 erhöhen
}//Ende while-Schleife "(zfeldlidx<26)"
//bstabmerker auf 0 setzen, wenn bstab ein leerzeichen ist
if(bstab==32)bstabmerker=0;
if(bstab>64 && bstab<91 || bstab>96 && bstab<123)//Wenn bstab ein Buchstabe
//erhöhe buchstabensumme um 1 und
//wenn bstabmerker=1 ist erhöhe summwort um 1 und setze bstabmerker=0
{buchstabensumme++; if (bstabmerker==1) {summwort++;bstabmerker=0;}}
//ansonsten wenn bstab ein satzabschlusszeichen ist erhöhe
//satzsumme und sondersumme um eins
else if(bstab==46 || bstab==33 || bstab==63 || bstab==59 ||
bstab==58) {satzsumme++;sondersumme++;}
//ansonsten wenn bstab ein leerzeichen nist erhöhe sondersumme um 1
else if(bstab!=32)sondersumme++;
//wenn bstab ein Buchstabe oder ein Bindestrich ist setze Wortmerker auf 1
if(bstab>64 && bstab<91 || bstab>96 && bstab<123||bstab==45) Wortmerker=1;
//wenn bstab ein Buchstabe oder ein Bindestrich ist und Wortmerker 1 ist,
//erhöhe summwort um 1 und setze Wortmerker auf 0
else if (Wortmerker==1) {summwort++; Wortmerker=0;}
Laufindex++; //erhöhe den Laufindex um 1
}//Ende while- Schleife "(aktZeile[Laufindex] != NULL)"
bstab=aktZeile[Laufindex-1];//weise bstab das Letzte Zeichen der Zeile zu
//wenn bstab ein Buchstabe ist setzte bstabmerker auf 1
if(bstab>64 && bstab<91 || bstab>96 && bstab<123) bstabmerker=1;
lidx++; //erhöhe lidx um 1
} while((*Zeigerfeld)[lidx]!=NULL);//Wiederhole solang kein NULL gefunden ist
Zeichensumme=buchstabensumme+sondersumme; // Berechnung Summe aller Zeichen
zeilenzahl=lidx; // Übergabe der Zeilenanzahl
free(*Zeigerfeld);
}//Ende Unterprogamm Analyse
/******************************************************************************/
/* Unterprogramm Ausgabe */
/******************************************************************************/
void Ausgabe (char *txtName) {
double mwwl; // Mittelwert Wortlänge
double mwsl; // Mittelwert Satzlaenge
char dummy[81];
extern int zfeld[27]; // Feld fuer die Anzahl aller Zeichen
extern int sondersumme ; // Summe aller Sonderzeichen
extern int satzsumme; // Summe aller Sätze
extern int summwort; // Summe aller Wörter
extern int zeilenzahl; // Anzahl aller Zeilen
extern double buchstabensumme; // Summe aller Buchstaben
extern double Zeichensumme; // Summe aller Zeilen
mwwl = buchstabensumme/summwort; // Berechnung des Mittelwertes der Wortlänge
mwsl = summwort/(double)satzsumme;// Berechnung des Mittelwertes der Satzlänge
/* Ausgabe aller Buchstaben und deren Haeufigkeiten mit Berechnungen */
clrscr();
printf(" Ergebnis der Analyse von Datei : [mm] %s\n\n\n", [/mm] txtName);
printf(" Haeufigkeit der einzelnen Buchstaben");
printf(" Anzahl Buchstaben: [mm] %4.0lf\n", [/mm] buchstabensumme);
printf(" [mm] ====================================\n\n\n");
[/mm]
printf(" a: %2.1d %5.1lf%%", zfeld[0], (100/buchstabensumme)*zfeld[0]);
printf(" b: %2.1d %5.1lf%%", zfeld[1], (100/buchstabensumme)*zfeld[1]);
printf(" c: %2.1d %5.1lf%%", zfeld[2], (100/buchstabensumme)*zfeld[2]);
printf(" d: %2.1d %5.1lf%%", zfeld[3], (100/buchstabensumme)*zfeld[3]);
printf(" e: %2.1d [mm] %5.1lf%%\n", [/mm] zfeld[4], (100/buchstabensumme)*zfeld[4]);
printf(" f: %2.1d %5.1lf%%", zfeld[5], (100/buchstabensumme)*zfeld[5]);
printf(" g: %2.1d %5.1lf%%", zfeld[6], (100/buchstabensumme)*zfeld[6]);
printf(" h: %2.1d %5.1lf%%", zfeld[7], (100/buchstabensumme)*zfeld[7]);
printf(" i: %2.1d %5.1lf%%", zfeld[8], (100/buchstabensumme)*zfeld[8]);
printf(" j: %2.1d [mm] %5.1lf%%\n", [/mm] zfeld[9], (100/buchstabensumme)*zfeld[9]);
printf(" k: %2.1d %5.1lf%%", zfeld[10], (100/buchstabensumme)*zfeld[10]);
printf(" l: %2.1d %5.1lf%%", zfeld[11], (100/buchstabensumme)*zfeld[11]);
printf(" m: %2.1d %5.1lf%%", zfeld[12], (100/buchstabensumme)*zfeld[12]);
printf(" n: %2.1d %5.1lf%%", zfeld[13], (100/buchstabensumme)*zfeld[13]);
printf(" o: %2.1d [mm] %5.1lf%%\n", [/mm] zfeld[14],(100/buchstabensumme)*zfeld[14]);
printf(" p: %2.1d %5.1lf%%", zfeld[15], (100/buchstabensumme)*zfeld[15]);
printf(" q: %2.1d %5.1lf%%", zfeld[16], (100/buchstabensumme)*zfeld[16]);
printf(" r: %2.1d %5.1lf%%", zfeld[17], (100/buchstabensumme)*zfeld[17]);
printf(" s: %2.1d %5.1lf%%", zfeld[18], (100/buchstabensumme)*zfeld[18]);
printf(" t: %2.1d [mm] %5.1lf%%\n", [/mm] zfeld[19],(100/buchstabensumme)*zfeld[19]);
printf(" u: %2.1d %5.1lf%%", zfeld[20], (100/buchstabensumme)*zfeld[20]);
printf(" v: %2.1d %5.1lf%%", zfeld[21], (100/buchstabensumme)*zfeld[21]);
printf(" w: %2.1d %5.1lf%%", zfeld[22], (100/buchstabensumme)*zfeld[22]);
printf(" x: %2.1d %5.1lf%%", zfeld[23],(100/buchstabensumme)*zfeld[23]);
printf(" y: %2.1d [mm] %5.1lf%%\n", [/mm] zfeld[24],(100/buchstabensumme)*zfeld[24]);
printf(" z: %2.1d [mm] %5.1lf%%\n\n\n",zfeld[25],(100/buchstabensumme)*zfeld[25]);
[/mm]
printf(" Lexikalische Analyse [mm] \n");
[/mm]
printf(" ==================== [mm] \n\n\n");
[/mm]
printf(" Summe Zeichen: %4.0lf", Zeichensumme);
printf(" Zeilen: %4.0d", zeilenzahl);
printf(" Mittelwerte [mm] \n");
[/mm]
printf(" [mm] -----------\n");
[/mm]
printf(" Buchstaben : %4.0lf", buchstabensumme);
printf(" Worte : %4.0d", summwort);
printf(" Wortlaenge: %2.1lf Buchstaben [mm] \n\n", [/mm] mwwl);
printf(" Sonderzeichen: %4.0d", sondersumme);
printf(" Saetze: %4.0d", satzsumme);
printf(" Satzlaenge: %4.1lf Worte", mwsl);
gets(dummy);
}//ende Ausgabe
/******************************************************************************/
/* Globale Variablen */
/* Zur Kommunikation zwischen den Unterprogrammen "Analyse" und "Ausgabe" */
/******************************************************************************/
static int zeilenzahl; // Anzahl aller Zeilen
static int zfeld[27]; // Feld fuer die Anzahl aller Zeichen
static int sondersumme = 0; // Summe aller Sonderzeichen
static int satzsumme = 0; // Summe aller Sätze
static int summwort = 0; // Summe aller Wörter
static double buchstabensumme = 0; // Summe aller Buchstaben
static double Zeichensumme = 0; // Summe aller Zeilen
Liebe Grüße :)
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:28 Di 12.01.2010 | Autor: | Frasier |
Hallo Sanny,
ich habe keinen Borland-Compiler, kann also nichtmal versuchen, das zu kompilieren.
Wo tritt der Fehler denn auf? Beim Kompilieren oder zur Laufzeit? Wie äußert sich der Fehler, Fehlermeldung?
Diese Informationen solltest du schon noch mit angeben.
Sonst ist man zu Beginn schon etwas erschlagen...
Und eine feiner Zug wäre es, wenn du das Programm soweit einkürzen könntest, dass nur noch der Fehler auftritt. Dann kann man sich auf das Wesentliche konzentrieren und während dieser Arbeit hast den Fehler vermutlich auch schon selbst gefunden. (Plus: Der fehlerproduzierende Code würde vielleicht mit dem gcc zu testen sein)
lg
F.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:54 Di 12.01.2010 | Autor: | felixf |
Hallo!
> Hallo, ich sitze schon seit Ewigkeiten an dem Programm und
> finde meine(n) Fehler nicht. Kann mir jemand helfen?
Dann verrat uns doch mal, um was fuer Fehler es sich handelt, wie sich diese zeigen etc.
Ich hab spontan nicht so viel Lust, mir das alles durchzulesen.
LG Felix
PS: Sagt dir [code]...[/code] was?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:30 Di 12.01.2010 | Autor: | Sanny |
Hier habe ich die Fehlermeldung einmal kopiert. Damit kann ich gar nix anfangen :( Die kommt gleich, wenn ich das Programm starten möchte.
Felix, nein, davon habe ich noch nichts gehört... ?!
[Dateianhang nicht öffentlich]
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:10 Mi 13.01.2010 | Autor: | Frasier |
Hallo,
womit kompilierst du das denn?
Es sieht nach Microsoft aus, andererseits verwendest du Borland-Bibliotheken.
Keine Ahnung, ob das klappen kann...
lg
F.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:20 Mi 20.01.2010 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|