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


Log in to reply