Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает программма, вроде бы все правильно 
:(
    Опции темы
ctpz
Дата 20.1.2012, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 27.12.2011

Репутация: нет
Всего: нет



Задача программы вычислять площадь 3d объекта, созданного из треугольников. По какой-то причине программа доходит только до получения информации о точке х. Дальше дело не идет.

Отладчик и компилятор ошибок не выдает. Среда разработки: Dev-cpp. Компилятор: G++

Код

#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

int main()
{
    vector <float> x;
    vector <float> y;
    vector <float> z;
    vector <float> ab;
    vector <float> bc;
    vector <float> ac;
    vector <float> tr_s;
    float s;
    
    string yn;
    
    int i = 0;
    int j = 0;
    int n = 0;
    
    cout << "Начать создание объекта (y/n)" << endl;
    
    cin >> yn;
    
    while(yn == "y"){
        cout << yn << endl;
        
        cout << "Точка " << i << ":" << endl;
        
        // x
        cout << "Координата х... ";
        cin >> x[i];
        cout << endl;
        
        // y
        cout << "Координата y... ";
        cin >> y[i];
        cout << endl;
        
        // z
        cout << "Координата z... ";
        cin >> z[i];
        cout << endl;
        
        cout << "Продолжить (y/n)" << endl;
        cin >> yn;
        
        ++i;
    }
    
    while(x[j + 2] && y[j + 2] && z[j + 2]){
        // xy
        ab[j] = sqrt(pow(x[j] - y[j] - z[j], 2) + pow(x[j + 1] - y[j + 1] - z[j + 1], 2));
        
        // yz
        bc[j] = sqrt(pow(x[j + 1] - y[j + 1] - z[j + 1], 2) + pow(x[j + 2] - y[j + 2] - z[j + 2], 2));
        
        // xz
        ac[j] = sqrt(pow(x[j] - y[j] - z[j], 2) + pow(x[j + 2] - y[j + 2] - z[j + 2], 2));
        
        // tr_s
        tr_s[j] = sqrt(((ab[j] + bc[j] + ac[j]) / 2) * (((ab[j] + bc[j] + ac[j]) / 2) - ab[j]) * (((ab[j] + bc[j] + ac[j]) / 2) - bc[j]) * (((ab[j] + bc[j] + ac[j]) / 2) - ac[j]));
        
        ++j;
    }
    
    while(tr_s[n]){
        s += tr_s[n];
        ++n;
    }
    
    system("PAUSE");
    
    return 0;
}

PM MAIL   Вверх
feodorv
Дата 20.1.2012, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Честно говоря, не разбирался, но первое, что бросилось в глаза, это странное условие:
Цитата(ctpz @  20.1.2012,  18:42 Найти цитируемый пост)
    while(x[j + 2] && y[j + 2] && z[j + 2]){

Как будто координаты не могут принимать нулевого значения!
У Вас есть счётчик числа вершин i, пользуйтесь им ;)


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Albor
Дата 20.1.2012, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Обращение (x[i]) к пустому вектору.
PM MAIL ICQ   Вверх
ctpz
Дата 20.1.2012, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 27.12.2011

Репутация: нет
Всего: нет



Цитата(feodorv @ 20.1.2012,  19:01)
Честно говоря, не разбирался, но первое, что бросилось в глаза, это странное условие:
Цитата(ctpz @  20.1.2012,  18:42 Найти цитируемый пост)
    while(x[j + 2] && y[j + 2] && z[j + 2]){

Как будто координаты не могут принимать нулевого значения!
У Вас есть счётчик числа вершин i, пользуйтесь им ;)

Мне надо, чтобы максимально допустимая координата не являлась пустой.
PM MAIL   Вверх
feodorv
Дата 20.1.2012, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(ctpz @  20.1.2012,  19:09 Найти цитируемый пост)
Мне надо, чтобы максимально допустимая координата не являлась пустой. 

Не совсем понял, что значит пустая координата. Но точка (0,0,0) вполне может являться вершиной какого либо треугольника...

Цитата(Albor @  20.1.2012,  19:01 Найти цитируемый пост)
Обращение (x[i]) к пустому вектору. 

Да, наверное, нужен insert...

Это сообщение отредактировал(а) feodorv - 20.1.2012, 19:47


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ctpz
Дата 20.1.2012, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 27.12.2011

Репутация: нет
Всего: нет



Цитата(feodorv @ 20.1.2012,  19:46)
Цитата(ctpz @  20.1.2012,  19:09 Найти цитируемый пост)
Мне надо, чтобы максимально допустимая координата не являлась пустой. 

Не совсем понял, что значит пустая координата. Но точка (0,0,0) вполне может являться вершиной какого либо треугольника...

Цитата(Albor @  20.1.2012,  19:01 Найти цитируемый пост)
Обращение (x[i]) к пустому вектору. 

Да, наверное, нужен insert...

1. Но будет как-то странно, если будет куча точек (0,0,0)
2. Что такое insert
PM MAIL   Вверх
feodorv
Дата 21.1.2012, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(ctpz @  20.1.2012,  22:26 Найти цитируемый пост)
Но будет как-то странно, если будет куча точек (0,0,0)

Достаточно одной!

Цитата(ctpz @  20.1.2012,  22:26 Найти цитируемый пост)
Что такое insert 

У Вас в векторе нет памяти для x[0] (аналогично y[0], z[0], x[1], ...), совсем нет. Её либо нужно заказать, либо воспользоваться методом insert.
cplusplus.com C++ : Reference : STL Containers : vector smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Result
Дата 21.1.2012, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 15.5.2011

Репутация: 3
Всего: 5



Цитата(feodorv @ 21.1.2012,  05:37)
 Её либо нужно заказать, либо воспользоваться методом insert.

Если просто "заказать" памяти и писать в нее, будет ли вектор знать про свой состав ? К примеру if(!vect.empty()), будет работать как ожидается ? 

Это сообщение отредактировал(а) Result - 21.1.2012, 09:14
PM   Вверх
Albor
Дата 21.1.2012, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(Result @  21.1.2012,  08:12 Найти цитируемый пост)
Если просто "заказать" памяти и писать в нее, будет ли вектор знать про свой состав ? К примеру if(!vect.empty()), будет работать как ожидается ? 

Безусловно, контролировать количество валидных данных в векторе должен "хозяин" кода. Что касается данной задачи, то, как вариант, можно было создать минимальный вектор координат с количеством элементов равным трём (один треугольник), а ещё лучше использовать метод push_back(), тогда значение возвращённое методом size() будет определять количество правильных данных. 

Это сообщение отредактировал(а) Albor - 21.1.2012, 10:41
PM MAIL ICQ   Вверх
feodorv
Дата 21.1.2012, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Result @  21.1.2012,  09:12 Найти цитируемый пост)
Если просто "заказать" памяти и писать в нее, будет ли вектор знать про свой состав ?

Нет, конечно не будет. И вообще я погорячился с заказам памяти, потому что если потом делать перезаказ этой самой памяти (под бОльший объём данных), никто не будет копировать старые данные (а они в векторе не будут числиться существующими) в новую область памяти. Поэтому лучше всего (и корректней всего) пользоваться доступными методами класса vector.

И да, vect.empty() (или соответсвующий итератор) значительно лучше чем
Цитата(ctpz @  20.1.2012,  18:42 Найти цитируемый пост)
    while(x[j + 2] && y[j + 2] && z[j + 2])

или
Цитата(ctpz @  20.1.2012,  18:42 Найти цитируемый пост)
   while(tr_s[n]){

 smile 

И было бы недурно ввести какой-нибудь класс типа triangle, который описывал бы треугольник сразу (и для задания которого нужно было бы ввести сразу 9 координат трёх его вершин)....


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Result
Дата 21.1.2012, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 15.5.2011

Репутация: 3
Всего: 5



а нормальная работа проги и не дойдет до распределения памяти (только если явно не ресольвить) ибо n-ый push_back потрет нелегала.

Это сообщение отредактировал(а) Result - 21.1.2012, 14:34
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1135 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.