Member 14643779 Ответов: 2

(Язык программирования C) функция входа в систему


Это мини-проект c, над которым я сейчас работаю. Я пытаюсь войти в систему после того,как зарегистрирую новую учетную запись, но даже я ввожу правильную информацию, все равно не могу войти, не могу найти ошибку. Кода довольно много, но я изо всех сил старался свести его к минимуму.

Код:

Это основной интерфейс при запуске консоли, для выбора входа в систему либо регистрации.Если вы впервые входите в систему, вам необходимо зарегистрировать новую учетную запись перед входом в систему.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>

void customer();
void customerres();
void customerlogin();
void fordelay();

int i, j;
int main_exit;

struct date
{
	int month, day, year;
};

struct
{
	int acc_no, age;
	char password[20];
	char repassword[20];
	char name[60];
	char user[60];
	char address[60];
	char gender[15];
	char acc_type[10];
	double phone;
	float amt;
	struct date dob;
	struct date deposit;
	struct date withdraw;
}add, upd, check;

void fordelay(int j)
{
	int i, k;
	for (i = 0;i < j;i++)
		k = i;
}

void main()
{
	system("cls");
	int choose;

	printf("\n1. Login\n2. Register\n\n\nEnter your choice:");
	scanf("%d", &choose);

	switch (choose)
	{
	case 1:
		customerlogin();
		break;

	case 2:
		customerres();
		break;
	}
}


И это функция регистрации, я добавляю две функции, которые проверяют наличие номера счета и проверяют соответствие пароля повторного ввода или нет. Для проверки наличия номера счета я использую указатель, чтобы сделать это. После ввода остальной информации пользователя программа сохранит ее в текстовый файл.

void customerres()
{
	int checkpassword;
	FILE* ptr;
	ptr = fopen("record.txt", "a+");
account_no:
	system("cls");
	printf("Register New Account");
	printf("\n\n\nEnter today's date(dd/mm/yyyy):");
	scanf("%d/%d/%d", &add.deposit.day, &add.deposit.month, &add.deposit.year);
	printf("\nEnter the Account Number:");
	scanf("%d", &check.acc_no);
	while (fscanf(ptr, "%d %s %s %s %s %d/%d/%d %d %s %s %lf %s %f %d/%d/%d\n", &add.acc_no, add.password, add.repassword, add.user, add.name, &add.dob.month, &add.dob.day, &add.dob.year, &add.age, add.address, add.gender, &add.phone, add.acc_type, &add.amt, &add.deposit.month, &add.deposit.day, &add.deposit.year) != EOF)
	{
		if (check.acc_no == add.acc_no)
		{
			printf("Account no. already in use!");
			fordelay(1000000000);
			goto account_no;

		}
	}
	add.acc_no = check.acc_no;
	printf("\nEnter the Username:");
	scanf("%s", add.user);
	checkpassword = 0;
	while (checkpassword == 0)
	{
	password:
		printf("\nEnter the password:");
		scanf("%s", add.password);
		printf("\nRe-enter the password:");
		scanf("%s", add.repassword);
		if (strcmp(add.password, add.repassword) == 0)
		{
			checkpassword = 1;
			printf("Password match!\n");
		}
		else
		{
			printf("Password don't match!\n");
			fordelay(1000000000);
			goto password;
		}
	}
	printf("\nEnter your name:");
	scanf("%s", add.name);
	printf("\nEnter the Date Of Birth(dd/mm/yyyy):");
	scanf("%d/%d/%d", &add.dob.day, &add.dob.month, &add.dob.year);
	printf("\nEnter the age:");
	scanf("%d", &add.age);
	printf("\nEnter the address:");
	scanf("%s", add.address);
	printf("\nEnter the gender:");
	scanf("%s", add.gender);
	printf("\nEnter the phone number: ");
	scanf("%lf", &add.phone);
	printf("\nEnter the amount to deposit:$");
	scanf("%f", &add.amt);
	printf("\nType of account:\n\t#Saving\n\t#Current\n\tEnter your choice:");
	scanf("%s", add.acc_type);

	fprintf(ptr, "%d %s %s %s %s %d/%d/%d %d %s %s %lf %s %f %d/%d/%d\n", &add.acc_no, add.password, add.repassword, add.user, add.name, add.dob.month, add.dob.day, add.dob.year, add.age, add.address, add.gender, add.phone, add.acc_type, add.amt, add.deposit.month, add.deposit.day, add.deposit.year);


	fclose(ptr);
	printf("\nAccount created successfully!");
add_invalid:
	printf("\n\n\n\t\tEnter 1 to go to the main menu and 0 to exit:");
	scanf("%d", &main_exit);
	system("cls");
	if (main_exit == 1)
	{
		main();
	}
	else if (main_exit == 0)
	{
		exit(0);
	}
	else
	{
		printf("\nInvalid!\a");
		goto add_invalid;
	}
}


