исправление неправильного вывода в определенном разделе - PullRequest
0 голосов
/ 19 февраля 2019

В моих инструкциях, приведенных ближе к концу, данные сотрудника должны отображаться в каждом столбце в порядке 222, 666, 444 и 555 после удаления столбца «333» ранее.Мне нужна помощь с получением столбца '666' в исходное место столбца 333.

#define _CRT_SECURE_NO_WARNINGS
#define SIZE 4

#include <stdio.h>

struct employee {

int number;
int age;
double salary;
};

int main(void) {
struct employee emp[SIZE] = { { 0,0,0 } }; //struct w/ array
int option = 1; //option variable
int nEmp = 0; //counting how many employee we have so far
int empIndex = 0;
int i, check, sNumber;


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

while (option != 0) {
 printf("1. 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", &option);
 printf("\n");

 switch (option)
 {
 case 1: //print employee information
  printf("EMP ID  EMP AGE EMP SALARY\n");
  printf("======  ======= ==========\n");

  for (i = 0; i < nEmp; i++) {

   if (emp[i].number > 0 && emp[i].age > 0 && emp[i].salary)

   printf("%d       %d   %.2lf\n", emp[i].number, emp[i].age, emp[i].salary);
  }
  printf("\n");

  break;

 case 2: //add employee
  printf("Adding Employee\n");
  printf("===============\n");

  if (nEmp < SIZE) {

   empIndex = 0;

   while ((emp[empIndex].number != 0) && (empIndex < SIZE)) {
    empIndex++;
   }

   printf("Enter Employee ID: ");
   scanf("%d", &emp[empIndex].number);
   printf("Enter Employee Age: ");
   scanf("%d", &emp[empIndex].age);
   printf("Enter Employee Salary: ");
   scanf("%lf", &emp[empIndex].salary);
   printf("\n");
   nEmp++; 

  }
  else {

   printf("ERROR!!! Maximum Number of Employees Reached\n\n");
  }

  break;

 case 3: //update employee
  printf("Update Employee Salary\n");
  printf("======================\n");

  if (nEmp == 0) { //alternative just in case there is no employee yet
   printf("\nNo employee to update\n\n");

   break;
  }
  do
  {
   check = 1;

   printf("Enter Employee ID: ");
   scanf("%d", &sNumber);

   for (i = 0; i < SIZE; i++)
   {
    if (emp[i].number == sNumber) 

     break;

    else if (i == nEmp - 1) 

     printf("*** ERROR: Employee ID not found! ***\n");
   }
   if (i != nEmp) {

    printf("The current salary is %.2f\n", emp[i].salary);
    printf("Enter Employee New Salary: ");
    scanf("%lf", &emp[i].salary);
    check = 0;
    printf("\n");
   }
  } while (check);

  break;
 case 4: //remove employee

  printf("Remove Employee\n");
  printf("===============\n");

  if (nEmp == 0) { //in case there is no employee yet

   printf("\nNo employee to remove\n\n");

   break;
  }
  do
  {
   check = 1;

   printf("Enter Employee ID: ");
   scanf("%d", &sNumber);

   for (i = 0; i < SIZE; i++)
   {
    if (emp[i].number == sNumber) 

     break;

    else if (i == nEmp - 1) 

     printf("*** ERROR: Employee ID not found! ***\n");
   }

   if (i != nEmp) {
    check = 0;

    printf("Employee %d will be removed\n\n", emp[i].number);
    emp[i].number = 0;
    emp[i].age = 0;
    emp[i].salary = 0.0;

    nEmp -= 1;
   }

  } while (check);

  break;

 case 0: //exiting process

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

  break;

 default: //not valid option input

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

  break;
 }
 //if (option != 0) option = -1;
}
return 1;
}

Я ожидаю, что окончательный результат будет:

EMP ID  EMP AGE EMP SALARY
======  ======= ==========
222       22   22222.22
666       66   66666.66
444       44   44444.44
555       55   55555.55

и НЕ (что я получаю в настоящее время)

EMP ID  EMP AGE EMP SALARY
======  ======= ==========
222       22   22222.22
444       44   44444.44
555       55   55555.55
666       66   66666.66

перед выходом из программы.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Полагаю, ваша проблема на самом деле в этом.Первоначально ваш массив выглядел примерно так:

EMP ID  EMP AGE EMP SALARY
======  ======= ========== 
222       22   22222.22 
333       33   33333.33 
444       44   44444.44 
555       55   55555.55

Вы хотите изменить это на следующее:

EMP ID  EMP AGE EMP SALARY
======  ======= ========== 
222       22   22222.22 
666       66   66666.66 
444       44   44444.44 
555       55   55555.55

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

По сути, внесите следующее изменение в свой код «Удалить сотрудника»

if (i != nEmp) {
    check = 0;

    printf("Employee %d will be removed\n\n", emp[i].number);
    emp[i].number = 0;
    emp[i].age = 0;
    emp[i].salary = 0.0;

    nEmp -= 1;
   }

и внесите это изменение в свой код «добавления сотрудника»

  if (nEmp < SIZE) {

   int empIndex = 0; //new variable to find the next possible location to store the employee

   while ((emp[empIndex].number != 0) && (empIndex < SIZE)) {       
        empIndex++;
   }

   printf("Enter Employee ID: ");
   scanf("%d", &emp[empIndex].number);
   printf("Enter Employee Age: ");
   scanf("%d", &emp[empIndex].age);
   printf("Enter Employee Salary: ");
   scanf("%lf", &emp[empIndex].salary);
   printf("\n");
   nEmp++;
  }

СделатьОбязательно используйте empIndex вместо nEmp для хранения нового сотрудника.Обратите внимание, что если вы удаляете сотрудника, но не добавляете обратно ни одного сотрудника, вы будете распечатывать нули для той записи, которую вы удалили.Кроме того, обратите внимание, что это означает, что вам нужно распечатать все элементы в массиве, а не только первые несколько, так как вы могли бы иметь сотрудника в последнем месте массива, но не в середине.

0 голосов
/ 19 февраля 2019

Ваш цикл for (for (i = searchedI; i < nEmp; i++) { ... }) перемещает все элементы на одну позицию вперед.Чтобы получить желаемый результат, просто переместите последний элемент в позицию, которую нужно удалить (код ниже показывает полный оставшийся блок if):

if (i != nEmp)
{
    check = 0;
    printf("Employee %d will be removed\n\n", emp[i].number);

    --nEmp; // doing this first spares you additional subtractons later...
    if (i != nEmp) // last element does not have to be moved...
        emp[i] = emp[nEmp];
    emp[nEmp].number = 0; // actually redundant
}
...