Здравствуйте, подскажите , пожалуйста, ошибку. Не могу найти в чем проблема.
Имеется класс lisdtADT, который содержит в себе maxSize, size и cursor.
Для утверждения инициализирую maxSize=11;` сразу, остальные переменные в конструкторе.
Проблема в том, что метод DataType getCursor(); *typedef int DataType; возвращает неверное значение(мусор).
После дебаггинга, я понял, что newDataItem в методе insert инициализируется правильными введенными значениями.
Далее, в файле source.cpp я пытаюсь подсчитать сумму моих введенных значений строкой total += samples.getCursor();. И именно getCursor(); возвращает мне мусор, который конечно же неправильно считает сумму.
Я думаю, что я выхожу в каком-то месте прибавляю лишнюю еденицу и поэтому происходит такая ошибка.
Помогите,пожалуйста, разобраться.Спасибо.
Мой код:
ListADT.h
#include<iostream>
const int defMaxListSize = 10;
typedef int DataType;
class ListADT
{
private:
//Data members
int maxSize=11;
int size;
int cursor;
DataType *dataItems=NULL;
public:
//Constructor
ListADT(int maxNumber = defMaxListSize);
//Destructor
~ListADT();
//List manipulation operations
void insert(const DataType &newDataItem); //Insert after cursor
void remove(); //Remove Data item
//void replace(const DataType &newDataItem); //Replace data item
//List status operations
bool isEmpty()const; //List is empty
bool isFull() const; //List is full
//List iteration operations
void gotoBeginning() ; //Go to beginning
void gotoEnd(); //Go to end
bool gotoNext(); //Go to next data item
bool gotoPrior(); //Go to prior data item
DataType getCursor(); //Return data item
//Output the list structure -used in testinf/debugging
//void showStructure()const;
};
ListADT.cpp
#include "ListADT.h"
ListADT::ListADT(int maxNumber):cursor(0),size(0)
{
if (maxNumber <= defMaxListSize)
dataItems = new DataType[maxNumber];
else
std::cout << "The list is overloaded" << std::endl;
}
ListADT::~ListADT()
{
delete dataItems;
}
void ListADT::insert(const DataType & newDataItem)
{
if (size + 1 <= maxSize)
{
dataItems[cursor] = newDataItem;
size++;
cursor++;
}
}
void ListADT::remove()
{
if (size - 1 >= 0)
cursor--;
}
bool ListADT::isEmpty() const
{
if (size <= 0)
return true;
else
return false;
}
bool ListADT::isFull() const
{
if (size == defMaxListSize)
return true;
else
return false;
}
void ListADT::gotoBeginning()
{
cursor = 0;
}
void ListADT::gotoEnd()
{
cursor = size;
}
bool ListADT::gotoNext()
{
if (cursor < size)
{
cursor++;
return true;
}
return false;
}
bool ListADT::gotoPrior()
{
if (!isEmpty() && cursor != 1)
{
cursor--;
return true;
}
else return false;
}
DataType ListADT::getCursor()
{
if (!isEmpty())
{
//std::cout << "C: " << cursor << std::endl; //правильный результат
//cursor--;
return dataItems[cursor]; // возвращает мусор
}
else
{
std::cout << "Empty list" << std::endl;
}
}
Source.cpp
#include <iostream>
#include "ListADT.h"
void main()
{
ListADT samples;
int newSample=0;
int total = 0;
//Read in a set of samples from the keyboard.
std::cout << "Enter list of samples (end with eof): ";
for (int i = 0; i < 10; i++)
{
std::cin >> newSample;
samples.insert(newSample);
}
//Sum the samples and output the result.
if (!samples.isEmpty())
{
samples.gotoBeginning();
do {
std::cout << "CUR " << samples.getCursor() << std::endl;
total += samples.getCursor();
}
while (samples.gotoNext());
}
std::cout << "Sum is " << total << std::endl;
system("pause");
}
Результат:
Ошибка была найдена в методе bool ListADT::gotoNext(). Происходил лишний шаг на единицу и поэтому десятый элемент возвращал мусор.
Метод insert() остается без изменений:
void ListADT::insert(const DataType & newDataItem)
{
if (size + 1 <= maxSize)
{
dataItems[cursor] = newDataItem;
size++;
cursor++;
}
}
Метод bool ListADT::gotoNext(). Меняем в условии size на size-1
bool ListADT::gotoNext()
{
if (cursor < size-1)
{
cursor++;
return true;
}
return false;
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости