Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Mc_crazy
1

класс "Предметный указатель"

27.05.2009, 15:38. Показов 1019. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
у Нас есть класс "Предметный указатель" ..
реализованный в 3 файлах..
всё работает.. нужно сделать так, чтобы появился раздел PRIVATE ( и в нём были какие то элементы) выручайте..

если что пишите в icq: 331-532-593 (очень нужна помощь)

Заголовочный файл:
struct termin
{ char info [20]; //термин
char page [20]; //страница где он присутствует в файле
};
struct element //элемент списка, где хранятся
{ termin info; //термины
element *next;
};

class deck //задание класса
{
public:
element *left;
//конструктор и деструктор
deck();
~deck();
//Функции класса без ФОП
void print();
//Функции класса с ФОП
void add (char term [20],char index [20]);
void find(char term [20]);

};


Файл реализации:


#include "File2.h"
#include <string.h>
#include <iostream.h>
string rus(char s[ ])
// перевод кодировки Windows в Dos
{
string t;
int i=0;
t=s;
while (t[i]!=0)
{
if(t[i]>='А'&& t[i]<='п' )
t[i]-=64;
if(t[i]>='р'&& t[i]<='я' )
t[i]-=16;
i++;
}
return t;
}
//конструтор и деструктор
deck::deck()
{
left=0; //началу списка присваивание конца (0)
}
deck::~deck()
{
}

void deck::add (char term [20],char index [20]) //функция добавления элемента в список
{ element *p; //указатель на новый элемент списка
element *q; //указатель для перехода по списку
element *t; //указатель для перехода по списку
int sorted,changed; //переменные для сортировки
termin buff; //временный буфер для сортировки
p=new element; //выделение памяти под новый элемент списка
q=left; //для перехода по списку присваиваем переменной q начало списка
strcpy (p->info.info,""); //очистка переменной инфо
strcpy(p->info.info,term); //копирование в инфо того, что ввели в функцию
strcpy (p->info.page,""); //очистка переменной страницы
strcpy(p->info.page,index); //копирование в страницу того, что ввели в функцию
if (left==0) //если это первый элемент в нашем списке
{
left = p;
p->next=0;
return;
}
else //если этот элемент не первый
{ while (q!=0)
{
t=q;
q=q->next;
}
t->next=p;
p->next=0;
}

q=left;
t=left;
sorted=0;

while (q!=0) //сортировка
{ do
{
changed = 0;
t=q;
do
{
if ((t->next!=0)&&((strcmp(t->info.info,t->next->info.info)>0)||((strcmp(t->info.info,t->next->info.info)==0)&&(strcmp(t->info.page,t->next->info.page)>0))))
/*условие того что надо сортировать: если не конец списка, если два термина разные, если термины одинаковые, но страницы разные*/
{
buff=t->info;
t->info=t->next->info;
t->next->info=buff;
changed=1;
}
t=t->next;
}
while (t!=0);
} while (sorted!=changed);
q=q->next;
}

}
//---------------------------------------------------------------------------
void deck:rint() //функция вывода на экран
{ element *p=left;element *q=left;
char buff [20];
if (left==0) //проверка на наличие элементов в списке
cout<<rus("Список пуст")<<endl;
else
{cout<< rus("Предметный указатель:")<<endl; //вывод на экран
while (q!=0) //переход по списку
{if (strcmp(buff,q->info.info)!=0) //если имена терминов разные, то
{
strcpy(buff,"");
strcpy(buff,q->info.info);
cout<<q->info.info<<" ";
p=q;
while (p!=0)
{
if ((strcmp(buff,p->info.info)==0)&&(strcmp(p->info.page,"0")!=0)) //проверка на нулевую страницу
cout<<p->info.page<<" ";
p=p->next;
}
cout<<endl;
}
q=q->next;
}
}
}
//---------------------------------------------------------------------------
void deck::find(char term [20]) //функция поиска
{
int f=0; //переменная - флаг
element *p=left;
if (left==0) //проверка на пустоту списка
cout<<rus("Список пуст")<<endl;
else
{
cout<< rus("Ваш элемент: ");
cout<<term<<" ";
while (p!=0) //вывод элемента
{
if ((strcmp(term,p->info.info)==0)&&(strcmp(p->info.page,"0")!=0))
{
cout<<p->info.page<<" ";
f=1; //если нашлась хотя бы одна ненулевая страница то флаг =1
}
p=p->next;
}
if (f==0) cout<<rus("не имеет страниц"); //флаг = 0 таких страниц не нашлось
cout<<endl;
}
}


и Файл меню:

//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <string.h>
#include <fstream.h>
#include <conio.h>

