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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2016, 00:17   #1
Doni11
Пользователь
 
Регистрация: 09.03.2016
Сообщений: 40
По умолчанию Перевести программу с C++ в DELPHI

Англо-русский словарь построен как двоичное дерево.

Каждая компонента содержит английское слово, соответствующее ему русское и счетчик количества обращений к данной компоненте.

Первоначально дерево формируется согласно английскому алфавиту. В процессе эксплуатации словаря при каждом обращении к компоненте в счетчик обращений добавляется единица.

Составить программу, которая:

обеспечивает начальный ввод словаря с конкретными значениями счетчиков обращений;
формирует новое представление словаря в виде двоичного дерева по следующему алгоритму:
в старом словаре ищется компонента с наибольшим значением счетчика обращений;
найденная компонента заносится в новый словарь и удаляется из старого;
переход к пункту 1 до исчерпания исходного словаря;
производит вывод нового и исходного словарей.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Doni11 вне форума Ответить с цитированием
Старый 30.03.2016, 00:18   #2
Doni11
Пользователь
 
Регистрация: 09.03.2016
Сообщений: 40
По умолчанию

Код:
//tree.h
#ifndef _TREE
#define _TREE
#include <string.h>
#include <conio.h>
#include <stdio.h>
struct NODE{
char * EnglishWord;
char * RussianWord;
int Counter;
NODE * Right;
NODE * Left;
};
 
 
NODE* CreateNode(char *&EnglishWord,char *&RussianWord,int Counter)
{
	NODE *NewNode=new NODE;
	if (!NewNode) return NULL;
	NewNode->EnglishWord=strdup(EnglishWord);
	NewNode->RussianWord=strdup(RussianWord);
	if ((!NewNode->EnglishWord)||(!NewNode->RussianWord)) {delete NewNode; return NULL;}
	NewNode->Right=NULL;
	NewNode->Left=NULL;
	NewNode->Counter=Counter;
	return NewNode;
}
 
int AddRightSon(NODE* &Node,char * EnglishWord,char *RussianWord,int Counter=0)
{
	NODE *NewNode=CreateNode(EnglishWord,RussianWord,Counter);
	Node->Right=NewNode;
	return 1;
}
 
int AddLeftSon(NODE* &Node,char * EnglishWord,char *RussianWord,int Counter=0)
{
	NODE *NewNode=CreateNode(EnglishWord,RussianWord,Counter);
	Node->Left=NewNode;
	return 1;
}
				 /*
NODE * FindNodeByCounter(NODE *root,int Counter)
{
	NODE * Find=root;
	if (!Find) return NULL;
	while (Find->Counter!=Counter)
	{
		if (Counter>Find->Counter) Find=Find->Right;
		if (Counter<Find->Counter) Find=Find->Left;
		if (Find==NULL) return NULL;
	}
	return Find;
}          */
 
NODE * FindNodeByCounter(NODE *root,int Counter,NODE *&LastNode)
{
	NODE * Find=root;
	if (!Find) return NULL;
	LastNode=NULL;
	while (Find->Counter!=Counter)
	{
//{	printf("%p %s %s %i %p %p\n",Find,Find->EnglishWord,Find->RussianWord,Find->Counter,Find->Left,Find->Right);}
		LastNode=Find;
		if (Counter>Find->Counter) Find=Find->Right;
		else {if (Counter<Find->Counter) Find=Find->Left;}
		if (Find==NULL) return NULL;
	}
	return Find;
}
 
int PrintTree(NODE *root)
{
	if (!root) return 0;
	if (root->Left) PrintTree(root->Left);
	printf("%s - %s (%i)\n",root->EnglishWord,root->RussianWord,root->Counter);
	if (wherey()==24)
	{
		printf("Нажмите любую клавишу для продолжения...");
		getch();
		printf("\n");
	}
	if (root->Right) PrintTree(root->Right);
	return 1;
}
int AddNode(NODE *&root,NODE*&Node)
{
	if (!Node) return 0;
	Node->Left=NULL;
	Node->Right=NULL;
	NODE *LastFind,*Find;
	int Counter=Node->Counter;
	if (!root) root=Node;
	else
	{
		Find=FindNodeByCounter(root,Counter,LastFind);
		if (!Find)
		{
			if (Counter<=LastFind->Counter) LastFind->Left=Node;
			else LastFind->Right=Node;
			//if (!LastFind->Right) LastFind->Right=Node;
			//else LastFind->Left=Node;
		}
		else
		{
			if (LastFind)
			{
				Node->Left=Find;
				if (LastFind->Left==Find) LastFind->Left=Node;
				if (LastFind->Right==Find) LastFind->Right=Node;
			}
			else
			{
				 Node->Left=root;
				 root=Node;
			}
		}
	}
	return 1;
}
 
