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

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

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

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

01.09.2012, 20:09. Просмотров 476. Ответов 6
Метки нет (Все метки)

Добрый день. Пытался решить задачу и напоролся на грабли:
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> и управляющих инструкций (C++):

Ошибка при использовании vector<bool> - C++
Текст ошибки (Visual studio 2013): Ошибка 2 error C2440: return: невозможно преобразовать...

Ошибка при использовании vector в заголовке функции - C++
/home/motoroller/qtProjects/laba1/main.cpp:8: ошибка: 'std::vector' is not a type bool extract_class_head(string str, std::vector...

Ошибка при использовании erase для std::vector - C++
Почему в случае удаления элемента из вектора с помощью передачи итератора в erase, который соответствует позиции удаляемого элемента...

vector выдает странные строки при использовании push_back - C++
Вот что я получаю *** Error in `./main': double free or corruption (!prev): 0x0000000001994a70 *** ======= Backtrace: ========= ...

Вызов конструктора с несколькими параметрами при использовании push_back() в vector'е - C++
Ситуация: #include &lt;vector&gt; class bar { public: bar(); bar(int); bar(int, int); //&lt;...&gt; };

При использовании push_back для vector-а, все предыдущие элементы перезаписываются - C++
Доброго времени суток,хочу поместить в вектор пути к файлам в определенной директории. Но когда отлажываю программу то вижу что все...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 20:17 #2
Полагаю вместо
C++
1
   if (ivec[i+1] > ivec.size()) // количество элементов нечётно
ты имел ввиду
C++
1
   if ( (i+1) > ivec.size()) // количество элементов нечётно
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
01.09.2012, 20:35  [ТС] #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
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 20:56 #4
Цитата Сообщение от xtorne21st Посмотреть сообщение
с этим кодом всё нормально (хотя логика, по сути страдает)
Как раз с этим куском все плохо. Он у тебя работает только благодяря тому что числа в ячейках соответвуют индексу ячейки. Если взять i+1 за границей массива - там может оказаться все что угодно начиная от любого числа, заканчивая ошибкой сегментации.

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

При include<vector> не включает и не видит vector - C++
Не видит vector: //--ClassNeuron.h #ifndef NEURON_H #define NEURON_H #include &lt;cstdlib&gt; #include...

Visual Studio сообщает о пропуске инструкций при поиске stdafx.h - C++
На любую программу студия ругается, выдает всегда одну ошибку. Скриншот привожу ниже. Почему так происходит? Пробовал разные программы,...

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main - C++
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt; #include &lt;stdlib.h&gt; #include &lt;fstream&gt;...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>) - C++
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...


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

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

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