Привет всем. Обращаюсь к вам за помощью, ибо нез наю кто есчё может мне помочь. проблема у меня такая, наш добрый препод по программированию задал нам написать курсач по теме которую мы не прошли, а сдавать его нада уже через неделю. так что даже и не знаю что делать. Задание выглядит так : В соответствии с индивидуальным заданием необходимо создать программную систему для обслуживания конкретной сложной динамической структуры данных (списка, дерева или стека). Для каждого из вариантов необходимо разработать следующие функции:
1.Создание пустой структуры данных 2.Добавление нового элемента для списка - в начало, в конец, после элемента с заданным номером (ключом). для дерева - к указанной вершине дерева 3.Вывод на экран дисплея 4.Удаление элемента для списка - из начала, из конца, с заданным номером (ключом). 5.Упорядочивание элементов структуры 6.Запись в файл 7.Уничтожение структуры данных 8.Чтение данных из файла
Сделать мне нада всё с помощью стэка. пример для стэка - 1.Человек (фамилия, имя, пол, национальность, рост, вес, номер тел., адрес)
Если кто может помогите чем смогите P.S. Всем-всем заранее за оказанную помощь
Michael_Rybak
9.12.2007 19:42
В faq - реализация стека на паскале. В гугле - реализация стека на с++. Приходи с конкретными вопросами.
Flanker
16.12.2007 18:08
Я снова ренулся)))))Но не спустыми руками))))) Вот прога сделана на основе бинарного дерева. Не могли бы вы помочь передлелать её на стек????
#include <iostream.h> #include <stdio.h> //#include <fstream.h> #include <conio.h> #include <stdlib.h> #include <stdio.h>; #include <string.h>; //========================================================================= struct node //описание структуры { char //объявление указателей на значение типа char *fam, //фамилия студента *name, //имя студента *fac; //Название факультета //инициализация переменных int nomer; //номер группы студента node *left, //указатель на левый элемент *right; //указатель на правый элемент }; //=========================================================================== node massiv[]= { {"Каштанова","Елена","Экономика",145}, {"Мавлиханова","Лилия","Экономика",167}, {"Белько","Александр","ИТ",121}, {"Лебединский","Никита","Математика",132} }; //========================================================================== void info() { cout <<"\n\n\n\n\t\t\tКурсовая работа по программированию"; cout <<"\n\n\n\t\t Пример простейшей базы данных на основе"; cout <<"\n\t\t\t\tбинарного дерава"; cout <<"\n\n\n\n\n\n\t\t для продолжения нажмите любую клавишу..."; getch(); clrscr; }
//========================================================================== void init(struct node ** root) //инициализация дерева { *root=NULL; //инициализация указателя на корень дерева } //==========================================================================
int menu() // функция для создания меню { clrscr(); int k; //код клавиши cout << "\n\t\t\t<< База данных о студентах>>\n"; cout << "\n--------------------------------------------------------------------------------\n"; cout << "\n\t****************ОСНОВНОЕ МЕНЮ**************** "; cout << "\n"; cout << "\n\t 1 - Создание новой базы данных"; cout << "\n\t 2 - Добавление нового элемента"; cout << "\n\t 3 - Удаление базы данных"; cout << "\n\t 4 - Удаление элемента с заданным ключом"; cout << "\n\t 5 - Добавление заранее определенных элементов"; cout << "\n\t 6 - Вывод базы данных на экран"; cout << "\n\t 0 - Выxод из программы\n"; cout << "\n Ваш выбор : ";
while ((k<48)||(k>54)) //интервал возможных вариантов вводимых значений k=getch(); //считывание кода нажатой клавиши k=k-48; return k; } //========================================================================= int number(struct node **p) //подсчет количества элементов дерева { if (*p==NULL) return 0; else return number(&((*p)->left))+number(&((*p)->right))+1; } //=========================================================================== int vvod() /*функция проверки на ввод*/ { int k,z,n,j=0; char ch; char st[30]=" "; char w[]={'0','1','2','3','4','5','6','7','8','9'}; do { n=1; gets(st); /*ввод строки*/ j=0; do { k=0; while (st[j]!=w[k] & k!=10) /*проверка на принадлежность промежутку '0'..'9'*/ k++; if (k==10 & !(st[j]=='-' & j==0 & strlen(st)!=1)) /*проверка на '-'*/ { cout <<"\n\tОшибка! Введено не число! Повторите ввод: "; j=0; n=0; int i=0; while (st[i]!='\0') /*обнуление строки*/ { st[i]='\0'; i++; } } else j++; } while (n!=0 & j!=strlen(st)); } while (n!=1); z=atol (st); /*перевод строки в число*/ return z; } //=========================================================================== struct node *nov( char *fam1, // заполнение полей нового элемента char *name1, char *fac1, int nomer1 ) { struct node *p; p=new(node); p->fam= new char[30]; //выделение памяти под новый символьный массив p->fam=fam1; //заполнение поля name нового элемента p->name=new char[30]; p->name=name1; p->fac=new char[30]; p->fac=fac1; p->nomer=nomer1; p->right=NULL; //указатель на соседнюю вершину дерева p->left=NULL; //указатель на нижнюю вершину дерева return p; } //=========================================================================== void add(struct node ** root,struct node * newel) //добавление нового элемента в дерево { if (*root==NULL) *root=newel; // если у дерева нет эл-ов, то новый эл-т становится корнем else { if (newel->nomer>=(*root)->nomer) // если новый эл-т >= текущему, переходим на правый элемент add(&((*root)->right),newel); else // переходим на левый элемент add(&((*root)->left),newel); } } //=========================================================================== void print(struct node ** p) // вывод на экран всех элементов дерева { //обход дерева слева if (*p!=NULL) // { printf("\n|%15s|%13s|%17s|%12d|", //печать информационного поля элемента (*p)->fam, (*p)->name, (*p)->fac,(*p)->nomer); print(&((*p)->left));
print(&((*p)->right));
} } //========================================================================== struct node** find(int c,struct node **p) //функция поиска элемента в дереве { //если элемент найден, то if ((*p==NULL)||(((*p)->nomer)==c) ) //функция возвращает значение указателя на этот эл-т return(p); else { if ((*p)->nomer>c) return(find(c,&((*p)->left))); if ((*p)->nomer<=c) return(find(c,&((*p)->right))); } } void Delete_1(struct node **r,struct node **q) //удаление одного элемента дерева { struct node *s; if ((*r)->right==NULL) { (*q)->fam = (*r)->fam; (*q)->name = (*r)->name; (*q)->fac = (*r)->fac; (*q)->nomer = (*r)->nomer; *q=*r; s=*r; *r=(*r)->left; delete s; } else Delete_1 (&((*r)->right), q); } //========================================================================== void Delete(struct node **p) //удаление из дерева вершины с укзанным ключом { node *q; q = *p; if ((q)->right==NULL) { *p = (q)->left; delete q; } else if ((q)->left==NULL) { *p = (q)->right; delete q; } else Delete_1 (&((q)->left),&q); } //=========================================================================== void del_all(struct node** p) // удаление всех элементов структуры , // начиная с данного { if(*p!=NULL) //если указатель не пуст { del_all(&((*p)->left)); // удаление адреса указателя на ветвь del_all(&((*p)->right)); if ((((*p)->left)==NULL)&&(((*p)->right)==NULL)) //если достигнут лист дерева { delete *p; // удалить память выделенную под указатель *p=NULL; // инициализировать указатель на p заново } } } //========================================================================== //========================================================================== void main () //основная программа { clrscr(); info(); struct node * newdata; struct node ** root; *root=NULL; //инициализация указателя на корень дерева char *name1,*fam1,*fac1; int nomer1=0; int key; int v=0; do { key=menu(); cout <<key; getch(); switch(key) { case 1: { if (v==0) { clrscr(); init(root); cout <<"\n\n Пустая база данных создана.\n"; cout <<"\n\n Нажмите любую клавишу для продолжения..."; v=1; } else { clrscr(); cout<<"\n\n База данных уже существуют.\n"; cout<< "\n\n Нажмите любую клавишу для продолжения..."; } getch(); break; } case 2: { clrscr(); if (v!=0) { if (number(root)>=10) cout <<"\n\n В базе данных максимальное число элементов (нажмите любую клавишу...)"; else { name1=new char[30]; fac1=new char[30]; fam1=new char[30]; cout <<"\n\n Введите данные о студенте :\n\n"; cout<<"\tВведите фамилию студента: "; gets(fam1); cout <<"\n\n\tВведите имя студента: "; gets(name1); cout<<"\n\n\tВведите название факультета:"; gets(fac1); cout<<"\n\n\tВведите номер группы факультета (100..200): "; do { nomer1=vvod(); if (nomer1<100 | nomer1>200) cout<<"\n\tОшибка !!! Повторите ввод:"; } while (nomer1<100 | nomer1>200);
struct node *newone; newone=nov(fam1,name1,fac1,nomer1); add(root,newone); clrscr(); cout <<"\n\n Новый элемент добавлен.\n"; cout <<"\n\n Нажмите любую клавишу для продолжения..."; } } else { cout <<"\n\n Для начала создайте новую базу данных.\n"; cout <<"\n Нажмите любую клавишу для продолжения..."; } getch(); break; } case 3: { clrscr(); if (*root!=NULL) // если корень не пуст { del_all(root); cout <<"\n\n База данных удалена. "; cout <<"\n\n Нажмите любую клавишу для продолжения..."; getch(); } else { cout<<"\n\n База данных пуста\n"; cout <<"\n Нажмите любую клавишу для продолжения"; } getch(); v=0; break; } case 4: { clrscr(); if (v!=0) { cout<<"\n\n Введите номер группы для поиска и удаления элемента базы данных: "; int number; number=vvod(); struct node **subroot; subroot=find(number,root); //поиск элемента с заданным ключом number if (*subroot!=NULL) { Delete(subroot); cout <<"\n\n Данные удалены.\n"; cout <<"\n\n Нажмите любую клавишу для продолжения...."; } else cout<<"\n\n Ошибка!!! Вы ввели данные, которые отсутствуют в базе данных!!!"; } else { cout<<"\n\n База данных пуста...\n"; cout <<"\n Нажмите любую клавишу для продолжения..."; } getch(); break; } case 5: { clrscr(); if (v!=0) { if (number(root)>=10) cout <<"\n\n В базе данных максимальное число элементов (нажмите любую клавишу...)"; else { int n; n=sizeof(massiv)/sizeof(massiv[0]); for (int i=0;i<n;i++) { struct node *newone; newone=nov(massiv[i].fam,massiv[i].name,massiv[i].fac,massiv[i].nomer); add(root,newone); } clrscr(); cout <<"\n\n Новые элементы добавлены.\n"; cout <<"\n Нажмите любую клавишу для продолжения...)"; } } else { cout <<"\n\n Для начала создайте новую базу данных.\n"; cout <<"\n Нажмите любую клавишу для продолжения...\n"; } getch(); break; } case 6: { clrscr(); if (*root!=NULL) //если корень не пуст { cout <<"\n\n База данных \n"; cout <<"\n ____________________________________________________________"; cout <<"\n| | | | |"; cout <<"\n| Фамилия | Имя | Факультет | Группа |"; cout <<"\n|_______________|_____________|_________________|____________|"; cout <<"\n| | | | |"; print(root); cout <<"\n|_______________|_____________|_________________|____________|"<<"\n\n"; cout <<"(Нажмите любую клавишу...)"; } else {cout<<"\n\n Данные отсутствуют ...\n"; cout <<"\n Нажмите любую клавишу для продолжения..."; } getch(); break; } } } while (key!=0); if (v!=0) del_all(root); }
ПОЖАЛУЙСТА!!!!!!
volvo
16.12.2007 18:18
Что это было? И зачем ЭТО переделывать? Проще с нуля написать... За основу можешь взять вот этот класс: Класс Stack (раз уж ты пишешь на С++)
Flanker
16.12.2007 18:30
Запутив то что ты написал он выдал ошибку. Мол pt не установлено не обозначено . Undefined symbol 'pt'
volvo
16.12.2007 19:01
Добавлено через 2 мин. Это смотря где ты запускал... Та программа тестировалась на Turbo C++ 3.0, там все работает. Для того, чтоб работало на компиляторах, более точно следующих Стандарту - потребуется изменить конструктор копирования: