Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лаба1 (с кораблями)
.c
#include <stdlib.h>
#include <stdio.h>
// Типы(классы) кают
enum e_type
{
TYPE_FIRST,
TYPE_BUSINESS,
TYPE_TOURIST
};
struct s_row
{
struct s_row_data
{
// Номер каюты
unsigned int number;
// Класс
enum e_type type;
// Количество мест
unsigned char places;
// Палуба
unsigned char floor;
// 0 - никого нет(свободна)
// 1 - мужчина
// 2 - женщина
// 4 - ребенок 1
// 8 - ребенок 2
unsigned char people;
} *data;
struct s_row *_next;
};
// Прототипы функций
struct s_row* gen_data();
int rand_minmax(int min, int max);
void print_free(struct s_row* db);
void print_free2(struct s_row* db);
void print_women_tourist(struct s_row* db);
void print_babies(struct s_row* db);
void print_men(struct s_row* db);
int main()
{
// БД (связанный список)
struct s_row* db = 0;
//
unsigned char exit = 0;
//
char key = 0;
db = gen_data();
do
{
puts("Select:");
puts("1) How much total free?");
puts("2) How much free by floors?");
puts("3) How much women in tourist class?");
puts("4) How much babies by floors?");
puts("5) How much men in business and 1st class by floors?");
puts("6) Exit");
fflush(stdin);
scanf("%c", &key);
switch (key)
{
case '1':
print_free(db);
break;
case '2':
print_free2(db);
break;
case '3':
print_women_tourist(db);
break;
case '4':
print_babies(db);
break;
case '5':
print_men(db);
break;
case '6':
exit = 1;
}
puts("");
puts("");
}
while (!exit);
return 1;
}
// 1)
void print_free(struct s_row* db)
{
struct s_row* tmp;
unsigned int count = 0;
tmp = db;
while (tmp)
{
if (tmp->data->people == 0)
{
count++;
}
tmp = tmp->_next;
}
printf("Total free: %d\n", count);
}
// 2)
void print_free2(struct s_row* db)
{
struct s_row* tmp;
unsigned int count[4] = {0, 0, 0, 0};
unsigned int i;
tmp = db;
while (tmp)
{
if (tmp->data->people == 0)
{
count[tmp->data->floor - 1]++;
}
tmp = tmp->_next;
}
for (i = 0;i < 4;i++)
{
printf("Floor %d, free: %d\n", i + 1, count[i]);
}
}
// 3)
void print_women_tourist(struct s_row* db)
{
struct s_row* tmp;
unsigned int count = 0;
tmp = db;
while (tmp)
{
if (tmp->data->people & 2 && tmp->data->type == TYPE_TOURIST)
{
count++;
}
tmp = tmp->_next;
}
printf("Total women in tourist class: %d\n", count);
}
// 4)
void print_babies(struct s_row* db)
{
struct s_row* tmp;
unsigned int count[4] = {0, 0, 0, 0};
unsigned int i;
tmp = db;
while (tmp)
{
count[tmp->data->floor - 1] += ((tmp->data->people & 4) >> 2) + ((tmp->data->people & 8) >> 3);
tmp = tmp->_next;
}
for (i = 0;i < 4;i++)
{
printf("Floor %d, babies: %d\n", i + 1, count[i]);
}
}
// 5)
void print_men(struct s_row* db)
{
struct s_row* tmp;
unsigned int count[4] = {0, 0, 0, 0};
unsigned int i;
tmp = db;
while (tmp)
{
if (tmp->data->type == TYPE_BUSINESS || tmp->data->type == TYPE_FIRST)
{
count[tmp->data->floor - 1] += (tmp->data->people & 1);
}
tmp = tmp->_next;
}
for (i = 0;i < 4;i++)
{
printf("Floor %d, men: %d\n", i + 1, count[i]);
}
}
// Случайное число в диапазоне
int rand_minmax(int min, int max)
{
int r = rand();
if (min == max)
return max;
return (r / (RAND_MAX / (max - min + 1))) + min;
}
void gen_row_data(struct s_row_data* data)
{
unsigned int pcount;
// Генерирование людей
data->people = rand_minmax(0, 1);
data->people |= rand_minmax(0, 1) << 1;
data->people |= rand_minmax(0, 1) << 2;
data->people |= rand_minmax(0, 1) << 3;
// Если только дети, то каюту оставляем пустой
if (!(data->people & 1) && !(data->people & 2))
{
data->people = 0;
}
// Условие, что с детьми всегда есть М+Ж
if ((data->people & 4) || (data->people & 8))
{
data->people |= 1 + 2;
}
// Считаем количество людей
pcount = (data->people & 1) + ((data->people & 2) >> 1) + ((data->people & 4) >> 2) + ((data->people & 8) >> 3);
// На основе этого выбираем X-местную каюту
data->places = rand_minmax(
// Минимальное количество
pcount > 0 ? pcount : 1,
// Макс.
4);
}
struct s_row* gen_data()
{
struct s_row* db = 0, *tmp = 0;
unsigned int i;
unsigned int n = 1;
// Каюты 1-го класса
for (i = 0;i < 40;i++)
{
// Инициализация первого элемента и переход к последующему
if (tmp)
{
tmp->_next = malloc(sizeof(struct s_row));
tmp = tmp->_next;
}
else
{
tmp = malloc(sizeof(struct s_row));
}
if (!db)
{
db = tmp;
}
tmp->_next = 0;
tmp->data = malloc(sizeof(struct s_row_data));
tmp->data->number = n++;
tmp->data->type = TYPE_FIRST;
// 20 кают на 1-м этаже
if (i < 20)
{
tmp->data->floor = 1;
}
// остальные на 2-м
else
{
tmp->data->floor = 2;
}
// Дополнительные данные
gen_row_data(tmp->data);
}
// Каюты бизнес-класса
for (i = 0;i < 100;i++)
{
tmp->_next = malloc(sizeof(struct s_row));
tmp = tmp->_next;
tmp->_next = 0;
tmp->data = malloc(sizeof(struct s_row_data));
tmp->data->number = n++;
tmp->data->type = TYPE_BUSINESS;
if (i < 40)
{
tmp->data->floor = 1;
}
else if (i < 80)
{
tmp->data->floor = 2;
}
else
{
tmp->data->floor = 3;
}
gen_row_data(tmp->data);
}
// Каюты туристические
for (i = 0;i < 200;i++)
{
tmp->_next = malloc(sizeof(struct s_row));
tmp = tmp->_next;
tmp->_next = 0;
tmp->data = malloc(sizeof(struct s_row_data));
tmp->data->number = n++;
tmp->data->type = TYPE_TOURIST;
if (i < 80)
{
tmp->data->floor = 3;
}
else
{
tmp->data->floor = 4;
}
gen_row_data(tmp->data);
}
return db;
}
Соседние файлы в предмете Основы алгоритмизации и программирования