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

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

02.09.2012, 23:02. Показов 5533. Ответов 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
2871 / 2018 / 991
Регистрация: 21.12.2010
Сообщений: 3,742
Записей в блоге: 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
2871 / 2018 / 991
Регистрация: 21.12.2010
Сообщений: 3,742
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 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. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru