С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056

Итератор и проверка на чётность/нечётность

02.09.2012, 23:02. Показов 5546. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Не получается организовать проверку на нечётное количество. При вводе нечётного количества данных программа выдаёт ошибку. Последнюю часть задания прошу не делать, а помочь только с организацией проверки. Сильно "заумный" код прошу не предлагать т.к. только 120 страница учебника для начинающих.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* pg. 124; ex. 3.17 part 1
Прочитайте в вектор набор целых чисел. Вычислите и отобразите 
сумму каждой пары смежных элементов в векторе. 
Если количество элементов нечётно, сообщите пользователю
от этом и отобразите значение последнего элемента без суммирования.
Отобразите программу так, чтобы она отобразила сумму первого и
последнего элементов, затем сумму второго и последнего и т.д. 
Организация кода должна осущесвиться при помощи итератора */
 
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
  vector<int> ivec;
  int digit;
 
  // прочитаем в вектор набор целых чисел
  while(cin >> digit)
    ivec.push_back(digit);
  cout << endl;
    
  // высчитаем смежные числа
  int first, second;
  for(vector<int>::iterator iter = ivec.begin();
      iter != ivec.end(); ++iter) {
    first = *iter;
    if (iter == ivec.end()) // ошибка! результат не удовлетворителен, ошибка при выполнении программы
      cout << first << " have not pair";
    else {   
      ++iter;
      second = *iter;
      cout << first + second << ' ';
    }
  }
  cout << endl;
 
 
  return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.09.2012, 23:02
Ответы с готовыми решениями:

Проверка числа на чётность/нечётность
Подскажите пожалуйста молодому-неопытному как проверить в С++ чётное число или нечётное? Есть какя-то специальная функция?

Проверка числа типа double на чётность/нечётность
В программе необходимо проверить число типа double на то, является оно четным или нет. Это возможно как-то сделать или нет? Обычный метод,...

Не могу понять, как работает проверка на нечётность
Программа призвана выводить на консоль элементы массива с нечётными значениями. Проверка на нечётность здесь весьма нетрадиционна....

15
 Аватар для PSIAlt
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
02.09.2012, 23:11
Итераторы ничего не знают о своем контейнере. Соответственно я думаю и об индексах в нем тоже...
Судя по условию
Если количество элементов нечётно, сообщите пользователю
от этом и отобразите значение последнего элемента без суммирования.
Тебе просто нужно сверятьcя с ivec.size()
1
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,743
Записей в блоге: 9
02.09.2012, 23:37
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <vector>
#include <iostream>
#include <iterator>
 
int main()
{
    std::vector<int> v;
    int num;
    while(std::cin >> num)
    {
        v.push_back(num);
    }
    std::vector<int>::const_iterator citBeg(v.begin()), citEnd(v.end());
    for(; std::distance(citBeg, citEnd) >= 2; citBeg += 2)
    {
        std::cout << *citBeg + *(citBeg + 1) << "  ";
    }
    if(citBeg != citEnd)
    {
        std::cout << *citBeg << "\nHasn't pair" << std::endl;
    }
    return 0;
}
1
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
03.09.2012, 00:02  [ТС]
Цитата Сообщение от PSIAlt Посмотреть сообщение
Тебе просто нужно сверятьcя с ivec.size()
точно, должно получиться

Добавлено через 1 минуту
Цитата Сообщение от igorrr37 Посмотреть сообщение
std::distance
эта функция мне не знакома, хотя смысл её ясен. Какому классу она принадлежит? Хотя по коду кажется что к iterator
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
03.09.2012, 00:09
Ни к какому, она глобальная. Работает на всех итераторах.
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
03.09.2012, 00:11  [ТС]
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ни к какому, она глобальная. Работает на всех итераторах.
тогда в таком случаи зачем был объявлен заголовок <iterator>?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
03.09.2012, 00:16
То, что она глобальная, ещё не значит, что она входит в стандартное ядро языка и не надо подключать нужные хедеры.

