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