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

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

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

Author24 — интернет-сервис помощи студентам
Добрый день. Пытался решить задачу и напоролся на грабли:
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
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.09.2012, 20:09
Ответы с готовыми решениями:

Access volation при использовании vector
Есть клас в котором обявлен вектор типа string. Когда я пытаюсь его вывести в ListBox вылетает...

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

Ошибка: Out of range при использовании <vector>
void quicksort() { long long arrsize; cout &lt;&lt; &quot;Enter amount of number&gt; &quot;; cin &gt;&gt; arrsize;...

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

6
87 / 87 / 1
Регистрация: 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()) // количество элементов нечётно
1
интересующийся
311 / 282 / 93
Регистрация: 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 выполнится условие тела цикла и перейдёт к следующей инструкции. Но этого не происходит и я не пойму в чём дело.
0
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 20:56 4
Цитата Сообщение от xtorne21st Посмотреть сообщение
с этим кодом всё нормально (хотя логика, по сути страдает)
Как раз с этим куском все плохо. Он у тебя работает только благодяря тому что числа в ячейках соответвуют индексу ячейки. Если взять i+1 за границей массива - там может оказаться все что угодно начиная от любого числа, заканчивая ошибкой сегментации.

Цитата Сообщение от xtorne21st Посмотреть сообщение
Хотя по идее, при передаче значения истина инструкции if выполнится условие тела цикла и перейдёт к следующей инструкции. Но этого не происходит и я не пойму в чём дело.
Предлагаю для начала заправить первый баг и расставить скобки {}
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
01.09.2012, 21:02  [ТС] 5
Цитата Сообщение от PSIAlt Посмотреть сообщение
Как раз с этим куском все плохо. Он у тебя работает только благодяря тому что числа в ячейках соответвуют индексу ячейки. Если взять i+1 за границей массива - там может оказаться все что угодно начиная от любого числа, заканчивая ошибкой сегментации.
Так а что вы можете предложить?
0
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 21:14 6
Брать индекс, а не значение, см. пост №2
1
интересующийся
311 / 282 / 93
Регистрация: 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
// непонятный результат
0
01.09.2012, 21:51
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.09.2012, 21:51
Помогаю со студенческими работами здесь

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

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

Vector Graphics ActiveX - множество ошибок при использовании
Уважаемые коллеги, кто-то работал с сием чудом? Vector Graphics ActiveX Сайт...

Ошибка Access Violation при использовании vector внутри класса
Проблема в следующем: имеется пользовательский класс. Три поля в классе - векторы, один из которых...

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

Несколько нюансов в плате ASUS B85-PLUS
Собираю такую конфигурацию: Проц. : Intel i5-4570 Кулер для процессора: Zalman CNPS11X Performa...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru