Ist ein solches Programm in C realisierbar?

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
tauberheli
Beiträge: 16
Registriert: Di Apr 27, 2010 3:47 pm

Ist ein solches Programm in C realisierbar?

Beitrag von tauberheli » Di Apr 27, 2010 4:18 pm

Bevor ich mich an die Feinheiten des C-Programmierens mache, möchte ich überprüfen, ob mein gewünschtes Programm überhaupt realisierbar ist:

Mein Programm soll (sehr einfach dargestellt) folgendermaßen ablaufen:
1) Eine Text-Datei einlesen. (Der Text umfasst ca. 100 DinA4-Seiten mit Wörtern, Zahlen, Sonderzeichen.)
2) Überprüfen, wie oft bestimmte Wörter vorkommen.
3) Gegebenfalls andere Analysen durchführen.
4) Die Ergebnisse in einer Datei abspeichern.

Die für mich entscheidenden Fragen sind:

- Ist eine solche Datenmenge zu bewältigen? (100 DinA4-Seiten)
- Gibt es in C eine Funktion, mit der ich eine Text-Datei einlesen kann?
- Ist es problematisch Buchstaben, Zahlen und Sonderzeichen gleichzeitig abarbeiten zu wollen?

Danke für Eure Mithilfe!
Heli

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Ist ein solches Programm in C realisierbar?

Beitrag von cloidnerux » Di Apr 27, 2010 4:45 pm

Bevor ich mich an die Feinheiten des C-Programmierens mache, möchte ich überprüfen, ob mein gewünschtes Programm überhaupt realisierbar ist:
Wo ein wille ist, ist auch ein Weg.
Wenn du C kannst, dann sollte es kein problem für dich sein, das Programm zu realisieren.
- Ist eine solche Datenmenge zu bewältigen? (100 DinA4-Seiten)
Selbst wenn auf jeder Din-A4 Seite 100.000 Zeichen stehen würden, bei 4-Byte pro Zeichen, wäre die Datei in PLain-Text nur ~38Mbyte groß, sollte also mit jedem neueren Computer Problemlos verarbeitet werden können.
- Ist es problematisch Buchstaben, Zahlen und Sonderzeichen gleichzeitig abarbeiten zu wollen?
Nein, es ist aber Problematisch Wörter abzuarbeiten, denn DU musst dir jetzt Gedanken machen, ob Groß/Kleinschreibung, Verbindungszeichen oder Rechtsschreibfehler eine Rolle spielen und wenn ja welche.
- Gibt es in C eine Funktion, mit der ich eine Text-Datei einlesen kann?
Es gibt Funktionen um Dateien einzulesen.
Wenn du REINEN Text hast, dann kannst du das auch direkt über diese Funktionen, wenn du aber *.doc oder *.odt oder sonstige Formatierte Texte einlesen willst, musst du dir in der Spezifikation zum Dateityp den Aufbau der Datei anschauen und dementsprechend einlesen und Interpretieren.
Zum Speichern gelten die selben Regeln.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Ist ein solches Programm in C realisierbar?

Beitrag von Xin » Di Apr 27, 2010 5:40 pm

tauberheli hat geschrieben:Bevor ich mich an die Feinheiten des C-Programmierens mache, möchte ich überprüfen, ob mein gewünschtes Programm überhaupt realisierbar ist:
Die Punkte, die Du aufgeschrieben hast, würde ich bei C vom Schwierigkeitslevel im Einsteigerbereich ansiedeln.
Das bedeutet nicht, dass Du morgen anfängst und zum Wochenende fertig bist.

Du kannst mit C so ziemlich alles machen, es gibt also viel zu lernen.
tauberheli hat geschrieben:- Ist eine solche Datenmenge zu bewältigen? (100 DinA4-Seiten)
100 A4 Seiten sind für moderne Computer in C keine erwähnenswerte Größe.
tauberheli hat geschrieben:- Gibt es in C eine Funktion, mit der ich eine Text-Datei einlesen kann?
Da C so ziemlich die Grundlage für alles ist, ist alles realisierbar. (außer Kaffee kochen ;-))
tauberheli hat geschrieben:- Ist es problematisch Buchstaben, Zahlen und Sonderzeichen gleichzeitig abarbeiten zu wollen?
Nein, kein Problem.


Ich finde es gut, dass Du gleich mit einem Projekt an den Start gehst, das gibt Dir die Motivation und eine Richtung, wie Du lernen kannst. Aber bitte geh davon aus, dass vor Deinem Projekt auch erst etliche Übungsprogramme stehen, um Dein Verständnis zu schulen.

cloidnerux hat geschrieben:Wo ein wille ist, ist auch ein Weg.
Wo ein While ist, ist auch ein Weg ;-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benjamin92
Beiträge: 19
Registriert: Sa Jun 06, 2009 8:50 am
Wohnort: Niederösterreich

Re: Ist ein solches Programm in C realisierbar?

Beitrag von Benjamin92 » Fr Apr 30, 2010 5:24 am

Hätte mal was für dich zum anschauen

Das ist ein Programm, das Telefonnummer nach einem bestimmten Schema sortiert.

Code: Alles auswählen

