Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2014, 19:10   #1
TLandertinger
Пользователь
 
Регистрация: 09.05.2013
Сообщений: 29
По умолчанию Деревья

Здравствуйте. У меня возникли проблемы. Вот задание:
Описать массив записей "семья".
--------------------------------------------------------------
Отец ! Мать ! Ребенок ! ! Ребенок
--------------------------------------- -----------
Ф.И.О.!дата !Ф.И.О.!дата ! Имя !дата ! ...... ! Имя !дата
!рожд.! !рожд.! !рожд.! ! !рожд.
---------------------------------------------------------------
!__________________ ________________!
не более 5 детей

Найти и вывести имя младшего ребенка у Иванова И.И. по форме
_______________________________
имя ребенка ! дата рождения !
-------------------------------
Я практически сделал, но у меня выходят ошибки (описание ошибок в скриншоте). Может, я что-то не так сделал? Заранее спасибо. Среда c++ visual studio 2010. Компилятор консольный CLR.
Изображения
Тип файла: jpg Безымянный.jpg (77.3 Кб, 116 просмотров)
Вложения
Тип файла: doc laba 12.doc (34.0 Кб, 12 просмотров)
TLandertinger вне форума Ответить с цитированием
Старый 17.07.2014, 19:16   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
// laba 12-1.cpp: главный файл проекта.
#include "stdafx.h"
#include "iostream"
#include "conio.h"

using namespace std;

struct Date 		
{
	unsigned day; 		
	unsigned month;		
	unsigned year;
};

struct Children
{
	char name_of_child[30];
	Date d_birth_child;
};

struct T_family 
{
	char fio_father[30];
	Date d_birth_father;
	char fio_mother[30];
	Date d_birth_mother;
	Children ch[5];
	int k;

}; 

struct TreeNode
{
	int k;
	T_family family;
	Children ch[5];
	TreeNode *next;
	TreeNode *child;
};

class date_of_birth
{
private:
	TreeNode *head;
public:
date_of_birth()
	{
		head = new TreeNode;
		TreeNode *node1 = new TreeNode;
		node1->k = 1;
		node1->child = NULL;
		node1->next = NULL;
		head->child = node1;
		TreeNode *node2 = new TreeNode;
		node2->k = 2;
		node2->child = NULL;
		node2->next = NULL;
		node1->next = node2;
		TreeNode *node3 = new TreeNode;
		node3->k = 3;
		node3->child = NULL;
		node3->next = NULL;
		node2->next = node3;
		T_family a = {"Ivanov I. I.", 21,5,1965,"Ivanova E.G.",13,2,1967,"Oleg",19,7,1994,"Olga",13,8,1996};
		TreeNode *nodeA = new TreeNode;
		nodeA->family = a;
		nodeA->child = NULL;
		nodeA->next = NULL;
		node1->child = nodeA;
	    T_family b = {"Petrov P. P.", 12,4,1962,"Petrova E.O.",8,12,1965,"Pavel",12,4,1988,"Ekaterina",24,8,1992};
		TreeNode *nodeB = new TreeNode;
		nodeB->family = b;
		nodeB->child = NULL;
		nodeB->next = NULL;
		node2->child = nodeB;
}

void add_node(int i)
	{
	int count;		
	T_family a; 
	char c;
	cout << endl << " Enter data of" << i+1 << "person\n ";
	cout << " fio of father ";
	cin.getline (a.fio_father, 30);
	cout << "Enter date of father's birthday: \n";
	cout << " day (1-31) ";
	cin >> a.d_birth_father.day;
	cin.get(c);
	cout << " month (1-12)";
	cin >> a.d_birth_father.month;
	cin.get(c);
	cout << " year ";
	cin >> a.d_birth_father.year;
	cin.get(c);
	cout << " fio of mother ";
	cin.getline (a.fio_mother, 30);
	cout << endl <<"Enter date of mother's birthday: \n";
	cout <<" day (1-31) ";
	cin >> a.d_birth_mother.day;
	cin.get(c);
	cout << " month (1-12)";
	cin >> a.d_birth_mother.month;
	cin.get(c);
	cout << " year ";
	cin >> a.d_birth_mother.year;
	cin.get(c);
	//запросить кол-во детей и запомнить в count
	cout << "Enter count of children" << endl;
	cin >> count;
	cin.get(c);
	if ((count > 5) && (count < 0)) cout << " Fatal error " << endl;
	a.k = count;
	for (int k=0; k < count; k++) {
		cout << endl << " Name of " " " << k+1 << " " " child ";
		cin.getline (a.ch[k].name_of_child, 30);
		cout << endl << "Enter date of" " "<< k+1 << " " "child's birthday: \n";
		cout <<" day (1-31) ";
		cin >> a.ch[k].d_birth_child.day;
		cin.get(c);
		cout << " month (1-12)";
		cin >> a.ch[k].d_birth_child.month;
		cin.get(c);
		cout << " year ";
		cin >> a.ch[k].d_birth_child.year;
		cin.get(c); 
	}

     	TreeNode *node = head->child;
		while(true)
		{
			if(node->k == a.k)
			{
				TreeNode *newNode = new TreeNode;
				newNode->family = a;
				newNode->child = NULL;
				newNode->next = NULL;
				if(node->child == NULL)
					node->child = newNode;
				else 	
				{
					TreeNode *elem = node->child;
					while(elem->next != NULL)
						elem = elem->next;
					elem->next = newNode;
				}
				return;
			}
			if(node->next == NULL)
				break;
			node = node->next;
		}

		TreeNode *newNode = new TreeNode;
		newNode->k = a.k;
		newNode->child = NULL;
		newNode->next = NULL;
		node->next = newNode;
		TreeNode *nodeA = new TreeNode;
		nodeA->family = a;
		nodeA->child = NULL;
		nodeA->next = NULL;
		newNode->child = nodeA;
	}

void print_tree()
	{
		printf("[ \n");
		TreeNode *node = head->child;
		while(node != NULL)
		{
			cout << " --> " << node->k << endl;
			if(node->child != NULL)
			{
				TreeNode *child = node->child;
				while(child != NULL)
				{
				printf("! %10s ! %2d.%2d.%4d !",child->family.fio_father, child->family.d_birth_father.day, 
child->family.d_birth_father.month, child->family.d_birth_father.year);
				printf("! %10s ! %2d.%2d.%4d !",child->family.fio_mother, child->family.d_birth_mother.day, 
child->family.d_birth_father.month, child->family.d_birth_father.year);
				for (int k = 0; k < child->family.k ; k++) {
				printf("! %10s ! %2d.%2d.%4d!", child->family.ch[k].name_of_child, child->family.ch[k].d_birth_child.day,
 child->family.ch[k].d_birth_child.month, child->family.ch[k].d_birth_child.year);
				printf("\n");
	}
					child = child->next;
				}
			}
			node = node->next;
		}
		printf("]\n");
	}

void find_min()
	{
		TreeNode *node = head->child;
		TreeNode *young = node->child;
		while(node != NULL)
		{
			if(node->k < young->k && node->child != NULL)
				young = node->child;
			node = node->next;
		}
printf("!  %10s  ! %2d.%2d.%4d !\n", young->family.ch[k_min].name_of_child, young->family.ch[k_min].d_birth_child.day,
 young->family.ch[k_min].d_birth_child.month, young->family.ch[k_min].d_birth_child.year);
	}
};

Последний раз редактировалось Stilet; 22.09.2014 в 21:12.
rrrFer вне форума Ответить с цитированием
Старый 17.07.2014, 19:17   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
int main()
{
	date_of_birth d;
	for(int i = 2; i < 4; i++)
	{ 	
		d.add_node(int i);
	};
	cout << "\nlist of structs\n!       father        !       mother        !        child        !\n";
	d.print_tree();
	d.find_min();
	_getch();
    return 0;
}
Просто вынес код в тему. В одно сообщение не влез, поэтому два.
rrrFer вне форума Ответить с цитированием
Старый 17.07.2014, 19:20   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Я практически сделал, но у меня выходят ошибки (описание ошибок в скриншоте). Может, я что-то не так сделал? Заранее спасибо. Среда c++ visual studio 2010. Компилятор консольный CLR.
Если сам делал, то расскажи подробно что ты тут пытался делать:
Код:
void find_min()
	{
		TreeNode *node = head->child;
		TreeNode *young = node->child;
		while(node != NULL)
		{
			if(node->k < young->k && node->child != NULL)
				young = node->child;
			node = node->next;
		}
printf("!  %10s  ! %2d.%2d.%4d !\n", young->family.ch[k_min].name_of_child, young->family.ch[k_min].d_birth_child.day, young->family.ch[k_min].d_birth_child.month, young->family.ch[k_min].d_birth_child.year);
	}
};
Первая ошибка в этом фрагменте.

Подробно, прям по строчкам. Что, зачем и почему.

Код невероятно кривой. На месте препода я бы тщательно издевался и никогда не принял бэ этот бред. Прочитай задание и посмотри на свои структуры, для начала.

Последний раз редактировалось rrrFer; 17.07.2014 в 19:32.
rrrFer вне форума Ответить с цитированием
Старый 18.07.2014, 13:22   #5
TLandertinger
Пользователь
 
Регистрация: 09.05.2013
Сообщений: 29
По умолчанию

Я сам вижу, что это бред, только я не разберусь в нем. В моем коде куча ошибок в одной строке
Код:
202 printf("!  %10s  ! %2d.%2d.%4d !\n", young->family.ch[k_min].name_of_child, young->family.ch[k_min].d_birth_child.day, young->family.ch[k_min].d_birth_child.month, young->family.ch[k_min].d_birth_child.year);
Чем ее заменить? k_min -- переменная, отвечающая за хранение номера младшего ребенка у Иванова И.И. Мне кажется, что она не нужна в этой строке. Или не так?
TLandertinger вне форума Ответить с цитированием
Старый 18.07.2014, 13:38   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Чем ее заменить? k_min -- переменная, отвечающая за хранение номера младшего ребенка у Иванова И.И. Мне кажется, что она не нужна в этой строке. Или не так?
Вам же компилятор черным по белому пишет, что нет такой переменной k_min. Надо найти младшего ребенка иванова и поместить его номер в k_min.

