Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

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

02.09.2012, 23:02. Просмотров 1340. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2012, 23:02     Итератор и проверка на чётность/нечётность
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
02.09.2012, 23:11     Итератор и проверка на чётность/нечётность #2
Итераторы ничего не знают о своем контейнере. Соответственно я думаю и об индексах в нем тоже...
Судя по условию
Если количество элементов нечётно, сообщите пользователю
от этом и отобразите значение последнего элемента без суммирования.
Тебе просто нужно сверятьcя с ivec.size()
igorrr37
1641 / 1269 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
02.09.2012, 23:37     Итератор и проверка на чётность/нечётность #3
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;
}
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
03.09.2012, 00:02  [ТС]     Итератор и проверка на чётность/нечётность #4
Цитата Сообщение от PSIAlt Посмотреть сообщение
Тебе просто нужно сверятьcя с ivec.size()
точно, должно получиться

Добавлено через 1 минуту
Цитата Сообщение от igorrr37 Посмотреть сообщение
std::distance
эта функция мне не знакома, хотя смысл её ясен. Какому классу она принадлежит? Хотя по коду кажется что к iterator
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.09.2012, 00:09     Итератор и проверка на чётность/нечётность #5
Ни к какому, она глобальная. Работает на всех итераторах.
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
03.09.2012, 00:11  [ТС]     Итератор и проверка на чётность/нечётность #6
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ни к какому, она глобальная. Работает на всех итераторах.
тогда в таком случаи зачем был объявлен заголовок <iterator>?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.09.2012, 00:16     Итератор и проверка на чётность/нечётность #7
То, что она глобальная, ещё не значит, что она входит в стандартное ядро языка и не надо подключать нужные хедеры.

И в одном хедере не обязательно лежит один класс; там может быть что угодно. Да итераторы бывают разных типов. <iterator> содержит кроме них заодно и прототип этой функции, и других тоже.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 03:28     Итератор и проверка на чётность/нечётность #8
29 строку напишите так:
C++
1
if (iter == ivec.end() - 1)
и всё будет работать. В последней итерации цикла, когда iter указывает на последний элемент вектора (ivec.end() - это уже за последним элеметном), в 32 строке выход за границу вектора, в 33 - попытка присвоить переменной значение, лежащее за границей вектора.
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
03.09.2012, 20:10  [ТС]     Итератор и проверка на чётность/нечётность #9
Цитата Сообщение от 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;
}
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 20:59     Итератор и проверка на чётность/нечётность #10
Ваш код с этим исправлением:
C++
1
if (iter == ivec.end() - 1)
работает правильно. Проверял.
igorrr37
1641 / 1269 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
03.09.2012, 21:09     Итератор и проверка на чётность/нечётность #11
эту ф-цию можно заменить разностью итераторов
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;
}
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 21:09     Итератор и проверка на чётность/нечётность #12
Вот ваш код, с этим испрвлением, и результат его работы:
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;
}
Что не устраивает? Могу объяснить, почему при этом исправлении ошибок уже нет.
Миниатюры
Итератор и проверка на чётность/нечётность   Итератор и проверка на чётность/нечётность   Итератор и проверка на чётность/нечётность  

xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
03.09.2012, 21:40  [ТС]     Итератор и проверка на чётность/нечётность #13
Да, будте добры разтолкуйте функции кода:
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 забыл)
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 21:46     Итератор и проверка на чётность/нечётность #14
При нечётном числе. Последняя итерация. Пары обработаны, в цикле 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().
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
03.09.2012, 22:01  [ТС]     Итератор и проверка на чётность/нечётность #15
огромное СПАСИБО! Всё разжёвано до мелочей
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2012, 22:09     Итератор и проверка на чётность/нечётность
Еще ссылки по теме:

Определить чётность числа - C++
Кто чем может Зачет скоро, а все сам сделать не успеваю. Все задания этого пункта нужно выполнить, используя оператор switch. 1....

Чётность трёх чисел - C++
Помогите пожалуйста написать программу, которая выводит &quot;Да&quot; или &quot;Нет&quot; в зависимости от того имеют ли три заданных числа одинаковую...

Программа для проверки цифр в числе на чётность - C++
как проверить каждую цифру в четырёхзначном числе на чётность без массива в DevC++ Я написал программу, которая делает это действие в...

Используя алгоритм adjacent_find, обнулить первую пару соседних элементов вектора, имеющих одинаковую чётность - C++
Дан вектор V. Обнулить первую пару соседних элементов, имеющих одинаковую четность. Например, список 1, 2, 3, 4, 6, 8, 3, 1 должен быть...

итератор - C++
скажите как в этой задачи перевести десятичное число в двоичное??? вот условие задачи!!! вот код!! main.h #include &lt;cstdlib&gt; ...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 22:09     Итератор и проверка на чётность/нечётность #16
До кучи. Если исправления нет. Нечётное число элементов. В последней итерации цикла, когда iter равен end() - 1 и указывает на последний элемент вектора , захода в if не будет (условие захода равенсто end()), а будет заход в else. Там итератор увеличится, станет равным end(), т.е. будет указывать на область за границей вектора. Дальше будет попытка присвоить значение из этой области переменной second, что вызовет ошибку.
Yandex
Объявления
03.09.2012, 22:09     Итератор и проверка на чётность/нечётность
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru