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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2015, 19:16   #1
whoami30
Пользователь
 
Регистрация: 08.12.2015
Сообщений: 14
По умолчанию expression:vector subscript out of range

Написал программа, скинул в текстовый файл неотформатированный текс, все работало, как только отформатировал текст вручную появилась проблема. Подскажите пожалуйста что делаю не так?
Код:
#pragma once
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <stdlib.h>
#include<conio.h>
using namespace std;
 vector <string> zapol(char name[])
 {
	    vector<string> v;
	   string str;
	   ifstream fout(name);
	   if (!fout)
	   {
		   cout<<"Файл с исходными данными не найдет \n Создайте файл с именем "<<name<<endl;
	   }
	   else
	   {
		   while(!fout.eof())
		   {
			   getline(fout,str);
			   v.push_back(str);
		   }
	   }
	   return v;
 }
 void stran (vector <string> v)
 {
	int page = 0, maxpage = v.size() / 8 + (v.size() % 8); 
    while (page<maxpage)
    {
        system ("cls");
        for (int i = 0; i < 8; ++i)
        {
            if (page * 8+i == v.size()) break;
            cout << v[page * 8+i] << endl;
        }
		char ch;
        cout<<"\nДля перехода на следующую страницу нажмите 'n'\nДля перехода на предыдущую страницу нажмите 'b'\n ->";
		cin>>ch;
        switch(ch)
        {
                case 'n':
                    {

                        if (page+1 <= maxpage) ++page;
                        break;
                        
                    }
                case 'b':
                    {
                        if (page+1 > 0) --page;
                        break;
                    }
                default:
                    {
                        system("cls");
                        cout <<"\nОШИБКА! НЕПРАВИЛЬНОЕ НАЖАТИЕ КЛАВИШИ!"<< endl;
						system ("pause");
                    }
        }
        if (page==maxpage)
        {
            system("cls");
            cout <<"\n\n\n\n\n                             ЗАВЕРШЕНИЕ ТЕОРИИ     "<<endl;
			page=0;
			return ;
        }
    }
 }
int teor_()
{
 
   setlocale(0,"rus");
   char name[]="teoria.txt";
   vector <string> v = zapol(name);
   stran(v);
   system ("pause");
   return 0;
}
Ссылка на отформатированный документ
Ссылка на ошибку
whoami30 вне форума Ответить с цитированием
Старый 18.12.2015, 10:14   #2
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
как только отформатировал текст вручную появилась проблема.
Ну так выходите за "пределы" вектора
Croessmah вне форума Ответить с цитированием
Старый 18.12.2015, 10:26   #3
whoami30
Пользователь
 
Регистрация: 08.12.2015
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Ну так выходите за "пределы" вектора
Ну так а что сделать, чтобы не выходить? Если я верну все как было, текст будет,мягко говоря, не айс, преподаватель не примет. Как сделать так, чтобы при данном отформатированном тексте не выходить за пределы вектора????
whoami30 вне форума Ответить с цитированием
Старый 18.12.2015, 10:31   #4
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Код:
int page = 0, maxpage = v.size() / 8 + v.size() % 8
Ну вот смотрите, допустим, у нас в векторе 14 строк. Значит у нас две страницы текста всего.
Считаем по Вашей формуле:
14/8 == 1 ;
14%8 == 6 ;
1+6 == 7 ;
Итого, у Вас получилось, что страниц семь, а не две.
Предлагаю исправить на:
Код:
int page = 0, maxpage = v.size() / 8 + bool(v.size() % 8);
при приведении к bool, получим true, если еще есть остаток, и false, если остатка нет.
При приведении к int (для сложения), получим 1 или 0, соответственно.
Как общий результат, получаем +1 страница, если еще есть остаточные строки.

Последний раз редактировалось Croessmah; 18.12.2015 в 10:35.
Croessmah вне форума Ответить с цитированием
Старый 18.12.2015, 10:53   #5
whoami30
Пользователь
 
Регистрация: 08.12.2015
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Код:
int page = 0, maxpage = v.size() / 8 + v.size() % 8
Ну вот смотрите, допустим, у нас в векторе 14 строк. Значит у нас две страницы текста всего.
Считаем по Вашей формуле:
14/8 == 1 ;
14%8 == 6 ;
1+6 == 7 ;
Итого, у Вас получилось, что страниц семь, а не две.
Предлагаю исправить на:
Код:
int page = 0, maxpage = v.size() / 8 + bool(v.size() % 8);
при приведении к bool, получим true, если еще есть остаток, и false, если остатка нет.
При приведении к int (для сложения), получим 1 или 0, соответственно.
Как общий результат, получаем +1 страница, если еще есть остаточные строки.
Доходчиво. А вот если я на первой странице и введу значение 'b'- назад. Предыдущей страницы нет, получится опять выход за пределы?

Цитата:
Сообщение от whoami30 Посмотреть сообщение
Доходчиво. А вот если я на первой странице и введу значение 'b'- назад. Предыдущей страницы нет, получится опять выход за пределы?
И посоветуйте пожалуйста книгу к прочтению, где примерно как Вы объясняют

Последний раз редактировалось Stilet; 18.12.2015 в 12:39.
whoami30 вне форума Ответить с цитированием
Старый 18.12.2015, 11:01   #6
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Предыдущей страницы нет, получится опять выход за пределы?
Немного подкорректировал:
Код:
                case 'n':
                    {
                        if (page < maxpage) //Если page еще меньше максимума, то можно идти вперед
                            ++page;//Идем вперед
                        //Если же page Достиг своего апогея, то ничего не делаем
                        break;

                    }
                case 'b':
                    {
                        if (page > 0) //Если page еще больше нуля, то значит можно "идти" назад.
                            --page;// то "идем" назад.
                        //Иначе просто ничего не делаем. Таким образом останемся на этой же странице. И никакого выхода за пределы.
                        break;
                    }
Конечно, лучше не красить а переделать, ну да ладно, это же студенческая работа :-)

Цитата:
И посоветуйте пожалуйста книгу к прочтению, где примерно как Вы объясняют
Букварь и Библия, других таких не встречал

Последний раз редактировалось Stilet; 18.12.2015 в 12:39.
Croessmah вне форума Ответить с цитированием
Старый 18.12.2015, 11:09   #7
whoami30
Пользователь
 
Регистрация: 08.12.2015
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Букварь и Библия, других таких не встречал
Жаль, но в любом случае ОГРОМНОЕ СПАСИБО!
whoami30 вне форума Ответить с цитированием
Старый 18.12.2015, 11:12   #8
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Если Вам не понятно изложение в книге, возьмите другую. В другой может быть проще.
Croessmah вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
subscript out of range excel (не массив) СергейАстана Microsoft Office Excel 5 27.09.2015 22:09
Ошибка string subscript out of range Pein95 Общие вопросы C/C++ 3 04.10.2013 01:18
subscript out of range Bape}l{ka Microsoft Office Excel 2 31.10.2011 12:54
Subscript out of range amator_roma Помощь студентам 1 04.07.2011 11:32
Динамический массив - Subscript out of range Zeraim Microsoft Office Excel 2 29.11.2010 16:28