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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вылетает ошибка, VS 03 
:(
    Опции темы
Grr
Дата 17.8.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#include <iostream>
using namespace std;
/*Написать перегруженные шаблоны функций для нахождения корней линейного (a*x + b = 0) и 
квадратного (a*x2+b*x + c = 0) уравнений. Замечание: в функции передаются коэффициенты уравнений. */
float vichislenie (int a, int b, int c)
{
    float koren_1, koren_2, temp, d=0;
    temp = (b*b-4*a*c);
    for (; (d*d)<temp;)
    {
        d++;
    }
    d=0? koren_1 = (-b + d) / (2*a) : false;
    d>0? koren_2 = (-b - d) / (2*a) : false;
    return koren_1, koren_2;
}

void main()
{
    int a, b, c;
    cout<<"vvedite a, b, c\n";
    cin>>a; cin>>b; cin>>c; cout<<"\n\n";
    cout<<"korni uravneniya (a*x2+b*x + c = 0) : "<<vichislenie (a, b, c);
}

Пытаюсь написать для второго уравнения и вылетает ошибка на этапе выполнения. Помогите найти ошибку (-ки) пожалуйста.
PM MAIL   Вверх
bsa
Дата 17.8.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



вообще-то для вычисления корня можно использовать sqrt...
PM   Вверх
Fazil6
Дата 17.8.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



мда... ахереть... Жесть просто, а не функция...


PM MAIL   Вверх
_Michael
Дата 17.8.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

.....
   return koren_1, koren_2;
}


Grr ты ж ведь два значения хочешь возвратить  smile 


--------------------
...не убивайся ни о чем - все временно,
хоть ночь темна но светлым днем беременна...

Саади
PM MAIL   Вверх
Grr
Дата 17.8.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ребята, я недавно начал учить. Что такое sqrt не знаю. И что такого в функции? Я рад бы сделать её лучше, но не знаю как smile

Добавлено через 1 минуту и 13 секунд
_Michael, да, корней два, по идее должно возвращать оба, если "д" больше нуля
PM MAIL   Вверх
_Michael
Дата 17.8.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да корней у квадратного уравнения действительно может быть два, но функция то в С возвращает только одно значение. Т-е таким макаром у тебя никак не выйдет. Тебе или надо выводить твои корни в консоль прямо в функции vichislenie  или ж передавать ей еще два дополнительных параметра - адреса переменных в которые ты будеш записывать полученные корни.


--------------------
...не убивайся ни о чем - все временно,
хоть ночь темна но светлым днем беременна...

Саади
PM MAIL   Вверх
MAKCim
Дата 17.8.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Код

#define ANSWER_NO_SOLUTION      (1 << 0)
#define ANSWER_ONE_SOLUTION    (1 << 1)
#define ANSWER_TWO_SOLUTION    (1 << 2) 

struct answer {
    union {
        char array[2 * sizeof(double)];
        double x1, x2;
        double x;
    }
    int flags;
};

struct answer calculate(int a, int b, int c) {
    struct answer answer = {0};
    int d = b * b - 4 * a * c;
    if (d < 0) {
        answer.flags |= ANSWER_NO_SOLUTION;
        return answer;
    } else if (d == 0) {
        answer.flags |= ANSWER_ONE_SOLUTION;
        answer.x = (double) -b / (2 * a);
    } else {
        answer.flags |= ANSWER_TWO_SOLUTION;
        answer.x1 = (double) (-b + sqrt((double) d)) / (2 * a);
        answer.x2 = (double) (-b - sqrt((double) d)) / (2 * a);
    }
    return answer;
}


Это сообщение отредактировал(а) MAKCim - 17.8.2007, 12:54


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Grr
Дата 17.8.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



_Michael, до обращений к памяти я ещё не дошёл) буду выводить в функции значит, спасибо smile
PM MAIL   Вверх
_Michael
Дата 17.8.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Grr,   smile Не за что.
MAKCim, ето даже больше чем требовалось  smile 

Это сообщение отредактировал(а) _Michael - 17.8.2007, 12:58


--------------------
...не убивайся ни о чем - все временно,
хоть ночь темна но светлым днем беременна...

Саади
PM MAIL   Вверх
bsa
Дата 17.8.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(Grr @ 17.8.2007,  12:39)
Ребята, я недавно начал учить. Что такое sqrt не знаю. И что такого в функции? Я рад бы сделать её лучше, но не знаю как smile

Цитата(man 3 sqrt)
ИМЯ
       sqrt - вычисление квадратного корня

СИНТАКСИС
       #include <math.h>

       double sqrt(double x);

ОПИСАНИЕ
       Функция  sqrt()  возвращает неотрицательный квадратный корень аргумента
       x.  Функция завершается с ошибкой и присваивает errno значение  EDOM  в
       том случае, если x - отрицательное число.

КОДЫ ОШИБОК
       EDOM   x - отрицательное число.

СООТВЕТСТВИЕ СТАНДАРТАМ
       SVID 3, POSIX, BSD 4.3, ISO 9899

СМОТРИ ТАКЖЕ
       hypot(3)

PM   Вверх
hkklr
Дата 17.8.2007, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А зачем здесь вообще отдельная функция? Мне кажется(хотя я могу ошибаться), что здесь она только мешает. Почему бы не написать так:
Код

#include<iostream>
#include<cmath>
using namespace std;
void main()
{
   double a,b,c;
   cin>>a,b,c;
   if(a==0)
   {
       if(b==0)
       {
           if(c==0)
          {
              cout<<"Бесконечное число решений";
          }
          else
          {
              cout<<"Решений нет";
          }
       } 
       else
       {
           cout<<-c/b;
       }  
   }
    else
    {
        float d=b*b-4*a*c;
        if(d<0)
       {
           cout<<"Комплексные корни";
       }
       if(d==0)
       {
           cout<<-b/(2*a);
       }
       if(d>0)
      {
           cout<<(-b-sqrt(d))/(2*a)<<','<<(-b+sqrt(d))/(2*a);
      }
    }
}

Много, но зато надеюсь понятно smile

Добавлено через 48 секунд
В моём коде возможны ошибки - я не проверял.
PM MAIL   Вверх
Rockie
Дата 17.8.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

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



Grr, глянь тут. И тут




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Grr
Дата 17.8.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



bsa, спасибо, буду использовать библиотеку теперь. Только учительница может ругаться, что вперёд забежал)))

hkklr, это домашнее задание, где чётко нужно придержаться условия. Получу двойку, если найду оптимальнее, чем нужно) а хуже всего, что в перегруженных функциях нельзя использовать иф и свитч, с которыми эта и следующие д/з намного легче было бы выполнить. 
Rockie, тоже благодарю, только гуглю я с самого начала юзал smile))
PM MAIL   Вверх
hkklr
Дата 18.8.2007, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Grr пишет:
Цитата

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

Да, я тебя понимаю... Что это за система обучения, где ставят двойки за оптимальное решение...  Все забывают про разумную достаточность. А почему нельзя использовать if и switch в перегруженных функциях? Это что, условие домашнего задания что ли?
PM MAIL   Вверх
bsa
Дата 18.8.2007, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



ну вместо if можно использовать operator?: Вместо свича тоже.
PM   Вверх
hkklr
Дата 18.8.2007, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Но это не всегда удобно.
PM MAIL   Вверх
Grr
Дата 18.8.2007, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



hkklr, получится ошибка на этапе копмиляции)) 
bsa, да, им и делаю smile
через 2 часа выложу 3 задания, которые отказываются получаться корректно)
PM MAIL   Вверх
Grr
Дата 18.8.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#include <iostream>
using namespace std;
/*Написать функцию, которая принимает в качестве параметров вещественное число и количество знаков после 
десятичной точки, которые должны остаться. Задачей функции является округление вышеуказанного вещественного 
числа с заданной точностью. */
float vichislenie (float ch, int vish)
{
    int sum = 0, sum_1 = 0; float drob, drob_1, itog;
    for (int i=ch; i>1; i--)
        sum++;
    drob=ch-sum; (int)ch;
    for (int i = 1; i < vish; i++)
        sum_1++;
    drob_1 = drob * sum_1; (int)drob_1;
    itog = (float)drob_1/sum_1;
    return itog+ch;
}
void main()
{
    float chislo;
    int tochnost;
    cout<<"Vvedite chislo dlya okrugleniya \n"; cin>>chislo;
    cout<<"\nZadayte kol-vo znakov kotorie dolgni ostatsya "; cin>>tochnost;
    cout<<"\n\n"<<vichislenie(chislo, tochnost)<<"\n\n";
}

беру число 12.1212, провожу округление до двух знаков, но получается 13.2424. Почему, не понимаю)
Код

#include <iostream>
#include <time.h>
#include <stdlib.h>
/*Написать шаблон функции для поиска среднего арифметического значений массива.*/
long Sred_arif (int n, int chisla[])
{
    double rezultat=0;
    for (int i=0; i<n; i++)
    {
        chisla[i]<n ? rezultat+=chisla[i] : false;
    }
    return rezultat/n;
}

