2010-10-16 5 views
0

alt text // Вычислить четверти набора целых чиселПочему моя прога не работает правильно?

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <conio.h> 

using std::cin; 
using std::cout; 
using std::endl; 
using std::vector; 
using std::sort; 

int main() 
{ 
// Ask for a set of integers 
cout << "Please input a set of integers: " 
    << endl; 

// Read the set of integers 
    // x is the variable to write 
int x; 
    // int_set is the set of integers to write 
vector<int> int_set; 
while (cin >> x) 
    { 
    int_set.push_back(x); 
    } 

// Check if the integer set is vacant 
typedef std::vector<int>::size_type vec_sz; 
vec_sz size = int_set.size(); 
if (size == 0) 
    cout << "There are no data. " 
    << "Please try again. "; 

// Sort 
sort (int_set.begin(), int_set.end()); 

// The set of integers multiply 1/4 
vector<double> int_set_quarter; 
cout << "The quarters of the set of integers are: "; 
for (int i = 0; i != size; ++i) 
    { 
    int_set_quarter[i] = 1/4 * int_set[i]; 
    cout << int_set_quarter[i]; 
    cout << endl; 
    } 

    getch(); 
return 0; 
} 

Если вы бежите, то он развалится ...

+0

Кстати, если вы потрудились провести примитивный отладочный сеанс, вы бы нашли ответ самостоятельно. –

ответ

2

int_set_quarter «s размер 0 и индексировать на нем. Изменение

vector<double> int_set_quarter; 

в

vector<double> int_set_quarter(size); 
+0

как исправить? – Darson

+0

@ Эрик: Что значит: как это исправить? если вы измените строки, как я сказал, все будет хорошо. –

+0

Да, вы правы. – Darson

0

Проблема заключается в следующем:

vector<double> int_set_quarter; 
int_set_quarter[0] = 0.25; 

Этот код будет врезаться, потому что int_set_quarter вектор не имеет 0-й элемент. Вы уже знаете, как это исправить (вы использовали то же самое в своем int_set векторе). Вы добавляете элементы в конец вектора с помощью метода push_back. Вы также можете использовать метод Армена по настройке размера вектора изначально через его конструктор.

Но в этом конкретном примере вам это не нужно. Вы никогда не использовать int_set_quarter вектор, так что вы можете сделать это:

// The set of integers multiply 1/4 
cout << "The quarters of the set of integers are: "; 
for (int i = 0; i != size; ++i) 
{ 
    double quarter = 1/4 * int_set[i]; 
    cout << quarter; 
    cout << endl; 
} 
+0

Это действительно хороший метод. – Darson

0

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

Вы можете зарезервировать необходимое пространство в векторе, обеспечивая количество необходимых элементов при creating the vector, позвонив по телефону или reserveresize, или с помощью push_back, чтобы добавить элемент в конец вектора ...

... или, так как вы ничего не делаете с int_set_quarter после цикла, вы можете просто рассчитать, что вам нужно для вывода для этой итерации в локальную переменную sa, показанной Dean.

Смежные вопросы