Mc_crazy
|
|
1 | |
класс "Предметный указатель"27.05.2009, 15:38. Показов 1060. Ответов 0
Метки нет (Все метки)
у Нас есть класс "Предметный указатель" ..
реализованный в 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); //условие бесконечности цикла для вывода меню } |
27.05.2009, 15:38 | |
Ответы с готовыми решениями:
0
Описать класс *предметный указатель* Класс "Предметный указатель" Предметный указатель Предметный указатель. Требуется на основе исходного файла построить предметный указатель и вывести его в файл |
27.05.2009, 15:38 | |
27.05.2009, 15:38 | |
Помогаю со студенческими работами здесь
1
Указатель на указатель, класс группа Как преобразовать указатель на класс к указателю на асбтрактный класс? Предметный указатель Задача "Предметный указатель" Если в класс нужно передать указатель на указатель на массив строк неизвестной длинны? Описать класс «предметный указатель». Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |