Informatik 1 - C -Programm basics
-
@Swordfish PRAKTIKUM INFORMATIK I / PROJEKTAUFGABE 3
1 Datenrepräsentation und Suche in Datensätzen
1.1 Einführung
Die Grundlage für eine effiziente automatisierte Suche in Datenbanken ist die Strukturierung
der einzelnen Datensätze. Ein Datensatz repräsentiert die Gesamtheit der Information, die zu
einem Objekt oder Ereignis gespeichert ist. Ein Such-Kriterium kann sich auf eine einzelne
Angabe in den Datensätzen beziehen oder mehrere Angaben verknüpfen.
Wir betrachten in dieser Aufgabe den Speiseplan der Mensa Campus Derendorf an einem
bestimmten Öffnungstag als einen Datensatz. Alle Mensa-Daten, mit denen Sie bei dieser
Aufgabe arbeiten sollen, stammen von folgender Webseite:
https://www.stw-d.de/en/gastronomie/speiseplaene/mensa-campus-derendorf/
Auf dieser Seite veröffentlicht das Studierendenwerk Düsseldorf für die Mensa Campus
Derendorf den aktuellen Speiseplan und die Speisepläne der folgenden vier Tage in englischer
Sprache.
Wir verfügen über eine Datenbank in der alle Speisepläne des Jahres 2019 gespeichert sind.
Diese Datenbank ist für ein C-Programm im CVis Onlinecompiler zugänglich wenn die
Header-Datei "mensadata_en.h" in das Programm eingefügt wird:
#include "mensadata_en.h"
Die Datensätze sind in C-Strukturen abgelegt. Jeder Datensatz (der Speiseplan eines Tages)
ist ein Element eines Datenfelds. Die symbolische Konstante "NUMDAYS" gibt an, wie viele
Datensätze aktuell vorhanden sind. Das Datenfeld ist in mensadata_en.h definiert als:
const Tagesplan tp[NUMDAYS];
In dieser Aufgabe sollen von den Daten aus dem Datenfeld tp lediglich die Einträge aus dem
Sommersemester 2019 verwendet werden. Der erste Datensatz des Sommersemesters 2019 ist
vom 01.03.2019 und hat den Indexwert 51 ( tp[51] ). Der letzte Eintrag aus dem
Sommersemesters 2019 ist vom 30.08.2019 und hat den Indexwert 185 ( tp[185] ).
Nachfolgend sind die Definitionen der Strukturen Mensa_Gericht und Tagesplan
sowie der Datenfelder Angebot und tp aus mensadata_en.h gezeigt. Durch das
#include von mensadata_en.h können Sie damit arbeiten.
PRAKTIKUM Seite 2 INFORMATIK I / PROJEKTAUFGABE 3
1.2 Aufgabenstellung
Sie sollen ein Programm schreiben, das für ein bestimmtes Mensa-Gericht eine Statistik für
das Sommersemester 2019 erstellt.
Im ersten Schritt sollen Sie in Ihrem Programm eine Struktur-Variable vom Typ Tagesplan
definieren. Diese Variable soll tp123456 heißen. 123456 steht für Ihre Matrikelnummer
und muss von Ihnen entsprechend ersetzt werden. Die Variable muss mit den aktuellen
Speiseplan-Daten für den Tag Ihres Präsenztermins 4 gefüllt werden. Die Daten bekommen
Sie von der Webseite
https://www.stw-d.de/en/gastronomie/speiseplaene/mensa-campus-derendorf/
sobald der Speiseplan für den Tag Ihres Präsenztermins 4 online ist. Bitte beachten Sie, dass
Sie die englische Version des Speiseplans benutzen sollen. Die Kennzeichnungen über
Zusatzstoffe und Allergene stehen hier:
#define NUMDAYS 252 /* Anzahl der Datensätze für Mensa-Öffnungstage /
/ Alle möglichen Mensa-Angebotskategorien für einen Tag /
const char Angebot[][50] =
{
"void" /Nr. 0, markiert eine leere Mensa-Essen-Datenstruktur/,
"Essen I" /Nr. 1/, "Essen II" /Nr. 2/, "Eintopf" /Nr. 3/,
"Dessertauswahl" /Nr. 4/, "Pizza" /Nr. 5/,
"Beilagenauswahl" /Nr. 6/, "Aktionsstand" /Nr. 7/,
"Grill" /Nr. 8/, "Gratin" / Nr. 9*/, "zur Pizza" /* Nr. 10*/,
"GreenCorner" /Nr. 11/, "Sonstiges" /Nr. 12/
};
/* Die Struktur "Mensa_Gericht" enthält alle Daten für ein bestimmtes
Angebot /
typedef struct {
int angebot_nr; / Nummer der Angebotskategorie /
int hauptgericht; / 1= Hauptgericht / 0= kein Hauptgericht /
char bezeichnung[100]; / Bezeichnung des Gerichts, z.B. "Obstbecher /
/ Kennzeichnung ist eine Zeichenkette mit einem oder mehreren
Buchstaben.
Gibt es keine Kennzeichnung dann ist die Zeichenkette leer "" /
char kennzeichnung[10]; / z.B. "FA" fuer fleischlos mit Alkohol /
/ Max. 20 Angaben (Zahlen) fuer Zusatzstoffe. 0 ! keine Angabe /
char zusatzstoffe_und_allergene[20][4];
int centpreise[3]; / Preise in Euro-Cent:
centpreise[0]=Studierendenpreis /
/ centpreise[1]=Bedienstetenpreis, centpreise[2]= Gaestepreis /
} Mensa_Gericht;
/ Die Struktur "Tagesplan" enthält das komplette Mensa-Angebot eines
bestimmten Tages /
typedef struct {
int wochentag; / Nr. des Wochentags, 1=Montag, 2=Dienstag, ... /
int kalenderwoche; / Nr. der Kalenderwoche (KW) /
int datum[3]; / Datum als {tag, monat, jahr} /
Mensa_Gericht gerichte[15]; / Max. 15 Gerichte an einem Tag /
} Tagesplan;
const Tagesplan tp[NUMDAYS] = ...
PRAKTIKUM Seite 3 INFORMATIK I / PROJEKTAUFGABE 3
https://www.stw-d.de/wp-content/uploads/2017/07/Zeichenerklaerung.pdf
Hinweis:
Es gibt verschiedene Möglichkeiten dafür, die Daten für den Tag Ihres Präsenztermins 4 in
die Variable vom Typ Tagesplan zu schreiben. So können Sie z.B. eine Folge von
Programmanweisungen programmieren, die jeweils eine Komponente in der TagesspeiseplanStruktur mit dem (den) gegebenen Wert(en) besetzt. Oft ist es einfacher, eine Strukturvariable
bei ihrer Definition mit den vorgegebenen konstanten Werten per Initialisierung zu belegen.
Diese Initialisierung erfolgt ganz ähnlich wie bei Datenfeldern.
Siehe z.B.: http://c-buch.sommergut.de/Kapitel13/Strukturen.shtml.
In der Arbeitsunterlage für das Praktikumsmodul 4 ist entsprechend ein Beispiel gezeigt, wie
einer Strukturvariablen eine Kopie einer "Struktur-Konstanten" zugewiesen wird. Im Internet
finden sich dazu Informationen unter dem Stichwort "compound literal". Am Beispiel der
Struktur "STUDI" aus dem Praktikumsmodul 4 sind nachfolgend die alternativen
Möglichkeiten von Initialisierung und Zuweisung eines compound literals gezeigt:
Das nachfolgende Beispielprogramm zeigt, wie die Werte der einzelnen Komponenten in den
Datenstrukturen ausgegeben und angezeigt werden können. Mit diesem Beispielprogramm
können Sie sich den Inhalt des ersten Datensatzes in der Datenbank anzeigen lassen:
typedef struct {
char name[50]; / max. 49 Zeichen lang /
int matrikelnummer; / 6-stellige Matrikelnummer /
char geschlecht; / entweder w, m oder x /
} STUDI;
/ Strukturvariable ich: Definition und Initialisierung */
STUDI ich = {"Mein Name", 123456, 'f'};ich = (STUDI){"Mein Name", 123456, 'f'}; /* Alternative */
ich = (STUDI){.matrikelnummer=123456,
.name="Mein Name", .geschlecht='f'}; /Alternative/
PRAKTIKUM Seite 4 INFORMATIK I / PROJEKTAUFGABE 3
Für eines der Hauptgerichte am Tag Ihres Präsenztermins 4 sollen Sie ermitteln, wie oft
dieses Gericht im Sommersemester 2019 angeboten wurde. Es muss eines der Gerichte
"Essen I" /Nr. 1/, "Essen II" /Nr. 2/ oder "Eintopf" /Nr. 3/ sein, siehe Datenfeld
Angebot, das in mensadata_en.h definiert ist. Die Nummer des Gerichts (1, 2, oder 3) soll
als Benutzereingabe programmiert werden, andere Zahlen soll Ihr Programm ignorieren. Bei
der Suche in der Datenbank müssen Sie jeweils die ersten N Zeichen der Bezeichnung
vergleichen. Dafür sollen Sie die Funktion strncmp() aus der Standardbibliothek
verwenden:
http://www.c-howto.de/tutorial/strings-zeichenketten/string-funktionen/strings-vergleichn/
Der dritte Parameter dieser Funktion ist die Anzahl der Zeichen, die verglichen werden sollen.
Nur wenn alle diese Zeichen gleich sind liefert der Funktionsaufruf den Wert 0 (Null).
Wie viele Zeichen für den Vergleich notwendig sind, also das N, müssen Sie festlegen. Auf
jeden Fall sollen Sie die Vergleiche in der Datenbank mit Funktionsaufrufen in der Form
strncmp(tp123456.gerichte[...].bezeichnung, ... , N) durchführen.
Hinweis:
Die Komponente angebot_nr in der Struktur Mensa_Gericht ist mit dem Wert 0 (Null)
belegt, wenn die Struktur "leer" ist. Bei einer Suche durch die Strukturen muss dieser Fall
immer zuerst abgefragt werden, um nicht eventuell Werte aus einer "leeren" Struktur in die
Statistik aufzunehmen. Wenn ein Datenbank-Eintrag (Struktur Tagesplan) in der ersten
#include <stdio.h>
#include "mensadata_en.h"
int main(void)
{
int j, i;
Tagesplan bsp=tp[0];printf("Datum: %i.%i.%i KW:%i Wochentag:%i\n",
bsp.datum[0], bsp.datum[1], bsp.datum[2],
bsp.kalenderwoche, bsp.wochentag);
for(j = 0; j < 15 && bsp.gerichte[j].angebot_nr>0; j++){
Mensa_Gericht gbsp = bsp.gerichte[j];
printf("\nAngebot: %s, %s\n%s\n",
Angebot[gbsp.angebot_nr],
gbsp.hauptgericht ?
"Hauptgericht" : "kein Hauptgericht",
gbsp.bezeichnung);
printf("Kennzeichnung: %s\n", gbsp.kennzeichnung);
printf("zusatzstoffe_und_allergene: ");
for (i=0; i<20 && gbsp.zusatzstoffe_und_allergene[i]!=0; i++)
printf("%s ", gbsp.zusatzstoffe_und_allergene[i]);printf("\nStudierendenpreis (Cent): %i", gbsp.centpreise[0]);
printf("\nBedienstetenpreis (Cent): %i", gbsp.centpreise[1]);
printf("\nGaestepreis (Cent): %i\n", gbsp.centpreise[2]);
}
return 0;
}
PRAKTIKUM Seite 5 INFORMATIK I / PROJEKTAUFGABE 3
Komponente des Datenfelds gerichte die Angebotskategorie "void" (0) hat
(tp[...].gerichte[0].angebot_nr==0) , dann können Sie davon ausgehen, dass dieser
Eintrag überhaupt kein Gericht enthält. Das kann z.B. der Fall sein, wenn die Mensa
geschlossen war. In allen anderen Fällen können Sie davon ausgehen, dass in dem Datenfeld
gerichte "Essen I" den Index-Wert 0 hat, "Essen II" den Index-Wert 1 und "Eintopf" den
Index-Wert 2.
Für die Statistik zu dem von Ihnen ausgewählten Gericht muss nicht nur die Anzahl des
Vorkommens im Sommersemester 2019 ermittelt werden, sondern auch der Mittelwert des
Wochenabstands zwischen zwei Tagen, an dem dieses Gericht im Speiseplan stand. Dieser
Mittelwert drückt aus, wie viele Wochen im Mittel vergehen, bis dieses Gericht wieder im
Speiseplan zu finden ist. Als Anzahl der Wochen zwischen zwei Speiseplaneinträgen für ein
Gericht können Sie die Differenz der Kalenderwochenangaben in der Struktur Tagesplan
verwenden.
Die Angaben in der kleinen Statistik für diese Aufgabe bestehen aus drei Dateneinheiten:
• eine Zeichenkette für die Bezeichnung des Gerichts
• ein int-Wert für die Anzahl des Vorkommens des Gerichts im Sommersemester 2019
• ein float-Wert für den mittleren Wochenabstand dieses Angebots in der Mensa
Eine weitere Teilaufgabe dieser Projektaufgabe ist es, für die Angaben in der Statistik eine
Datenstruktur zu definieren und zu benutzen. Die Datenstruktur soll mit Hilfe von typedef
definiert werden, ein Datenfeld von Typ char enthalten sowie zwei weitere Komponenten
von Typ int bzw. float. Die Ergebnisse Ihrer Datenbanksuche müssen Sie in einer
Variablen vom Typ dieser Struktur ablegen. Die Inhalte dieser Struktur-Variablen sind
anschließend als Programmausgabe dem Benutzer mitzuteilen.
Folgende Vorgaben muss Ihr Programm zusätzlich einhalten:
• Die erste Programmanweisung (hinter den Definitionen der Programmvariablen)
soll mit der Funktion printf eine Ausgabezeile erzeugen, bestehend aus dem
Programm-Titel "Suchen im Mensa-Speiseplan Sommersemester 2019", Ihrem Namen
(Vor- und Nachname) und Ihrer Matrikelnummer.
• Alle Variablen in Ihrem Programm sollen am Anfang des Programmtextes
definiert werden. Das ist nach der Kopfzeile des Hauptprogramms ("main") und vor
der ersten Programmanweisung. Direkt danach soll folgende Kommentarzeile stehen:
/* Hauptprogramm: Ende der Variablen-Definitionen */
• Die Namen der Variablen, Datenstrukturen und eigenen Typen in Ihrem Programm
müssen mindestens 5 Zeichen lang sein. Die Variablennamen dürfen keine
Großbuchstaben enthalten. Gleiche aufeinanderfolgende Zeichen dürfen in den
Variablennamen höchstens zweimal vorkommen ("ttt00" wäre nicht erlaubt!). Sie
sollen sich Variablennamen überlegen, die mit der Verwendung der jeweiligen
Variable in Zusammenhang stehen. Insbesondere sollen sich die Unterschiede der
Namen zweier Variablen aus deren Verwendung im Programm ableiten lassen.
PRAKTIKUM Seite 6 INFORMATIK I / PROJEKTAUFGABE 3
Einfaches Durchnummerieren, z.B. variable1, variable2 ...., ist nicht erlaubt, ebenso
wenig sinnfreie Namen wie z.B. torsten, florian oder franziska.
• Ihr Programm soll nur solche Ausgaben erzeugen, die in der Aufgabenstellung explizit
gefordert werden
-
Es reichen mir auch nur Teilsachen damit ich irgendwas abgebe ...
-
@Lordkurd sagte in Informatik 1 - C -Programm basics:
Diese Variable soll tp123456 heißen. 123456 steht für Ihre Matrikelnummer
und muss von Ihnen entsprechend ersetzt werden.Hab den Rest nicht gelesen, mir ist nur das hier ins Auge gesprungen
-
hab bis 18 uhr zeit bitte ..
-
wer mir hilft kriegt auch 20 Euro, ist nur eine arbeit von 5-10 Minuten
-
- dauert es mindestens 10 minuten, die aufgabe durchzulesen
- hättest du vielleicht vor 2 wochen fragen sollen
- hat das studium die aufgabe, diejenigen auszusortieren, die entweder nicht die fähigkeiten, oder die motivation haben, um später in dem beruf zu arbeiten.
-
@Lordkurd sagte in Informatik 1 - C -Programm basics:
ist nur eine arbeit von 5-10 Minuten
Scherzkeks
-
@Lordkurd sagte in Informatik 1 - C -Programm basics:
wer mir hilft kriegt auch 20 Euro, ist nur eine arbeit von 5-10 Minuten
Studierst du BWL?
-
Keine Panik, dein Freund hat das alles genau eingeplant. Er meldet sich bei dir pünktlich 5 vor 18h.
-
Ich frag nach hilfe, was macht ihr auf einen drauf hacken..
Ich studiere kein bwl
wie ich schon sagte der Anfang würde mir reichen damit ich teilpunkte bekomme.
nur weil ich die Arbeit verschätzt habe und vil auf 20-30 min Arbeit ankommt könnte man trz sich über 20 euro freuen und das gewissen haben jemanden geholfen zu haben
-
@Lordkurd sagte in Informatik 1 - C -Programm basics:
und das gewissen haben jemanden geholfen zu haben
also ich würde eher glauben, dir geholfen zu haben, wenn ich dir die aufgabe eben nicht mache.
-
@Wade1234
Informatik ist 0 relevant für das Studium unser Prof sagt es selber,
lernt das einmalig und habt es hinter euch und mit einigen Sachen kommt man garnicht klar
Info bzw C-Programm ist mein schwäche ..
-
@Lordkurd sagte in Informatik 1 - C -Programm basics:
Ich frag nach hilfe, was macht ihr auf einen drauf hacken..
Einfach ignorieren. Ist nicht persönlich. Ich find die Situation tatsächlich irgendwie witzig (kennen wir alle schon was ähnliches aus eigener Erfahrung), und das ist für mich auch eine Möglichkeit, Stress abzubauen.
Was die konkrete Aufgabe betrifft, ich persönlich finde das viel zu uninteressant, um mir das überhaupt durchzulesen, und ich verdiene so viel, dass mich 20€ überhaupt nicht reizen, schon gar nicht an einem Feiertag.@Wade: ich kenne sowas schon auch... Wir hatten im Informatikstudium auch genügend Vorlesungen, die ziemlich fachfremd waren und die ich extrem lästig fand. Ja, das ist kein Grund, 2 Stunden vor der Abgabe mit dem Thema anzufangen, aber ich kann den TE auch gut verstehen.
Normalerweise gibt´s hier schon paar Leute, die solche Fragen beantworten, musst vielleicht noch etwas warten.
-
@Mechanics Leider muss ich es in 27 minuten abgeben, bin Student für mich ist 20 Euro die welt ( 2x feiern")
-
@Lordkurd sagte in Informatik 1 - C -Programm basics:
( 2x feiern")
Das ist ein Troll oder? Bitte lass das ein Troll sein.
-
@Bashar 4 Euro eintritt 6 Euro trinken, Student ohne Barfög ist leider so
-
@Lordkurd dass studenten feiern gehen, ist ein übles klischee. jedenfalls für die, die das studium auch ernst nehmen und bestehen wollen.
-
@Wade1234 Abgesehen von Info läuft es echt stark jede Klasur unter 2,5 bestanden
-
Was studierst du überhaupt?
-
@Mechanics Maschinenbau