Member 14022413 Ответов: 2

Мой код не выполняется и вообще не отображается


Я попытался заглянуть в интернет, чтобы выяснить, как сделать так, чтобы эти строки кода появлялись после того, как вы введете 3 неверных идентификатора сотрудника. Поэтому, если я наберу 123,321,333, они должны появиться под ними. Но это не так.

printf("The current salary is %.2lf", emp[i].salary);
printf("\nEnter Employee New Salary: ");


КОД:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#define SIZE 4

struct Employee {
	int id,
		age;

	double salary;
};

int main(void) {

	int menuChoice,
		i,
		validEmployees = 0,
		idToUpdate = 0;

	struct Employee emp[SIZE] = { {0} };

	printf("---=== EMPLOYEE DATA ===---\n");

	do {
		printf("\n1. Display Employee Information\n");
		printf("2. Add Employee\n");
		printf("3. Update Employee Salary\n");
		printf("4. Remove Employee\n");
		printf("0. Exit\n\n");

		printf("Please select from the above options: ");
		scanf("%d", &menuChoice);

		switch (menuChoice) {
		case 1:
			printf("\nEMP ID  EMP AGE EMP SALARY\n");
			printf("======  ======= ==========\n");
			for (i = 0; i < SIZE; i++) {
				if (emp[i].id >= 0) {
					printf("%6d%9d%11.2lf\n", emp[i].id, emp[i].age, emp[i].salary);
				}
			}

			break;
		case 2:
			printf("\nAdding Employee\n");
			printf("===============");
			validEmployees = 0;

			for (i = 0; i < SIZE; i++) {
				if (emp[i].id > 0) {
					++validEmployees;
				}
			}

			if (validEmployees >= SIZE) {
				printf("\nERROR!!! Maximum Number of Employees Reached\n");
			}
			else {
				printf("\nEnter Employee ID: ");
				scanf("%d", &emp[validEmployees].id);
				printf("Enter Employee Age: ");
				scanf("%d", &emp[validEmployees].age);
				printf("Enter Employee Salary: ");
				scanf("%lf", &emp[validEmployees].salary);
			}
			break;

		case 3:

			printf("\nUpdate Employee Salary\n");
			printf("======================\n");
			printf("Enter Employee ID: ");
			scanf("%d", &idToUpdate);

			for (i = 0; i < 2; i++) {
				if (emp[i].id >= 0)
					printf("*** ERROR: Employee ID Not found! ***\n");
				printf("Enter Employee ID: ");
				scanf("%d", &idToUpdate);
			}

			for (i = 2; i < 2; i++) {
				if (idToUpdate == emp[i].id) {
					printf("The current salary is %.2lf", emp[i].salary);
					printf("\nEnter Employee New Salary: ");
					scanf("%lf", &emp[i].salary);
				}
			}

			break;

		case 4:

			printf("\nRemove Employee\n");
			printf("===============\n");
			printf("Enter Employee ID: ");
			scanf("%d", &idToUpdate);

			for (i = 0; i < SIZE; i++) {
				if (idToUpdate == emp[i].id) {
					printf("Employee %d will be removed\n", emp[i].id);
					emp[i].id = 0;
				}
			}
			break;

		case 0:

			printf("\nExiting Employee Data Program. Good Bye!!!\n");

			break;
		default:

			printf("\nERROR: Incorrect Option: Try Again\n");

			break;
		}

	} while (menuChoice != 0);

	return 0;
}


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

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

2 Ответов

Рейтинг:
1

Patrice T

Цитата:
Я попытался заглянуть в интернет, чтобы выяснить, как сделать так, чтобы эти строки кода появлялись после того, как вы введете 3 неверных идентификатора сотрудника. Поэтому, если я наберу 123,321,333, они должны появиться под ними. Но это не так.

printf("The current salary is %.2lf", emp[i].salary);
printf("\nEnter Employee New Salary: ");

Обратите внимание на цикл "for", начальное значение которого i
for (i = 2; i < 2; i++) {
    if (idToUpdate == emp[i].id) {
        printf("The current salary is %.2lf", emp[i].salary);
        printf("\nEnter Employee New Salary: ");
        scanf("%lf", &emp[i].salary);
    }
}


Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Member 14022413

Означает ли i быть i = 0?...Если нет, то не могли бы вы быть более конкретными в том, что касается значения i неправильно?

Patrice T

Возможно, но есть простой способ узнать, попробуйте его, и вы увидите, работает ли он так, как ожидалось.

CPallini

Мой 5.

Patrice T

Спасибо

Рейтинг:
1

KarstenK

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

scanf("%d", &idToUpdate);

for (i = 0; i < SIZE; i++) {
	if (emp[i].id == idToUpdate) {
		//handle all update code
		
		//ready
		break;//leave loop
	}
}
Есть еще одна проблема
for (i = 0; i < SIZE; i++) {
	if (idToUpdate == emp[i].id) {
		printf("Employee %d will be removed\n", emp[i].id);
		//emp[i].id = 0;
		memset( &emp[i], 0, sizeof(Employee) );//overwrite ALL data
	}
}
Используйте представление отладчика, чтобы увидеть изменение данных. (В левом нижнем углу панели)