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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2008, 17:28   #1
Nastja
Пользователь
 
Регистрация: 30.11.2008
Сообщений: 11
По умолчанию Помощь с лабой: «Перегрузка операций» (ООП, класс-АТД, на с++)

Очень прошу,откликнитесь пожалуйста! Очень нужно решение! Уже не знаю сколько пытаюсь разобраться - не получается! Хотя с остальными лабами проблем не было :-(((
Определить и реализовать класс - абстрактный тип данных. Определить и реализовать операции над данными этого класса. Написать и выполнить программу полного тестирования этого класса.
//=================================== ===============
Вот задание:
АДТ-однонаправленный список с элементами типа char. Дополнительно перегрузить следующие операции:
[] доступ к элементу в заданной позиции, например:
int i; char c;
list L;
c=L[i];
+ объединить два списка;
!= проверка на неравенство.
//=================================== ===============
Порядок выполнения работы.
1. Выбрать класс АТД в соответствии с вариантом.
2. Определить и реализовать в классе конструкторы, деструктор, функции Input (ввод с клавиатуры) и Print (вывод на экран), перегрузить операцию присваивания.
3. Написать программу тестирования класса и выполнить тестирование.
4. Дополнить определение класса заданными перегруженными операциями ( в соответствии с вариантом).
5. Реализовать эти операции. Выполнить тестирование.
Nastja вне форума Ответить с цитированием
Старый 30.11.2008, 23:23   #2
Nastja
Пользователь
 
Регистрация: 30.11.2008
Сообщений: 11
По умолчанию

Есть кто-нибудь, кто хорошо понимает списки???
Nastja вне форума Ответить с цитированием
Старый 01.12.2008, 11:37   #3
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Многие тут всё хорошо понимают, просто поймите, что времени на эту задачку придётся потратить не 5 и не 15 минут.

Мы же помогаем, а не делаем с нуля. Надо решить с нуля - фриланс поможет, за умеренную плату конечно.

Иначе давайте то, что у вас получилось, что не работает?
zetrix вне форума Ответить с цитированием
Старый 01.12.2008, 21:08   #4
Nastja
Пользователь
 
Регистрация: 30.11.2008
Сообщений: 11
По умолчанию Осталось две перегрузки(!!!): [] -доступ к элементу в заданной позиции, + -объединить два списка.

#include <iostream.h>
#include <conio.h>
#include <string.h>

//АТД
class Atd{
class Spisok {
public:
char simv; //Данные
Spisok *next; //Указатель на следующий узел
Spisok (char x = NULL) //Конструктор
{simv = x; next = NULL;}
};
Spisok *begin, *end; //Указатели на начало, конец списка
public:
Atd (); //Конструктор по умолчанию
Atd (char *str); //Конструктор с параметрами
~Atd(); //Деструктор
bool operator !=(const Atd&); //Перегрузка операции != - проверка на неравенство
Atd& operator =(const Atd&); //Перегрузка операции присваивания
// Atd& operator +(char); //Перегрузка операции + -объединить два списка (Atd+Atd)
// Atd& operator [](char); //Перегрузка операции [] -доступ к элементу в заданной позиции (например: int i; char c;list L;c=L[i])

// void Input(); //Ввод с клавиатуры
void Print(); //Функция вывода на экран
};




//Конструктор с параметрами
Atd :: Atd (char* str)
{
Spisok *pv = new Spisok;
pv->simv = str[0];
begin = end = pv;
for (int i=1; i <= (int)strlen(str); i++)
{
Spisok *pv = new Spisok;
pv->simv = str[i];
end->next = pv;
end = pv;
}
cout << endl << "vyzvan konstruktor c parametrami.\n";
}


//Деструктор
Atd :: ~Atd ()
{
if (begin != NULL )
{
Spisok *pv = begin;
while (pv)
{
pv = begin->next;
delete begin;
begin = pv;
}
}
cout << endl << "vyzvan destructor.\n";
}


//Перегрузка операции присваивания
Atd& Atd :: operator =(const Atd& x)
{
cout << "vyzvana peregruzka operatora '='.\n";
this->~Atd();
char dsimv;
Spisok *pv = new Spisok;
Spisok *dpv = x.begin;
dsimv = dpv->simv;
dpv = dpv->next;
pv->simv = dsimv;
begin = end = pv;
while (dpv)
{ Spisok *pv = new Spisok;
dsimv = dpv->simv;
pv->simv = dsimv;
end->next = pv;
end = pv;
dpv = dpv->next;
};
return (*this);
};


//Перегрузка операции + -объединить два списка (Atd+Atd)

/*
Atd& Atd :: operator +(Atd& , Atd& )
{


cout << "vyzvana peregruzka operatora '+'.\n";


cout << endl << "Atd: \n";


cout << endl;
return (*this);
};
*/


//Перегрузка операции [] -доступ к элементу в заданной позиции (например: int i; char c;list L;c=L[i])

/*
Atd& Atd :: operator [](char x)
{

cout << "vyzvana peregruzka operatora '[]'.\n";


return (*this);
};
*/

//Проверка АТД на неравенство
bool Atd :: operator !=(const Atd& x)
{
cout << "vyzvana peregruzka operatora '!='.\n";
Spisok *pv = begin;
Spisok *dpv = x.begin;
while ((pv)&&(dpv))
{
if (pv->simv == dpv->simv) return false;
pv = pv->next;
dpv = dpv->next;
}
return true;

}


//статическая компонента-функция просмотра всего списка
void Atd :: Print()
{
Spisok *pv = begin;
cout << endl << "Atd: \n";
while (pv)
{
cout << pv->simv << ' ';
pv = pv->next;
}
cout << endl;
}


void main()
{
cout << "Press ENTER to create objects...\n";
getch ();
Atd first("IAM");
cout << "object is created.\n"
<< "Press ENTER to look at it...\n";
getch ();
first.Print();

cout << "Press ENTER to create one more object...\n";
getch();
Atd second("ACOUY");

cout << "list is object.\n"
<< "Press ENTER to look at it...\n";
getch ();
second.Print();

cout << endl << "compare them.\n";
cout << "Press ENTER to look at result.\n";
getch ();
if (first != second) cout << "They are didn't =.\n";
else cout << "They are =.\n";
first.Print();
second.Print();

cout << endl << "the first object compare to the second object. And following compare them anew.\n";
cout << "Press ENTER to look at result.\n";
getch ();
first = second;
if (first != second) cout << "They are didn't =.\n";
else cout << "They are =.\n";
first.Print();
second.Print();

/*
cout << endl << "add second object to first object, and [] from second object.\n";
cout << "Press ENTER to look at result.\n";
getch ();

*/

getch ();
}
Nastja вне форума Ответить с цитированием
Старый 01.12.2008, 21:10   #5
Nastja
Пользователь
 
Регистрация: 30.11.2008
Сообщений: 11
По умолчанию

я -
Помогите, пожалуйста, разобраться!..
Nastja вне форума Ответить с цитированием
Старый 02.12.2008, 17:19   #6
Nastja
Пользователь
 
Регистрация: 30.11.2008
Сообщений: 11
По умолчанию

Как сложить два списка???
Nastja вне форума Ответить с цитированием
Старый 02.12.2008, 17:27   #7
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

в последнем элементе ссылкой на следующий элемент должна быть ссылка на первый элемент второго списка.
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Старый 03.12.2008, 18:27   #8
Nastja
Пользователь
 
Регистрация: 30.11.2008
Сообщений: 11
По умолчанию С++ :-(

Индексирование почти написала, кто-нибудь может привести пример объединения(складывания) двух списков? Ну не получается...
Nastja вне форума Ответить с цитированием
Старый 03.12.2008, 18:36   #9
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

Цитата:
Сообщение от Nastja Посмотреть сообщение
Spisok *next; //Указатель на следующий узел
Вот сюда в последнем элементе списка 1 запиши ссылку на 1 элемент списка 2 !!!
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Старый 04.12.2008, 13:57   #10
Nastja
Пользователь
 
Регистрация: 30.11.2008
Сообщений: 11
По умолчанию

Спасибо, Sm1le!
Nastja вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операций new, new[], delete, delete[] IgorKr Общие вопросы C/C++ 1 22.10.2008 12:14
Конструктор, наследование, перегрузка операций Lioness Помощь студентам 18 02.06.2008 20:44
Нужна помощь с программой ООП на С++ Vofka Фриланс 3 30.11.2007 16:52