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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2017, 02:14   #1
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
Злость Перегрузка оператора ==

Перегрузка == не правильно проверяет списки. Всегда один и тот же результат, хотя по коду должна проверять каждый элемент.
Код:
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <Windows.h>
using namespace std;
 
struct element 
{
    char c; 
    element *Next;
};
 
class List 
{
    element *Begin; 
    element *End;
    int size;
public:
    List() { Begin = End = NULL; } 
    List(char *c);
    bool operator==(const List& other);
};
List::List(char *c)
{
	element *temp = new element;
	temp->c = c[0];
	Begin = End = temp;
	size++;
	for (int i = 1; i < (int)strlen(c); i++)
	{
		element *temp = new element;
		temp->c = c[i];
		End->Next = temp;
		End = temp;
		size++;
	}
	End->Next = 0;
	cout << "Сработал конструктор с параметрами." << endl;
}
bool List::operator==(const List& other)
{
	if (this->size != other.size)
	{
		return false;
	}
	if (this->size && other.size == 0)
		return true;
	element *temp1 = this->Begin;
	element *temp2 = other.Begin;
	while (temp1 != NULL)
	{
		if (temp1->c == temp2->c) return true;
			temp1 = temp1->Next;
			temp2 = temp2->Next;
	}
	return false;
}
Alexis_777 вне форума Ответить с цитированием
Старый 19.11.2017, 03:06   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
while (temp1 != NULL)
	{
		if (temp1->c == temp2->c) return true;
			temp1 = temp1->Next;
			temp2 = temp2->Next;
	}
	return false;
Списки равные, если хоть один из элементов равен?

Кстати, у вас будет весело, если будете сравнивать с списком нулевого размера.
p51x вне форума Ответить с цитированием
Старый 19.11.2017, 03:58   #3
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Код:
while (temp1 != NULL)
	{
		if (temp1->c == temp2->c) return true;
			temp1 = temp1->Next;
			temp2 = temp2->Next;
	}
	return false;
Списки равные, если хоть один из элементов равен?

Кстати, у вас будет весело, если будете сравнивать с списком нулевого размера.
нет, списки должны быть равны, когда все элементы равны, т.е. поэлементное сравнение.
Как сравнить не важно, если есть другой способ, буду рад помощи.

Последний раз редактировалось Alexis_777; 19.11.2017 в 04:03.
Alexis_777 вне форума Ответить с цитированием
Старый 19.11.2017, 04:26   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Как должно это одно, я говорю как написано. Что сделает return true, если первые элементы равны?
p51x вне форума Ответить с цитированием
Старый 19.11.2017, 06:25   #5
Unlimit_
Новичок
Джуниор
 
Регистрация: 16.11.2017
Сообщений: 1
По умолчанию

Код:
bool List::operator==(const List& other)
{
	if (this->size != other.size)
	{
		return false;
	}
	
	element *temp1 = this->Begin;
	element *temp2 = other.Begin;

	while (temp1 != NULL)
	{
		if (temp1->c != temp2->c)
                    return false; 

		temp1 = temp1->Next;
		temp2 = temp2->Next;
	}
	return true;
}
Unlimit_ вне форума Ответить с цитированием
Старый 19.11.2017, 13:28   #6
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Как должно это одно, я говорю как написано. Что сделает return true, если первые элементы равны?
Как работает я понимаю, но почему-то не сравнивает, где ошибка даже не знаю.
Получается должно сравнивать сначала первый элемент, потом 2, 3 и т.д. пока есть совпадения будет true, иначе false.

Цитата:
Сообщение от Unlimit_ Посмотреть сообщение
Код:
bool List::operator==(const List& other)
{
	if (this->size != other.size)
	{
		return false;
	}
	
	element *temp1 = this->Begin;
	element *temp2 = other.Begin;

	while (temp1 != NULL)
	{
		if (temp1->c != temp2->c)
                    return false; 

		temp1 = temp1->Next;
		temp2 = temp2->Next;
	}
	return true;
}
К сожалению пока не работает.

Вот весь код.
Еще вопрос как мне переделать функцию ввода Input, чтобы элементы добавлялись в начало списка, а не в конец.
Сейчас ввожу 123, выводит 321.
Хотелось бы исправить чтобы последовательно было.
Код:
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <Windows.h>
using namespace std;
 
struct element 
{
    char c; 
    element *Next;
};
 
class List 
{
    element *Begin; 
    element *End;
    int size;
public:
    List() { Begin = End = NULL; } 
    List(char *c);
    bool operator==(const List& other);
};
List::List(char *c)
{
    element *temp = new element;
    temp->c = c[0];
    Begin = End = temp;
    size++;
    for (int i = 1; i < (int)strlen(c); i++)
    {
        element *temp = new element;
        temp->c = c[i];
        End->Next = temp;
        End = temp;
        size++;
    }
    End->Next = 0;
    cout << "Сработал конструктор с параметрами." << endl;
}
bool List::operator==(const List& other)
{
	if (this->size != other.size)
	{
		//списки содержат разное число элементов
		return false;
	}
	//if (this->size && other.size == 0)
		//return true;//оба списка пусты*/
	element *temp1 = this->Begin; // поэлементное сравнение
	element *temp2 = other.Begin;
	while (temp1 != NULL)
	{
		if (temp1->c != temp2->c) return false;
			temp1 = temp1->Next;
			temp2 = temp2->Next;
	}
	return true;
	// если мы тут, то несовпадения в списках не обнаружены
}

void List::Input() 
{
	int size; 
	char c; 
	cout << "Ввод списка!\n";
	cout << "Введите кол-во эл-тов в списке: ";
	cin >> size;
	for (int i = 0; i < size; i++)
	{
		cout << i << ". c = ";
		cin >> c;
		element *temp = new element;
		temp->c = c;
		temp->Next = Begin;
		Begin = temp;
	}
}

void List::Print()
{
	element *temp = Begin; 
	//cout << "Вывод элемента на экран: " << endl;
	while (temp != NULL) 
	{
		cout << temp->c << " "; 
		temp = temp->Next; 
	}
	cout << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	List l1;
	l1.Input();
	List l2("Hel1l212121oooo");

	cout << "Список 1: "; l1.Print();
	cout << "Список 2: "; l2.Print();
	cout << endl;

	cout << "Перегрузка оператора - проверка на равенство (==):\n";
	if (l1 == l1)
		cout << "Списки равны!\n";
	else cout << "Списки не равны!\n";
}
Есть идеи что может быть не так?

Последний раз редактировалось Alexis_777; 19.11.2017 в 23:17.
Alexis_777 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перегрузка оператора << Praud Помощь студентам 9 15.03.2014 22:03
Перегрузка оператора ++ Svorobey C# (си шарп) 7 04.11.2013 13:07
Перегрузка оператора [] dbazulev Общие вопросы C/C++ 1 02.12.2012 20:19
Перегрузка оператора == Lapo4ka Общие вопросы C/C++ 4 15.12.2011 01:26
перегрузка оператора -> alex_alpha Общие вопросы C/C++ 5 23.06.2010 19:07