IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Динамическая структура данных, C++
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


!bye2.gif !bye2.gif !bye2.gif Привет всем. Обращаюсь к вам за помощью, ибо нез наю кто есчё может мне помочь. проблема у меня такая, наш добрый препод по программированию задал нам написать курсач по теме которую мы не прошли, а сдавать его нада уже через неделю. так что даже и не знаю что делать. Задание выглядит так : В соответствии с индивидуальным заданием необходимо создать программную систему для обслуживания конкретной сложной динамической структуры данных (списка, дерева или стека). Для каждого из вариантов необходимо разработать следующие функции:

1.Создание пустой структуры данных
2.Добавление нового элемента
для списка - в начало, в конец, после элемента с заданным номером (ключом).
для дерева - к указанной вершине дерева
3.Вывод на экран дисплея
4.Удаление элемента
для списка - из начала, из конца, с заданным номером (ключом).
5.Упорядочивание элементов структуры
6.Запись в файл
7.Уничтожение структуры данных
8.Чтение данных из файла

Сделать мне нада всё с помощью стэка.
пример для стэка - 1.Человек (фамилия, имя, пол, национальность, рост, вес, номер тел., адрес)

Если кто может помогите чем смогите
P.S.
Всем-всем заранее за оказанную помощь
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


В faq - реализация стека на паскале. В гугле - реализация стека на с++. Приходи с конкретными вопросами.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


Я снова ренулся)))))Но не спустыми руками))))) Вот прога сделана на основе бинарного дерева. Не могли бы вы помочь передлелать её на стек????

#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);
}


ПОЖАЛУЙСТА!!!!!! smile.gif smile.gif smile.gif smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






blink.gif Что это было? И зачем ЭТО переделывать? Проще с нуля написать... За основу можешь взять вот этот класс: Класс Stack (раз уж ты пишешь на С++)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


Запутив то что ты написал он выдал ошибку. Мол pt не установлено не обозначено . Undefined symbol 'pt'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Добавлено через 2 мин.
Это смотря где ты запускал... Та программа тестировалась на Turbo C++ 3.0, там все работает. Для того, чтоб работало на компиляторах, более точно следующих Стандарту - потребуется изменить конструктор копирования:

Stack :: Stack(const Stack &s): first(0) { // Добавлена инициализация first

Stack Ts;
Item *pt; // Описание переменной перенесено сюда
for(pt = s.first; pt; pt = pt -> next) Ts.push(pt -> item);
pt = Ts.first;
while(pt) {
push(pt -> item); pt = pt -> next;
}

}


2 moders: я сначала по ошибке запостил сообщение в тему по ссылке... Удалите его оттуда, please, ответ должен быть здесь...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.10.2020 21:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name