массивы структур
От: Аноним  
Дата: 13.12.13 09:31
Оценка: :))
Нужен пункт 3 и 4 сделать !!!)) Помогите !!


Создать программу учета сотрудников.
О сотруднике необходимо хранить следующие данные:

— ФИО
— должность
— дата рождения.

Данные о сотрудниках следует хранить в массиве структур

Программа должна иметь следующее меню:
1. Вывод списка сотрудников
2. Редактирование
Изменение должности
Добавление сотрудника
Удаление сотрудника
3. Запросы
Вывести данные о сотруднике с заданной фамилией
Вывести всех сотрудников, у которых день рождения в заданном месяце
4. Статистика
Общее количество сотрудников
Количество сотрудников в каждой должности
Количество молодых специалистов (до 35 лет)



#include <stdio.h>
#include <stdlib.h>
#include <locale.h>  
#include <iostream>

#define MAX 100

struct addr {
  char kolvo[50];
  char name[30];
  char fam[40];
  char otch[20];
  char dolg[10];
  char dat[10];
  char mes [15];
  char god [4];
  char young[10];
  unsigned long int zip;
} addr_list[MAX];

void init_list(void), enter(void);
void remove(void), list(void);
int menu_select(void), find_free(void);
void kolvo(); int young(void );
int main(void)
{
setlocale(LC_ALL,"RUS");
  char choice;

  init_list(); /* инициализация массива структур */
  for(;;) {
    choice = menu_select();
    switch(choice) {
    case 1: enter();
        break;
    case 2: remove ();
        break;
    case 3: list();
        break;
    case 4: kolvo();
        break;
    case 5: exit(0);
        break;
    }
  }

  return 0;
}

/* Инициализация списка. */
void init_list(void)
{ int t;

  for(t=0; t<MAX; ++t) addr_list[t].name[0] = '\0';
}

void kolvo()
{
int t;
for(t=0; t<MAX; ++t)
if(addr_list[t].name[0])
    {
        printf("Количество сотрудников: %s\n" ,addr_list[t].kolvo);
    }
}



/* Получения значения, выбранного меню. */
int menu_select(void)
{

  char s[80];
  int c;

  printf("1. Введите имя\n");
  printf("2. Удалите имя\n");
  printf("3. Выведите список\n");
  printf("4. Количество сотрудников\n");
  printf("5. Выход\n");
  do {
    printf("\nВведите номер нужного пункта: ");
    gets(s);
    c = atoi(s);
  } while(c<0 || c>5);
  return c;
}

/* Ввод адреса в список. */
void enter(void)
{
  int slot;
  char s[80];

  slot = find_free();

  if(slot==-1) {
    printf("\nСписок заполнен");
    return;
  }
  printf("количество сотрудников: ");
  gets(addr_list[slot].kolvo);

  printf("Введите имя: ");
  gets(addr_list[slot].name);

  printf("Введите фамилию: ");
  gets(addr_list[slot].fam);

  printf("Введите отчество: ");
  gets(addr_list[slot].otch);

  printf("Введите должность: ");
  gets(addr_list[slot].dolg);
  
  printf("Дата рождения: ");
  gets(addr_list[slot].dat);

  printf("Месяц рождения: ");
  gets(addr_list[slot].mes);

  printf("Год рождения: ");
  gets(addr_list[slot].god);
}


/* Поиск свободной структуры. */
int find_free(void)
{
  int t;

  for(t=0; addr_list[t].name[0] && t<MAX; ++t) ;

  if(t==MAX) return -1; /* свободных структур нет */
  return t;
}

/* Удаление адреса. */
void remove(void)
{
 int slot;
  char s[80];

  printf("Введите № записи: ");
  gets(s);
  slot =atoi(s);

  if(slot>=0 && slot < MAX)
    addr_list[slot].name[0] = '\0';
}

