From daad9ec9d3fb822e1ed38214bca4208879e1cb2f Mon Sep 17 00:00:00 2001 From: alexchilab Date: Thu, 1 May 2025 15:58:04 +0200 Subject: [PATCH] Program: 25.5.1.c und 25.6.4.c --- 25.4.1.c | 22 +++++------ 25.4.3.c | 28 ++++++------- 25.5.1.c | 117 ++++++++++++++++++++++++++++--------------------------- 25.6.4.c | 48 +++++++++++++++++++++++ 4 files changed, 132 insertions(+), 83 deletions(-) create mode 100644 25.6.4.c diff --git a/25.4.1.c b/25.4.1.c index 532d721..d2148ea 100644 --- a/25.4.1.c +++ b/25.4.1.c @@ -1,30 +1,30 @@ #include #include -void streichen(char *zeichKet, char streich) +void streichen(char *zeichKet, char streich) ///zeichKet: Text und streich: Zeichen, dass entfernt werden soll { - int i = 0; - int p = 0; + int i = 0; ///i schaut sich jedes Zeichen an + int p = 0; ///p ist die Stelle an der wir schreiben, wenn es nicht gelöscht werden soll - while(zeichKet[i] != '\0') + while(zeichKet[i] != '\0') ///Solange der Text weitergeht, prüft man Zeichen für Zeichen weiter { - if(zeichKet[i] != streich) + if(zeichKet[i] != streich) ///Wenn das aktuelle Zeichen nicht gelöscht werden soll... { - zeichKet[p] = zeichKet[i]; - p++; + zeichKet[p] = zeichKet[i]; ///...schreiben wir es an p (neue Stelle des Zeichens) + p++; ///p wird hochgezählt } i++; } - zeichKet[p] = '\0'; + zeichKet[p] = '\0'; ///Ende des Textes } int main() { - char zeichenkette[1001]; - char loeschen; + char zeichenkette[1001]; ///Index fängt bei 1 an deshalb 1001 und nicht 1000 + char loeschen; ///Zeichen das gelöscht werden soll printf("Geben Sie eine Zeichenkette (max. 1000 Zeichen) ein: \n"); scanf("%1000[^\n]s", zeichenkette); @@ -35,7 +35,7 @@ int main() printf("...Die neue Zeichenkette ist dann: \n"); - streichen(zeichenkette, loeschen); + streichen(zeichenkette, loeschen); ///Aufruf der Funktion, die den Buchstaben rauswirft printf("%s\n", zeichenkette); diff --git a/25.4.3.c b/25.4.3.c index 6707384..4e40d6f 100644 --- a/25.4.3.c +++ b/25.4.3.c @@ -2,38 +2,38 @@ #include #include -int is_palindrome(char *wort) +int is_palindrome(char *wort) ///Funktion, die prüft ob das Wort ein Palindrom ist oder nicht { - int len = strlen(wort); + int len = strlen(wort); ///hier wird die Länge des Wortes ermittelt int i; - for (i = 0; i < len / 2; i++) + for (i = 0; i < len / 2; i++) ///Da Wort wird von außen nach innen verglichen: erster und letzter Buchstabe usw. { - if (tolower(wort[i]) != tolower(wort[len - 1 - i])) - { - return 0; + if (tolower(wort[i]) != tolower(wort[len - 1 - i])) ///prüft ob die Zeichen, die verglichen werden gleich oder ungleich sind + { ///Groß- und Kleinschreibung wird außer Acht gelassen + return 0; ///Wort ist kein Palindrom sofort return 0 } } - return 1; + return 1; ///Wort ist ein Palindrom --> alle Zeichen waren gleich } int main() { - char text[1001]; - char *teiler = " ,:"; - char *token; + char text[1001]; ///Index beginnt immer bei 1 deshalb 1001 + char *teiler = " ,:"; ///Diese Zeichen gelten als Trennzeichen + char *token; ///Zeiger der dann später auf jedes Wort zeigt printf("Geben Sie Zeilen ein:\n"); scanf("%1000[^\n]s",text); - token = strtok(text, teiler); + token = strtok(text, teiler); ///teilt den Text beim ersten Trennzeichen und gibt das erste Wort zurück - while (token != NULL) + while (token != NULL) ///Solange es noch weitere Wörter gibt... { - if (is_palindrome(token) == 1) + if (is_palindrome(token) == 1) ///prüft man ob es ein Palindrom ist und wenn ja gibt man es wieder aus { printf("........ %s\n", token); } - token = strtok(NULL, teiler); + token = strtok(NULL, teiler); ///gehe zum nächsten Wort } diff --git a/25.5.1.c b/25.5.1.c index f7bb840..daa0eaa 100644 --- a/25.5.1.c +++ b/25.5.1.c @@ -2,89 +2,90 @@ #include #include -int kaeferIrrfahrt() { - int a = 0; - int strecke = 0; +int kaeferIrrfahrt() +{ + int a = 0; // Startposition 0 + int strecke = 0; // zählt wie viele Schritte der Käfer macht (anfangs 0) - while (a != 3) { + while (a != 3) // Solange Käfer nicht bei Position 3 (Ziel), wiederholt sich die Schleife --> Ziel erreicht, wenn a == 3 + { + int richtung = rand() % 3; // Erzeugen einer Zufallszahl --> %3 teilt die Zahl durch 3 und nimmt den Rest (0,1 oder 2) - if (a == 0) { - a++; - strecke++; + if (a == 0) + { + a = 1; //Wenn der Käfer bei 0 ist, kann er NUR zu 1 gehen } - if (a == 1) { - int zuf = rand() % 3 + 1; - - if (zuf > 1) { - a++; - strecke++; + else if (a == 1) // Wenn er bei 1 ist, gibt es 2 Möglichkeiten: + { + if (richtung == 0) // Wenn richtung == 0, dann zurück nach 0 + { + a = 0; } - else { - a--; - strecke++; + + else + { + a = 2; // Wenn richtung == 1 oder 2, dann geht er nach 2 } } - if (a == 2) { - int zuf = rand() % 3 + 1; - - if (zuf < 3) { - a--; - strecke++; + else if (a == 2) // Wenn er bei 2 ist, gibt es zwei Möglichkeiten: + { + if (richtung < 2) // Wenn richtung kleiner 2, dann zurück nach 1 + { + a = 1; } - else { - a++; - strecke++; + + else + { + a = 3; // Wenn richtung 2, geht er zum Ziel (Position 3) } } + + strecke++; // Nach jedem Schritt zählt die Variable +1 dazu } - return strecke; + + return strecke; // Wenn Käfer am Ziel, geben wir zurück, wie viele Schritte er gebraucht hat } -int main() { - int fahrt; +int main() +{ + int anzahl; // Speichert, wie oft gelaufen werden soll + printf("Geben Sie die Anzahl der Irrfahrten ein: "); - scanf("%d", &fahrt); + scanf("%d", &anzahl); - srand(time(NULL)); + srand(time(NULL)); // Sorgt dafür, dass bei jedem Neustart die Zufallszahlen anders sind - int *weglaengen = (int *)malloc(fahrt * sizeof(int)); + int haeufigkeit[100] = {0}; // Array mit 100 Zahlen (Weglänge 0-99) --> Alle beginnen bei 0 + int summe = 0; // Wird später verwendet, um alle Weglängen zusammenzuzählen - int n; - for (n = 0; n < fahrt; n++) { - weglaengen[n] = kaeferIrrfahrt(); + for (int i = 0; i < anzahl; i++) // Wir wiederholen den Vorgang "anzahl"-mal + { + int weg = kaeferIrrfahrt(); // Funktion der Irrfahrt wird aufgerufen und Anzahl der Schritte in "weg" gespeichert + + if (weg < 100) // Ist die Weglänge kleiner als 100, dann + { + haeufigkeit[weg]++; // Erhöhe die Anzahl für diese Weglänge um 1 --> damit man am Ende weiss, wie oft jede Weglänge vorkam + } + + summe += weg; // Rechnet alle Weglängen zusammen } + printf("\n| Weglaenge | Haeufigkeit |\n"); + printf("---------------------------\n"); - int maxWeglange = fahrt*100; - int *haeufigkeit = (int *)calloc(maxWeglange , sizeof(int)); - - int i; - for (i = 0; i < fahrt; i++) { - haeufigkeit[weglaengen[i]]++; - } - - - printf("Wegl�nge H�ufigkeit\n"); - int p; - for (p = 0; p <= maxWeglange; i++) { - if (haeufigkeit[p] > 0) { - printf("%9d %9d\n", p, haeufigkeit[p]); + for (int i = 0; i < 100; i++) // Für jede Weglänge + { + if (haeufigkeit[i] > 0) // Wurde jede Weglänge mindestens einmal erreicht? + { + printf(" %2d %5d\n", i, haeufigkeit[i]); // Wenn ja, printe sie so } } + double durchschnitt = (double) summe / anzahl; //Berechnet den Durchschnitt, wie viele Schritte der Käfer gebraucht hat --> double, weil Kommazahl - int summe = 0; - int k; - for ( k = 0; k < fahrt; k++) { - summe += weglaengen[k]; - } - double durchschnitt = (double)summe / fahrt; - printf("Durchschnittliche Wegl�nge: %.2lf\n", durchschnitt); - - free(weglaengen); - free(haeufigkeit); + printf("\nDurchschnittliche Weglaenge: %.2f\n", durchschnitt); return 0; } diff --git a/25.6.4.c b/25.6.4.c new file mode 100644 index 0000000..22f5a18 --- /dev/null +++ b/25.6.4.c @@ -0,0 +1,48 @@ +#include +#include + +#define MAX_LEN 10 // Eingabe des Wortes kann max. 10 Zeichen lang sein + +int eingabefarbe() // Liest eine Farbe und gibt eine Zahl zurück --> Gruen 1, Rot 2, Violett 3 +{ + int eingabe_als_zahl = 0; // 0 = noch keine gültige Farbe + char *grundfarbe[] = {"Gruen", "Rot", "Violett"}; // Array aus Strings: Erlaubte Farben, die der Benutzer eingeben darf + char eingabeFarbe[MAX_LEN]; // Hier wird die Eingabe des Benutzers gespeichert --> 9 Buchstaben und 1 Enterzeichen + + printf("Geben Sie eine Farbe ein (Gruen, Rot, Violett): "); + + fgets(eingabeFarbe, MAX_LEN, stdin); // Liest die Eingabe des Benutzers als Text ein und speichert sie in eingabeFarbe + + if(eingabeFarbe[strlen(eingabeFarbe)-1] == '\n') // Prüft, ob ein Zeilenumbruch da ist und löscht ihn, damit Vergleich der Farben später funktioniert + eingabeFarbe[strlen(eingabeFarbe)-1] = '\0'; // \n wird ersetzt mit \0 --> Ende Zeichen + + for (int i = 0; i < 3; ++i) // Schritt wird 3 mal wiederholt, da drei Farben verfügbar sind + { + if (strcmp(eingabeFarbe, grundfarbe[i]) == 0) // Vergleicht 2 Texte: Der eingegeben wurde & erlaubte Farbe --> Wenn genau gleich, dann gibt strcmp() den Wert 0 zurück + { + eingabe_als_zahl = i + 1; // Wir speichern die Farbe als Zahl --> Gruen 1, Rot 2, Violett 3 + return eingabe_als_zahl; // Wird zurück an die main gegeben + } + } + return eingabe_als_zahl; // Wenn keine Zahl passt --> Ungültig (0) +} + +int main() +{ + int farbe1, farbe2, posTabelle; // 3 Platzhalter werden definiert; posTabelle = um die Mischfarbe aus Tabelle zu holen + char *auswahl[] = {"Gruen", "Gelb", "Blau", "Gelb", "Rot", "Purpur", "Blau", "Purpur", "Violett"}; // 1D-Array: Tabelle mit den Mischfarben, insgesamt 9 zur Auswahl beginnend bei Index 0, also 8 + + farbe1 = eingabefarbe(); // Farbe 1 wird gespeichert + farbe2 = eingabefarbe(); // Farbe 2 wird gespeichert + + if (farbe1 == 0 || farbe2 == 0) // Wenn eine Farbe ungültig ist, dann brechen wir ab und printen + { + printf("Ungültige Eingabe"); + return 0; + } + + posTabelle = (farbe1 -1) * 3 + farbe2 -1; // Umrechnung von 2D-Tabelle in 1D-Array: farbe1 ist die Zeile und farbe2 ist die Spalte, 3 ist die Anzahl der Spalten pro Zeile + printf("Die Mischfarbe ist dann: %s", auswahl[posTabelle]); + + return 0; +}