Задача со структурами турбопролог - Prolog
Формулировка задачи:
нужно решить такую задачу.
Найти всех матерей, имеющих менее трех детей.
Как это сделать?
Решение задачи: «Задача со структурами турбопролог»
textual
Листинг программы
// ConsoleApplication2.cpp: главный файл проекта.
#include "stdafx.h"
using namespace std;
struct product{
char Name[40];
int weigh = 0;
int number = 0;
char material[40];
product *next;
};
void List_New_Elem(product* &my_food, product* to_food); // добавляет элемент в список
int Kol_Elem_List(product* my_food); // возвращает количество элементов
bool List_NULL(product* my_food); // проверяет на пустоту
void Print_List(product* my_food); // вывод информации о продуктах на экран
product* pow_Stal(product* my_food); // получает массив продуктов из стали
product* pow_plastics(product* my_food); // получает массив продуктов из пластмассы
product* pow_aluminum(product* my_food); // получаем массив продуктов из алюминия
void torn(product *to_fStal, product *to_food); // создает отдельный элемент
product *End_Sort(product* my_food); // заключительная сортировка
void TopToTop(product *to_elem, product *mass_food, int j); // переставляет элементы местами
product *post_elemMass_to_stract(product *mass_food, int n); // перенос элементов из массива в структуру
int main(array<System::String ^> ^args)
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
product *my_food = NULL;
product *to_food = NULL;
product *my_fStal = NULL; // продукты из стали
product *my_fplastics = NULL; // продукты из пластмассы
product *my_aluminum = NULL; // продукты из алюминия
cout << " Введите количество продуктив: ";
int k = 0;
cin >> k;
cout << " <br>МЕНЮ<br>" << endl;
cout << " 1 - Добавить информацию о продуктах с клавиатуры" << endl;
cout << " 2 - Добавить информацию о продуктах из текстового файла" << endl;
cout << " 0 - Выход" << endl;
cout << " <br>" << endl;
cout << " Введите команду: ";
int clic = 0;
cin >> clic;
switch (clic)
{
case 1:{
for (int i = 0; i < k; i++){
to_food = new product;
cout << " Введите наименование продукта: ";
cin >> to_food->Name;
cout << " Введите вес продукта: ";
cin >> to_food->weigh;
cout << " Введите серийный номер продукта: ";
cin >> to_food->number;
cout << " Введите материал продукта: ";
cin >> to_food->material;
cout << "<br>ПРОДУКТ ДОБАВЛЕН<br>" << endl;
to_food->next = NULL;
List_New_Elem(my_food, to_food);
}
cout << "Полученный список продуктов: "<<endl;
Print_List(my_food);
break;
}
case 2:{
char str[40]; // файл
cout << " Введите имя файла: ";
cin >> str;
ifstream in(str); // открытие файла по заданному файлу
for (int i = 0; i < k; i++){
to_food = new product;
in >> to_food->Name >> to_food->weigh >> to_food->number >> to_food->material;
to_food->next = NULL;
List_New_Elem(my_food, to_food);
}
cout << "Полученный список продуктов: " << endl;
Print_List(my_food);
break;
}
case 0:{
return 0;
}
default:
cout << "Неверная команда!" << endl;
break;
}
system("pause");
cout << endl << " ==============Отсортированные продукты============== " << endl<<endl;
cout << " =======Полученный список продуктов из стали:======== " << endl;
my_fStal = pow_Stal(my_food);
Print_List(my_fStal);
cout << " ==================================================== " << endl << endl;
cout << " =====Полученный список продуктов из пластмассы:===== " << endl;
my_fplastics = pow_plastics(my_food);
Print_List(my_fplastics);
cout << " ==================================================== " << endl << endl;
cout << " ======Полученный список продуктов из алюминия:====== " << endl;
my_aluminum = pow_aluminum(my_food);
Print_List(my_aluminum);
cout << endl << " =====================СОРТИРОВКА===================== " << endl;
my_fStal = End_Sort(my_fStal);
Print_List(my_fStal);
cout << " ==================================================== " << endl;
my_fplastics = End_Sort(my_fplastics);
Print_List(my_fplastics);
cout << " ==================================================== " << endl;
my_aluminum = End_Sort(my_aluminum);
Print_List(my_aluminum);
system("pause");
}
// Добавление элемента
void List_New_Elem(product* &my_food, product* to_food) {
int kol = Kol_Elem_List(my_food);
if (kol == 0){
my_food = to_food;
}
else if (kol == 1){
my_food->next = to_food;
}
else {
product *my_f = my_food;
for (int i = 1; i < kol && my_f->next != NULL; i++) {
my_f = my_f->next;
}
my_f->next = to_food;
}
}
// Количество элементов
int Kol_Elem_List(product* my_food) {
int kol = 0;
product *to_food = my_food;
// Проходим весь список
while (!List_NULL(to_food)) {
to_food = to_food->next;
kol++;
}
return kol;
}
// Проверка на пустоту списка
bool List_NULL(product* my_food) {
if (my_food == NULL){
return true; // список пуст
}
else{
return false; //список не пуст
}
}
// Вывод на экран
void Print_List(product* my_food) {
product *to_food = my_food;
while (!List_NULL(to_food)) {
cout << " " << to_food->Name << " " << to_food->weigh << " " << to_food->number << " " << to_food->material << endl;
to_food = to_food->next;
}
}
// получаем сталь
product* pow_Stal(product* my_food){
product *to_food = my_food;
product *my_fStal = NULL;
while (!List_NULL(to_food)){
if (to_food->material[0] == 'С'&&to_food->material[1] == 'т'&&to_food->material[2] == 'а'&&to_food->material[3] == 'л'&&to_food->material[4] == 'ь'){
product *to_fStal = new product;
torn(to_fStal, to_food);
List_New_Elem(my_fStal, to_fStal);
}
to_food = to_food->next;
}
return my_fStal;
}
// получаем пластмассу
product* pow_plastics(product* my_food){
product *to_food = my_food;
product *my_fplastics = NULL;
while (!List_NULL(to_food)){
if (to_food->material[0] == 'П'&&to_food->material[1] == 'л'&&to_food->material[2] == 'а'&&to_food->material[3] == 'с'&&to_food->material[4] == 'т'&&to_food->material[5] == 'м'&&to_food->material[6] == 'а'&&to_food->material[7] == 'с'&&to_food->material[8] == 'с'&&to_food->material[9] == 'а'){
product *to_fplastics = new product;
torn(to_fplastics, to_food);
List_New_Elem(my_fplastics, to_fplastics);
}
to_food = to_food->next;
}
return my_fplastics;
}
// получаем алюминий
product* pow_aluminum(product* my_food){
product *to_food = my_food;
product *my_aluminum = NULL;
while (!List_NULL(to_food)){
if (to_food->material[0] == 'А'&&to_food->material[1] == 'л'&&to_food->material[2] == 'ю'&&to_food->material[3] == 'м'&&to_food->material[4] == 'и'&&to_food->material[5] == 'н'&&to_food->material[6] == 'и'&&to_food->material[7] == 'й'){
product *to_aluminum = new product;
torn(to_aluminum, to_food);
List_New_Elem(my_aluminum, to_aluminum);
}
to_food = to_food->next;
}
return my_aluminum;
}
void torn(product *to_f, product *to_food){
strcpy(to_f->Name, to_food->Name);
to_f->number = to_food->number;
to_f->weigh = to_food->weigh;
strcpy(to_f->material, to_food->material);
to_f->next = NULL;
}
product *End_Sort(product* my_food){
product *to_food = my_food;
product *mass_food;
product *to_elem = new product; // буферная переменная
// выделение памяти
mass_food = new product[Kol_Elem_List(my_food)];
// цикл переноса элементов структуры в массив
for (int i = 0; i < Kol_Elem_List(my_food); i++){
product *to_f = new product;
torn(to_f, to_food);
strcpy((mass_food[i]).Name, to_f->Name);
mass_food[i].number = to_f->number;
mass_food[i].weigh = to_f->weigh;
strcpy((mass_food[i].material), to_f->material);
mass_food[i].next = NULL;
if (!List_NULL(to_food)){
to_food = to_food->next;
}
}
// сортировка массива
for (int i = Kol_Elem_List(my_food) - 1;i > 0; i--){
for (int j = 0; j<i; j++){
if (mass_food[j].number > mass_food[j + 1].number){
TopToTop(to_elem,mass_food, j);
}
if (mass_food[j].number == mass_food[j + 1].number){
if (mass_food[j].weigh < mass_food[j + 1].weigh){
TopToTop(to_elem,mass_food, j);
}
}
}
}
my_food = post_elemMass_to_stract(mass_food, Kol_Elem_List(my_food));
return my_food;
}
void TopToTop(product *to_elem, product *mass_food, int j){
// копируем элемент
strcpy(to_elem->Name, mass_food[j].Name);
to_elem->number = mass_food[j].number;
to_elem->weigh = mass_food[j].weigh;
strcpy(to_elem->material, mass_food[j].material);
to_elem->next = NULL;
// переносим значение из следующего элемента
mass_food[j] = mass_food[j + 1];
// следующий элемент становится предыдущем
strcpy((mass_food[j + 1]).Name, to_elem->Name);
mass_food[j + 1].number = to_elem->number;
mass_food[j + 1].weigh = to_elem->weigh;
strcpy((mass_food[j + 1].material), to_elem->material);
mass_food[j + 1].next = NULL;
}
product *post_elemMass_to_stract(product *mass_food,int n){
product *to_food = new product;
to_food = NULL;
for (int j = 0; j < n; j++){
product *to_elem = new product;
strcpy(to_elem->Name, mass_food[j].Name);
to_elem->number = mass_food[j].number;
to_elem->weigh = mass_food[j].weigh;
strcpy(to_elem->material, mass_food[j].material);
to_elem->next = NULL;
List_New_Elem(to_food, to_elem);
}
return to_food;
}