/* Вывод списка на экран. */
void list(void)
{
  int t;

  for(t=0; t<MAX; ++t) {
    if(addr_list[t].name[0]) {
        printf(" Имя: %s\n",            addr_list[t].name);
        printf(" Фамилия: %s\n " ,        addr_list[t].fam);
        printf("Отчество: %s\n " ,        addr_list[t].otch);
        printf("Должность: %s\n ",        addr_list[t].dolg);
        printf("Дата рождения: %s\n ",    addr_list[t].dat); 
        printf("Месяц рождения: %s\n ", addr_list[t].mes);
        printf("Год рождения: %s\n ",    addr_list[t].god);
    }
  }
  printf("\n\n");
}
с++
Re: массивы структур
От: jazzer Россия Skype: enerjazzer
Дата: 13.12.13 09:59
Оценка:
Здравствуйте, Аноним, Вы писали:

у тебя же уже есть код для прохода по списку сотрудников:
А>
А>  for(t=0; t<MAX; ++t) {
      // вот тут пиши свой код
А>  }
А>

просто вставляй внутрь необходимые условия и действия.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: массивы структур
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 13.12.13 10:10
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Аноним, Вы писали:


J>у тебя же уже есть код для прохода по списку сотрудников:

А>>
А>>  for(t=0; t<MAX; ++t) {
J>      // вот тут пиши свой код
А>>  }
А>>

J>просто вставляй внутрь необходимые условия и действия.
Плохому же учишь неофита! А где произволтельность? А где использование нормальных контейнеров?
Sic luceat lux!
Re[3]: массивы структур
От: jazzer Россия Skype: enerjazzer
Дата: 13.12.13 10:13
Оценка: 3 (1) +1
Здравствуйте, Kernan, Вы писали:

K>Плохому же учишь неофита! А где произволтельность? А где использование нормальных контейнеров?


Очевидно, они их еще не проходили:

Данные о сотрудниках следует хранить в массиве структур


ЗЫ Все мы с бейсика/асма начинали, чего уж тут. Динамический хэш-контейнер на них обоих реализовывать — застрелиться.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: массивы структур
От: Кодт Россия  
Дата: 17.12.13 12:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нужен пункт 3 и 4 сделать !!!)) Помогите !!


Сделать не сделаем, а помочь — почему бы и нет?

А>3. Запросы

А> Вывести данные о сотруднике с заданной фамилией
А> Вывести всех сотрудников, у которых день рождения в заданном месяце

Ещё у нас есть запрос
1. Вывод списка сотрудников

поэтому, либо нужно обобщить их, сделав функцию вывода списка вот такой
void list(char const* surname /* = NULL */, int month /* = 0 */)
{
  for(.....)
  {
    .....
    if(surname!=NULL && strcmp(addr_list[t].fam, surname)!=0) continue; // фамилия задана, несовпадение
    if(month!=0 && atoi(addr_list[t].mes)!=month) continue; // месяц задан, несовпадение
    printf(.....);
    printf(.....);
    printf(.....);
  }
}

либо вынести вывод отдельного элемента
void print_record(struct addr const* record)
{
    printf(.....);
    printf(.....);
    printf(.....);
};
void list_all(void)
{
  for(.....) print_addr(&addr_list[t]);
}
void list_surname(void)
{
  char surname[80];
  printf("введите фамилию: "); .....
  for(.....) if(.....) print_addr(&add_list[t]);
}

Кстати говоря, а зачем месяц рождения хранится в строковом поле? Почему не в int?

А>4. Статистика

А> Общее количество сотрудников
А> Количество сотрудников в каждой должности
А> Количество молодых специалистов (до 35 лет)

Общее количество: или во время добавления-редактирования вести счётчик, или просто:
Пробежаться по списку и посчитать. Как в функции list, только не печатать, а ++count. И в конце вывести этот count.

Количество до 35 лет:
Сперва взять текущую дату (смотри функции time() и localtime())
Затем пробежаться по списку, для каждого сотрудника проверить, моложе он 35 лет или нет, и если моложе — ++count.
В конце — вывести count.

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

Специально не расписываю подробности, потому что это интересно именно самому сделать. Там и в библиотеку <time.h> придётся немножко въехать, и над деталями сравнения подумать, и вообще, если у человека прямо сегодня 35-летие, это молодой или не молодой? Он превращается в полночь, в полдень, в следующую полночь?
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.