Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаба1 (с кораблями)

.c
Скачиваний:
2
Добавлен:
15.09.2014
Размер:
5.95 Кб
Скачать

#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;
}
Соседние файлы в предмете Основы алгоритмизации и программирования