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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Логарифм - Исключения[C++] 
:(
    Опции темы
ArniLand
Дата 3.5.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Написал программу подсчитывает логарифм вида lg(2*c-a)+d-152)/(a/4+c) и обрабатывает возможные исключительные ситуации по следующему заданию. Какие буду замечание к программе, что стоит переделать в программе и т.д.
1. Описание класса:
Переменные - операнды выражения; конструкторы; методы установления значений объекта, вычисления выражения,  выведения объекта
2. Задание  - Создать массив объектов; вычислить выражение для каждого объекта, вывести результат.

Код программы:
Код

//Logarifm.h
class Logarifm
{
private:
    double a;
    double c;
    double d;
    double F;
public:
    Logarifm(double a1, double c1, double d1);
    ~Logarifm();
    double Function();
};

//.cpp
#include "stdafx.h"
#include <iostream>
#include "Logarifm.h"
#include <math.h>

using namespace std;

Logarifm::Logarifm(double a1, double c1, double d1)
{
    a = a1;
    c = c1;
    d = d1;
}

Logarifm::~Logarifm()
{}

double Logarifm::Function()
{
    try
    {
        cout <<"a :" << a <<"\n";
        cout <<"c :" << c <<"\n";
        cout <<"d :" << d <<"\n";
        cout <<"Function F = (lg(2*c-a)+d-152)/(a/4+c)\n";

        if (a <=0)
        throw "a < 0";
        
        if ((a/4+c) == 0)
        throw "Delenie na 0 zapresheno";

        if (((2*c-a)+d-152) <= 0)
        throw "Logarifm <= 0";

        F = (log10((2*c-a)+d-152)/(a/4+c));
        cout << F;
    }

    catch (const char *t)
    {
        cout << t <<"/n";
    }
     
    return 0;
}

//main.cpp
#include "stdafx.h"
#include <iostream>
#include "Logarifm.h"

using namespace std;

int main()
{
    Logarifm *obj1 = new Logarifm(0.0, 0.0, 4.5);
    Logarifm *obj2 = new Logarifm(3.4, 5.6, 6.0);
    Logarifm *obj[2] = {obj1, obj2};

    obj[0]->Function();
    cout << "\n\r";
    obj[1]->Function();
    cout << "\n\r";
    return 0;
}










PM MAIL   Вверх
toxx
Дата 3.5.2010, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ArniLand
Добавить страж включения в .h файл 
Код

#ifndef Logarifm_h
#define Logarifm_h
...
#endif 


Это сообщение отредактировал(а) toxx - 3.5.2010, 16:02
PM MAIL   Вверх
azesmcar
Дата 3.5.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



ArniLand

не любишь ты стражей порядка включения © smile 
PM   Вверх
toxx
Дата 3.5.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



azesmcar
я думал из какой это темы...теперь вспомнил smile 
PM MAIL   Вверх
ArniLand
Дата 3.5.2010, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



добавил стражей включений, еще будут какие то замечания к программе?
PM MAIL   Вверх
azesmcar
Дата 4.5.2010, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(ArniLand @  3.5.2010,  23:59 Найти цитируемый пост)
добавил стражей включений, еще будут какие то замечания к программе? 

найдутся smile 
Код

//Logarifm.h
class Logarifm
{
private:
    double a;
    double c;
    double d;
    double F; // не понял зачем вообще нужно это поле?
public:
    Logarifm(double a1, double c1, double d1);
    ~Logarifm();
    double Function();
};
//.cpp
#include "stdafx.h"
#include <iostream>
#include "Logarifm.h"
#include <math.h> // не math.h а cmath
using namespace std;
Logarifm::Logarifm(double a1, double c1, double d1) // почему не использован список инициализации?
{
    a = a1;
    c = c1;
    d = d1;
}
Logarifm::~Logarifm() // ничего особенного, просто зачем нужен пустой деструктор?
{}
double Logarifm::Function()
{
    // exception-ы так не используют, если есть возможность отловить
    // ошибку на месте то бросать исключения незачем
    // исключения имеет смысл использовать там, где нет возможности
    // обработать ошибку и нужно ее передать наверх, вызывающему
    // throw тут может и нужен, а вот try-catch нет.
    try
    {
        cout <<"a :" << a <<"\n"; // зачем нужны эти выводы? я так понимаю для отладки? зачем тогда они остались?
        cout <<"c :" << c <<"\n";
        cout <<"d :" << d <<"\n";
        cout <<"Function F = (lg(2*c-a)+d-152)/(a/4+c)\n";
        if (a <=0)
        throw "a < 0"; // <<-----------
        
        if ((a/4+c) == 0) // <<-----------
        throw "Delenie na 0 zapresheno";
        if (((2*c-a)+d-152) <= 0)
        throw "Logarifm <= 0"; // <<-----------
        F = (log10((2*c-a)+d-152)/(a/4+c)); // я так думаю это надо возвращать а не 0
        cout << F;
    }
    catch (const char *t) // бросать надо исключения (см. заголовочный файл stdexcept) а не указатели на char, и ловить по ссылке
    {
        cout << t <<"/n";
    }
    // зачем нужна функция, которая все время возвращает 0?
    // может ей вообще не нужно ничего возвращать?
    return 0;
}
//main.cpp
#include "stdafx.h"
#include <iostream>
#include "Logarifm.h"
using namespace std;
int main()
{
    Logarifm *obj1 = new Logarifm(0.0, 0.0, 4.5);
    Logarifm *obj2 = new Logarifm(3.4, 5.6, 6.0);
    Logarifm *obj[2] = {obj1, obj2}; // какой смысл в этом массиве?
    obj[0]->Function();
    cout << "\n\r"; // не \n\r а \r\n, и вообще одного \n уже достаточно
    obj[1]->Function();
    cout << "\n\r"; // тут тоже самое
    return 0; // просто к сведению, в main() return 0 можно и не писать
}


Это сообщение отредактировал(а) azesmcar - 4.5.2010, 08:29
PM   Вверх
ArniLand
Дата 4.5.2010, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

private:
    ....
    double F; // не понял зачем вообще нужно это поле?

Здесь храниться результат подсчета нашей функция
Код


Logarifm::Logarifm(double a1, double c1, double d1) // почему не использован список инициализации?
{
    a = a1;
    c = c1;
    d = d1;
}


А в чем будет разница если я его использую, не совсем понимаю для чего он?
Код


 try
    {
        cout <<"a :" << a <<"\n"; // зачем нужны эти выводы? я так понимаю для отладки? зачем тогда они остались?
        cout <<"c :" << c <<"\n";
        cout <<"d :" << d <<"\n";
     .... 
    
     }
выводят первоначальные результаты, нужно чтобы выводило 2 раза, то есть я отсылаю в конструктор два раза параметры. Но как я понимаю вынести за пределы блока try нужно эти три строки.

Код

     // exception-ы так не используют, если есть возможность отловить
    // ошибку на месте то бросать исключения незачем
    // исключения имеет смысл использовать там, где нет возможности
    // обработать ошибку и нужно ее передать наверх, вызывающему
    // throw тут может и нужен, а вот try-catch нет.


А как же я использую throw без try-catch, если try проверяет код на ошибки, а catch перехватывает эти ошибки?

Код

catch (const char *t)


в throw  та строка которая пишется под "...." строка в моем случае является указателем типа char, во всяком случае такой пример есть в Шилдте
Код

 Logarifm *obj[2] = {obj1, obj2}; // какой смысл в этом массиве?
Условие задании написано сделать массив объектов, но я сделал массив указателей

Код

if (a <=0)
throw "a < 0"; // <<-----------

f ((a/4+c) == 0) // <<-----------
throw "Delenie na 0 zapresheno";

if (((2*c-a)+d-152) <= 0)
throw "Logarifm <= 0"; // <<-----------


Здесь сделал я проверяю на три условия при которых функция не имеет смысл. Первое, функция имеет смысле когда a больше нуля, во втором условии проверяю чтобы знаменатель не равнялся нулю. А с третьим условием ошибся, нужно его убрать. Нам вообще показывали пример с исключениями такого плана. Рассматривали функцию или выражение(в плане простое математическое выражение со школьной программы) и проверяли на условия при которых оно имеет смысл, пример кода который показывали был похож на мой.
 



Это сообщение отредактировал(а) ArniLand - 4.5.2010, 11:16
PM MAIL   Вверх
azesmcar
Дата 4.5.2010, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(ArniLand @  4.5.2010,  11:11 Найти цитируемый пост)
А в чем будет разница если я его использую, не совсем понимаю для чего он?

тоже что и тут
Код

int a;
a = 1;

это присваивание (твой случай)
Код

int a = 1;

это инициализация (случай со списком инициализации), лучше инициализировать.

Цитата(ArniLand @  4.5.2010,  11:11 Найти цитируемый пост)
выводят первоначальные результаты, нужно чтобы выводило 2 раза, то есть я отсылаю в конструктор два раза параметры. Но как я понимаю вынести за пределы блока try нужно эти три строки.

твой класс не должен ничего выводить на экран, пока его об этом не попросят (лучше чтобы он вообще ничего не выводил, а предоставлял возможность другим обеспечить вывод данных на экран/файл или куда-то еще), таков принцип, я попросил его подсчитать логарифм а не выводить на экран какие-то аргументы, зачем мне оно надо?

Цитата(ArniLand @  4.5.2010,  11:11 Найти цитируемый пост)
А как же я использую throw без try-catch, если try проверяет код на ошибки, а catch перехватывает эти ошибки?

Перехватывать надо не на том же уровне, если есть возможность обрабатывать ошибку на том же уровне - обрабатывай сразу, без throw, try-catch.

пример
Код

try {
   if (a == 0)
      throw "error, argument is zero";
} catch (const char * e) {
   cout << e; 
}

заменить на
Код

   if (a == 0)
       cout << e; 

исключения надо использовать лишь в исключительных ситуациях

Цитата(ArniLand @  4.5.2010,  11:11 Найти цитируемый пост)
в throw  та строка которая пишется под "...." строка в моем случае является указателем типа char, во всяком случае такой пример есть в Шилдте

Я тебе говорю как правильно. Да, в C++ можно и const char * как исключение использовать, но лучше использовать типы, специально созданные для этого.

Цитата(ArniLand @  4.5.2010,  11:11 Найти цитируемый пост)
Условие задании написано сделать массив объектов, но я сделал массив указателей

Зачем? нарушаешь условия задачи, и еще добавляешь от себя что-то совсем ненужное.

Это сообщение отредактировал(а) azesmcar - 4.5.2010, 11:30
PM   Вверх
ArniLand
Дата 4.5.2010, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



[quote]
Перехватывать надо не на том же уровне, если есть возможность обрабатывать ошибку на том же уровне - обрабатывай сразу, без throw, try-catch.
Код

try {
   if (a == 0)
      throw "error, argument is zero";
} catch (const char * e) {
   cout << e; 
}

Код


if (a == 0)
       cout << e;



Так цель этой лабораторной состоит в использованием throw, try-catch. Мне нужно нужно придумать самому ситуации когда мое выражение не имеет смысл и придумать исключительные ситуации с использованием throw, try-catch, без них ее принимать у меня не будут.

Цитата

Я тебе говорю как правильно. Да, в C++ можно и const char * как исключение использовать, но лучше использовать типы, специально созданные для этого.

Твоя мысль понятна,  но мы еще не проходили специальные для этого типы и потому я умею пока только так и преподаватель показывал на своем примере именно так и говорил чтобы делали так
Код

 const char *


Покажи пожалуйста пример как правильно реализовать с массивом объектов в main.

Цитата

твой класс не должен ничего выводить на экран, пока его об этом не попросят (лучше чтобы он вообще ничего не выводил, а предоставлял возможность другим обеспечить вывод данных на экран/файл или куда-то еще), таков принцип, я попросил его подсчитать логарифм а не выводить на экран какие-то аргументы, зачем мне оно надо?

я всего лишь вывожу первоначальные значения аргументов логарифма a, c, d, про сделал чтобы они уже были даны в программе и все.


Это сообщение отредактировал(а) ArniLand - 4.5.2010, 11:55
PM MAIL   Вверх
azesmcar
Дата 4.5.2010, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(ArniLand @  4.5.2010,  11:50 Найти цитируемый пост)
Так цель этой лабораторной состоит в использованием throw, try-catch. Мне нужно нужно придумать самому ситуации когда мое выражение не имеет смысл и придумать исключительные ситуации с использованием throw, try-catch, без них ее принимать у меня не будут.

т.е. у тебя задание использовать try-catch, не важно где, не важно как, не важно к месту или нет?

Цитата(ArniLand @  4.5.2010,  11:50 Найти цитируемый пост)
Твоя мысль понятна,  но мы еще не проходили специальные для этого типы и потому я умею пока только так и преподаватель показывал на своем примере именно так и говорил чтобы делали так

ну ты спросил что не так - я ответил smile 

Цитата(ArniLand @  4.5.2010,  11:50 Найти цитируемый пост)
Покажи пожалуйста пример как правильно реализовать с массивом объектов в main.

ну хотя бы как-то так
Код

Logarifm *obj[2] = {
    new Logarifm(0.0, 0.0, 4.5),
    new Logarifm(3.4, 5.6, 6.0)};

а то у тебя и массив и объекты, в итоге смысл у этого массива весьма сомнительный.

хотя все задание в целом фигня конечно smile 
PM   Вверх
ArniLand
Дата 4.5.2010, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



azesmcar, ну задание заключается в том что, дана какая то функция(пример со школьной программы) и нужно проверить случаи когда функция не имеет смысл с использованием исключений

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

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

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

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

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


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

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


 




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


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

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