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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.61
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
#1

как сложить вектор с целым числом? - C++

19.11.2011, 14:26. Просмотров 2527. Ответов 28
Метки нет (Все метки)

Как к элементу вектора прибавить целое число??? Скажите плиз, очень нужно!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2011, 14:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос как сложить вектор с целым числом? (C++):

Класс "вектор" с конструкторами, позволяющими создать нулевой вектор и вектор с произвольным числом элементов - C++
Привет! Задача следующая. Нужно реализовать класс "вектор" с конструкторами, которые позволяют создать нулевой вектор и вектор с...

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

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

Заменить элементы побочной диагонали целым числом, введенным пользователем - C++
Мне нужно было создать массив и выполнить определенные задания с массивом , 2 я сделал а вот с 3 заданием проблема, ЗАДАНИЕ ГЛАСИТ:...

Написать программу, которая определяет, является ли введенная с клавиатуры строка целым числом - C++
1. Написать программу, которая определяет, является ли введенная с клавиатуры строка целым числом. 2. Дана строка символов среди...

Проверка, является ли строка целым числом? - C++
Есть готовый, и работающий код. Нужно только немного изменить: Чтобы на 25 строке вместо char k; Было char* k; #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
19.11.2011, 14:30  [ТС] #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int k1, k2, i;
int sum1=0, sum2=0;
 
for(i=0;i<stones.size();i++)
{
        if(sum1<=sum2)
        {     
                sum1+ =stones.at(i);// вот тут вот почему не работает stones.at(i) это вектор соответственно
                k1++;}
        else
        {    
                sum2+=stones.at(i);
                k2++;}
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.11.2011, 17:31 #3
может в stones ничего нет
k1 и k2 не инициализированы
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2011, 17:39 #4
Цитата Сообщение от 2008kedr2008 Посмотреть сообщение
как сложить вектор с целым числом?
Ни как. Нельзя складывать вектора с числами, матрицы с векторами и булки с гвоздями. "У Пети 8 гвоздей и 4 булки, а у Васи 2 гвоздя и 5 булок. У кого больше?" Простите, чего больше? Булок? Гвоздей? Подзатыльников за попытку съесть булку, фаршированную гвоздями? Ран из-за того, что всё таки этой фигни наелся? Мозгов у того, кто не стал этого делать?
thick_int
Заблокирован
19.11.2011, 18:37 #5
Цитата Сообщение от taras atavin Посмотреть сообщение
Ни как. Нельзя складывать вектора с числами, матрицы с векторами и булки с гвоздями. "У Пети 8 гвоздей и 4 булки, а у Васи 2 гвоздя и 5 булок. У кого больше?" Простите, чего больше? Булок? Гвоздей? Подзатыльников за попытку съесть булку, фаршированную гвоздями? Ран из-за того, что всё таки этой фигни наелся? Мозгов у того, кто не стал этого делать?
Вопрос то звучал не про сложение с вектором, а с элементом вектора.
А как сложить, да очень просто, как складываются любые два числа.
Например,
C++
1
2
3
4
5
vector<int> myvec(10, 0);
//как то еще меняем значения векторов
//...
//Прибавляем, например 5 к компоненту вектора с индексом 2
mevec[2] +=5;
Дело в том, что для этой структуры данных выбрано крайне (ИМХО) неудачное название. Это в реальности не вектор, а несколько более удобный массив.
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
19.11.2011, 20:38  [ТС] #6
хоть один разумный ответ!! подскажи пожалуйста почему не работает , могу выслать код полность!
Мне кажется что проблема в том что у меня значение вектора шаблон
Bers
Заблокирован
19.11.2011, 20:40 #7
Цитата Сообщение от 2008kedr2008 Посмотреть сообщение
Мне кажется что проблема в том что у меня значение вектора шаблон
телепатия подсказывает мне, что у тебя выход за пределы диапазона массива.
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
19.11.2011, 20:42  [ТС] #8
телепат!!! а аргументировать можешь свои ведения?
main.cpp
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 <cstdlib>
#include <iostream>
#include "method.cpp"
#include <fstream>
#include <iomanip>
using namespace std;
 
int main(int argc, char *argv[])
{
      
    ifstream input_file("file.txt"); // открываем файл с данными
    vector<selection<int> > stones; // Вектор элементов
    selection<int> e; //  структура
    while(!input_file.eof()) // перемещаем файлы в вектор
    {
      input_file>>e.x;
      stones.push_back(e);
    }
    create_lot(stones);
    arrange_lot(stones);
    arrange_bags(stones);
    for(int i=0; i<stones.size(); i++) // Вывод
      cout<<setw(3)<<stones.at(i).x<<endl;
    input_file.close();
  
    system("PAUSE");
    return EXIT_SUCCESS;
}
function.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef VIBOR
#define VIBOR
 
#include <vector>
 
using std::vector;
 
template<class T> void create_lot(vector<T>&);
template<class T> void arrange_lot(vector<T>&);
void arrange_bags(vector<T> &)
 
#endif
struct.h
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
#ifndef SELECTION
#define SELECTION
 
template<class T> 
struct selection{
  T x; // Ключ
    bool operator < (selection<T> e) // Функция сравнения
  {
     if(x < e.x)
        return true;
      else
        return false;
    
  }
int operator+(selection<T> e)
{   return (x+e.x);
                    }
bool operator <= (selection<T> e) // Функция сравнения
  {
     if(x <= e.x)
        return true;
      else
        return false;
    
  }
};
#endif
method.cpp
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
53
54
55
56
57
58
59
60
#include "struct.h"
#include <vector>
#include <iostream>
using std::vector;
using std::cout;
using std::endl;
 
 
template<class T> 
void create_lot(vector<T> &stones) //создание массива весов камней
{
        cout<<stones.size()<<" Number of stones. They weigh:\n";
        for(int k=0;k < stones.size();k++);
}
 
template<class T> 
void arrange_lot(vector<T> &stones) //сортировка по убыванию
{
int i,j;
T temp;
 
for(i=0;i < stones.size()-1;i++)
        for(j=i+1; j < stones.size() ;j++)    
                if(stones.at(i) < stones.at(j))
                    {   temp = stones.at(i);
                        stones.at(i) = stones.at(j);
                        stones.at(j) = temp;  }
                        
}
template<class T> 
void arrange_bags(vector<T> &stones) //создает две кучи более близкие по размеру
{
int k1, k2, i;
T sum1, sum2;
sum1 =stones.at(0);
sum2 =stones.at(0);
//T bag1[stones.size()-1],bag2[stones.size()-1];
for(i=0;i<stones.size();i++)
{
        if(sum1<=sum2)
        {      // bag1[k1]=stones.at(i);
                sum1 =stones.at(i+sum1);
                k1++;}
        else
        {     //  bag2[k2]=stones.at(i);
                sum2+=stones.at(i);
                k2++;}
}
if(sum1/sum2 <=2)
{       cout<<"\n heap 1: ";
        for(i=0;i<k1;i++)
                //cout<<bag1[i]<<"  ";
        cout<<"\n weigh 1: "<<sum1<<endl;
        cout<<"\n heap2: ";
        for(i=0;i<k2;i++)
                //cout<<bag2[i]<<"  ";
        cout<<"\n weigh 2: "<<sum2<<endl;
}
else cout<<"more 2\n";
}
Bers
Заблокирован
19.11.2011, 20:53 #9
Цитата Сообщение от 2008kedr2008 Посмотреть сообщение
телепат!!! а аргументировать можешь свои ведения?
Конечно могу: 99,9999% всех крушений в рантайме при работе метода вектора at() происходит по причине того, что метод бросил исключение, которое никто не обработал.

Исключение он бросает (если ты не в курсе), при попытке доступа к элементу вне допустимого диапазона.

Но вообще то, я не люблю включать режим телепатии.

Если человек не в состоянии умишком своим понять, что люди мысли не читают, то даже хороший программист не видя кода, не сможет сказать, как исправить код. Особенно если сам автор ничего толком про эту ошибку не сообщил

Описание ошибки "что-то не работает" - это афигительно информативное описание. Ага.

Может хватит уже тупить то?
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
19.11.2011, 20:55  [ТС] #10
все понял=))) код просто лежал уже два дня!!! вот он.. если не сложно скажите мне в чем косяк!
Bers
Заблокирован
19.11.2011, 21:09 #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for(i=0;i<stones.size();i++)
{
           if(sum1<=sum2)
           {        // bag1[k1]=stones.at(i);
                      sum1 =stones.at(i+sum1); 
 
                //чему будит равняться индекс массива, 
                //когда i станет равным stones.size()-1 ?
 
 
                      k1++;}
           else
          {    //    bag2[k2]=stones.at(i);
                      sum2+=stones.at(i);
                      k2++;}
}
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
19.11.2011, 21:24  [ТС] #12
эээ. не пойму вопроса!
Bers
Заблокирован
19.11.2011, 21:26 #13
Цитата Сообщение от Bers Посмотреть сообщение
sum1 =stones.at(i+sum1);
Обращение к элементу вектора видишь?

Ты этот код сам писал?
Ты вообще понимаешь, что тут происходит?

Ты осознаешь по какому индексу идёт обращение к элементу вектора?
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
19.11.2011, 21:27  [ТС] #14
это уже идет по моему версия "от безисходности"
должно быть так
C++
1
2
3
4
5
6
7
8
9
10
for(i=0;i<=stones.size();++i)
{
        if(sum1<=sum2)
        {      // bag1[k1]=stones.at(i);
                sum1+=stones.at(i);
                k1++;}
        else
        {     //  bag2[k2]=stones.at(i);
                sum2+=stones.at(i);
                k2++;}
Bers
Заблокирован
19.11.2011, 21:32 #15
Цитата Сообщение от 2008kedr2008 Посмотреть сообщение
for(i=0;i<=stones.size();++i)
А вот здесь у вас последнее i в цикле будит равна size() вектора.

Тоесть, если вектор содержит всего 10 элементов, то на последней итерации цикла будит обращение к 10 элементу.

Я не знаю, ты вообще в курсе, или нет, но вектор это на самом деле массив. У него элементы индексируются с нуля, а не с единичке.

То есть, если в векторе 10 элементов, то они будит иметь индексы 0...9
Девятый - последний. Десятого уже нету.

А у тебя последняя i равна size()

у тебя идет обращение к элементу уже за пределами диапазона.
Ты считаешь это правильно? Так и должно было бы быть?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2011, 21:32
Привет! Вот еще темы с ответами:

Сложить модули элементов строк матрицы и сформировать из них вектор V - C++
Помогите, пожалуйста: дана матрица А размера n на n. Нужно сформировать вектор V, элементами которого являются суммы модулей элементов...

Вектор векторов с различным числом элементов в каждом внутреннем векторе - C++
Здравствуйте, возникла такая проблема: нужно написать программу которая на экран выводит таблицу значений, используя структуру вектор, при...

Есть n-значное число нужно сложить сложить все его цифры - C++
Как такое реализовать?

Сложить попарно элементы массива, последний сложить с первым - C++
помогите, пожалуйста, попарно сложить элементы массива x, последний элемент сложить с первым и записать результат в массив y


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

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

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