И в одном хедере не обязательно лежит один класс; там может быть что угодно. Да итераторы бывают разных типов. <iterator> содержит кроме них заодно и прототип этой функции, и других тоже.
1
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 03:28
29 строку напишите так:
C++
1
if (iter == ivec.end() - 1)
и всё будет работать. В последней итерации цикла, когда iter указывает на последний элемент вектора (ivec.end() - это уже за последним элеметном), в 32 строке выход за границу вектора, в 33 - попытка присвоить переменной значение, лежащее за границей вектора.
1
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
03.09.2012, 20:10  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
1
if (iter == ivec.end() - 1)
я так понял, что при применении инструкции if в теле цикла приведёт к логической ошибке. Даже если количество операндов чётное, будет обращение инструкции if к ivec.end, что приведёт к ошибке. Нужно организовать код таким образом, что если итератор обращается к ivec.end, цикл прекратился и вывело сообщение о том, что последний операнд не имеет пары. Версия представленная уважаемым igorrr37 безусловно решает задачу, но мне бы хотелось узнать как можно организовать код без всяких "наворотов" типа функции distance().

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
  vector<int> ivec;
  int digit;
 
  // прочитаем в вектор набор целых чисел
  while(cin >> digit)
    ivec.push_back(digit);
  cout << endl;
  
  int first, second;
  for(vector<int>::iterator iter = ivec.begin();
      iter != ivec.end(); ++iter) {
    first = *iter;
    ++iter;
    second = *iter;
    cout << first + second << ' ';
  }
  cout << endl;
    
  return 0;
}
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 20:59
Ваш код с этим исправлением:
C++
1
if (iter == ivec.end() - 1)
работает правильно. Проверял.
0
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,743
Записей в блоге: 9
03.09.2012, 21:09
эту ф-цию можно заменить разностью итераторов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
  vector<int> ivec;
  int digit;
  while(cin >> digit)
    ivec.push_back(digit);
  cout << endl;
  int first;
  for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
  {
    first = *iter++;
    if(iter != ivec.end())
    {
        cout << first + *iter << "  ";
    }
    else
    {
        cout << first << " - Without pair" << std::endl;
        break;
    }
  }
  cout << endl;
  return 0;
}
1
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 21:09
Вот ваш код, с этим испрвлением, и результат его работы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
  vector<int> ivec;
  int digit;
 
  // прочитаем в вектор набор целых чисел
  while(cin >> digit)
    ivec.push_back(digit);
  cout << endl;
    
  // высчитаем смежные числа
  int first, second;
  for(vector<int>::iterator iter = ivec.begin();
      iter != ivec.end(); ++iter) {
    first = *iter;
    if (iter == ivec.end() - 1) 
      cout << first << " have not pair";
    else {   
      ++iter;
      second = *iter;
      cout << first + second << ' ';
    }
  }
  cout << endl;
 
  system("pause");
  return 0;
}
Что не устраивает? Могу объяснить, почему при этом исправлении ошибок уже нет.
Миниатюры
Итератор и проверка на чётность/нечётность   Итератор и проверка на чётность/нечётность   Итератор и проверка на чётность/нечётность  

1
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
03.09.2012, 21:40  [ТС]
Да, будте добры разтолкуйте функции кода:
C++
1
if (iter == ivec.end() - 1)
Добавлено через 16 минут
Цитата Сообщение от igorrr37 Посмотреть сообщение
эту ф-цию можно заменить разностью итераторов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
  vector<int> ivec;
  int digit;
  while(cin >> digit)
    ivec.push_back(digit);
  cout << endl;
  int first;
  for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
  {
    first = *iter++;
    if(iter != ivec.end())
    {
        cout << first + *iter << "  ";
    }
    else
    {
        cout << first << " - Without pair" << std::endl;
        break;
    }
  }
  cout << endl;
  return 0;
}
Да, за break забыл)
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 21:46
При нечётном числе. Последняя итерация. Пары обработаны, в цикле for() итератор увеличится и станет равным end() - 1. Это указатель на последний элемент. Так как итератор равен end() - 1, то будет заход в if. Там последний элемент выведется на консоль с надписью: " have not pair". В else захода нет. В for итератор увеличивается, становится равным end(). Выход из for(). При чётном числе. Последняя итерация. В цикле for() итератор увеличится и станет равным end() - 2. Это указатель на последнюю пару. В 19 строке значение первого элемента пары сохраняется. Так как итератор равен end() - 2, то захода в if не будет, а будет заход в else. Там итератор увеличится и станет указывать на последний элемент (второй элемент пары) (end() - 1). В следующей строке, значение этого элемента сохраняется, дальше он складывается с первым элементом пары (сохранённым в 19 строке) и сумма выводится. В for итератор увеличивается, становиться равным end(). Выход из for().
1
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
03.09.2012, 22:01  [ТС]
огромное СПАСИБО! Всё разжёвано до мелочей
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 22:09
До кучи. Если исправления нет. Нечётное число элементов. В последней итерации цикла, когда iter равен end() - 1 и указывает на последний элемент вектора , захода в if не будет (условие захода равенсто end()), а будет заход в else. Там итератор увеличится, станет равным end(), т.е. будет указывать на область за границей вектора. Дальше будет попытка присвоить значение из этой области переменной second, что вызовет ошибку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.09.2012, 22:09
Помогаю со студенческими работами здесь

Проверка числа на чётность
Какой из этих способов работает быстрее if (!(a%2)) или if (!(a&amp;1))

Проверка введенного числа на чётность
Написать программу, которая проверяет, является ли введенное пользователем целое число четным. Хэлп ми плз )

Проверка чисел на чётность или наоборот, дальнейший вывод
Написать программу, в которой вводятся 3 числа: А,В,С. Если среди них имеется хотя бы одно четное вычислить максимальное, иначе –...

Реализовать двусвязный список (list), итератор (iterator) и константный итератор (сonst_iterator) для списка
не могу понять что должно быть результатом. может подскажете примеры? пожалуйста. Задание: Реализовать двусвязный список (list),...

Как проверить значение на нечётность и отрицательность?
Как проверить значение на нечётность и отрицательность? if((i&gt;0)&amp;&amp;(i%(-2)==0)) return Invalid; else ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru