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

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

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

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

02.09.2012, 23:02. Просмотров 1437. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2012, 23:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Итератор и проверка на чётность/нечётность (C++):

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

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

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

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

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

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

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

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

И в одном хедере не обязательно лежит один класс; там может быть что угодно. Да итераторы бывают разных типов. <iterator> содержит кроме них заодно и прототип этой функции, и других тоже.
1
alsav22
5421 / 4816 / 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 - попытка присвоить переменной значение, лежащее за границей вектора.
1
xtorne21st
интересующийся
304 / 275 / 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;
}
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 20:59 #10
Ваш код с этим исправлением:
C++
1
if (iter == ivec.end() - 1)
работает правильно. Проверял.
0
igorrr37
1647 / 1275 / 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;
}
1
alsav22
5421 / 4816 / 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;
}
Что не устраивает? Могу объяснить, почему при этом исправлении ошибок уже нет.
1
Миниатюры
Итератор и проверка на чётность/нечётность   Итератор и проверка на чётность/нечётность   Итератор и проверка на чётность/нечётность  

xtorne21st
интересующийся
304 / 275 / 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 забыл)
0
alsav22
5421 / 4816 / 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().
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
03.09.2012, 22:01  [ТС] #15
огромное СПАСИБО! Всё разжёвано до мелочей
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2012, 22:01
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
03.09.2012, 22:01
Ответ Создать тему
Опции темы

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