Ich habe von der Schule ein Microsoft Imagine-Konto erhalten, wodurch ich mit auch problemlos Visual Studio installieren könnte, ich fand es aber praktischer nur 1 IDE für alles benutzen, wenns denn möglich is, allein schon weil man sich so dran gewöhnt hat.
Kompilier ich es im Release-Modus ist es exakt das selbe… Das Programm arbeitet mit 1 txt-Datei und die .c Datei mit der main. Die includes sind diese:
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <locale.h>
#include <unistd.h>```
Die komplette C-Datei, falls benötigt, schaut so aus:
[SPOILER]```/*
* File: main.c
* Author: Andy
*
* Created on 14. Februar 2017, 20:21
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <locale.h>
#include <unistd.h>
void verschluesseln(char* pin) {
int i;
for (i = 0; i < strlen(pin); i++) {
pin** = pin** + 128;
}
}
void entschluesseln(char* pin) {
int i;
for (i = 0; i < strlen(pin); i++) {
pin** = pin** - 128;
}
}
void dateiSchreiben(FILE* datei, float kontostand, bool sperre, char* geheimzahl, char* username, int stelle) {
datei = fopen("usernames.txt", "rw+");
FILE* tempDatei = tmpfile();
char temp[100];
verschluesseln(geheimzahl);
int i;
for (i = 0; fscanf(datei, "%s", &temp) == 1; i++) {
if (i != stelle) {
fprintf(tempDatei, "%s
", temp);
} else {
fprintf(tempDatei, "%g;%i;%s;%s
", kontostand, sperre, geheimzahl, username);
}
}
fseek(datei, 0, SEEK_SET);
fseek(tempDatei, 0, SEEK_SET);
while (fscanf(tempDatei, "%s", &temp) == 1) {
fprintf(datei, "%s
", temp);
}
fclose(datei);
fclose(tempDatei);
}
int main(int argc, char** argv) {
float kontostand;
int i, menuEingabe = 0, abhebenEingabe, stelle;
bool sperre, hierSperre = false, userFound = false;
char usernameEingabe[100], temp[200];
char* geheimEingabe;
char* pinVeri;
char* neuePin1;
char* neuePin2;
char* geheimzahl;
char* usernameDatei;
FILE* fp_usernames = fopen("usernames.txt", "r");
setlocale(LC_NUMERIC, "de_DE.UTF-8");
if (fp_usernames != NULL) {
printf("Bitte geben Sie den Benutzernamen ein: ");
scanf("%s", &usernameEingabe);
for (stelle = 0; fscanf(fp_usernames, "%f;%i;%s", &kontostand, &sperre, &temp) == 3; stelle++) {
// aufteilen2(temp, geheimzahl, usernameD);
geheimzahl = strtok(temp, ";");
entschluesseln(geheimzahl);
usernameDatei = strtok(NULL, ";");
if (strcmp(usernameEingabe, usernameDatei) == 0) {
userFound = true;
break;
}
fclose(fp_usernames);
}
if (!userFound) {
printf("Benutzername nicht vorhanden!
");
} else {
for (i = 1; i <= 3 && !sperre; i++) {
geheimEingabe = getpass("Bitte geben Sie die Geheimzahl ein: ");
if (strcmp(geheimzahl, geheimEingabe) != 0 && !sperre) {
printf("Falsche PIN! Noch %i Versuche bis zur Sperrung!
", 3 - i);
if (i == 3) {
sperre = hierSperre = true;
printf("Ihr Konto wurde gesperrt!
");
dateiSchreiben(fp_usernames, kontostand, sperre, geheimzahl, usernameDatei, stelle);
}
} else {
break;
}
}
if (!hierSperre) {
if (sperre) {
printf("Ihr Konto ist gesperrt!
");
} else {
printf("Herzlich Willkommen %s!
", usernameEingabe);
while (menuEingabe != 5) {
printf("Menu:
Kontostand (1):
Geld auszahlen (2):
Geld einzahlen (3)
PIN ändern (4)
Beenden (5):
");
scanf("%i", &menuEingabe);
switch (menuEingabe) {
case 1: printf("Ihr Kontostand beträgt %'.2f Euro.
", kontostand);
break;
case 2:
printf("Wie viel Euro möchten Sie abheben? ");
scanf("%i", &abhebenEingabe);
if (abhebenEingabe > kontostand) {
printf("Negative Kontostände nicht zulässig!
");
} else if (abhebenEingabe % 5 != 0) {
printf("Der Betrag muss durch 5 Euro teilbar sein! Münzausgabe nicht unterstützt!
");
} else {
kontostand -= abhebenEingabe;
dateiSchreiben(fp_usernames, kontostand, sperre, geheimzahl, usernameDatei, stelle);
printf("Es wurden erfolgreich %'i Euro von Ihrem Konto abgebucht! Der neue Kontostand beträgt nun %'.2f Euro!
", abhebenEingabe, kontostand);
}
break;
case 3:
printf("Wie viel Geld wollen Sie einzahlen? ");
scanf("%i", &abhebenEingabe);
kontostand += abhebenEingabe;
dateiSchreiben(fp_usernames, kontostand, sperre, geheimzahl, usernameDatei, stelle);
printf("Es wurden erfolgreich %'i Euro auf Ihr Konto gebucht! Der neue Kontostand beträgt nun %'.2f Euro!
", abhebenEingabe, kontostand);
break;
case 4:
pinVeri = getpass("Bitte geben Sie zur Verifizierung die alte PIN ein: ");
if (strcmp(geheimzahl, pinVeri) == 0) {
bool gleich = false;
while (!gleich) {
neuePin1 = getpass("Bitte geben Sie die neue PIN ein: ");
neuePin2 = getpass("Bitte geben Sie die neue PIN noch einmal ein: ");
if (strcmp(neuePin1, neuePin2) != 0) {
printf("Die neuen PINs stimmen nicht überein! Bitte erneut eingeben!
");
} else if (strlen(neuePin1) != 4) {
printf("Die PIN muss 4-stellig sein!
");
} else {
gleich = true;
geheimzahl = neuePin1;
}
}
dateiSchreiben(fp_usernames, kontostand, sperre, geheimzahl, usernameDatei, stelle);
printf("Die PIN wurde erfolgreich geändert!
");
}
break;
}
}
}
}
}
fclose(fp_usernames);
} else {
printf("Benuternamen-Datei konnte nicht geöffnet werden!
");
}
return (EXIT_SUCCESS);
}```[/SPOILER]
Edit: Der C-Tag ist ja mal komplett fürn Hintern...