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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2013, 15:53   #1
golddigger1713
 
Регистрация: 26.05.2013
Сообщений: 5
По умолчанию Курсовая работа. Генератор кроссвордов в С++

Написал программу для курсовой, смысл в том что программа создает кроссворд из заданных слов в заданной сетке, однако при запуске выдает вот такую ошибку. Не подскажете а чем проблема?
Изображения
Тип файла: jpg 45.jpg (109.6 Кб, 190 просмотров)
golddigger1713 вне форума Ответить с цитированием
Старый 26.05.2013, 16:15   #2
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

Выход за границу вектора
revizor вне форума Ответить с цитированием
Старый 26.05.2013, 16:44   #3
golddigger1713
 
Регистрация: 26.05.2013
Сообщений: 5
По умолчанию

Цитата:
Выход за границу вектора
И как это исправить?
golddigger1713 вне форума Ответить с цитированием
Старый 26.05.2013, 16:45   #4
golddigger1713
 
Регистрация: 26.05.2013
Сообщений: 5
По умолчанию

Код:



using namespace std;

// буква со счетчиком
struct CharAndCounter
{
	char Char;
	int Counter;
	CharAndCounter(char _char = ' ', int _counter = 0)
		: Char(_char), Counter(_counter) {}
};

// элемент словаря
struct VocElement
{
	string String; // слово
	bool Busy; // флаг "занято/не занято"
	VocElement(const string& str ="", bool b = false)
		: String(str), Busy(b) {}
};

vector<vector<CharAndCounter> > Field;
vector<VocElement> Vocabulary;

struct WordCoords
{
	static const char VERTICAL = 'v', HORIZONTAL = 'h';
	int X, Y; // расположение слова
	char Dir; // направление слова(горизонтальное/вертикальное)
	int Length; // длина слова

	WordCoords(int _x, int _y, int _len, char _dir)
		: X(_x), Y(_y), Dir(_dir), Length(_len) {}
	// горизонтальное и вертикальное смещение очередной буквы слова относительно предыдущей
	int dx() { return (Dir == HORIZONTAL) ? 1 : 0; }
	int dy() { return (Dir == VERTICAL) ? 1 : 0; }
};

 vector<WordCoords> Crossword; // оnисание кроссворда


// служебная функция для сортировки слов по длине
 bool Less(const VocElement& lhs, const VocElement& rhs)
 {
	 return lhs.String.length() < rhs.String.length();
 }

 
// Функция ReadData() считывает описание кроссворда из файла crossword.txt и словаря из файла vocabulary.txt
 void ReadData()
 {
	ifstream crossw("crossword.txt"), voc("vocabulary.txt");
	 string temp;
	 // считать последовательно все слова словаря
	 while(!voc.eof())
	 {
		 voc >> temp;
		 Vocabulary.push_back(VocElement(temp, false));
	 }
	 // отсортировать словарь по длине слов
	 sort(Vocabulary.begin(), Vocabulary.end(), Less);

	 // считать описание кроссворда
	 int W, H, x, y, len;
	 char dir;
	 // длина и высота поля
	 crossw >> W; crossw >> H;

	 for (;;)
	 {
		 // считать очередной элемент описания
		 crossw >> x; crossw >> y;
		 crossw >> len; crossw >> dir;
		 if(crossw.eof())
			 break;
		 Crossword.push_back(WordCoords(x, y, len, dir));
	 }
	 // заполнить все поле пустыми символами
	 for(int i = 0; i < W; i++)
	 {
		 vector<CharAndCounter> col(H);
		 fill(col.begin(), col.end(), CharAndCounter());
		 Field.push_back(col);
	 }
 }
	 // можно ли разместить слово word на позиции с?
	 // (предполагается, что длина слова нас устраивает, требуется лишь
	 // определить соответствие букв слова уже имеющимся на поле буквам)
	 bool CanPlace(WordCoords c, const string& word)
	 {
		 for(unsigned i = 0; i < word.length(); i++)
		 {
			 // если очередная ячейка непуста
			 // и при этом символ в ней не соответствует i-му символу слова
			 if(Field[c.X + i*c.dx()][c.Y + i*c.dy()].Char != ' ' &&
                Field[c.X + i*c.dx()][c.Y + i*c.dy()].Char != word[i])
				return false; // слово нельзя разместить на позиции с
		 }
		 return true;
	 }
 
	 // разместить слово word в позиции с (предполагается, что это возможно)
	 void PlaceWord(WordCoords c, const string& word)
	 {
		 for(unsigned i = 0; i , word.length(); i++)
		 {
			 Field[c.X + i*c.dx()][c.Y + i*c.dy()].Char = word[i];
			 Field[c.X + i*c.dx()][c.Y + i*c.dy()].Counter++;
		 }
	 }
	 //--------------------------------------------------------
	 // снять слово word с позиции с
	 void RemoveWord(WordCoords c, const string& word)
	 {
		 for(unsigned i = 0; i < word.length(); i++)
		 {
			 if(--Field[c.X + i*c.dx()][c.Y + i*c.dy()].Counter == 0)
			 Field[c.X + i*c.dx()][c.Y + i*c.dy()].Char = ' ';
		 }
	 }

	 bool Solve(unsigned CoordNo)
	 {
		 if(CoordNo == Crossword.size())
			 // если подкроссворд пуст
			 return true;
		 // получить диапазон слов, длина каждого из которых
		 // равна Crossword[CoordNo].Length
		 pair<vector<VocElement>::iterator, vector<VocElement>::iterator> range =
			 equal_range(Vocabulary.begin(), Vocabulary.end(),
			 string(Crossword[CoordNo].Length, ' '), Less);

		 // цикл по словам словаря
		 for(vector<VocElement>::iterator p = range.first;
			 p != range.second; p++)
			 if(!p->Busy && CanPlace(Crossword[CoordNo], p->String))
			 {   // если слово не занято
				 // и его можно разместить на позиции Crossword[CoordNo]
				 PlaceWord(Crossword[CoordNo], p->String); // разместить слово
				 p->Busy = true;         //теперь слово занято
				 if(Solve(CoordNo + 1))  // если подкроссворд решается
					 return true;
				 RemoveWord(Crossword[CoordNo], p->String); // снять слово
				 p->Busy = false; // пометить слово как незанятое
			 }
			 return false;
	 }

	 int main(int argc, char* argv[])
	 {
		 // считать параметры кроссворда
		 ReadData();
		 if(Solve(0))
		 {
			 // если решение найдено, распечатать содержимое Field
			 for(unsigned y = 0; y < Field[0]. size(); y++)
			 {
				 for(unsigned x = 0; x < Field.size(); x++)
					 cout << Field[x][y].Char;
				 cout << endl;
			 }
		 }
		 else
			 cout << "нет решений";

		 return 0;
	 }
golddigger1713 вне форума Ответить с цитированием
Старый 26.05.2013, 16:56   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
И как это исправить?
С помощью отладчика/отладочной печати найти, где происходит обращение за пределы массива; подумать, откуда оно там взялось, исправить. Лично мне "на глазок" подозрительно обращение с (глобальным!) объектом Field. Влепите отладочную печать или утверждения перед каждым обращением к нему.
В конце концов, если Вы написали этот код, то ничего нового я Вам не сообщил, правда?
Abstraction вне форума Ответить с цитированием
Старый 26.05.2013, 16:58   #6
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

Я так сразу не скажу где ошибка. Программу скопировал себе, скомпилировал, запустил и она зависла) Никаких ошибок не показывает
revizor вне форума Ответить с цитированием
Старый 26.05.2013, 19:12   #7
golddigger1713
 
Регистрация: 26.05.2013
Сообщений: 5
По умолчанию

Цитата:
for(unsigned i = 0; i , word.length(); i++)
Все, нашел ошибку. Оказалось в 116 строке вместо "<" стояла ","
Всем спасибо за помощь.
golddigger1713 вне форума Ответить с цитированием
Старый 26.05.2013, 19:49   #8
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

Цитата:
вместо "<" стояла ","
Клавишу Shift забыл нажать
revizor вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Курсовая работа по БД Suslik963 Фриланс 6 23.05.2013 11:55
Курсовая работа(( Юрико Помощь студентам 4 27.12.2012 17:09
Курсовая работа frang Помощь студентам 0 05.02.2012 23:37
КУРСОВАЯ РАБОТА ПО ОС mazzn Фриланс 0 24.12.2010 11:46
Курсовая работа deadh5n1 Помощь студентам 3 05.11.2008 20:05