string rus(char s[ ])
// перевод кодировки Windows в Dos
{
string t;
int i=0;
t=s;
while (t[i]!=0)
{
if(t[i]>='А'&& t[i]<='п' )
t[i]-=64;
if(t[i]>='р'&& t[i]<='я' )
t[i]-=16;
i++;
}
return t;
}

struct termin
{ char info [20]; //термин
char page [20]; //страница где он присутствует в файле
};

struct element //структура типа элемент списка, где хранятся
{ termin info; //термины
element *next;
};

string rus(char s[ ]); //функция перекодировки
int menu( ); //функция меню

void create(element *&left) //создание списка
{ left=0; //началу списка присваивание конца (0)
}

void add (char term [20],char index [20], element *&left) //функция добавления элемента в список
{ element *p; //указатель на новый элемент списка
element *q; //указатель для перехода по списку
element *t; //указатель для перехода по списку
int sorted,changed; //переменные для сортировки
termi //временный буфер для сортировки
p=new element; //выделение памяти под новый элемент списка
q=left; //для перехода по списку присваиваем переменной q начало списка
strcpy (p->info.info,""); //очистка поля инфо
strcpy(p->info.info,term); //копирование в поле инфо того, что ввели в функцию
strcpy (p->info.page,""); //очистка переменной страницы
strcpy(p->info.page,index); //копирование в страницу того, что ввели в функцию
if (left==0) //если это первый элемент в нашем списке
{
left = p;
p->next=0;
return;
}
else //если этот элемент не первый
{ while (q!=0)
{
t=q;
q=q->next;
}
t->next=p;
p->next=0;
}

q=left;
t=left;
sorted=0;

while (q!=0) //сортировка
{ do
{
changed = 0;
t=q;
do
{
if ((t->next!=0)&&((strcmp(t->info.info,t->next->info.info)>0)||((strcmp(t->info.info,t->next->info.info)==0)&&(strcmp(t->info.page,t->next->info.page)>0))))
/*условие того что надо сортировать: если не конец списка, если два термина разные, если термины одинаковые, но страницы разные*/
{
buff=t->info;
t->info=t->next->info;
t->next->info=buff;
changed=1;
}
t=t->next;
}
while (t!=0);
} while (sorted!=changed);
q=q->next;
}


}

void print(element *left) //вывод на экран
{ element *p=left;element *q=left;
char buff [20];
if (left==0) //проверка на наличие элементов в списке
cout<<rus("Список пуст")<<endl;
else
{cout<< rus("Предметный указатель:")<<endl; //вывод на экран
while (q!=0) //переход по списку
{if (strcmp(buff,q->info.info)!=0) //если имена терминов разные, то
{
strcpy(buff,"");
strcpy(buff,q->info.info);
cout<<q->info.info<<" ";
p=q;
while (p!=0)
{
if ((strcmp(buff,p->info.info)==0)&&(strcmp(p->info.page,"0")!=0)) //проверка на нулевую страницу
cout<<p->info.page<<" ";
p=p->next;
}
cout<<endl;
}
q=q->next;
}
}
}

void find(char term [20],element *&left) //функция поиска
{ int f=0; //переменная - флаг(указатель)
element *p=left;
if (left==0) //проверка на пустоту списка
cout<<rus("Список пуст")<<endl;
else
{ cout<< rus("Ваш элемент: ");

cout<<term<<" ";
while (p!=0) //вывод элемента
{
if ((strcmp(term,p->info.info)==0)&&(strcmp(p->info.page,"0")!=0))
{
cout<<p->info.page<<" ";
f=1; //если нашлась хотя бы одна ненулевая страница то флаг =1
}
p=p->next;
}
if (f==0) cout<<rus("не имеет страниц"); //флаг = 0 таких страниц не нашлось
cout<<endl;
}
}

int menu( )
{ int p;
cout<<endl;
cout<<rus("Меню")<<endl;
cout<< rus("1. Добавление термина в предметный указатель")<<endl;
cout<< rus("2. Добавление элемента в предметный указатель")<<endl;
cout<< rus("3. Обновление информации об элементе указателя")<<endl;
cout<< rus("4. Вывод элементов указателя в алфавитном порядке")<<endl;
cout<< rus("5. Поиск элемента указателя по термину")<<endl;
cout<< rus("6. Выход из программы")<<endl;
cout<<endl;
cout<<rus("Укажите пункт меню: ");
cin>>p;
return p; }

