Browse Source
Merge branch 'feature/update-current-customer-account-balance' into feature/withdraw-money-system
remotes/origin/feature/withdraw-money-system
Merge branch 'feature/update-current-customer-account-balance' into feature/withdraw-money-system
remotes/origin/feature/withdraw-money-system
Shivam Chaudhary
2 years ago
14 changed files with 327 additions and 10 deletions
-
3.gitignore
-
20src/CustomerData.txt
-
4src/CustomerProperties.h
-
97src/LoginCustomer.c
-
10src/LoginCustomer.h
-
2src/_file_information.h
-
BINsrc/a.exe
-
63src/currentCustomerAccountBalance.c
-
10src/currentCustomerAccountBalance.h
-
6src/lineReplacer.h
-
81src/updateCustomerAccountBalance.c
-
11src/updateCustomerAccountBalance.h
-
9team.md
-
21tests/test_LoginCustomer.c
@ -1 +1,2 @@ |
|||
.DS_Store |
|||
.DS_Store |
|||
.vscode |
@ -0,0 +1,20 @@ |
|||
1234=example |
|||
ID=1234 |
|||
forename=Max |
|||
Surname=Mustermann |
|||
password=example |
|||
balance=5000 |
|||
|
|||
1327=example |
|||
ID=1327 |
|||
forename=Max |
|||
Surname=Mustermann |
|||
password=example |
|||
balance=1500 |
|||
|
|||
1666=example |
|||
ID=1666 |
|||
forename=Max |
|||
Surname=Mustermann |
|||
password=example |
|||
balance=240 |
@ -0,0 +1,4 @@ |
|||
typedef struct Customer{ |
|||
char *ID, *forename, *surname, *password; |
|||
float balance; |
|||
}customer_t; |
@ -0,0 +1,97 @@ |
|||
#include "LoginCustomer.h" |
|||
|
|||
bool checkLogin(bool loginSuccessful) |
|||
{ |
|||
return (loginSuccessful) ? true : false; |
|||
} |
|||
|
|||
void collectCustomerDataForLogin(int attempts) |
|||
{ |
|||
customer_t c; |
|||
c.ID = calloc(15+1,sizeof(char)); |
|||
c.password = calloc(15+1, sizeof(char)); |
|||
char digitCharacterFromUser, passwordCharacterFromUser; |
|||
int IDLengthCounter = 0, passwordLengthCounter = 0; |
|||
const int IDMaxLength = 16, passwordMaxLength = 16; |
|||
|
|||
printf("Enter ID:\n"); |
|||
while(((digitCharacterFromUser=getchar()) != '\n')&&IDLengthCounter<IDMaxLength){ |
|||
if(digitCharacterFromUser>='0'&&digitCharacterFromUser<='9'){ |
|||
*(c.ID+IDLengthCounter) = digitCharacterFromUser; |
|||
} |
|||
else{ |
|||
printf("Character entered is not a digit. Aborting.\n"); |
|||
exit(-1); |
|||
} |
|||
++IDLengthCounter; |
|||
} |
|||
*(c.ID+IDLengthCounter) = '\0'; |
|||
|
|||
if(IDLengthCounter>=IDMaxLength){ |
|||
printf("ID entered is too long. Aborting.\n"); |
|||
exit(-1); |
|||
} |
|||
|
|||
printf("Enter password:\n"); |
|||
while((passwordCharacterFromUser=getchar())!='\n'&&passwordLengthCounter<passwordMaxLength){ |
|||
*(c.password+passwordLengthCounter) = passwordCharacterFromUser; |
|||
++passwordLengthCounter; |
|||
} |
|||
*(c.password+passwordLengthCounter) = '\0'; |
|||
|
|||
if(passwordLengthCounter>=passwordMaxLength){ |
|||
printf("Password entered is too long. Aborting.\n"); |
|||
exit(-1); |
|||
} |
|||
customer_t *ptr = &c; |
|||
bool loginSuccessful = loginCustomer(ptr); |
|||
if(loginSuccessful ) { |
|||
printf("Welcome to the menu!\n"); |
|||
//call menu() |
|||
}else if(!loginSuccessful && attempts < MAX_LOGIN_ATTEMPTS){ |
|||
printf("You have %d attempts left.\n", MAX_LOGIN_ATTEMPTS - attempts); |
|||
collectCustomerDataForLogin(++attempts); |
|||
}else{ |
|||
printf("Maximum number of attempts reached. Program terminates.\n"); |
|||
exit(-1); |
|||
//call error() |
|||
} |
|||
|
|||
} |
|||
|
|||
bool loginCustomer(customer_t *c) |
|||
{ |
|||
bool foundCustomerEntryInFile = false; |
|||
char *searchForThisString = generateCheckString(c->ID,c->password); |
|||
char *lineFromCustomerFile = calloc(40,sizeof(char)); |
|||
FILE *readCustomerFile = fopen("CustomerData.txt", "r"); |
|||
if(readCustomerFile==NULL){ |
|||
printf("Could not find file. Aborting.\n"); |
|||
exit(-1); |
|||
//call error() |
|||
} |
|||
while((fscanf(readCustomerFile,"%s",lineFromCustomerFile)!=EOF)){ |
|||
if(strcmp(searchForThisString,lineFromCustomerFile)==0){ |
|||
foundCustomerEntryInFile = true; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
if(checkLogin(foundCustomerEntryInFile)){ |
|||
printf("Login successful.\n"); |
|||
return foundCustomerEntryInFile; |
|||
}else{ |
|||
printf("Login not successful.\n"); |
|||
} |
|||
fclose(readCustomerFile); |
|||
return foundCustomerEntryInFile; |
|||
} |
|||
|
|||
char *generateCheckString(char *ID, char *password){ |
|||
int checkStringLength = strlen(ID) + 1 + strlen(password) + 1; |
|||
char *checkString = calloc(checkStringLength, sizeof(char)); |
|||
checkString = strcat(ID,"="); |
|||
checkString = strcat(checkString,password); |
|||
*(checkString+checkStringLength) = '\0'; |
|||
return checkString; |
|||
} |
@ -0,0 +1,10 @@ |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <stdbool.h> |
|||
#include <string.h> |
|||
#include "CustomerProperties.h" |
|||
#define MAX_LOGIN_ATTEMPTS 3 |
|||
char *generateCheckString(char *, char*); |
|||
bool checkLogin(bool); |
|||
void collectCustomerDataForLogin(int); |
|||
bool loginCustomer(customer_t *); |
@ -0,0 +1,2 @@ |
|||
#define MAX_LENGTH 100 |
|||
#define CUSTOMER_DATA_FILE "CustomerData.txt" |
@ -0,0 +1,63 @@ |
|||
#include "currentCustomerAccountBalance.h" |
|||
|
|||
float fetchBalanceFromBalanceString(char balance_String[MAX_LENGTH]) { |
|||
float balance = 0; |
|||
char *token = strtok(balance_String, "="); // separates string to two parts |
|||
while (token != NULL) { |
|||
if (atoi(token) != 0) { |
|||
balance = atof(token); // converts string to float |
|||
break; |
|||
} |
|||
token = strtok(NULL, "="); |
|||
} |
|||
return balance; |
|||
} |
|||
|
|||
float readFileAndGetAvailableBalance(FILE *file, char stringID[MAX_LENGTH]) { |
|||
float balance = 0; |
|||
bool keep_reading = true; |
|||
char buffer[MAX_LENGTH]; |
|||
char balance_String[MAX_LENGTH]; |
|||
|
|||
while(keep_reading) { |
|||
fgets(buffer, MAX_LENGTH, file); |
|||
if (feof(file)) { |
|||
keep_reading = false; |
|||
} |
|||
else if(strstr(buffer, stringID)) { |
|||
for (int i = 0; i < 4; i++) { |
|||
fgets(buffer, MAX_LENGTH, file); |
|||
} |
|||
strcpy(balance_String, buffer); |
|||
balance = fetchBalanceFromBalanceString(balance_String); |
|||
keep_reading = false; |
|||
} |
|||
|
|||
} |
|||
return balance; |
|||
} |
|||
|
|||
float getAvailableAccountBalance(int user_id) { |
|||
float availableBalance = 0; |
|||
char stringID[MAX_LENGTH] = "ID="; |
|||
char user_id_as_string[MAX_LENGTH]; |
|||
|
|||
sprintf(user_id_as_string, "%d", user_id); // converts user_id to string |
|||
strcat(stringID, user_id_as_string); |
|||
// Now stringID is "ID=user_id" |
|||
|
|||
FILE *file = fopen(CUSTOMER_DATA_FILE, "r"); |
|||
if(file == 0) { |
|||
printf("Error: customer data file cannot be opened!\n"); |
|||
return 0; |
|||
} |
|||
else { |
|||
availableBalance = readFileAndGetAvailableBalance(file, stringID); |
|||
} |
|||
|
|||
|
|||
fclose(file); |
|||
|
|||
return availableBalance; |
|||
|
|||
} |
@ -0,0 +1,10 @@ |
|||
#include <stdio.h> |
|||
#include <stdbool.h> |
|||
#include <string.h> |
|||
#include <stdlib.h> |
|||
|
|||
#include "_file_information.h" |
|||
|
|||
float getAvailableAccountBalance(int user_id); |
|||
float fetchBalanceFromBalanceString(char balance_String[MAX_LENGTH]); |
|||
float readFileAndGetAvailableBalance(FILE *file, char stringID[MAX_LENGTH]); |
@ -0,0 +1,6 @@ |
|||
#include <stdio.h> |
|||
#include <stdbool.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
|
|||
void replaceLineInFile(const char* file_name, int line, const char* new_line); //replaces the line at "line" on the file "file_name", with the new line "new_line". |
@ -0,0 +1,81 @@ |
|||
#include "updateCustomerAccountBalance.h" |
|||
#include "currentCustomerAccountBalance.c" |
|||
#include "lineReplacer.h" |
|||
|
|||
void replaceLineInFile(const char* file_name, int line, const char* new_line){ |
|||
FILE* file = fopen(file_name, "r"); |
|||
if (file == NULL) { |
|||
printf("Error opening file!\n"); |
|||
return; |
|||
} |
|||
char current_string[1024]; |
|||
int current_line = 1; |
|||
char *temp_file_name = "temp.txt"; |
|||
FILE* temp_file = fopen(temp_file_name, "w"); |
|||
if (temp_file == NULL) { |
|||
printf("Error creating temp file!\n"); |
|||
fclose(file); |
|||
return; |
|||
} |
|||
while (fgets(current_string, sizeof(current_string), file) != NULL) { |
|||
if (current_line == line) { |
|||
fprintf(temp_file, "%s", new_line); |
|||
fputs("\n", temp_file); |
|||
} else { |
|||
fprintf(temp_file, "%s", current_string); |
|||
} |
|||
current_line++; |
|||
} |
|||
fclose(file); |
|||
fclose(temp_file); |
|||
if(remove(file_name)!=0){ |
|||
printf("could not remove the original file!"); |
|||
} // Remove the original file |
|||
if(rename(temp_file_name, file_name)!=0){ |
|||
printf("could not rename!"); |
|||
} // Rename the temp file to the original file |
|||
} |
|||
|
|||
void replaceBalanceInString(float replacementBalance, int currentLine) { |
|||
char newBalanceLine[MAX_LENGTH] = "balance="; |
|||
char balance_as_string[MAX_LENGTH]; |
|||
sprintf(balance_as_string, "%g", replacementBalance); //converts replacement balance to string |
|||
strcat(newBalanceLine, balance_as_string); |
|||
replaceLineInFile("CustomerData.txt",currentLine,newBalanceLine); |
|||
} |
|||
|
|||
bool updateAvailableAccountBalance(int user_id, float newBalance){ |
|||
|
|||
bool keep_reading = true; |
|||
|
|||
char buffer[MAX_LENGTH]; |
|||
char stringID[MAX_LENGTH] = "ID="; |
|||
char user_id_as_string[MAX_LENGTH]; |
|||
char balance_String[MAX_LENGTH]; |
|||
int currentLine=0; |
|||
|
|||
sprintf(user_id_as_string, "%d", user_id); // converts user_id to string |
|||
strcat(stringID, user_id_as_string); |
|||
|
|||
FILE *file = fopen("CustomerData.txt", "r+"); |
|||
printf(stringID); |
|||
while(keep_reading) { |
|||
fgets(buffer, MAX_LENGTH, file); |
|||
currentLine++; |
|||
if (feof(file)) { |
|||
keep_reading = false; |
|||
} |
|||
else if(strstr(buffer, stringID)) { //found the customer |
|||
fgets(buffer, MAX_LENGTH, file); |
|||
fgets(buffer, MAX_LENGTH, file); |
|||
fgets(buffer, MAX_LENGTH, file); |
|||
fgets(buffer, MAX_LENGTH, file); |
|||
strcpy(balance_String, buffer); |
|||
currentLine+=4; |
|||
keep_reading = false; |
|||
} |
|||
|
|||
} |
|||
fclose(file);; |
|||
replaceBalanceInString(newBalance,currentLine); |
|||
} |
@ -0,0 +1,11 @@ |
|||
#include <stdio.h> |
|||
#include <stdbool.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
|
|||
#define MAX_LENGTH 100 |
|||
|
|||
|
|||
bool updateAvailableAccountBalance(int user_id, float newBalance); |
|||
|
|||
void replaceBalanceInString(float replacementBalance, int currentLine); |
@ -1,9 +0,0 @@ |
|||
# Bankmanagement-System |
|||
|
|||
- Can Hacioglu, Fdlt3817 |
|||
- Atharva Kishor Naik, fdai7514 |
|||
- Julius Philipp Engel, fdai7057 |
|||
- Shivam Chaudhary, fdlt3781 |
|||
- Mohamed Yahya Dahi, fdai6618 |
|||
- Haytham Daoula, fdai7207 |
|||
|
@ -0,0 +1,21 @@ |
|||
#include <unity.h> |
|||
#include "LoginCustomer.h" |
|||
void setUp(){}; |
|||
void tearDown(){}; |
|||
void test_checkLogin() |
|||
{ |
|||
/*arrange*/ |
|||
bool expected_test_values_compute_to_true[] = {4==4,true==true, 1==1, false==false, 'z'=='z', '='=='=',0x1A==0x1A}; |
|||
int length_1 = sizeof(expected_test_values_compute_to_true)/sizeof(bool); |
|||
|
|||
bool expected_test_values_compute_to_false[] = {4!=4,true==false,1==0,false==true,'z'=='x','!'==')',0x1A==0x2B}; |
|||
int length_2 = sizeof(expected_test_values_compute_to_false)/sizeof(bool); |
|||
|
|||
/*act and assertions*/ |
|||
for(int i=0;i<7;++i) { |
|||
TEST_ASSERT_TRUE(checkLogin(expected_test_values_compute_to_true[i])); |
|||
} |
|||
for(int i=0;i<7;++i){ |
|||
TEST_ASSERT_FALSE(checkLogin(expected_test_values_compute_to_false[i])); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue