Bitte um Hilfeeeee

Hier landen Posts, die keine Wissensfrage erhalten, sondern einen Dummen suchen.
hobbyflug
Beiträge: 13
Registriert: Fr Okt 24, 2014 2:38 pm
Kontaktdaten:

Bitte um Hilfeeeee

Beitrag von hobbyflug » Fr Okt 24, 2014 2:50 pm

Hallo

Bin neu hier.

Habe eine Frage zu diesen C Programm:

Kann mir das Programm jemand kurz erklären?
für was was ist, zb. struct Buch getBuch() ; int errLinenumber ; int leseausdatei(char filename[], struct Buch feld[], int feldmax) ;oder int isEmtyausserLeerzeichen(char str[]) und welche Aufgabe es im Programm hat?

Es ist wirklich wichtig für mich!
Danke

Code: Alles auswählen

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

struct Buch
{
    char titel[50];
    char autor[30];
    int erscheinungsjahr;
    double preis;
};

int errLinenumber;

void ausgabe (struct Buch b, int i)
{
    printf("\nBuch %d\n",i);
    printf("    Titel: %s \n",b.titel);
    printf("    Autor: %s \n",b.autor);
    printf("    Erscheinungsjahr: %d \n",b.erscheinungsjahr);
    printf("    Preis: %.2lf \n",b.preis);
}

struct Buch getBuch()
{
    struct Buch b;
    char s[80];
   
    printf("\n");
    do
    {
        printf("Titel:");
        fgets(s,sizeof s, stdin);
    }
    while (strlen(s)==0);
    s[strlen(s)-1]=0;//\n weg bei der Ausgabe
    strncpy(b.titel, s, sizeof (b.titel)); 
    
    
    do
    {
        printf("Autor:");
        fgets(s,sizeof s, stdin);
    }
    while (strlen(s)==0);
    s[strlen(s)-1]=0;
    strncpy(b.autor, s, sizeof (b.autor));
    
    do
    {
        printf("Preis:");
        fgets(s,sizeof s, stdin);
        sscanf(s,"%lf",&b.preis);
    }
    while (strlen(s)==0 || b.preis<0.0);
    
    do
    {
        printf("Jahr:");
        fgets(s,sizeof s, stdin);
        sscanf(s,"%d",&b.erscheinungsjahr);
    }
    while (strlen(s)==0);
      
    return b;
}

int isEmtyausserLeerzeichen(char str[])
{
    int i=0;
    while(1)
    {
        char c=str[i++];
        
        if(c==0)
            return 1;
        
        if(c!=' ' && c!='\t' && c!= '\n' && c!='\r')
            return 0;
    }
}


//fehler <0
//buecher>=0
int leseausdatei(char filename[], struct Buch feld[], int feldmax)
{
    //f ist der Filehandler
    FILE *f = fopen(filename, "r");
    int i, n, errcode;
    errLinenumber = 0;
    if (f == NULL)
        return -1;//datei lässt sich nicht öffnen
    
    for(n=0;n>-1;n++)
    {
        char s[1024];
        
        if (fgets(s,sizeof s, f)==NULL)
        {
            fclose (f);
            errLinenumber = -1 ;
            return n;
        }
        
        s[strlen(s)-1]=0;
        
        struct Buch buch;
        char *p;
        p=strtok(s, ",");
               
        if (p==NULL || isEmtyausserLeerzeichen(p))
            continue;//leere Zeile?
        strncpy(buch.titel, p, sizeof(buch.titel));
        
        errLinenumber++;
        
        p=strtok(NULL, ",");       
        if (p==NULL)
        {
            errcode=-2;
            break;
        }
        strncpy(buch.autor, p, sizeof(buch.autor));
        
        p=strtok(NULL, ",");
        if (p==NULL)
        {
            errcode=-3;
            break;
        }
        if(sscanf(p,"%d", &buch.erscheinungsjahr)!=1)
        {
            errcode=-4;
            break;
        }
        
        p=strtok(NULL, ",");
        if (p==NULL)
        {
            errcode=-5;
            break;
        }
        if(sscanf(p,"%lf", &buch.preis)!=1)
        {
            errcode=-6;
            break;
        }
        
        feld[n]=buch;
    }
    
    

    fclose(f);
    return errcode;
}