void main()
{ element* left; //Первый элемент списка
element *t; //Текущий элемент
element *q; //Текущий элемент
char buff [20];
int i,p,x,f,page;
char g [20];
char n [20];
ifstream ftext("text.txt"); //файл ввода текста для построения предметного указателя
ifstream fin ("vxod.txt"); //файл ввода терминов
ofstream fout("vixod.txt"); //файл для вывода окончательного предметного указателя
create(left);
cout<<rus("Выберите метод ввода:")<<endl;
cout<<rus("1.Получение информации из файла")<<endl;
cout<<rus("2.Ручной ввод")<<endl;
cin>>p;
//ввод терминов из файла
if (p==1)
{
while (!fin.eof())
{strcpy(g,"");
fin>>g;
if (strcmp(g,"\0")!=0) //условие наличия символа конца файла
add(g,"0",left);
}
fin.close();
}
//ввод с клавиатуры
else
{ cout<<rus("Ручной ввод. Для окончания ввода введите слово end")<<endl;
do
{ cout<<rus("Введите имя нового термина : ");
cin>>n;
if (strcmp(n,"end")!=0) add(n,"0",left);
}
while (strcmp(n,"end")!=0); //для оконцания ввода требуется ввести слово end
}
//формирование увазателя из файла с текстом
page=5; //количество слов на странице, требуется для определения размера страницы. можно задать любое целое положительное число
i=0;
while (!ftext.eof())
{ strcpy(g,"");
ftext>>g;
i=i+1;
f=0;
t=left;
{ while (t!=0)
{
if (strcmp(t->info.info,g)==0)
{sprintf(n,"%d",(i/page)+1); //функция превращающая число в строку (%d) возвращает число
add(g,n,left);
f=1;
}
if (f==1)
break;
t=t->next;
}
}
}

do
{
p=menu();
x=0;
switch(p)
{
case 1:
{
cout<<rus("Введите имя нового термина : ");
cin>>g;
add(g,"0",left);
}
break;

case 2:
{ cout<<rus("Введите термин : ");
cin>>g;
cout<<rus("Введите номер страницы: ");
cin>>n;
add(g,n,left);
}
break;

case 3:
{ cout<<rus("Введите имя термина : ");
cin>>g;
cout<<rus("Введите номер страницы: ");
cin>>n;
add(g,n,left);
}
break;

case 4:
{
print (left);
}
break;

case 5:
{ cout<<rus("Введите термин : ");
cin>>g;
find (g,left);
}
break;
case 6:
{
t=left;q=left;
if (left==0) //проверка на наличие элементов в списке
cout<<rus("Список пуст")<<endl;
else
{
while (q!=0) //переход по списку
{if (strcmp(buff,q->info.info)!=0) //если имена терминов разные, то
{
strcpy(buff,"");
strcpy(buff,q->info.info);
fout<<q->info.info<<" ";
t=q;
while (t!=0)
{
if ((strcmp(buff,t->info.info)==0)&&(strcmp(t->info.page,"0")!=0)) //проверка на нулевую страницу
fout<<t->info.page<<" ";
t=t->next;
}
cout<<endl;
}
q=q->next;
}
}
exit(0);
}
break;
}
getch();
clrscr();
}
while (true); //условие бесконечности цикла для вывода меню
}
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2009, 15:38
Ответы с готовыми решениями:

Описать класс *предметный указатель*
Описать клас *предметный указатель*. Каждый компонент указателя содержит слово и номер страницы, на...

Класс "Предметный указатель"
Разработать программу на языке С++ на основе объектно-ориентированного подхода, содержащей классы и...

Предметный указатель
Уважаемые программисты! Очень прошу о помощи.... Последняя лабораторная горит.....не понимаю как...

Предметный указатель.
Предметный указатель организован в виде вектора. Каждая компонента указателя содержит слово и...

Требуется на основе исходного файла построить предметный указатель и вывести его в файл
14. Строки текстового файла input.txt состоят из слов, разделенных одним или несколькими пробелами....

0
27.05.2009, 15:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2009, 15:38
Помогаю со студенческими работами здесь

Указатель на указатель, класс группа
помогите пожалуйста не могу понять что со строкой 312 знаю что с указателем что то не то......

Как преобразовать указатель на класс к указателю на асбтрактный класс?
Но тут есть одна тонкость- два промежуточных класса. Вот код, надеюсь всё из него понятно....

Предметный указатель
Предметный указатель организован в виде линейного списка. Каждый компонент указателя содержит...

Задача "Предметный указатель"
Данную задачу нашел у яндекс академия, у них же предоставлено решение, но VS 2017 ругается и не...

Если в класс нужно передать указатель на указатель на массив строк неизвестной длинны?
Как проинициализировать массив строк wchar_t * (произвольного размера) , если его нужно передать в...

Описать класс «предметный указатель».
Каждая компонента указателя содержит слово и номера страниц ,на которых она встречается.Допустимое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru