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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2017, 08:46   #1
NikolaP
Новичок
Джуниор
 
Регистрация: 27.04.2017
Сообщений: 2
По умолчанию [C++] Использование векторов и интералов

Здравствуйте. Занимаюсь самостоятельным изучением с++ по книге Майкла Доусона Изучаем С++ через программирование игр. В главе 4 есть задача: << Воспользуйтесь векторами и итераторами и напишите программу, позволяющую пользователю вести список любимых игр. В этой программе у пользова*теля должны быть такие возможности: перечислить заголовки всех игр, доба*вить заголовок игры, удалить заголовок игры.>>
Код:
Код:
// Список любимых игр
// В нем можно перечислять, добовлять или удалять названия игр

#include "stdafx.h"
#include <vector>
#include <iostream>
#include <string>
using namespace std;



int main()
{
	vector<string>list;
	vector<string>ACTIONS;
	vector<string>::const_iterator iter;
	vector<string>listend;
	ACTIONS.push_back("error");
	ACTIONS.push_back("add");
	ACTIONS.push_back("del");
	ACTIONS.push_back("view");
	ACTIONS.push_back("quit");
	cout << "\t\t Welcome to \"The list of games\"\n\n";
	cout << "If you want to add a game name, enter \"add\"\n";
	cout << "If you want to delete a game name, enter \"del\"\n";
	cout << "If you want to view the name of the games, enter \"view\"\n";
	cout << "If you want to quit, enter \"quit\"\n\n";
	string answer;
	string name;
	while (true)
	{
		cout << "\nWhat do you want to do: ";
		cin >> answer;
		iter = find(ACTIONS.begin(), ACTIONS.end(), answer);
		if (iter == ACTIONS.end())
		{
			iter = ACTIONS.begin();
			cout << "\nSorry wrong action\n";
		}
		if (*iter == "add")
		{
			cout << "\nEnter the name of the game: ";
			cin >> name;
			list.push_back(name);
		}
		if (*iter == "del")
		{
			cout << "\nEnter the name of the game: ";
			cin >> name;
			iter = find(list.begin(), list.end(), name);
			if(iter==list.end())
			{
				iter = ACTIONS.begin();
				cout << "\nSorry, game not found.\n";
			}
			else
			{
				list.erase(iter);
				cout << "\nGame " << name << " delete.\n";
				iter = ACTIONS.begin();
			}
		}
		if (*iter == "view")
		{
			iter = list.begin();
			int i = 1;
			while (iter!=list.end())
			{
				cout << endl <<i<<". "<< *iter << endl ;
				iter++;
				i++;
			}
			iter = ACTIONS.begin();
		}
		if (*iter == "quit")
		{
			break;
		}
	}

    return 0;
}
Код заработал только после добавления переназначения iter = ACTIONS.begin() когда iter==list.end() или iter == ACTIONS.end(). Этого в книге нет и я считаю данное действие не правильным. Подскажите пожалуйста где я ошибся. Ведь в книге когда интерал принимает конечное значение ни каких дописок нет. Спасибо.
NikolaP вне форума Ответить с цитированием
Старый 27.04.2017, 09:32   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

iter = find(ACTIONS.begin(), ACTIONS.end(), answer);

Вот эта строчка, если ничего не нашло, то итератор равен end.
Дальше читаем что это такое - end указывает на элемент, следующий за последним (т.е. такого элемента нет).
Теперь код

iter = find(ACTIONS.begin(), ACTIONS.end(), answer);
if (*iter == "add")

если ничего не нашло, iter == end и *iter это не определенное поведение (или даже ошибка, точно читайте в хелпах).

Т.е. по умному...нада бы так

Код:
iter = find(ACTIONS.begin(), ACTIONS.end(), answer);
if (iter != ACTIONS.end())
{
   //пеленка ИФ
   if (*iter == "add")
}
else
{
   //show error
}

Последний раз редактировалось alexzk; 27.04.2017 в 09:36.
alexzk вне форума Ответить с цитированием
Старый 27.04.2017, 09:39   #3
NikolaP
Новичок
Джуниор
 
Регистрация: 27.04.2017
Сообщений: 2
По умолчанию

Спасибо за разъяснение.
NikolaP вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Pascal] нужно сформировать матрицу из векторов, вектора x,y,z должны стать столбцами матрицы, остановилась после сортировки векторов anna77777 Помощь студентам 3 07.01.2017 01:22
Вектор Векторов (с++) Deicide Помощь студентам 1 26.10.2012 10:28
Вектор векторов Freewill Visual C++ 6 19.02.2012 18:05
Ввод векторов и матриц, умножение матрицы на вектор и вычисление скалярного призведения двух векторов zverushka Помощь студентам 18 20.02.2009 15:25