int schreibeindatei(char filename[], struct Buch feld[], int feldmax)
{
    int i;
    FILE *f = fopen (filename, "w");
    if(f==NULL)
        return-1;
    
    for(i=0;i<feldmax;i++)
    {
        struct Buch *pb = &feld[i];
        fprintf(f,"%s",pb->titel);
        fprintf(f,",%s",pb->autor);
        fprintf(f,",%d",pb->erscheinungsjahr);
        fprintf(f,",%lf",pb->preis);
        fprintf(f,"\n");
    }
    fclose(f);
    
}

int main()
{
    struct Buch bibliothek[100];
    int i;
    int anzahl, err;
    
    printf("\tBuecherliste\n");
    printf("\t------------\n\n");
    
    anzahl=leseausdatei("file1.csv", bibliothek, 100);
    if(anzahl<=0)
    {
        int error=anzahl;
        printf("Fehler beim Lesen (code %d) in Zeile%d\n",error, errLinenumber);
        return -1;
    }
    
    for (i=0;i<anzahl;i++)
        ausgabe(bibliothek[i], i+1);
    
    bibliothek[6]=getBuch();
    
    err=schreibeindatei("file1.csv", bibliothek, anzahl);
    if(err<=0)
    {
        printf("Fehler beim Lesen (code %d) in Zeile%d\n",err);
        return -2;
    }
    
    struct Buch meinErstesBuch;
    struct Buch meinZweitesBuch={"Max und Moriz","Wilhelm Busch",1845,10.99};                      // nur beim Anlegen der Struktur
    struct Buch meinDrittesBuch;
    
    meinErstesBuch.preis = 120.99;
    strncpy(meinErstesBuch.autor,  "Kehlmann", sizeof(meinErstesBuch.autor));
    strncpy(meinErstesBuch.titel,  "Die Vermessung der Welt", sizeof(meinErstesBuch.titel));
    meinErstesBuch.erscheinungsjahr =2007;
    meinDrittesBuch = getBuch();
      
    bibliothek[0]=meinErstesBuch;
    bibliothek[1]=meinZweitesBuch;
    bibliothek[2]=meinDrittesBuch;
    
    
    for (i=0;i<4;i++)
        ausgabe(bibliothek[i], i+1);
    
    printf("\n\n");
    
    return (0);
}
Lg Marcel

Edit by Xin: CodeFlags eingefügt

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

Re: Bitte um Hilfeeeee

Beitrag von Xin » Fr Okt 24, 2014 4:43 pm

hobbyflug hat geschrieben:Hallo
Bin neu hier.
Stimmt... 1. Beitrag. ^^
hobbyflug hat geschrieben: Habe eine Frage zu diesen C Programm:

Kann mir das Programm jemand kurz erklären?
für was was ist, zb. struct Buch getBuch() ; int errLinenumber ; int leseausdatei(char filename[], struct Buch feld[], int feldmax) ;oder int isEmtyausserLeerzeichen(char str[]) und welche Aufgabe es im Programm hat?
Grübel... ich verstehe die Frage nicht.

Mir scheint, die Funktionsnamen sind relativ verständlich gewählt und auch die globale Variable ist eigentlich mit wenig Englischkenntnissen zu erahnen!?

Entweder Du kannst etwas C, dann kannst Du den Quelltext lesen und dazu konkrete Fragen stellen oder Du kannst kein C, dann weiß ich nicht wie ausführlich die Antwort sein müsste. Sie würde dann wohl erstmal lauten, dass Du doch bitte das C-Tutorial liest, um dann konkretere Fragen zu stellen. ^^
hobbyflug hat geschrieben:Es ist wirklich wichtig für mich!
Hausaufgaben?

Das Programm ist zu groß, um die erste Hausaufgabe zu sein. Es sieht auch nicht aus, als hätte es ein Lehrer geschrieben, sondern eher als wäre es von einem anderen Schüler kopiert worden. Ich glaube, da muss ich nochmals auf's C-Tutorial verweisen.
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.

hobbyflug
Beiträge: 13
Registriert: Fr Okt 24, 2014 2:38 pm
Kontaktdaten:

Re: Bitte um Hilfeeeee

Beitrag von hobbyflug » So Okt 26, 2014 4:55 pm

ja ich kann C. Wir haben es in der Schule.

Meine Frage ist , ob mir jemand das Programm erklären kann, was "isEmtyausserLeerzeichen" und -->

Code: Alles auswählen

FILE *f = fopen(filename, "r");
    int i, n, errcode;
    errLinenumber = 0;
    if (f == NULL)
        return -1;//datei lässt sich nicht öffnen
   
    for(n=0;n>-1;n++)
    {
        char s[1024];
       
        if (fgets(s,sizeof s, f)==NULL)
        {
            fclose (f);
            errLinenumber = -1 ;
            return n;
        }
       
        s[strlen(s)-1]=0;
       
        struct Buch buch;
        char *p;
        p=strtok(s, ",");
               
        if (p==NULL || isEmtyausserLeerzeichen(p))
            continue;//leere Zeile?
        strncpy(buch.titel, p, sizeof(buch.titel));
macht. Sprich, damit ich weiß, wozu ich das im Programm verwenden muss.

Danke

lg

Edit by Xin: Erneut Code-Tags eingefügt

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

Re: Bitte um Hilfeeeee

Beitrag von Xin » Mo Okt 27, 2014 2:24 am

hobbyflug hat geschrieben:ja ich kann C. Wir haben es in der Schule.

Meine Frage ist , ob mir jemand das Programm erklären kann, was "isEmtyausserLeerzeichen"
Das ist widersprüchlich. "isEmtyausserLeerzeichen" ist eine sehr kurze Funktion, die einen fragwürdigen Namen besitzt, aber ansonsten recht gerade wegprogrammiert ist. Was aus dieser Funktion verstehst du denn nicht?

hobbyflug hat geschrieben: und -->

Code: Alles auswählen

FILE *f = fopen(filename, "r");
    int i, n, errcode;
    errLinenumber = 0;
    if (f == NULL)
        return -1;//datei lässt sich nicht öffnen
   
    for(n=0;n>-1;n++)
    {
        char s[1024];
       
        if (fgets(s,sizeof s, f)==NULL)
        {
            fclose (f);
            errLinenumber = -1 ;
            return n;
        }
       
        s[strlen(s)-1]=0;
       
        struct Buch buch;
        char *p;
        p=strtok(s, ",");
               
        if (p==NULL || isEmtyausserLeerzeichen(p))
            continue;//leere Zeile?
        strncpy(buch.titel, p, sizeof(buch.titel));
macht. Sprich, damit ich weiß, wozu ich das im Programm verwenden muss.
Selbe Frage: Welchen Teil verstehst Du nicht?
strtok findest Du im Wiki.

Kommentiere den Quelltext doch erstmal für Dich durch und markiere die Stelle, wo Du Probleme hast. Es bringt Dich nicht weiter, wenn ich das für Dich tue.
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.

hobbyflug
Beiträge: 13
Registriert: Fr Okt 24, 2014 2:38 pm
Kontaktdaten:

Re: Bitte um Hilfeeeee

Beitrag von hobbyflug » Mo Okt 27, 2014 7:34 am

Bei isEmtyausserLeerzeichen verstehe ich das nicht -->

Code: Alles auswählen

char c=str[i++];
       
if(c==0)
    return 1;
       
if(c!=' ' && c!='\t' && c!= '\n' && c!='\r')

und -->

Code: Alles auswählen

FILE *f = fopen(filename, "r");
int i, n, errcode;
errLinenumber = 0;
if (f == NULL)
    return -1
Ist das das selbe , wenn ich statt NULL eine 0 reinschreibe

Edit by cloidnerux: code-tags, Einrückungen

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

Re: Bitte um Hilfeeeee

Beitrag von Xin » Mo Okt 27, 2014 8:53 am

Könntest Du Dir bitte die Code-Tags anschauen. Einfach oben mal auf "Code" drücken und den Quelltext dazwischen kopieren.
hobbyflug hat geschrieben:Bei isEmtyausserLeerzeichen verstehe ich das nicht -->

Code: Alles auswählen

char c=str[i++];
       
        if(c==0)
            return 1;
       
        if(c!=' ' && c!='\t' && c!= '\n' && c!='\r')
Du hast einen String und kopierst den Buchstaben an Stelle i. i wird um eins erhöht.
Ist der Buchstabe 0, wird die Funktion verlassen. Ist der Buchstabe nicht ' ', nicht '\t', nicht ’\n’, und nicht ’\r’, dann ...
Die escapten Zeichen sind Tab, NewLine und Rewind.
hobbyflug hat geschrieben: und -->

Code: Alles auswählen

FILE *f = fopen(filename, "r");
    int i, n, errcode;
    errLinenumber = 0;
    if (f == NULL)
        return -1
Ist das das selbe , wenn ich statt NULL eine 0 reinschreibe
NULL steht für einen Zeiger, der auf die Adresse 0 zeigt. Es ist das gleiche wie 0, aber bei einem Zeiger schreib trotzdem NULL, um zu demonstrieren, dass es sich um einen Zeiger handelt. Wie Du dem Vergleich mit einem Character auch besser if(c=='\0') schreibst. Inhaltlich ist das das gleiche, aber es dokumentiert besser, was Du da eigentlich tust.
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.

hobbyflug
Beiträge: 13
Registriert: Fr Okt 24, 2014 2:38 pm
Kontaktdaten:

Re: Bitte um Hilfeeeee

Beitrag von hobbyflug » Mo Okt 27, 2014 12:17 pm

ok sry

also ob ich if(f == NULL) oder if(f == 0) schreibe ist egal, es verändert im Programm nichts

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

Re: Bitte um Hilfeeeee

Beitrag von Xin » Mo Okt 27, 2014 7:16 pm

hobbyflug hat geschrieben:ok sry

also ob ich if(f == NULL) oder if(f == 0) schreibe ist egal, es verändert im Programm nichts
Im Ausführbarem Programm ändert sich dadurch nichts. Aber der Quelltext wird für den Menschen besser verständlich - insbesondere wenn die Projekte mal größer werden.
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.

Benutzeravatar
darksider3
Beiträge: 347
Registriert: Fr Sep 14, 2012 6:26 pm
Wohnort: /dev/sda1
Kontaktdaten:

Re: Bitte um Hilfeeeee

Beitrag von darksider3 » Mo Okt 27, 2014 7:31 pm

"NULL" ist im Grunde tatsächlich gleich 0. Es ist aber nicht die Zahl, die dadurch repräsentiert werden soll, sondern eher das Ergebniss. 0 ist ja im grunde False; Also falsch. Aber wenn Du beispielsweise einen Passwortgeschützten Zugang zu XY schreibt, musst Du ja prüfen, ob alles ausgefüllt wurde(Passwort...). Sowas wäre ein größeres Projekt, wie Xin glaube ich meint( Beispiel halt.^^). Wenn die länge gleich NULL ist, soll das einfach "Leer" bedeuten, und nicht false.

So jedenfalls habe ich mir das mal beigebracht.
effizienz ist, wenn ich ein loch bohre und hinterher mein nachbar auch ein bild aufhängen kann... ^^
Meine Homepage und der Microblog von mir :)
Live Life dont let Life Live You!
Am meisten Aktiv in Webentwicklung und PHP im Wiki

hobbyflug
Beiträge: 13
Registriert: Fr Okt 24, 2014 2:38 pm
Kontaktdaten:

Re: Bitte um Hilfeeeee

Beitrag von hobbyflug » Mo Okt 27, 2014 8:39 pm

Super danke!!!!!!

Kann mir wer sagen, warum dieses Programm nicht funktioniert?

Code: Alles auswählen

/* 
 * File:   main.c
 * Author: Marcel
 *
 * Created on 24. Oktober 2014, 16:52
 */

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

/*
 * 
 */

struct Mensch
{
    char name[25];
    char nationalitaet[30];
    char wohnort[20];
    int alter;
};

int errLinenumber;

void ausgabe (struct Mensch b , int i)
{
    printf("Mensch: \n");
    printf("Name: %s \n", b.name);
    printf("Nationalitaet: %s \n", b.nationalitaet);
    printf("Wohnort: %s \n", b.wohnort);
    printf("Alter: %d \n", b.alter);
}

struct Mensch getMensch()
{
    struct Mensch b;
    char s[100];
    
    printf("\n");
    
    do
    {
        printf("Name:");
        fgets(s,sizeof s, stdin);
    }
    while (strlen(s)==0);
    
    s[strlen(s)-1]=0;                        //\n weg bei der Ausgabe
    strncpy(b.name, s, sizeof (b.name)); 

    do
    {
        printf("Nationalitaet:");
        fgets(s,sizeof s,stdin);
    }
    while (strlen(s)==0);
    
    s[strlen(s)-1]=0;                       //\n weg bei der Ausgabe
    strncpy(b.nationalitaet, s, sizeof (b.nationalitaet));
    
    do
    {
        printf("Wohnort:");
        fgets(s,sizeof s, stdin);
    }
    while (strlen(s)==0);
    
    s[strlen(s)-1]=0;                       //\n weg bei der Ausgabe
    strncpy(b.wohnort, s, sizeof (b.wohnort));
    
    do
    {
        printf("Alter:");
        fgets(s,sizeof(s),stdin);
        sscanf(s, "%d", &b.alter);
    }
    while (strlen(s)==0);
        
    
    return b;

}

int isEmtyausserLeerzeichen(char str[])
{
    int i=0;
    
    while(1)
    {
        char c=str[i++];
        
        if(c==0)
            return 1;
        
        if(c!=' ' && c!='\t' && c!= '\n' && c!='\r')
            return 0;
    }
}


int leseausDatei (char filename[], struct Mensch feld[], int feldmax)
{
    //f = Filehandler
    
    FILE *f = fopen (filename, "r");
    int i; 
    int n; 
    int errcode;
    
    errLinenumber = 0;
    
    if (f == NULL)
        return -1;                  //Datei laesst sich nicht oeffnen 
    
    for(n=0;n>-1;n++)
    {
        char s[1024];
        
    if (fgets(s,sizeof s, f)==NULL)
        {
            fclose (f);
            errLinenumber = -1 ;
            return n;
        }
        
    s[strlen(s)-1]=0;
        
    struct Mensch mensch;
    char *p;
    p=strtok(s, ",");
    
    if (p==NULL || isEmtyausserLeerzeichen(p))
        continue;                                               //leere Zeile?
    strncpy(mensch.name, p, sizeof(mensch.name));
        
    errLinenumber++;
        
    p=strtok(NULL, ",");       
    if (p==NULL)
    {
        errcode=-2;
        break;
    }
    strncpy(mensch.nationalitaet, p, sizeof(mensch.nationalitaet));
    
    p=strtok(NULL, ",");       
    if (p==NULL)
    {
        errcode=-3;
        break;
    }
    strncpy(mensch.wohnort, p, sizeof(mensch.wohnort));
        
    p=strtok(NULL, ",");
    if (p==NULL)
    {
        errcode=-4;
        break;
    }
    if(sscanf(p,"%d", &mensch.alter)!=1)
    {
        errcode=-4;
        break;
    }

        
    feld[n]=mensch;
    
    }
    
    fclose(f);
    return errcode;
}

int schreibeinDatei(char filename[], struct Mensch feld[], int feldmax)
{
    int i;
    FILE *f = fopen (filename, "w");
    if(f==NULL)
        return-1;
    
    for(i=0; i<=feldmax; i++)
    {
        struct Mensch *pb = &feld[i];
        fprintf(f,"%s",pb->name);
        fprintf(f,",%s",pb->nationalitaet);
        fprintf(f,",%s",pb->wohnort);
        fprintf(f,",%d",pb->alter);
        fprintf(f,"\n");
    }
    
    fclose(f);
    
    return 1;
    
}


int main(int argc, char** argv) 
{
    
    struct Mensch bibliothek[100];
    int i;
    int anzahl, err;
    
    printf("\tMensch:\n");
    printf("\t------\n\n");
    
    anzahl=leseausDatei("daten.csv", bibliothek, 100);
    
    if(anzahl<=0)
    {
        int error=anzahl;
        printf("Fehler beim Lesen (code %d) in Zeile%d\n",error, errLinenumber);
        return -1;
    }
    
    for (i=0;i<anzahl;i++)
        ausgabe(bibliothek[i], i+1);
    
    bibliothek[6]=getMensch();
    
    err=schreibeinDatei("daten.csv", bibliothek, anzahl);
    if(err<=0)
    {
        printf("Fehler beim Lesen (code %d) in Zeile%d\n",err);
        return -2;
    }
    
    struct Mensch eins;
    //struct Mensch zwei={"Max Mustermann","Italien","Lignano",28};// nur beim Anlegen der Struktur

    
    eins.alter = 16;
    strncpy(eins.name,  "Marcel", sizeof(eins.name));
    strncpy(eins.nationalitaet,  "Oesterreich", sizeof(eins.nationalitaet));
    strncpy(eins.wohnort, "Leibnitz", sizeof(eins.wohnort));
 
      
    bibliothek[0]=  eins;
    //bibliothek[1]=   zwei;

    
    
    for (i=0;i<4;i++)
        ausgabe(bibliothek[i], i+1);
    
    printf("\n\n");
    
    return (EXIT_SUCCESS);
}

daten.csv

Marcel Maier , Oestrreich , Leibnitz , 16
Sven de Cou , Schweiz , Neucatel , 16
Lukas Mueller , Deutschland , Berlin , 40


danke

lg

Antworten