Я повторяю:
Цитата:
Подробно, прям по строчкам. Что, зачем и почему.
Я не знаю что ты хотел этим кодом сделать, я его не понимаю.

Цитата:
Мне кажется, что она не нужна в этой строке. Или не так?
Мне кажется эта строка вообще не нужна, или это не так? - если нужна - поясните для чего. И про остальные строки тоже поясните. Лично я не отвечу на следующие вопросы пока не увижу подробных пояснений к каждой строке.
rrrFer вне форума Ответить с цитированием
Старый 19.07.2014, 13:30   #7
TLandertinger
Пользователь
 
Регистрация: 09.05.2013
Сообщений: 29
По умолчанию

Код:
void find_min()//эта функция ищет младшего ребенка у Иванова И.И.
	{
		int k_min = 0;//объявление переменной, отвечающей за
                                 //хранение номера младшего ребенка
                                 //у Иванова И.И.
		TreeNode *node = head->child;
		TreeNode *young = node->child;//ветка с минимальным 
                                                           //ребенком
		while(node != NULL)
		{
			if(node->k < young->k && node->child != NULL)//поиск
                        //ветки с большей датой рождения, в которой есть 
                        //потомки
				young = node->child;
			node = node->next;
			k_min = young->k;//k_min присваиваем ветвь young->k
                                                //k -- номер ребенка. 
		}
	
printf("!  %10s  ! %2d.%2d.%4d !\n", young->family.ch[k_min].name_of_child, young->family.ch[k_min].d_birth_child.day, young->family.ch[k_min].d_birth_child.month, young->family.ch[k_min].d_birth_child.year);//вывод младшего ребенка
	}
};
Исправил. Просто переменная k_min не была объявлена.Заменять строку вывода не надо.
Откомпилировалось, но в итоге компилятор выдал вот что(см. скриншоты). Может быть, дело в конструкторе:
Код:
date_of_birth()
	{
		head = new TreeNode;
		TreeNode *node1 = new TreeNode;
		node1->k = 1;
		node1->child = NULL;
		node1->next = NULL;
		head->child = node1;
		TreeNode *node2 = new TreeNode;
		node2->k = 2;
		node2->child = NULL;
		node2->next = NULL;
		node1->next = node2;
		TreeNode *node3 = new TreeNode;
		node3->k = 3;
		node3->child = NULL;
		node3->next = NULL;
		node2->next = node3;
		T_family a = {"Ivanov I. I.", 21,5,1965,"Ivanova E.G.",13,2,1967,"Oleg",19,7,1994,"Olga",13,8,1996};
		TreeNode *nodeA = new TreeNode;
		nodeA->family = a;
		nodeA->child = NULL;
		nodeA->next = NULL;
		node1->child = nodeA;
	    T_family b = {"Petrov P. P.", 12,4,1962,"Petrova E.O.",8,12,1965,"Pavel",12,4,1988,"Ekaterina",24,8,1992};
		TreeNode *nodeB = new TreeNode;
		nodeB->family = b;
		nodeB->child = NULL;
		nodeB->next = NULL;
		node2->child = nodeB;
}
или где-нибудь еще накосячил?
Изображения
Тип файла: jpg Безымянный4.jpg (62.0 Кб, 73 просмотров)
Тип файла: jpg Безымянный5.jpg (40.1 Кб, 74 просмотров)
TLandertinger вне форума Ответить с цитированием
Старый 19.07.2014, 13:32   #8
TLandertinger
Пользователь
 
Регистрация: 09.05.2013
Сообщений: 29
По умолчанию

В первом скрине дерево не совсем правильно. Должно быть
[
-->1
!Ivanov I.I.!21.5.1965!Ivanova E.G.!13.8.1967!Oleg!26.1.1994!Olga! 5.3.1996!
-->2
(сведения о 2 семье)
-->3
(сведения о 3 семье)
и т.д.
TLandertinger вне форума Ответить с цитированием
Старый 22.09.2014, 11:45   #9
unkname
 
Регистрация: 23.03.2014
Сообщений: 5
По умолчанию

вам удалось решить проблему?
unkname вне форума Ответить с цитированием
Старый 22.09.2014, 16:53   #10
TLandertinger
Пользователь
 
Регистрация: 09.05.2013
Сообщений: 29
По умолчанию

С трудом, но удалось.
TLandertinger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Деревья Си++ СветОК Общие вопросы C/C++ 1 25.05.2012 07:52
Деревья Си++ СветОК Помощь студентам 0 24.05.2012 20:56
С++ Деревья DenSyntax Фриланс 3 24.06.2010 16:50
Б деревья F_A_N_Alex Помощь студентам 1 06.10.2009 23:05
деревья ShenDy Общие вопросы C/C++ 0 13.03.2009 19:18