Initial Commit

This commit is contained in:
Emma Nora Theuer 2024-12-27 15:25:17 +01:00
parent a8ca938a9e
commit 457e322c02
6 changed files with 403 additions and 0 deletions

36
Workbook/Makefile Normal file
View 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

20
Workbook/include/util.h Normal file
View 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
View 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
View 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
View 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
View 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;
}