Compare commits
	
		
			2 commits
		
	
	
		
			a8ca938a9e
			...
			5035dcbd61
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
							 | 
						5035dcbd61 | ||
| 
							 | 
						457e322c02 | 
					 7 changed files with 417 additions and 0 deletions
				
			
		
							
								
								
									
										36
									
								
								Workbook/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Workbook/Makefile
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,36 @@
 | 
			
		|||
##
 | 
			
		||||
# TH WWS
 | 
			
		||||
#
 | 
			
		||||
# @file
 | 
			
		||||
# @version 0.1
 | 
			
		||||
CC = gcc
 | 
			
		||||
CFLAGS ?= -Wall -Wextra -Iinclude -fomit-frame-pointer -O2
 | 
			
		||||
 | 
			
		||||
SRC_DIR = src
 | 
			
		||||
INCLUDE_DIR = include
 | 
			
		||||
BUILD_DIR = build
 | 
			
		||||
TARGET = WWS_System
 | 
			
		||||
 | 
			
		||||
SRC_FILES = $(wildcard $(SRC_DIR)/*.c)
 | 
			
		||||
OBJ_FILES = $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(SRC_FILES))
 | 
			
		||||
 | 
			
		||||
.PHONY: all clean
 | 
			
		||||
 | 
			
		||||
all: $(BUILD_DIR) $(TARGET)
 | 
			
		||||
 | 
			
		||||
# Link all the files into the final executable
 | 
			
		||||
$(TARGET): $(OBJ_FILES)
 | 
			
		||||
	$(CC) $(OBJ_FILES) -o $@
 | 
			
		||||
 | 
			
		||||
# Compile source- and object files
 | 
			
		||||
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR)
 | 
			
		||||
	$(CC) $(CFLAGS) -c $< -o $@
 | 
			
		||||
 | 
			
		||||
#Ensure the build directory exists
 | 
			
		||||
$(BUILD_DIR):
 | 
			
		||||
	mkdir -p $(BUILD_DIR)
 | 
			
		||||
 | 
			
		||||
# Clean build and target
 | 
			
		||||
clean:
 | 
			
		||||
	rm -Rf $(BUILD_DIR) $(TARGET)
 | 
			
		||||
# end
 | 
			
		||||
| 
						 | 
				
			
			@ -309,3 +309,17 @@ int main() {
 | 
			
		|||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
#+END_SRC
 | 
			
		||||
 | 
			
		||||
*** 2. Vorbereitungsaufgabe
 | 
			
		||||
#+BEGIN_SRC C
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
 | 
			
		||||
#define ERRORRETURN 10787253
 | 
			
		||||
#define ARRSIZE 4096
 | 
			
		||||
#define EXITVAL 15326
 | 
			
		||||
 | 
			
		||||
#+END_SRC
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										20
									
								
								Workbook/include/util.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Workbook/include/util.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
#ifndef UTIL_H_
 | 
			
		||||
#define UTIL_H_
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
 | 
			
		||||
// Magic number to be returned in case something goes wrong. Lets the program know an error occured. This is kind of a hack.
 | 
			
		||||
#define ERRORRETURN 10787253
 | 
			
		||||
 | 
			
		||||
void null_terminate(char str[]);
 | 
			
		||||
bool is_num(char *str);
 | 
			
		||||
bool is_int(char *str);
 | 
			
		||||
int get_clean_int();
 | 
			
		||||
double get_clean_num();
 | 
			
		||||
bool is_safe(const char* string);
 | 
			
		||||
#endif // UTIL_H_
 | 
			
		||||
							
								
								
									
										44
									
								
								Workbook/include/wws.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								Workbook/include/wws.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,44 @@
 | 
			
		|||
#ifndef WWS_H_
 | 
			
		||||
#define WWS_H_
 | 
			
		||||
 | 
			
		||||
#include "util.h"
 | 
			
		||||
 | 
			
		||||
#define ARRSIZE 4096
 | 
			
		||||
#define EXITVAL 15326
 | 
			
		||||
 | 
			
		||||
typedef struct Product Product;
 | 
			
		||||
typedef struct Customer Customer;
 | 
			
		||||
 | 
			
		||||
struct Product {
 | 
			
		||||
    int id;
 | 
			
		||||
    char* name;
 | 
			
		||||
    double price;
 | 
			
		||||
    int amount;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct Customer {
 | 
			
		||||
    char* name;
 | 
			
		||||
    int id;
 | 
			
		||||
    // NOTE: Always NULL-initialize this!!
 | 
			
		||||
    Product* products[ARRSIZE];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Implementation details
 | 
			
		||||
int read_id();
 | 
			
		||||
char* read_name();
 | 
			
		||||
double read_price();
 | 
			
		||||
int read_amount();
 | 
			
		||||
int find_first_free_index(Customer customer);
 | 
			
		||||
int find_product(Customer customer, int id); // Returns index of product
 | 
			
		||||
int find_customer(int id); // Returns index in the customers array
 | 
			
		||||
 | 
			
		||||
// Top-Level functions
 | 
			
		||||
int add_product();
 | 
			
		||||
int print_product();
 | 
			
		||||
int add_customer();
 | 
			
		||||
int print_customer();
 | 
			
		||||
int menu();
 | 
			
		||||
 | 
			
		||||
extern Customer customers[ARRSIZE];
 | 
			
		||||
 | 
			
		||||
#endif // WWS_H_
 | 
			
		||||
							
								
								
									
										13
									
								
								Workbook/src/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Workbook/src/main.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
#include "wws.h"
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    Customer customers[ARRSIZE];
 | 
			
		||||
    memset(customers, 0, sizeof(Customer));
 | 
			
		||||
    while(true) {
 | 
			
		||||
        int exitcode = menu();
 | 
			
		||||
        if (exitcode == EXITVAL) {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										95
									
								
								Workbook/src/util.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								Workbook/src/util.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,95 @@
 | 
			
		|||
#include "util.h"
 | 
			
		||||
 | 
			
		||||
bool is_num(char *str) {
 | 
			
		||||
    if (*str == '+' || *str == '-') {
 | 
			
		||||
        str++;
 | 
			
		||||
    }
 | 
			
		||||
    if (*str == '\0') {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    while (*str) {
 | 
			
		||||
        if (!isdigit((unsigned char)*str) || !(*str == '.')) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        str++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool is_int(char *str) {
 | 
			
		||||
    if (*str == '+' || *str == '-') {
 | 
			
		||||
        str++;
 | 
			
		||||
    }
 | 
			
		||||
    if (*str == '\0') {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    while (*str) {
 | 
			
		||||
        if (!isdigit((unsigned char)*str)) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        str++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
double get_clean_num() {
 | 
			
		||||
    char *buffer;
 | 
			
		||||
    size_t bufsize = 0;
 | 
			
		||||
    char *eptr;
 | 
			
		||||
 | 
			
		||||
    ssize_t input_length = getline(&buffer, &bufsize, stdin);
 | 
			
		||||
    if (input_length == -1) {
 | 
			
		||||
        printf("Fehler beim lesen des inputs.\n");
 | 
			
		||||
        free(buffer);
 | 
			
		||||
        buffer = NULL;
 | 
			
		||||
        return ERRORRETURN;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (is_num(buffer)) {
 | 
			
		||||
        return strtod(buffer, &eptr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf("Deine Eingabe ist keine Zahl.\n");
 | 
			
		||||
    free(buffer);
 | 
			
		||||
    buffer = NULL;
 | 
			
		||||
    return ERRORRETURN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int get_clean_int() {
 | 
			
		||||
    char *buffer;
 | 
			
		||||
    size_t bufsize = 0;
 | 
			
		||||
 | 
			
		||||
    ssize_t input_length = getline(&buffer, &bufsize, stdin);
 | 
			
		||||
    if (input_length == -1) {
 | 
			
		||||
        printf("Fehler beim lesen des inputs.\n");
 | 
			
		||||
        free(buffer);
 | 
			
		||||
        buffer = NULL;
 | 
			
		||||
        return ERRORRETURN;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (is_int(buffer)) {
 | 
			
		||||
        return atoi(buffer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf("Deine Eingabe ist keine ganze Zahl.\n");
 | 
			
		||||
    free(buffer);
 | 
			
		||||
    buffer = NULL;
 | 
			
		||||
    return ERRORRETURN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool is_safe(const char* string) {
 | 
			
		||||
    if (string == NULL) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    for (size_t i = 0; string[i] != '\0'; ++i) {
 | 
			
		||||
        if (string[i] == '%') {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										195
									
								
								Workbook/src/wws.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								Workbook/src/wws.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,195 @@
 | 
			
		|||
#include "wws.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
int read_id() {
 | 
			
		||||
    printf("Produktnummer: ");
 | 
			
		||||
    int input = get_clean_int();
 | 
			
		||||
    if (input != ERRORRETURN) {return input;}
 | 
			
		||||
    else {
 | 
			
		||||
        printf("Die eingegebene Produktnummer ist keine Zahl.\n");
 | 
			
		||||
        return ERRORRETURN;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char* read_name() {
 | 
			
		||||
    char* buffer;
 | 
			
		||||
    size_t buffsize = 0;
 | 
			
		||||
    printf("Name: ");
 | 
			
		||||
    ssize_t input_length = getline(&buffer, &buffsize, stdin);
 | 
			
		||||
    if (input_length == -1) {
 | 
			
		||||
        printf("Fehler beim lesen.\n");
 | 
			
		||||
        free(buffer);
 | 
			
		||||
        buffer = NULL;
 | 
			
		||||
    }
 | 
			
		||||
    return buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
double read_price() {
 | 
			
		||||
    printf("Preis: ");
 | 
			
		||||
    double price = get_clean_num();
 | 
			
		||||
    if (price == ERRORRETURN) {return ERRORRETURN;}
 | 
			
		||||
    return price;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int read_amount() {
 | 
			
		||||
    printf("Anzahl: ");
 | 
			
		||||
    int amount = get_clean_int();
 | 
			
		||||
    if (amount == ERRORRETURN) {return ERRORRETURN;}
 | 
			
		||||
    return amount;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int find_first_free_index(Customer customer) {
 | 
			
		||||
    for (int i = 0; i < ARRSIZE; i++) {
 | 
			
		||||
        if (customer.products[i] == NULL) {
 | 
			
		||||
            return i;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    printf("Für diesen Kunden können keine weiteren Produkte hinzugefügt werden.\n");
 | 
			
		||||
    return ERRORRETURN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int find_product(Customer customer, int id) {
 | 
			
		||||
    for (int i = 0; i < ARRSIZE; i++) {
 | 
			
		||||
        if (customer.products[i]->id == id) {return i;}
 | 
			
		||||
    }
 | 
			
		||||
    return ERRORRETURN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int find_customer(int id) {
 | 
			
		||||
    for (int i = 0; i < ARRSIZE; i++) {
 | 
			
		||||
        if (customers[i].id == id) {return id;}
 | 
			
		||||
    }
 | 
			
		||||
    return ERRORRETURN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int add_product() {
 | 
			
		||||
    Product* new_product = (Product*) malloc(sizeof(Product));
 | 
			
		||||
    printf("**********************\n");
 | 
			
		||||
    printf("* WWS Produkteingabe *\n");
 | 
			
		||||
    printf("**********************\n");
 | 
			
		||||
    printf("Bitte geben Sie ihre Kundennumer ein: ");
 | 
			
		||||
    int customer_id = get_clean_int();
 | 
			
		||||
    if (customer_id == ERRORRETURN) {return ERRORRETURN;}
 | 
			
		||||
    Customer* customer = &customers[find_customer(customer_id)];
 | 
			
		||||
    new_product->id = read_id();
 | 
			
		||||
    if (new_product->id == ERRORRETURN) {return ERRORRETURN;}
 | 
			
		||||
    if (find_product(*customer, new_product->id)) {
 | 
			
		||||
        printf("Es existiert bereits ein Produkt mit dieser ID.\n");
 | 
			
		||||
        return ERRORRETURN;
 | 
			
		||||
    }
 | 
			
		||||
    new_product->name = read_name();
 | 
			
		||||
    if (!is_safe(new_product->name)) {
 | 
			
		||||
        printf("Der eingegebene Produktname enthält verbotene Zeichen.\n");
 | 
			
		||||
        return ERRORRETURN;
 | 
			
		||||
    }
 | 
			
		||||
    new_product->price = read_price();
 | 
			
		||||
    if (new_product->price == ERRORRETURN) {return ERRORRETURN;}
 | 
			
		||||
    new_product->amount = read_amount();
 | 
			
		||||
    if (new_product->amount == ERRORRETURN) {return ERRORRETURN;}
 | 
			
		||||
    int free_index = find_first_free_index(*customer);
 | 
			
		||||
    if (free_index == ERRORRETURN) {return ERRORRETURN;}
 | 
			
		||||
    customer->products[free_index] = new_product;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int print_product() {
 | 
			
		||||
    printf("**********************\n");
 | 
			
		||||
    printf("* WWS Produktausgabe *\n");
 | 
			
		||||
    printf("**********************\n");
 | 
			
		||||
    printf("Bitte geben Sie Ihre Kundennummer ein: ");
 | 
			
		||||
    int customer_id = get_clean_int();
 | 
			
		||||
    if (customer_id == ERRORRETURN) {return ERRORRETURN;}
 | 
			
		||||
    printf("Bitte geben Sie die gewünschte Produktnummer ein: ");
 | 
			
		||||
    int product_id = get_clean_int();
 | 
			
		||||
    if (product_id == ERRORRETURN) {return ERRORRETURN;}
 | 
			
		||||
    int product_index = find_product(customers[customer_id], product_id);
 | 
			
		||||
    if (product_index == ERRORRETURN) {
 | 
			
		||||
        printf("Die Produktnummer konnte nicht gefunden werden.\n");
 | 
			
		||||
        return ERRORRETURN;
 | 
			
		||||
    }
 | 
			
		||||
   
 | 
			
		||||
    Product* product = customers[customer_id].products[product_index];
 | 
			
		||||
    printf("Produktnummer: %d\n", product->id);
 | 
			
		||||
    printf("Produktname: %s\n", product->name);
 | 
			
		||||
    printf("Preis: %f\n", product->price);
 | 
			
		||||
    printf("Anzahl: %d\n", product->amount);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int add_customer() {
 | 
			
		||||
    Customer* new_customer = (Customer*) malloc(sizeof(Customer));
 | 
			
		||||
    if (new_customer == NULL) {
 | 
			
		||||
        printf("Fehler beim Speicher zuweisen");
 | 
			
		||||
        return ERRORRETURN;
 | 
			
		||||
    }
 | 
			
		||||
    printf("*********************\n");
 | 
			
		||||
    printf("* WWS Kundeneingabe *\n");
 | 
			
		||||
    printf("*********************\n");
 | 
			
		||||
    printf("Kundennummer: ");
 | 
			
		||||
    new_customer->id = get_clean_int();
 | 
			
		||||
    if (new_customer->id == ERRORRETURN) {return ERRORRETURN;}
 | 
			
		||||
    printf("Kundenname: ");
 | 
			
		||||
    new_customer->name = read_name();
 | 
			
		||||
    if (!is_safe(new_customer->name)) {
 | 
			
		||||
        printf("Der eigegebene Kundenname enthält verbotene Zeichen.\n");
 | 
			
		||||
        return ERRORRETURN;
 | 
			
		||||
    }
 | 
			
		||||
    for (int i = 0; i < ARRSIZE; i++) {
 | 
			
		||||
        if (customers[i].id == -1) {
 | 
			
		||||
            customers[i] = *new_customer;
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    printf("Es können keine weiteren Kunden hinzugefügt werden.\n");
 | 
			
		||||
    return ERRORRETURN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int print_customer() {
 | 
			
		||||
    printf("**********************\n");
 | 
			
		||||
    printf("* WWS Kundenausgabe *\n");
 | 
			
		||||
    printf("**********************\n");
 | 
			
		||||
    printf("Bitte geben Sie ihre Kundennummer ein: ");
 | 
			
		||||
    int id = get_clean_int();
 | 
			
		||||
    if (id == ERRORRETURN) {return ERRORRETURN;}
 | 
			
		||||
    int wanted_index = find_customer(id);
 | 
			
		||||
    if (wanted_index == ERRORRETURN) {
 | 
			
		||||
        printf("Die eingegebene Kundennummer konnte nicht gefunden werden.");
 | 
			
		||||
        return ERRORRETURN;
 | 
			
		||||
    }
 | 
			
		||||
    Customer customer = customers[wanted_index];
 | 
			
		||||
    printf("Kundennumer: %d\n", customer.id);
 | 
			
		||||
    printf("Name: %s\n", customer.name);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int menu() {
 | 
			
		||||
    printf("**********************\n");
 | 
			
		||||
    printf("*   WWS Menüsystem   *\n");
 | 
			
		||||
    printf("**********************\n");
 | 
			
		||||
    printf("1: Produkteingabe\n");
 | 
			
		||||
    printf("2: Produktausgabe\n");
 | 
			
		||||
    printf("3: Kundeneingabe\n");
 | 
			
		||||
    printf("4: Kundenausgabe\n");
 | 
			
		||||
    printf("5: Verlassen\n");
 | 
			
		||||
    printf("Auswahl: ");
 | 
			
		||||
    int input = get_clean_int();
 | 
			
		||||
    switch (input) {
 | 
			
		||||
        case 1:
 | 
			
		||||
            add_product();
 | 
			
		||||
            break;
 | 
			
		||||
        case 2:
 | 
			
		||||
            print_product();
 | 
			
		||||
            break;
 | 
			
		||||
        case 3:
 | 
			
		||||
            add_customer();
 | 
			
		||||
            break;
 | 
			
		||||
        case 4:
 | 
			
		||||
            print_customer();
 | 
			
		||||
            break;
 | 
			
		||||
        case 5:
 | 
			
		||||
            printf("Das System wird verlassen...\n");
 | 
			
		||||
            return EXITVAL;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in a new issue