Как упростить код с помощью цикла или массива?

#c

#c

Вопрос:

я пытаюсь изучить новый алгоритм с помощью struct на c, затем я пытаюсь провести некоторый тест. Но код слишком длинный, и я хочу сделать его более простым.

 struct employee{
  char ID[6];
  char name[20];
  char address[50];
  long salary;
  long T;
}casher1,casher2;

int main(int argc, char const *argv[]) {
  int ch;
  printf("Choose : ");
  scanf("%d",amp;ch );
  if (ch == 1) {
    printf("Input Name : " );
    scanf("%s",casher1.name );
    printf("Input ID : " );
    scanf("%s",casher1.ID );
    printf("Input Salary : " );
    scanf("%d",amp;casher1.salary);
    printf("Input T : " );
    scanf("%d",amp;casher1.T );
    printf("n");
    casher1.salary = casher1.salary   casher1.T;

    printf("ID : %sn",casher1.ID );
    printf("Name : %sn",casher1.name );
    printf("Salary : %dn",casher1.salary );
  }
  else if(ch == 2) {
    printf("Input Name : " );
    scanf("%s",casher2.name );
    printf("Input ID : " );
    scanf("%s",casher2.ID );
    printf("Input Salary : " );
    scanf("%d",amp;casher2.salary);
    printf("Input T : " );
    scanf("%d",amp;casher2.T );
    printf("n");
    casher2.salary = casher2.salary   casher2.T;

    printf("ID : %sn",casher2.ID );
    printf("Name : %sn",casher2.name );
    printf("Salary : %dn",casher2.salary );
  }

  return 0;
}
  

Я ожидал, что такой результат будет для каждого кэшера
Идентификатор: 12345
Название: тест
Зарплата: 2000 долларов

Комментарии:

1. Что вам действительно нужно, так это функция, а не цикл или массив. (Вы также могли бы использовать цикл и массив, но это перебор всего для 2 кассиров.) Вы уже изучили их?

2. @JimBalter нет. я еще не изучал это

3. функции — самый мощный инструмент в программировании… Я предлагаю подождать, пока вы не узнаете о них, а не использовать цикл здесь.

4. если вы измените casher1,casher2 на casher[2] , то у вас будет массив из двух элементов.

5. Можно использовать массив, но тогда каждая ссылка должна быть проиндексирована. Я думаю, было бы лучше сначала изучить функции и указатели.

Ответ №1:

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

В этом случае, без необходимости помещать кэшеры в массив, вы можете создать функцию, которая принимает кэшер в качестве аргумента,

 #include <stdio.h>

struct employee{
  char ID[6];
  char name[20];
  char address[50];
  long salary;
  long T;
}casher1,casher2;

int casherFunction(struct employee *casher);

int main(int argc, char const *argv[]) {
  int ch;
  printf("Choose : ");
  scanf("%d",amp;ch );
  if( 1 == ch ){
    casherFunction(amp;casher1);
  }else if( 2 == ch ){
    casherFunction(amp;casher2);
  }
  return 0;
}

int casherFunction(struct employee *casher){
   printf("Input Name : " );
    scanf("%s",casher->name );
    printf("Input ID : " );
    scanf("%s",casher->ID );
    printf("Input Salary : " );
    scanf("%ld",amp;casher->salary);
    printf("Input T : " );
    scanf("%ld",amp;casher->T );
    printf("n");
    casher->salary = casher->salary   casher->T;

    printf("ID : %sn",casher->ID );
    printf("Name : %sn",casher->name );
    printf("Salary : %ldn",casher->salary );
    return 0;
}
  

Итак, здесь вы сначала объявляете функцию:

 int casherFunction(struct employee *casher);
  

и затем после основного вы определяете его:

 int casherFunction(struct employee *casher){
       printf("Input Name : " );
        scanf("%s",casher->name );
        printf("Input ID : " );
        scanf("%s",casher->ID );
        printf("Input Salary : " );
        scanf("%ld",amp;casher->salary);
        printf("Input T : " );
        scanf("%ld",amp;casher->T );
        printf("n");
        casher->salary = casher->salary   casher->T;

        printf("ID : %sn",casher->ID );
        printf("Name : %sn",casher->name );
        printf("Salary : %ldn",casher->salary );
        return 0;
    }
  

возвращаемое значение 0 является стандартным возвращаемым значением при отсутствии ошибок.

Обратите также внимание, что функция ожидает указатель, casherFunction(struct employee *casher) поэтому при вызове функции мы пишем: casherFunction(amp;casher1) с amp; .

Кроме того, элементы в указателе структуры находятся под casher->ID вместо casher.ID .

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

Тогда код будет:

 #include <stdio.h>

struct employee{
  char ID[6];
  char name[20];
  char address[50];
  long salary;
  long T;
}casher1,casher2;

int casherFunction(struct employee *casher);
int casherShow(struct employee casher);

int main(int argc, char const *argv[]) {
  int ch;
  printf("Choose : ");
  scanf("%d",amp;ch );
  if( 1 == ch ){
    casherFunction(amp;casher1);
  }else if( 2 == ch ){
    casherFunction(amp;casher2);
  }
    printf("%ldnn",casher1.salary);
    casherShow(casher1);

  return 0;
}

int casherFunction(struct employee *casher){
   printf("Input Name : " );
    scanf("%s",casher->name );
    printf("Input ID : " );
    scanf("%s",casher->ID );
    printf("Input Salary : " );
    scanf("%ld",amp;casher->salary);
    printf("Input T : " );
    scanf("%ld",amp;casher->T );
    printf("n");
    casher->salary = casher->salary   casher->T;

    printf("ID : %sn",casher->ID );
    printf("Name : %sn",casher->name );
    printf("Salary : %ldn",casher->salary );
    return 0;
}

int casherShow(struct employee casher){
    printf("Name: ");
    printf("%sn",casher.name );
    printf("Input ID : " );
    printf("%sn",casher.ID );
    printf("Salary : " );
    printf("%ldn",casher.salary);
    return 0;   
}