NODE* AddNode(NODE *&root,char *EnglishWord,char *RussianWord,int Counter=0)
{
	NODE * Node=CreateNode(EnglishWord,RussianWord,Counter);
	if (!Node) return NULL;
	if (!AddNode(root,Node)) return NULL;
	else return Node;
 
}
 
 
void DeleteTree(NODE *&root)
{
	if (root)
	{
		if (root->Left) DeleteTree(root->Left);
		if (root->Right) DeleteTree(root->Right);
		delete root;
	}
}
 
NODE *FindMaxNode(NODE *root,NODE* &max,NODE*&last)
{
	if (!root) return max;
	if (root->Left) FindMaxNode(root->Left,max,last);
	if (root->Counter>max->Counter) {last=max;max=root;}
	if (root->Right) FindMaxNode(root->Right,max,last);
	return max;
}
int FindParentNode(NODE*root,NODE *cur,NODE *&parent)
{
	if (!root) return NULL;
	if (parent->Right==cur) return 1;
	if (parent->Left==cur) return 1;
	if ((cur==root->Right)||(cur==root->Left)) {parent=root; return 1;}
	FindParentNode(root->Left,cur,parent);
	FindParentNode(root->Right,cur,parent);
	return 0;
}
 
NODE * TransformTree(NODE *root)
{
	NODE *lastroot=root;
	NODE *cur=root,*last=NULL;
	NODE *NewRoot=NULL;
	if (!root) return NULL;
		last=NULL;
	while (1)
	{
		cur=root;
		NODE *max;
		max=root;
		last=NULL;
		max=FindMaxNode(root,max,last);
		FindParentNode(root,max,last);
		cur=max;
		if ((max->Right)&&(max->Left))
		{
			NODE *ll=NULL;
				 while ((cur->Left)||(cur->Right))
				 {
					 ll=cur;
					 if (cur->Right) cur=cur->Right;
					 while (cur->Left) {ll=cur;cur=cur->Left;}
				 }
					 NODE *temp=new NODE;
					 if (!temp) {printf("Нехватка памяти");exit(1);}
					 temp->EnglishWord=cur->EnglishWord;
					 temp->RussianWord=cur->RussianWord;
					 temp->Counter=cur->Counter;
					 cur->EnglishWord=max->EnglishWord;
					 cur->RussianWord=max->RussianWord;
					 cur->Counter=max->Counter;
					 max->EnglishWord=temp->EnglishWord;
					 max->RussianWord=temp->RussianWord;
					 max->Counter=temp->Counter;
					 delete temp;
					 temp=cur;
					 cur=max;
					 max=temp;
					 if (ll->Right==max) ll->Right=NULL;
					 else {if (ll->Left==max) ll->Left=NULL;}
 
 
 
 
		}
		else
		{
			 if (last)
			 {
				 if (last->Right==max) last->Right=max->Right;
				 else {if (last->Left==max) last->Left=max->Left;}
			 }
			 if (root==max)
			 {
				 if (root->Left) root=root->Left;
				 else {if (root->Right) root=root->Right;}
			 }
 
 
		}
		if ((root->Right==root)||(root->Left==root))
		{
			int h;
			h=24;
		}
 
		max->Left=NULL;
		max->Right=NULL;
    AddNode(NewRoot,max);
		if (max==root) break;
	}
	return NewRoot;
}
 
NODE *FindNodeByEnglishWord(NODE *root,char *EnglishWord)
{
	if (!root) return NULL;
	NODE *f=NULL;
	if (root->Right) f=FindNodeByEnglishWord(root->Right,EnglishWord);
	if (f) return f;
	if (strcmpi(root->EnglishWord,EnglishWord)==0)
	{
		f=root;
		f->Counter++;
		return f;
	}
	if (root->Left) f=FindNodeByEnglishWord(root->Left,EnglishWord);
	if (f) return f;
	return NULL;
}
NODE *FindNodeByRussianWord(NODE *root,char *RussianWord)
{
	if (!root) return NULL;
	NODE *f=NULL;
	if (root->Right) f=FindNodeByRussianWord(root->Right,RussianWord);
	if (f) return f;
	if (strcmpi(root->RussianWord,RussianWord)==0)
	{
		f=root;
		f->Counter++;
		return f;
	}
	if (root->Left) f=FindNodeByRussianWord(root->Left,RussianWord);
	if (f) return f;
  return NULL;
Doni11 вне форума Ответить с цитированием
Старый 30.03.2016, 00:18   #3
Doni11
Пользователь
 
Регистрация: 09.03.2016
Сообщений: 40
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include "TREE.H"
#include <process.h>
 
NODE * root=NULL;//Корень дерева- словаря
char ch='c';
char *s=new char [101];
char *f="%100s";
 
void main()
{
	 root=CreateNode("1","1",0);
	 AddNode(root,"2","2",-6);
	 AddNode(root,"3","3",-4);
	 AddNode(root,"4","4",-8);
	 AddNode(root,"3","3",-4);
	 AddNode(root,"4","4",-8);
	 AddNode(root,"3","3",-4);
	 AddNode(root,"3","3",-5);
 
 
   root->Left->Counter=10;
	 if (!s) {printf("Нехватка памяти\n");exit(1);}
	 while (1)
	 {
		 clrscr();
		 printf("1-Добавить узел\n2-Преобразовать дерево\n3-Вывод дерева\n4-Перевести с английского\n5-Перевести с русского\n0-Выход");
		 ch=getch();
		 switch (ch)
		 {
			 case '1':
			 {
				 NODE *Node=new NODE;
				 if (!Node) {printf("Не хватает памяти для выполнения указанной операции.\n");break;}
				 printf("\nВведите английское слово: ");
				 scanf(f,s);
				 Node->EnglishWord=strdup(s);
				 if (!Node->EnglishWord) {printf("ОШИБКА!"); delete Node; break;}
				 printf("Введите соответствующее ему русское слово: ");
				 scanf(f,s);
				 Node->RussianWord=strdup(s);
				 if (!Node->RussianWord) {printf("ОШИБКА!"); free(Node->EnglishWord); delete Node; break;}
				 printf("Введите начальное значение счётчика количества обращений: ");
				 scanf("%i",&(Node->Counter));
				 if (AddNode(root,Node)) printf("Узел добавлен успешно.\n");
				 else printf("ОШАБКА! Не удалось добавить узел.\n");
         break;
			 }
			 case '2':
			 {
				 printf("Преобразование дерева...\n");
				 root=TransformTree(root);
				 printf("преобразование дерева заверщено. Нажмите любую кнопку...\n");
				 getch();
				 break;
			 }
			 case '3':
			 {
				 clrscr();
				 if (!root) printf("Дерево пустое.\n");
				 else	PrintTree(root);
				 printf("Нажмите любую кнопку...\n");getch();
				 break;
			 }
			 case '4':
			 {
				 clrscr();
				 NODE *Node;
				 printf("Введите английское слово: ");
				 scanf(f,s);
				 Node=FindNodeByEnglishWord(root,s);
				 if (Node) {printf("%s - %s (%i)\n",Node->EnglishWord,Node->RussianWord,Node->Counter);getch();}
				 else {printf("Нет такого слова в дереве.");getch();}
				 break;
			 }
			 case '5':
			 {
				 clrscr();
				 NODE *Node;
				 printf("Введите русское слово: ");
				 scanf(f,s);
				 Node=FindNodeByRussianWord(root,s);
				 if (Node) {printf("%s - %s (%i)\n",Node->RussianWord,Node->EnglishWord,Node->Counter);getch();}
				 else {printf("Нет такого слова в дереве.");getch();}
				 break;
			 }
 
			 case '0':
			 case 27:
				 DeleteTree(root);
				 exit(0);
				 break;
		 }
 
	 }
 
 
}
Doni11 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Срочно! Нужно Перевести программу с Java на Delphi, или написать похожую Chifth Фриланс 11 21.05.2014 10:55
перевести программу рисования графиков с Pascal на Delphi DooD Помощь студентам 5 19.05.2011 23:15
нужно перевести программу из Turbo Pascal в Delphi Insensible Doll Помощь студентам 3 27.05.2010 13:41
перевести программу из Pascal с использованием компонента Stringgrid в delphi. evrey Компоненты Delphi 4 02.06.2008 18:57
Помогите перевести наипростейшую программу в Visual Basic из Delphi Cooler Общие вопросы Delphi 1 20.11.2006 21:21