Für eine Warenbestellung sei ein Typ artikel wie folgt definiert:
typedef struct {
int artikelnummer;
int anzahl; //Amzahl gekaufter Artikel
double preis; //Preis eines Artikels in Euro
} artikel;
Geben Sie eine C-Funktion an, die einen Array vom Typ artikel übergeben bekommt und Gesamtpreis der Bestellung sowie Treuepunkte zurückgibt. Für letztere gilt:
- ab einem Bestellwert von 100 Euro gibt es 5% Rabatt
- Für je 20 Euro Bestellwert gibt es einen Treuepunkt
Sie dürfen annehmen, dass die C-Funktion keine ungültigen Eingaben erhält. Diese Aufgabe wurde als Prüfungsaufgabe gestellt. Bearbeitungszeit 24 Minuten.
double gesamtpreis(artikel array_artikel[], int laenge, int *treuepunkte) {
int i;
int s=0;
for (i=0; i < laenge; i++) {
s += array_artikel[i].anzahl * array_artikel[i].preis;
}
*treuepunkte = (int)(s / 20);
if (s >= 100.0) {
s *= 0.95; // *= (1-0.05) f. bessere wart-/lesbarkeit
}
return s;
}
Gegeben Sei eine Klasse Stack mit folgenden Funktionen:
void stack_push(stack **this, int item);
int stack_pop(stack **this);
int stack_isempty(stack **this);
a) Überlegen Sie, wie man den Inhalt eines Stacks in einen anderen verschieben kann, so dass die Reihenfolge der Elemente gleich bleibt.
- in zwei Schritten: temp-Stack als Zwischenablage, dann in Ziel-Stack
- in einem Schritt unter Verletzung des Datentyps: weitere Funktion / Erweiterung d. Datentyps zur Liste, sodass nicht gepusht, sondern angehangen/appended wird.
b) Schreiben Sie eine entsprechende Funktion. Diese darf nur die Parameter stack-from und stack_to besitzen und muss die Klasse Stack verwenden.
void stack_move(stack** stack_from, stack** stack_to) {
stack* tmp = NULL;
int elm;
while (!stack_isempty(stack_from)) {
stack_push(&tmp, stack_pop(stack_from));
}
while (!stack_isempty(&tmp)) {
stack_push(stack_to, stack_pop(&tmp));
}
}
Schreiben Sie eine Funktion die zwei Listen als Eingabe erhält und diese zusammen fügt. Die Struktur der Listen darf dabei verändert werden. Das Ergebnis der Funktion soll die verkettete Liste sein.
typedef struct list_t {
int item;
list_t next;
} list;
list* verketten(list* l1, list* l2) {
list* l = l1;
if(l != NULL) {
while(l->next!=NULL)
l = l1->next;
l->next = l2;
}else{
l = l2;
}
return l;
}