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

Несколько нюансов при использовании <vector> и управляющих инструкций - C++

Восстановить пароль Регистрация
 
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
01.09.2012, 20:09     Несколько нюансов при использовании <vector> и управляющих инструкций #1
Добрый день. Пытался решить задачу и напоролся на грабли:
C++
1
2
3
4
5
6
7
8
9
10
11
12
 // вычислим и отобразим сумму каждых смежных элементов в векторе.
  int sum = 0;
  vector<int>::size_type last = ivec.size();
  last = last - 1; // соответствует нумерации объектов начиная с нуля
  for(vector<int>::size_type i = 0; i < ivec.size(); ++i) {
    //    if (!(last % 2)) // работает не корректно
   if (ivec[i+1] > ivec.size()) // количество элементов нечётно
      cout << ivec[i] << " have no pair" << endl;
   else sum = ivec[i] + ivec[i+1];   
   cout << sum << endl;
  }
  cout << endl;
В одном случаи инструкция if работает корректно, а в другой не переходит к следующей инструкции и "зацикливается" пока не пройдёт весь цикл for. Вроде бы во всех случаях при возвращении false должно перейти к следующей инструкции...
И второй момент: в этом же коде выводиться на экран последний объект вектора, хотя цикл уже закончился. Помогите пожалуйста разобраться без всяких "наворотов" - это только 100 страница учебника.

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
42
43
44
45
46
47
48
49
50
51
52
/* pg. 120; ex. 3.13
Прочитайте в вектор набор целых чисел. Вычислите и отобразите сумму каждой
пары смежных элементов в векторе. Если количество элементов нечётно, сообщите
пользователю от этом и отобразите значение последнего элемента без
суммирования. Отобразите программу так, чтобы она отобразила сумму первого и
последнего элементов, затем сумму второго и последнего и т.д. */
 
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
  int a;
  cout << "Please, enter quantity numbers: " << endl;
  cin >> a;
  vector<int> ivec(a);
 
  cout << "digits are: " << endl;
  // объявим содержимое вектора значениями от 0 до а
  for(vector<int>::size_type i = 0; i != ivec.size(); ++i) {
    ivec[i] = i; /* т.к. в векторе уже инициализированы объекты значением 0,
            просто объявим им новое значение */
    cout << ivec[i] << ' '; // и отобразим значение каждого элемента  
  }
  cout << '\n' << endl;
 
  // вычислим и отобразим сумму каждых смежных элементов в векторе.
  int sum = 0;
  vector<int>::size_type last = ivec.size();
  last = last - 1; // соответствует нумерации объектов начиная с нуля
  for(vector<int>::size_type i = 0; i < ivec.size(); ++i) {
    //    if (!(last % 2)) // работает не корректно
   if (ivec[i+1] > ivec.size()) // количество элементов нечётно
      cout << ivec[i] << " have no pair" << endl;
   else sum = ivec[i] + ivec[i+1];   
   cout << sum << endl;
  }
  cout << endl;
 
  // изменение в программе (см. условие)
  // вычислим и отобразим сумму каждого объекта с последним
  sum = 0;
  last = ivec.size();
  last = last - 1;
  for(vector<int>::size_type i = 0; i < ivec.size(); ++i) {
    sum = ivec[i] + ivec[last];
    cout << sum << endl;
  }
  cout << endl;
  return 0;
}
Результат:
Please, enter quantity numbers: 10

digits are:
0 1 2 3 4 5 6 7 8 9

1
3
5
7
9
11
13
15
17
9

9
10
11
12
13
14
15
16
17
18

Результат 2:
Please, enter quantity numbers: 11

digits are:
0 1 2 3 4 5 6 7 8 9 10

1
3
5
7
9
11
13
15
17
19
10 have no pair
19

10
11
12
13
14
15
16
17
18
19
20
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2012, 20:09     Несколько нюансов при использовании <vector> и управляющих инструкций
Посмотрите здесь:

Вызов конструктора с несколькими параметрами при использовании push_back() в vector'е C++
C++ error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main
C++ vector выдает странные строки при использовании push_back
C++ Ошибка при использовании vector в заголовке функции
C++ Ошибка при использовании vector<bool>
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 20:17     Несколько нюансов при использовании <vector> и управляющих инструкций #2
Полагаю вместо
C++
1
   if (ivec[i+1] > ivec.size()) // количество элементов нечётно
ты имел ввиду
C++
1
   if ( (i+1) > ivec.size()) // количество элементов нечётно
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
01.09.2012, 20:35  [ТС]     Несколько нюансов при использовании <vector> и управляющих инструкций #3
с этим кодом всё нормально (хотя логика, по сути страдает), я имел тот случай, который закоментирован:
C++
1
 if (!(last % 2)) // работает не корректно
Он более логичен, но при его использовании выдаст следующий результат:
0 have no pair
0
1 have no pair
0
2 have no pair
0
3 have no pair
0
4 have no pair
0
5 have no pair
0
6 have no pair
0
7 have no pair
0
8 have no pair
0

Добавлено через 3 минуты
Хотя по идее, при передаче значения истина инструкции if выполнится условие тела цикла и перейдёт к следующей инструкции. Но этого не происходит и я не пойму в чём дело.
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 20:56     Несколько нюансов при использовании <vector> и управляющих инструкций #4
Цитата Сообщение от xtorne21st Посмотреть сообщение
с этим кодом всё нормально (хотя логика, по сути страдает)
Как раз с этим куском все плохо. Он у тебя работает только благодяря тому что числа в ячейках соответвуют индексу ячейки. Если взять i+1 за границей массива - там может оказаться все что угодно начиная от любого числа, заканчивая ошибкой сегментации.

Цитата Сообщение от xtorne21st Посмотреть сообщение
Хотя по идее, при передаче значения истина инструкции if выполнится условие тела цикла и перейдёт к следующей инструкции. Но этого не происходит и я не пойму в чём дело.
Предлагаю для начала заправить первый баг и расставить скобки {}
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
01.09.2012, 21:02  [ТС]     Несколько нюансов при использовании <vector> и управляющих инструкций #5
Цитата Сообщение от PSIAlt Посмотреть сообщение
Как раз с этим куском все плохо. Он у тебя работает только благодяря тому что числа в ячейках соответвуют индексу ячейки. Если взять i+1 за границей массива - там может оказаться все что угодно начиная от любого числа, заканчивая ошибкой сегментации.
Так а что вы можете предложить?
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 21:14     Несколько нюансов при использовании <vector> и управляющих инструкций #6
Брать индекс, а не значение, см. пост №2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 21:51     Несколько нюансов при использовании <vector> и управляющих инструкций
Еще ссылки по теме:

C++ Visual Studio сообщает о пропуске инструкций при поиске stdafx.h
Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>) C++
При использовании push_back для vector-а, все предыдущие элементы перезаписываются C++

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

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
01.09.2012, 21:51  [ТС]     Несколько нюансов при использовании <vector> и управляющих инструкций #7
Результат остался прежним, может код (логика) немного улучшился:
// вычислим и отобразим сумму каждых смежных элементов в векторе.
C++
1
2
3
4
5
6
7
8
9
10
  int sum = 0;
  vector<int>::size_type last = ivec.size();
  last = last - 1; // соответствует нумерации объектов начиная с нуля
  for(vector<int>::size_type i = 0; i < ivec.size(); ++i) {
    //    if (!(last % 2)) // работает не корректно
      if ((i+1) > ivec.size()) // количество элементов нечётно
      cout << ivec[i] << " have no pair" << endl;
   else sum = ivec[i] + ivec[i+1];   
   cout << sum << endl;
  }
Случай номер раз - вводим число 10:
Please, enter quantity numbers: 10

digits are:
0 1 2 3 4 5 6 7 8 9

1
3
5
7
9
11
13
15
17
9
// всё также выводит значение последнего объекта вектора

Случай номер два - число 9:
Please, enter quantity numbers: 9

digits are:
0 1 2 3 4 5 6 7 8

1
3
5
7
9
11
13
15
135137
// непонятный результат
Yandex
Объявления
01.09.2012, 21:51     Несколько нюансов при использовании <vector> и управляющих инструкций
Ответ Создать тему
Опции темы

Текущее время: 08:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru