0 Daumen
1,4k Aufrufe

Hallo wir haben von unseren Informatiklehrer eine Gruppenhausaufgabe bekommen, die wir eigentlich alleine Lösen sollten.
Nun fällt unser Unterricht allerdings aus (Lehrer wird sehr lange Krank sein) und die Hausaufgaben werden nun nicht mehr abgegeben, deshalb wollte ich hier einmal fragen, wie man auf die Lösung kommt, bzw was bei uns falsch läuft.


Aufgabe:
In der Datei “staedte.csv” sind die Städte eines Bundeslands, das Bundesland selbst und die Anzahl der Bewohner dieser
Städte, getrennt durch Semikolons, aufgelistet.
Schreibe ein Programm, das für ein gegebenes Bundesland alle Städte findet, in denen mindestens eine vorgegebene
Anzahl n an Menschen leben. Die Ausgabe soll mit Hilfe der Funktion write_file in die Datei “resultat.txt” erfolgen,
und für jeden Eintrag eine Zeile enthalten, die das Format Die Stadt Nürnberg hat 505664 Einwohner. befolgt. Zur
Vereinfachung kannst du davon ausgehen, dass die Länge dieses Strings niemals 100 Zeichen überschreitet.
In dieser Aufgabe sollen das Bundesland und die Anzahl n als Parameter direkt beim Aufruf des Programms übergeben
werden. Einen beispielhaften Aufruf mit Parametern kannst du in Listing 2 Zeile 3 sehen. In C stehen die übergebenen
Parameter als char** argv zur Verfügung. In argv[1] und argv[2] werden jeweils das erste und das zweite
Argument übergeben. (argv[0] ist für den Programmnamen reserviert.)

Verfügbarer Code:

intput3.c  (darf nicht verändert werden)


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "input3.h"

int MAX_LAENGE_STR = 255;
int MAX_LAENGE_ARR = 100;

void write_file(char *result[], int len) {
    FILE *fp = fopen("resultat.txt", "w");
    if (fp == NULL){
        perror("resultat.txt");
        exit(1);
    }
    for (int i=0; i<len; i++) {
        fprintf(fp, "%s\n", result[i]);
    }
    fclose(fp);
}

int read_file(char *dateiname, char staedte[][MAX_LAENGE_STR], char laender[][MAX_LAENGE_STR], int bewohner []) {
    FILE *fp = fopen(dateiname, "r");

    if (fp == NULL){
        perror(dateiname);
        exit(1);
    }

    char stadt[MAX_LAENGE_STR];
    char land[MAX_LAENGE_STR];
    int anzahl;
    int i = 0;
    int len;

    while(fscanf(fp, "\"%[^\"]\";\"%[^\"]\";%d\n", stadt, land, &anzahl) != EOF)
    {
        if (i >= MAX_LAENGE_ARR) {
            printf("ERROR: Die Datei ist größer als erwartet!");
            return i;
        }
        len = strlen(stadt) + 1;
        strncpy(staedte[i], stadt, len-1);
        staedte[i][len-1] = '\0';

        len = strlen(land) + 1;
        strncpy(laender[i], land, len-1);
        laender[i][len-1] = '\0';

        bewohner[i] = anzahl;
        i++;
    }
    fclose(fp);
    return i;
}

input3.h (darf nicht verändert werden)

extern int MAX_LAENGE_ARR;
extern int MAX_LAENGE_STR;

void write_file(char *result[], int len);
int read_file(char *dateiname, char staedte[][MAX_LAENGE_STR], char laender[][MAX_LAENGE_STR], int bewohner []);

staedte.csv

"Essen";"Nordrhein-Westfalen";574635
"Bremen";"Bremen";547340
"Dresden";"Sachsen";523058
"Leipzig";"Sachsen";522883
"Hannover";"Niedersachsen";522686
"Nürnberg";"Bayern";505664
"Duisburg";"Nordrhein-Westfalen";489599
"Bochum";"Nordrhein-Westfalen";374737
"Wuppertal";"Nordrhein-Westfalen";349721
"Bonn";"Nordrhein-Westfalen";324899
"Bielefeld";"Nordrhein-Westfalen";323270
"Mannheim";"Baden-Württemberg";313174
"Karlsruhe";"Baden-Württemberg";294761
"Münster";"Nordrhein-Westfalen";279803
"Wiesbaden";"Hessen";275976


Und hier der Code, :

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

/* Die Konstanten:
*  int MAX_LAENGE_STR - die maximale String Länge
*  int MAX_LAENGE_ARR - die maximale Array Länge
*  sind input3.c auf jeweils 255 und 100 definiert
*/

int main(int argc, char **argv) {
    if (argc < 3) {
        printf("Aufruf: %s <anzahl> <bundesland>\n", argv[0]);
        printf("Beispiel: %s 100 Bayern\n", argv[0]);
        printf("Klein-/Großschreibung beachten!\n");
        exit(1);
    }
    int anzahl = atoi(argv[1]);
    char *bundesland = argv[2];

    // Statisch allokierter Speicher
    char staedte[MAX_LAENGE_ARR][MAX_LAENGE_STR];
    char laender[MAX_LAENGE_ARR][MAX_LAENGE_STR];
    int bewohner[MAX_LAENGE_ARR];

    int len = read_file("staedte.csv", staedte, laender, bewohner);

    // Hier implementieren
    char ** jg;
    int cc = 0;
    int cc_jg = 0;

    for(int i = 0; i < len; i++) {
        if((strcmp(bundesland, laender[i]) == 0) && (bewohner[i] >= anzahl)) {
            cc ++;
        }
    }

    jg = (char **) malloc(MAX_LAENGE_ARR*sizeof(char *));;
    for (int j = 0; j < len; j++) {
        jg[j] = (char*)malloc(MAX_LAENGE_STR*sizeof(char));
    }

    for(int i = 0; i < len; i++) {
        if((strcmp(bundesland, laender[i]) == 0) && (bewohner[i] >= anzahl)) {
            sprintf(jg[cc_jg], "Die Stadt %s hat %d Einwohner.", staedte[i], bewohner[i]);
            cc_jg++;
        }
    }

// Mithilfe von write_file(...) soll das Ergebnis in die "resultat.txt"
    write_file(jg, cc_jg);

    // Dynamisch allozierter Speicher muss hier freigegeben werden.
    for(int l = 0; l < cc; l++) {
        free(jg[l]);
    }
    free(jg);
    return 0;
}


Der Code an sich müsste funktionieren, nur wird keine TxT erstellt, also irgendwas stimmt dort nicht.

Ich weiß es ist viel, aber ihr seht die Probleme doch bestimmt schneller als wir:)

Mit freundlichen Grüßen

Anja

Avatar von

1 Antwort

0 Daumen
Der Code an sich müsste funktionieren

Habt ihr den Code denn einmal ausprobiert? Wenn ja: Gab es Fehlermeldungen und/oder Warnings?

Wenn keine Fehlermeldungen kommen ist die Wahrscheinlichkeit groß, dass das File erzeugt wird ... ihr müsst es nur finden. Ändert ggf. den Namen des Files ("resultat.txt") und sucht nach Start des Programms den (potentiellen) Output über die Windows-Suche.

Lasst euch mal den Inhalt von jg ausgeben bzw. debuggt den gesamten Programmaufruf: https://www.thegeekstuff.com/2010/03/debug-c-program-using-gdb/

Avatar von

Hallo!

Nein es kommen leider keine Fehlermeldungen.

Wie meinst du das mit dem Namen ändern?

Also es wird bei uns keine Datei erstellt, wir haben schon alles abgesucht.

Wenn wir allerdings unseren Code durch einen Code ersetzen, der nichts mit der Aufgabe zu tun hat und nur 2 Zeilen in die txt schreiben soll funktioniert es, es liegt also an unseren Code.

Wahrscheinlich bekommt er keinen Input?  Denn in der Aufgabe steht, dass die Daten nach Einwohnerzahl und Bundesland geordnet werden sollten, bzw man filtern muss.

Allerdings wüssten wir nicht, wo wir diese Angaben reinschreiben könnten um dies zu prüfen.

Ihr ruft doch die Funktion write_file auf, der zwei Argumente übergeben werden. Was wird da übergeben? Wie sieht der "der andere" Code aus?

Ja, diese Funktion befindet sich in der input3.c Datei (also wurde vorgegeben) und die schaut so aus:

void write_file(char *result[], int len) {
    FILE *fp = fopen("resultat.txt", "w");
    if (fp == NULL){
        perror("resultat.txt");
        exit(1);
    }
    for (int i=0; i<len; i++) {
        fprintf(fp, "%s\n", result[i]);
    }
    fclose(fp);
}


Wir übergeben ihr das array result und len.


Das ist allerdings nur die Theorie, testen konnten wir es noch nicht, da noch nie etwas passiert ist.

Dort steht doch der Name, den ich meinte ("resultat.txt"). Dort tragt ihr den Filenamen ein.

testen konnten wir es noch nicht

Das solltet ihr aber ... sonst wird nichts ausgegeben.

Hier ist euer Aufruf: write_file(jg, cc_jg); Spezifiziert jg und cc_jg.

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community