/*тело программы для проверки*/
using namespace std;
void main()
{
    int massiv[15];
    srand(time(NULL));
    for (int i=0; i<15; i++)
        massiv[i] = rand()%10;
    for (int i=0; i<15; i++)
        cout<<massiv[i]<<", ";
    cout<<"\n\nSrednee arifmeticheskoe massiva : "<<Sred_arif(15, massiv)<<"\n";
}

как ни странно, но работает корректно smile
Код

#include <iostream>
#include <math.h>
using namespace std;
/*Написать перегруженные шаблоны функций для нахождения корней линейного (a*x + b = 0) и 
квадратного (a*x2+b*x + c = 0) уравнений. Замечание: в функции передаются коэффициенты уравнений. */
float vichislenie (int a, int b, int c)
{
    float x_1, x_2;
    int temp;
    double d;
    d=(b*2-4*a*c);
    a!=0 ? x_1=(-b+sqrt((double)d))/(2*a) : false;
    a!=0 ? x_2=(-b-sqrt((double)d))/(2*a) : false;
    d>=0 ? temp = 1 : false;
    d>0 ? temp = 2 : false;
    cout<<"uravnenie a*x2+b*x+c=0 imeet ";
    temp == 2 ? cout<<"2 kornya"<<x_1<<"\t"<<x_2<<"\n\n" : cout<<"1 koren"<<x_1<<"\n\n";
    return 0;
}

void main()
{
    int a, b, c;
    cout<<"vvedite a, b, c\n";
    cin>>a; cin>>b; cin>>c; cout<<"\n\n";
    cout<<"korni uravneniya (a*x2+b*x + c = 0) : "<<vichislenie (a, b, c);
}

попробовал через скрт, но всё равно ошибка :(

PM MAIL   Вверх
MAKCim
Дата 18.8.2007, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Grr
первая задача
Код

double convert(double number, int precision) {
    double result = (double)((int)number), multiply = 10.0;
    number -= result;
    while (precision--) {
        number *= 10.0;
        result += (int)number / multiply;
        number -= (int)number;
        multiply *= 10.0;
    }
    return result;
}


Добавлено через 12 минут и 1 секунду
квадратное уравнение
Код

int calculate(int a, int b, int c) {
    int d = b * b - 4 * a * c;
    d == 0 ? printf("one solution: x = %F\n", (double) - b / (2 * a)) :
    d < 0 ? printf("no solutions\n") :
        printf("two solutions: x1 = %F, x2 = %F\n",
        ((double) - b + sqrt(d)) / (2 * a),
        ((double) - b - sqrt(d)) / (2 * a));
    return 0;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Вообще-то шаблонная функция - это несколько не то, что ты написал.
1. Функция округления:
Код
#include <cmath>
float my_round(float value, unsigned dig)
{
     const float pow_10 = static_cast<float>( pow(10, dig) );
/*pow - это стандартная функция возведения в степень
   если ее нельзя использовать, то можешь воспользоваться следующим кодом вместо этой строчки:
     float pow_10 = 1;
     for(unsigned i = 0; i < dig; ++i)
          pow_10 *= 10;
*/
     return static_cast<unsigned long>( value * pow_10  + 0.5) / pow_10;
}

2. Шаблон функции подсчета среднего арифметического:
Код
template<typename T>
T measure(const T *array, unsigned count)
{
    T sum = 0;
    for(unsigned i = 0; i < count; ++i, ++array)
       sum += *array;
    return sum / count;
}

3. Шаблон функции для нахождения корней квадратного уравнения:
Код
template<typename T>
struct SquareEquationResult
{
     T val1;
     T val2;
     SquareEquationResult(const T &v1, const T &v2) : val1(v1), val2(v2) {}
};
template <typename T>
SquareEquationResult<T> calcEquation(const T &a, const T &b, const T &c)
{
    const T d = b * b - 4 * a * c; //вообще-то надо считать не 2b-4ac, как у тебя, а b^2 - 4ac
    if (d < 0)
       throw("Invalid values");
    const T sqd = static_cast<T>( sqrt( static_cast<double>(d) ) );
    return SquareEquationResult<T>( (-b + sqd) / (2*a), (-b - sqd) / (2*a) );
}

PM   Вверх
Grr
Дата 18.8.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Офигеть, я тоже хочу всё знать, что и вы))
сейчас буду разбираться, половина в алгоритмах не понятно)
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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