В этом коде я сделал функцию проверки того, правильно ли пользователь ввел информацию. Если номер учетной записи, имя пользователя и пароль совпадают, он успешно войдет в систему, но здесь я потерпел неудачу.

void customerlogin()
{
	system("cls");
	FILE* ptr;
	ptr = fopen("record.txt", "r");

	printf("\nAccount number: ");
	scanf("%d", &check.acc_no);
	printf("Username: ");
	scanf("%s", check.name);
	printf("Password: ");
	scanf("%s", check.password);

	int checkcredential, choose, findacct, login;
	choose = 0;
	checkcredential = 0;
	findacct = 0;
	login = 0;
	while (fscanf(ptr, "%d %s %s %s %s %d/%d/%d %d %s %s %lf %s %f %d/%d/%d\n", &add.acc_no, add.password, add.repassword, add.user, add.name, &add.dob.month, &add.dob.day, &add.dob.year, &add.age, add.address, add.gender, &add.phone, add.acc_type, &add.amt, &add.deposit.month, &add.deposit.day, &add.deposit.year) != EOF)
	{
		if (check.acc_no == add.acc_no)
		{
			if (strcmp(check.name, add.name) == 0)
			{
				if (strcmp(check.password, add.password) == 0)
				{
					fclose(ptr);
					login = 1;
					customer(check.acc_no);
				}
				else
				{
					checkcredential = 1;
				}
			}
			else
			{
				checkcredential = 1;
			}
		}
		else
		{
			findacct = 1;
		}
	}
	fclose(ptr);
	if (login == 0)
	{
		if (findacct == 1 || checkcredential == 1)
		{
			printf("\nSorry, wrong credentials!\n\nEnter 1 to try again and 0 to exit:");
			scanf("%d", &main_exit);
			system("cls");
			if (main_exit == 1)
			{
				customerlogin();
			}
			else if (main_exit == 0)
			{
				exit(0);
			}
		}
	}
}

void customer()
{
	printf("/n Login Successful!");
}



Спасибо за любые исправления в моем коде, я оценил это.

Что я уже пробовал:

Я пробовал много способов отредактировать свой код, но все равно потерпел неудачу, похоже, я действительно не правильно поймал ошибку...

OriginalGriff

Если бы мы хотели разместить на SO, мы бы разместили на SO. Мы этого не делаем - потому что размещаем здесь сообщения. Говоря "!Я сделал то же самое в другом месте" - это просто грубо и не улучшает ваши изменения в ответе хеттинга...

Member 14643779

Мне очень жаль, что я не заметил неуместности своих слов. Я очень благодарен Вам за этот урок.

2 Ответов

Рейтинг:
0

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


Рейтинг:
0

Richard MacCutchan

Я бы посоветовал вам начать все сначала. Ваш код кажется слишком сложным для такой простой системы, и есть одна или две вещи, которые являются пустой тратой времени.

Начните с системы, которая просто принимает идентификатор пользователя и пароль, так что вы можете свести к минимуму количество кода, который должен быть протестирован.

Для регистрации запросите данные пользователя, а затем выполните поиск в базе данных (или текстовом файле), чтобы узнать, существуют ли эти данные уже. Если да, спросите о других деталях.

Для запроса входа в систему вам просто нужно запросить эти два поля и проверить, существуют ли они в базе данных. Если это так, примите статус, иначе распечатайте сообщение о том, что данные неверны. Если он терпит неудачу три раза, то завершите работу приложения.

Как только эта простая часть будет успешно работать, вы можете начать добавлять другие поля в свою базу данных: дата создания учетной записи - вы можете получить это из системы, нет необходимости вводить ее пользователю. Дата рождения, но не возраст, так как это будет неправильно завтра, и может быть вычислено в любое время. И нет никакого смысла хранить перепечатанный пароль после того, как вы его проверили. Кроме того, вам нужно подумать о хэшировании ваших паролей, чтобы они не хранились в открытом тексте.