Informatik 1 - C -Programm basics
-
@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
-
@Lordkurd also maschinenbauingenieure müssen auch programmieren können. oder meinst du, dass sich die firmen jemanden leisten, der extra technische informatik studiert hat?
-
Mögliche Lösung: Verlängere die Frist, bettele den Prof an, besorg dir ein Attest oder sonstwas, und programmiere es selbst in den nächsten paar Tagen. Dann wirst du erstens sehen, dass es länger als ein paar Minuten dauert, dass es mehr wert ist als 20€, dass man im Studium seine Zeit auch anders als mit feiern verbringen kann, und du lernst auch noch was (vermeintlich nutzloses) obendrauf!
-
20:05
/* 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 Suchkriterium 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 Tagesspeiseplan-Struktur 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. 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. */
20:30
Durchlesen und lesbar-machen: 25 min.
Aaah, Déjà-vu: https://www.c-plusplus.net/forum/topic/348750/arrays-braces-around-scalar-initializer/8
-
#include <stdio.h> #include <string.h> typedef struct { int angebot_nr; int hauptgericht; char bezeichnung[100]; char kennzeichnung[10]; char zusatzstoffe_und_allergene[20][4]; int centpreise[3]; } Mensa_Gericht; typedef struct { int wochentag; int kalenderwoche; int datum[3]; Mensa_Gericht gerichte[15]; } Tagesplan; #define NUMDAYS 252 #include "mensadata_en.h" struct { char name[50]; int matrikelnummer; char geschlecht; } ich = { "Müller Lüdenscheidt", 471112, 'm' }; typedef struct { char bezeichnung[100]; int anzahl; float wochenabstand; } Suche; int main() { enum { N = 10 }; int letztewoche = 0, zaehler = 0, s; Suche suche = { 0 }; const char *e, *essen[] = { "Burger steak, Greek style with cream cheese filling","Macaroni with peas and mushrooms","Rhineland cut green bean hotpot" }; scanf("%d", &s); e = essen[s - 1]; for (int i = 51; i <= 185; ++i) { for (int j = 0; j < 15; ++j) if ((tp[i].gerichte[j].angebot_nr == 1 || tp[i].gerichte[j].angebot_nr == 2 || tp[i].gerichte[j].angebot_nr == 3) && !strncmp(tp[i].gerichte[j].bezeichnung, e, N)) { strcpy(suche.bezeichnung, tp[i].gerichte[j].bezeichnung); suche.anzahl++; if (letztewoche == 0) letztewoche = tp[i].kalenderwoche; else if (letztewoche < tp[i].kalenderwoche) { suche.wochenabstand += tp[i].kalenderwoche - letztewoche; zaehler++; letztewoche = tp[i].kalenderwoche; } } } suche.wochenabstand /= zaehler; printf("Suchen im Mensa-Speiseplan Sommersemester 2019\n%s\n%d\n%s\n%d\n%f", ich.name, ich.matrikelnummer, suche.bezeichnung, suche.anzahl, suche.wochenabstand); return 0; }
Die 20€ überweist du bitte an den NABU