/**
        Autor:      Benjamin Kraus
        Klasse:     2AHEL
        Datum:      28.1.2010
        Dateiname:  Teln11
        Aufgabe:    Telefonnummern aus einem .txt-file einlesen und für
                    Maschinenverarbeitung aufbereiten
        Status:     Fertig
        Version:    Final 1.2
**/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void verarbeitung(char*lpfad,char*spfad);
void verarbeitung(char*lpfad,char*spfad)
{
    int i;
    char telnr[100];
    FILE*datei1;
    FILE*datei2;
    datei1=fopen(lpfad,"r");                                                                     //Hier wird die Lesedatei geöffnet
    datei2=fopen(spfad,"w");                                                                     //Hier wird die Schreibdatei geöffnet

    if ((datei1==NULL)||(datei2==NULL))
    {
        printf("Pruefen Sie bitte die Pfade\n");
    }
    else
    {
        while (fgets(telnr,100,datei1)!=NULL)                                                     //Die Zeichen werden als String eingelesen
        {
            i=strcspn(telnr,"+");                                                                 //Anfang der Nummer wird gesucht
            if (i>=strlen(telnr))                                                                 //Wenn kein +
            {
                if ((strlen(telnr)<=6)&&(strlen(telnr)>=4))                                       //Nummern ohne Ortsvorwahl bekommen die
                {
                    fprintf(datei2,"+432952");                                                    //Hollabrunner Ortsvorwahl
                    i=0;
                }
                else
                {
                    i=strcspn(telnr,"0");
                    if ((telnr[i]=='0')&&(telnr[i+1]!='0'))
                    {
                        fprintf(datei2,"+43");                                                     // +43 wird am Anfang der Telefonnummer angehängt
                        i++;
                    }
                }
            }
            for (;i<strlen(telnr);i++)                                                            //Zeichenweise aufrufen
            {
                if ((telnr[i]=='0')&&(telnr[i+1]=='0'))                                           //Bei 00 am Anfang
                {
                    fprintf(datei2,"+");
                    i++;
                }
                else if (((telnr[i]>='0')&&(telnr[i]<='9'))||(telnr[i]=='\n')||(telnr[i]=='+'))  //Nur 0-9, + und neue Zeile eingelesen
                {
                    fprintf(datei2,"%c",telnr[i]);
                }

            }
        }
        fclose(datei1);
        fclose(datei2);                                                                           //Die Dateien werden geschlossen
    }
}
int main(int argc, char *argv[])
{
    printf("Version: Final 1.2\n\n");                                                         //Anzeige der Versionsnummer
    char wh,lpfad[200],spfad[200];
    do
    {
        if (argc==1)
        {
            printf("Bitte geben Sie die Quelldatei an\n");                                    //Der Quellpfad
            scanf("%s",lpfad);
            printf("Bitte geben Sie die Zieldatei an\n");                                     //Der Zielpfad
            scanf("%s",spfad);
            verarbeitung(lpfad,spfad);
        }                                                                                     //Hier wird das Unterprogramm zur Verabeitung aufgerufen
        else
            if (argc==2)                                                                         //Bei einem Parameter wird die Hilfe angezeigt
            {
                printf("\n\tWenn Sie keine Parameter eingeben, dann werden sie im\n\tProgrammverlauf nach den Pfaden gefragt.\n\tWenn Sie die Pfade als Parameter eingeben, geht das auch.");
            }
            else
                if (argc==3)
                {
                    strcpy(lpfad,argv[1]);                                          //Hier werden die Dateipfade aus den Parametern üernommen
                    strcpy(spfad,argv[2]);
                    verarbeitung(lpfad,spfad);                                      //das Unterprogramm wird aufgerufen
                    printf("Die Parameter wurden erfolgreich verarbeitet");
                }
        if (argc!=3)
        {
            printf("\nWollen Sie wiederholen?");                                    //Abfrage, ob man wiederholen will, bei manuellen Programmaufruf
            scanf("\n%c",&wh);
        }
        else
        {
            wh='n';                                                                 //Diese Zeile wird benötigt, für Batchverarbeitung, da ist eine Abfrage, ob man wiederholen will unnötig
        }
    }
    while ((wh=='j')||(wh=='J'));
    return 0;
}

tauberheli
Beiträge: 16
Registriert: Di Apr 27, 2010 3:47 pm

Re: Ist ein solches Programm in C realisierbar?

Beitrag von tauberheli » Di Jul 06, 2010 10:59 am

Hallo Leute!

Habe das C-Tutorial inzwischen abgearbeitet. Wäre toll, wenn Ihr mir weiterhelfen könntet....

Soviel ich verstanden habe, kann man mit fgets() zeilenweise einlesen. D.h. bis zum Zeilenumbruch. Was ist aber, wenn ich von einem Fließtext wortweise einlesen möchte, d.h. immer bis zum nächsten Leerzeichen. Brauche ich da wieder eine andere Funktion?

LG und Danke im voraus,
Heli

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Ist ein solches Programm in C realisierbar?

Beitrag von Xin » Di Jul 06, 2010 11:30 am

tauberheli hat geschrieben:Hallo Leute!

Habe das C-Tutorial inzwischen abgearbeitet. Wäre toll, wenn Ihr mir weiterhelfen könntet....

Soviel ich verstanden habe, kann man mit fgets() zeilenweise einlesen. D.h. bis zum Zeilenumbruch. Was ist aber, wenn ich von einem Fließtext wortweise einlesen möchte, d.h. immer bis zum nächsten Leerzeichen. Brauche ich da wieder eine andere Funktion?
Zwei Möglichkeiten: Du kannst eine Zeile einlesen und anschließend strtok die Zeile in ihre Einzelteile zerlegen.

Oder Du schreibst einen eigenen Parser.

Ich lade meist die Datei komplett in den Speicher und anschließend einen eigenen Parser.
Einen solchen Parser, der einzelne Worte in einem Text ausliest, gebe ich meinen Programmierschülern auch prinzipiell als Aufgabe - es ist eine hervorragende Übung - sie wirkt häufig erstmal frustrierend, weil man reichlich Fehler machen kann, aber wenn man den Parser dann lauffähig hat, hat man viele Fehlermöglichkeiten kennengelernt, die man anschließend vermeiden kann.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten