Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/Studentendatenbank/Musterlösung: Unterschied zwischen den Versionen

(Die Seite wurde neu angelegt: „=== Musterlösung === <pre> #include <stdlib.h> #include <stdio.h> #include <string.h> #define ANZAHL 10 Teil a: struct student { int mat_nr; char vorna...“)
 
 
(2 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 7: Zeile 7:
  
 
#define ANZAHL 10
 
#define ANZAHL 10
 +
#define NAME_LEN 25
 +
 +
#define NAME_TO_LONG (-1)
 +
#define MAT_NR_USED (-2)
 +
#define DB_FULL (-3)
 +
#define ADD_SUCCEED 1
 +
#define NO_MAT_NR (-1)
 +
#define DEL_SUCCEED 1
  
 
/* Teil a */
 
/* Teil a */
struct student {
+
typedef struct student_t {
 
int mat_nr;
 
int mat_nr;
char vorname[25];
+
char first_name[NAME_LEN];
char nachname[25];
+
char last_name[NAME_LEN];
};
+
} student;
  
 
/* Teil b */
 
/* Teil b */
print_student(struct student *studi) {
+
void print_student(student *studi) {
printf("Matr.Nr.: %i, Vorname: %s, Nachname: %s\n", studi->mat_nr, studi->vorname, studi->nachname);
+
printf("Matr.Nr.: %i, Vorname: %s, Nachname: %s\n", studi->mat_nr, studi->first_name, studi->last_name);
 
}
 
}
  
 
/* Teil c */
 
/* Teil c */
print_studenten_db(struct student **db) {
+
void print_students_db(student **db) {
 +
printf("===========================================================\n");
 
int i;
 
int i;
 
for (i=0; i<ANZAHL; i++) {
 
for (i=0; i<ANZAHL; i++) {
Zeile 28: Zeile 37:
 
}
 
}
 
}
 
}
 +
printf("===========================================================\n");
 
}
 
}
  
 
/* Teil e */
 
/* Teil e */
clear_db(struct student **db) {
+
void clear_db(student **db) {
 
int i;
 
int i;
 
for (i=0; i<ANZAHL; i++) {
 
for (i=0; i<ANZAHL; i++) {
Zeile 39: Zeile 49:
 
}
 
}
 
}
 
}
 +
}
 +
 +
/* Teil f */
 +
int get_student_index(int mat_nr, student **db) {
 +
int i;
 +
for (i=0; i<ANZAHL; i++) {
 +
if (db[i] != NULL) {
 +
if (mat_nr == db[i]->mat_nr) {
 +
return i;
 +
}
 +
}
 +
}
 +
return -1;
 +
}
 +
 +
int add_student(int mat_nr, char *first_name, char *last_name, student **db) {
 +
if (strlen(first_name) >= NAME_LEN || strlen(last_name) >= NAME_LEN) {
 +
return NAME_TO_LONG;
 +
}
 +
if (get_student_index(mat_nr, db) >= 0) {
 +
return MAT_NR_USED;
 +
}
 +
 +
int i;
 +
for (i=0; i<=ANZAHL; i++) {
 +
if (db[i] == NULL) {
 +
db[i] = malloc(sizeof(student));
 +
db[i]->mat_nr = mat_nr;
 +
strcpy(db[i]->first_name, first_name);
 +
strcpy(db[i]->last_name, last_name);
 +
return ADD_SUCCEED;
 +
}
 +
}
 +
return DB_FULL;
 +
}
 +
 +
/* Teil g */
 +
int del_student(int mat_nr, student **db) {
 +
int del_student_index = get_student_index(mat_nr, db);
 +
if (del_student_index < 0) {
 +
return NO_MAT_NR;
 +
}
 +
free(db[del_student_index]);
 +
db[del_student_index] = NULL;
 +
return DEL_SUCCEED;
 
}
 
}
  
 
int main() {
 
int main() {
/* Teil b*/ printf("Teil b\n");
+
/* Teil b*/ printf(">>> Teil b\n");
struct student *ein_student = malloc(sizeof(struct student));
+
student *one_student = malloc(sizeof(student));
ein_student->mat_nr = 123456;
+
one_student->mat_nr = 123456;
strcpy(ein_student->vorname, "Max");
+
strcpy(one_student->first_name, "Max");
strcpy(ein_student->nachname, "Mustermann");
+
strcpy(one_student->last_name, "Mustermann");
print_student(ein_student);
+
print_student(one_student);
  
/* Teil c */ printf("Teil c\n");
+
/* Teil c */ printf(">>> Teil c\n");
struct student *alle_studenten[ANZAHL];
+
student *all_students[ANZAHL];
 
int i;
 
int i;
 
for (i=0; i<ANZAHL; i++) {
 
for (i=0; i<ANZAHL; i++) {
alle_studenten[i] = NULL;
+
all_students[i] = NULL;
 
}
 
}
alle_studenten[0] = ein_student;
+
all_students[0] = one_student;
print_studenten_db(alle_studenten);
+
print_students_db(all_students);
 +
 
 +
/* Teil d */ printf(">>> Teil d\n");
 +
all_students[1] = malloc(sizeof(student));
 +
all_students[1]->mat_nr=653321;
 +
strcpy(all_students[1]->first_name, "Herbert");
 +
strcpy(all_students[1]->last_name, "Meier");
 +
all_students[2] = malloc(sizeof(student));
 +
all_students[2]->mat_nr=765431;
 +
strcpy(all_students[2]->first_name, "Hubertine");
 +
strcpy(all_students[2]->last_name, "Schulze");
 +
free(all_students[0]);
 +
all_students[0] = NULL;
 +
print_students_db(all_students);
  
/* Teil d */ printf("Teil d\n");
+
/* Teil e */ printf(">>> Teil e\n");
alle_studenten[1] = malloc(sizeof(struct student));
+
clear_db(all_students);
alle_studenten[1]->mat_nr=653321;
+
 
strcpy(alle_studenten[1]->vorname, "Herbert");
+
/* Teil f */ printf(">>> Teil f\n");
strcpy(alle_studenten[1]->nachname, "Meier");
+
if (add_student(123456, "Peter", "Mueller", all_students) == ADD_SUCCEED) {
alle_studenten[2] = malloc(sizeof(struct student));
+
printf("Student hinzugefuegt.\n");
alle_studenten[2]->mat_nr=765431;
+
}
strcpy(alle_studenten[2]->vorname, "Hubertine");
+
if (add_student(123456, "Hans", "Wurst", all_students) == MAT_NR_USED) {
strcpy(alle_studenten[2]->nachname, "Schulze");
+
printf("Student nicht hinzugefuegt, da Mat.nr. schon benutzt wird.\n");
free(alle_studenten[0]);
+
}
alle_studenten[0] = NULL;
+
if (add_student(123457, "Hans", "Wurst", all_students) == ADD_SUCCEED) {
print_studenten_db(alle_studenten);
+
printf("Student hinzugefuegt..\n");
 +
}
 +
print_students_db(all_students);
  
/* Teil e */
+
/* Teil g */ printf(">>> Teil g\n");
clear_db(alle_studenten);
+
if (del_student(123456, all_students) == DEL_SUCCEED) {
 +
printf("Student entfernt.\n");
 +
}
 +
print_students_db(all_students);
 
}
 
}
 
</pre>
 
</pre>
Zeile 82: Zeile 155:
 
Als kleine Starthilfe folgt ein Beispiel, wie so ein Kommentar formatiert sein könnte. Mit "Vorschau zeigen" kannst du dir ansehen, was deine Änderung bewirken würde, ohne wirklich etwas zu ändern.
 
Als kleine Starthilfe folgt ein Beispiel, wie so ein Kommentar formatiert sein könnte. Mit "Vorschau zeigen" kannst du dir ansehen, was deine Änderung bewirken würde, ohne wirklich etwas zu ändern.
 
Du musst übrigens außerhalb dieses auskommentieren Bereichs schreiben ;)
 
Du musst übrigens außerhalb dieses auskommentieren Bereichs schreiben ;)
 +
-->

Aktuelle Version vom 5. März 2013, 17:37 Uhr

Musterlösung

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

#define ANZAHL 10
#define NAME_LEN 25

#define NAME_TO_LONG (-1)
#define MAT_NR_USED (-2)
#define DB_FULL (-3)
#define ADD_SUCCEED 1
#define NO_MAT_NR (-1)
#define DEL_SUCCEED 1

/* Teil a */
typedef struct student_t {
	int mat_nr;
	char first_name[NAME_LEN];
	char last_name[NAME_LEN];
} student;

/* Teil b */
void print_student(student *studi) {
	printf("Matr.Nr.: %i, Vorname: %s, Nachname: %s\n", studi->mat_nr, studi->first_name, studi->last_name);
}

/* Teil c */
void print_students_db(student **db) {
	printf("===========================================================\n");
	int i;
	for (i=0; i<ANZAHL; i++) {
		if (db[i] != NULL) {
			print_student(db[i]);
		}
	}
	printf("===========================================================\n");
}

/* Teil e */
void clear_db(student **db) {
	int i;
	for (i=0; i<ANZAHL; i++) {
		if (db[i] != NULL) {
			free(db[i]);
			db[i] = NULL;
		}
	}
}

/* Teil f */
int get_student_index(int mat_nr, student **db) {
	int i;
	for (i=0; i<ANZAHL; i++) {
		if (db[i] != NULL) {
			if (mat_nr == db[i]->mat_nr) {
				return i;
			}
		}
	}
	return -1;
}

int add_student(int mat_nr, char *first_name, char *last_name, student **db) {
	if (strlen(first_name) >= NAME_LEN || strlen(last_name) >= NAME_LEN) {
		return NAME_TO_LONG;
	}
	if (get_student_index(mat_nr, db) >= 0) {
		return MAT_NR_USED;
	}

	int i;
	for (i=0; i<=ANZAHL; i++) {
		if (db[i] == NULL) {
			db[i] = malloc(sizeof(student));
			db[i]->mat_nr = mat_nr;
			strcpy(db[i]->first_name, first_name);
			strcpy(db[i]->last_name, last_name);
			return ADD_SUCCEED;
		}
	}
	return DB_FULL;
}

/* Teil g */
int del_student(int mat_nr, student **db) {
	int del_student_index = get_student_index(mat_nr, db);
	if (del_student_index < 0) {
		return NO_MAT_NR;
	}
	free(db[del_student_index]);
	db[del_student_index] = NULL;
	return DEL_SUCCEED;
}

int main() {
	/* Teil b*/ printf(">>> Teil b\n");
	student *one_student = malloc(sizeof(student));
	one_student->mat_nr = 123456;
	strcpy(one_student->first_name, "Max");
	strcpy(one_student->last_name, "Mustermann");
	print_student(one_student);

	/* Teil c */ printf(">>> Teil c\n");
	student *all_students[ANZAHL];
	int i;
	for (i=0; i<ANZAHL; i++) {
		all_students[i] = NULL;
	}
	all_students[0] = one_student;
	print_students_db(all_students);

	/* Teil d */ printf(">>> Teil d\n");
	all_students[1] = malloc(sizeof(student));
	all_students[1]->mat_nr=653321;
	strcpy(all_students[1]->first_name, "Herbert");
	strcpy(all_students[1]->last_name, "Meier");
	all_students[2] = malloc(sizeof(student));
	all_students[2]->mat_nr=765431;
	strcpy(all_students[2]->first_name, "Hubertine");
	strcpy(all_students[2]->last_name, "Schulze");
	free(all_students[0]);
	all_students[0] = NULL;
	print_students_db(all_students);

	/* Teil e */ printf(">>> Teil e\n");
	clear_db(all_students);

	/* Teil f */ printf(">>> Teil f\n");
	if (add_student(123456, "Peter", "Mueller", all_students) == ADD_SUCCEED) {
		printf("Student hinzugefuegt.\n");
	}
	if (add_student(123456, "Hans", "Wurst", all_students) == MAT_NR_USED) {
		printf("Student nicht hinzugefuegt, da Mat.nr. schon benutzt wird.\n");
	}
	if (add_student(123457, "Hans", "Wurst", all_students) == ADD_SUCCEED) {
		printf("Student hinzugefuegt..\n");
	}
	print_students_db(all_students);

	/* Teil g */ printf(">>> Teil g\n");
	if (del_student(123456, all_students) == DEL_SUCCEED) {
		printf("Student entfernt.\n");
	}
	print_students_db(all_students);
}

Kommentare

Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf "bearbeiten" und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)