Add exercises for pointers and const.
This commit is contained in:
1 parent
1b8fecaad0
commit
273f622601
5 files changed
+256
No files matched your search
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Was gibt folgendes Programm aus? Erst überlegen, dann ausführen.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAX_TEXT_LEN 100
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char text1[MAX_TEXT_LEN];
|
||||
char *text2;
|
||||
int number;
|
||||
} MyStruct;
|
||||
|
||||
void modify1(MyStruct arg);
|
||||
void modify2(MyStruct *arg);
|
||||
|
||||
int main()
|
||||
{
|
||||
char text[MAX_TEXT_LEN] = "Text 2";
|
||||
MyStruct someStruct = {"Text 1", text, 15};
|
||||
|
||||
printf("someStruct.text1 = %s\n", someStruct.text1);
|
||||
printf("someStruct.text2 = %s\n", someStruct.text2);
|
||||
printf("someStruct.number = %d\n", someStruct.number);
|
||||
|
||||
modify1(someStruct);
|
||||
|
||||
printf("\nNach modify1:\n");
|
||||
printf("someStruct.text1 = %s\n", someStruct.text1);
|
||||
printf("someStruct.text2 = %s\n", someStruct.text2);
|
||||
printf("someStruct.number = %d\n", someStruct.number);
|
||||
|
||||
modify2(&someStruct);
|
||||
|
||||
printf("\nNach modify2:\n");
|
||||
printf("someStruct.text1 = %s\n", someStruct.text1);
|
||||
printf("someStruct.text2 = %s\n", someStruct.text2);
|
||||
printf("someStruct.number = %d\n", someStruct.number);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
void modify1(MyStruct arg)
|
||||
{
|
||||
strcpy(arg.text1, "Neuer Text 1");
|
||||
strcpy(arg.text2, "Neuer Text 2");
|
||||
arg.number = 100;
|
||||
}
|
||||
|
||||
void modify2(MyStruct *arg)
|
||||
{
|
||||
strcpy(arg->text1, "Wieder neuer Text 1");
|
||||
strcpy(arg->text2, "Wieder neuer Text 2");
|
||||
arg->number = 200;
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Im folgenden Programm soll eine Eingabe nur bestehend aus Zahlen als String eingelesen werden. Die einzelnen Zahlen sollen extrahiert, konvertiert
|
||||
* und deren Summe ausgegeben werden.
|
||||
*
|
||||
* 1. Ergänzen Sie in den vorhandenen Funktionen zunächst das Schlüsselwort const bei geeigneten Parametern.
|
||||
* 2. Implementieren Sie nun die Funktion konvertiereZahlen, die einen String übergeben bekommt, die enthaltenen Zahlen nach int konvertiert und in einem
|
||||
* int-Array speichert. Der String soll nicht verändert werden. Die Funktion soll die Anzahl an extrahierten Zahlen zurückgeben oder 0, falls Wörter enthalten
|
||||
* sind, die keine Zahlen sind. Sehen Sie sich für die genauen Anforderung an die Funktion auch unten deren Verwendung in der main-Funktion an. Vergessen Sie
|
||||
* nicht, Parameter mit dem Schlüsselwort const zu markieren, wenn es Sinn ergibt.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define PUFFER_GROESSE 100
|
||||
|
||||
|
||||
char *gibTextEin(char *ausgabeText, char *puffer, unsigned int groesse);
|
||||
void gibSummeAus(unsigned int zahlen[], unsigned int anzahl);
|
||||
|
||||
int main()
|
||||
{
|
||||
char eingabe[PUFFER_GROESSE];
|
||||
unsigned int zahlen[PUFFER_GROESSE];
|
||||
unsigned int vorhandeneZahlen = 0;
|
||||
|
||||
gibTextEin("Geben Sie Zahlen ein: ", eingabe, PUFFER_GROESSE);
|
||||
|
||||
vorhandeneZahlen = konvertiereZahlen(eingabe, zahlen, PUFFER_GROESSE);
|
||||
|
||||
gibSummeAus(zahlen, vorhandeneZahlen);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
char *gibTextEin(char *ausgabeText, char *puffer, unsigned int groesse)
|
||||
{
|
||||
printf("%s", ausgabeText);
|
||||
fgets(puffer, groesse, stdin);
|
||||
|
||||
if(puffer[strlen(puffer)-1] == '\n')
|
||||
puffer[strlen(puffer)-1] = '\0';
|
||||
else
|
||||
while(getchar() != '\n') {}
|
||||
|
||||
return puffer;
|
||||
}
|
||||
|
||||
void gibSummeAus(unsigned int zahlen[], unsigned int anzahl)
|
||||
{
|
||||
int summe = 0;
|
||||
|
||||
if(anzahl > 0)
|
||||
{
|
||||
printf("%d", zahlen[0]);
|
||||
summe = zahlen[0];
|
||||
}
|
||||
|
||||
for(int i = 1; i < anzahl; i++)
|
||||
{
|
||||
printf(" + %d", zahlen[i]);
|
||||
summe += zahlen[i];
|
||||
}
|
||||
|
||||
if(anzahl > 0)
|
||||
printf(" = %d\n", summe);
|
||||
else
|
||||
printf("%s", "Keine Werte vorhanden!\n");
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Ergänzen Sie im untenstehenden Programm die fehlenden Funktionen. addiereText bekommt dabei eine Folge von
|
||||
* Zahlenwörtern kleiner zehn übergeben und ermittelt daraus die Summe. Groß- und Kleinschreibung soll keine Rolle spielen.
|
||||
* Zudem liefert die Funktion 0, wenn ein Zahlenwort nicht aufgelöst werden konnte, ansonsten 1.
|
||||
*
|
||||
* 1. Beispielhafter Programmablauf:
|
||||
* >> Addiere: Fuenf achT SIEBEN
|
||||
* Das Ergebnis lautet 20.
|
||||
*
|
||||
* 2. Beispielhafter Programmablauf:
|
||||
* >> Addiere: fuenf achtzehn sieben
|
||||
* Falsche Eingabe.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "../02_strings/eingabe.h"
|
||||
|
||||
#define MAX_EINGABE_LEN 100
|
||||
|
||||
char *wandleKlein(char *text);
|
||||
int wandleZahl(const char *wort);
|
||||
int addiereText(const char *text, int *erg);
|
||||
|
||||
int main()
|
||||
{
|
||||
char eingabeText[MAX_EINGABE_LEN];
|
||||
int erg;
|
||||
|
||||
gibTextEin("Addiere: ", eingabeText, MAX_EINGABE_LEN);
|
||||
|
||||
if(addiereText(eingabeText, &erg))
|
||||
printf("Das Ergebnis lautet %d.\n", erg);
|
||||
else
|
||||
printf("Falsche Eingabe.\n");
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Erweitern Sie das folgende Programm, sodass es die Funktion qsort der Standard-Bibliothek verwendet,
|
||||
* um das enthaltene String-Array sortiert auszugeben. Es sollen zuerst die Strings ohne Zahlen ausgegeben werden
|
||||
* und am Ende die mit Zahlen. Die Strings ohne Zahlen sollen aufsteigend sortiert werden, die mit Zahlen absteigend.
|
||||
* Sie können davon ausgehen, dass die im Array enthaltenen Strings immer nur aus Buchstaben oder nur aus Zahlen bestehen.
|
||||
* Es ist also ausreichend, das erste Zeichen mittels isdigit(...) zu prüfen.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
void gibStringsAus(const char *strings[], unsigned int anzahl);
|
||||
|
||||
int main()
|
||||
{
|
||||
const char *strings[] = {"789", "Zorro", "Adam", "Werner", "123", "Bernd", "Hubert", "456"};
|
||||
unsigned int anzahlStrings = sizeof(strings)/sizeof(strings[0]);
|
||||
|
||||
printf("Vor Sortierung:\n");
|
||||
gibStringsAus(strings, anzahlStrings);
|
||||
|
||||
// TODO: Hier sortieren
|
||||
|
||||
printf("\nNach Sortierung:\n");
|
||||
gibStringsAus(strings, anzahlStrings);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
void gibStringsAus(const char *strings[], unsigned int anzahl)
|
||||
{
|
||||
for(int i = 0; i < anzahl; i++)
|
||||
{
|
||||
printf("%s\n", strings[i]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Im folgenden Programm hat sich ein Fehler eingeschlichen. Eigentlich sollen die Zeichenketten vertauscht
|
||||
* ausgegeben werden. Allerdings klappt etwas nicht.
|
||||
*
|
||||
* 1. Lassen Sie zunächst das Programm laufen und finden Sie heraus, warum die Zeichenketten string1 und string2 nicht vertauscht werden.
|
||||
* 2. Sorgen Sie nun dafür, dass die Zeichenketten vertauscht werden. Ändern Sie dafür nur den Funktionsinhalt von tauscheStrings(...)
|
||||
* 3. Schreiben Sie nun eine neue Tauschfunktion, die die ursprünglich angedachte Funktionalität umsetzt. Es sollen also nur die Zeiger vertauscht
|
||||
* werden. Der Array-Inhalt soll unverändert bleiben.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAX_STRING_LEN 8
|
||||
|
||||
void tauscheStrings(char *zgr1, char *zgr2);
|
||||
|
||||
int main()
|
||||
{
|
||||
char strings[][MAX_STRING_LEN] = {"String1", "String2"};
|
||||
char *string1 = strings[0];
|
||||
char *string2 = strings[1];
|
||||
|
||||
printf("Vor Tausch:\n");
|
||||
printf("Inhalt von string1: %s\n", string1);
|
||||
printf("Inhalt von string2: %s\n", string2);
|
||||
printf("Inhalt von strings[0]: %s\n", strings[0]);
|
||||
printf("Inhalt von strings[1]: %s\n", strings[1]);
|
||||
|
||||
tauscheStrings(string1, string2);
|
||||
|
||||
printf("\nNach Tausch:\n");
|
||||
printf("Inhalt von string1: %s\n", string1);
|
||||
printf("Inhalt von string2: %s\n", string2);
|
||||
printf("Inhalt von strings[0]: %s\n", strings[0]);
|
||||
printf("Inhalt von strings[1]: %s\n", strings[1]);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
void tauscheStrings(char *zgr1, char *zgr2)
|
||||
{
|
||||
char *tmp = zgr1;
|
||||
zgr1 = zgr2;
|
||||
zgr2 = tmp;
|
||||
}
|
||||
Reference in new issue
Block a user