Страница 1 из 4
Посмотрите задачу на С++
Добавлено: 27 фев 2008, 15:54
Anton_XXX
Привет всем!
Решил простенькую задачку на С++ посмотрите пожалуйста:
1. Вычислить значение выражения при различных вещественных типах данных (float и double). Вычисления следует выполнять с использованием промежу-точных переменных. Сравнить и объяснить полученные результаты.
((a+b)^4-(a^4+4*a^3*b))/(6*a^2*b^2+4*a*b^3+b^4)
Код: Выделить всё
#include <math.h>
#include <stdio.h>
#include <iostream.h>
#include <dos.h>
#include <STDLIB.h>
main()
{
float a,b,k,q1,qb3,qa2,qa3,qa4,qb4,qb2,sum,qsum4;
double a1,b1,k1,qq1,qqb3,qqa2,qqa3,qqa4,qqb4,qqb2,sum1,qqsum4;
// тип float
a=100;
b=0.001;
qa4=pow(a,4);
qa3=pow(a,3);
qa2=pow(a,2);
qb2=pow(b,2);
qb3=pow(b,3);
qb4=pow(b,4);
sum=a+b;
qsum4=pow(sum,4);
k=(qsum4-qa4+4*qa3*b)/(6*qa2*qb2+4*a*qb3+qb4);
cout <<"Ответ с типом float: "<<k<<endl;
cin>>k; // задержка
// тип double
a1=100;
b1=0.001;
qqa4=pow(a1,4);
qqa3=pow(a1,3);
qqa2=pow(a1,2);
qqb2=pow(b1,2);
qqb3=pow(b1,3);
qqb4=pow(b1,4);
sum1=a1+b1;
qqsum4=pow(sum1,4);
k1=(qqsum4-qqa4+4*qqa3*b1)/(6*qqa2*qqb2+4*a1*qqb3+qqb4);
cout <<"Ответ с типом double: "<<k1<<endl;
cin>>k1; // задержка
}
В программе этой получается ответ: 133332 и 133333
Посчилал я налисточке этот же пример, получилось примерно 1,033326

Можете показать ошибку... пожалуйста!
Вот! Еще... вы заметили наверное как я сделал задержку программы...
Вопрос: Каким еще способом можно сделать задержку...?
Re: Посмотрите задачу на С++
Добавлено: 27 фев 2008, 17:24
Albor
Здесь ошибка математическая. Ты пропустил скобку, перед которой стоит знак минус. Задержка нормальная, главное результат можно посмотреть. Так или иначе в конце нужно определять какой-либо ввод от пользователя. Можно, например код поместить в цикл do while и при выходе задать вопрос пользователю продолжить работу или нет, а там уже какой будет выбор.
Re: Посмотрите задачу на С++
Добавлено: 27 фев 2008, 17:59
Anton_XXX
ааа... точно...! Большое спасибо!
Re: Посмотрите задачу на С++
Добавлено: 27 фев 2008, 18:18
Anton_XXX
Вот, поставил я скобку... а результаты все-равно не совпадают!
Код: Выделить всё
.......................
k=(qsum4-(qa4+4*qa3*b))/(6*qa2*qb2+4*a*qb3+qb4); //результат float = -0.00316648
.......................
и
.......................
k1=(qqsum4-(qqa4+4*qqa3*b1))/(6*qqa2*qqb2+4*a1*qqb3+qqb4); //результат double = 1
.......................
такое возможно?

Re: Посмотрите задачу на С++
Добавлено: 28 фев 2008, 09:31
airyashov
Погрешность округление при операциях с большим и малым числами, посмотрите результат этой программы, ясно же написано с использованием промежуточных переменных.
Код: Выделить всё
#include <math.h>
#include <stdio.h>
#include <iostream.h>
#include <dos.h>
#include <STDLIB.h>
#include <conio.h>
main()
{
float k1f,a,b,k,q1,qb3,qa2,qa3,qa4,qb4,qb2,sum,qsum4;
double k1d,a1,b1,k1,qq1,qqb3,qqa2,qqa3,qqa4,qqb4,qqb2,sum1,qqsum4;
clrscr();
a=100;
b=0.001;
qa4=pow(a,4);
cout<<"qa4 "<<qa4<<endl;
qa3=pow(a,3);
cout<<"qa3 "<<qa3<<endl;
qa2=pow(a,2);
cout<<"qa2 "<<qa2<<endl;
qb2=pow(b,2);
cout<<"qb2 "<<qb2<<endl;
qb3=pow(b,3);
cout<<"qb3 "<<qb3<<endl;
qb4=pow(b,4);
cout<<"qb4 "<<qb4<<endl;
sum=a+b;
qsum4=pow(sum,4);
cout<<"qsum4 "<<qa4<<endl;
k=(qsum4-(qa4+4*qa3*b));
cout<<4*qa3*b<<endl;
cout<<qa4+4*qa3*b<<endl;
cout<<"(1) "<<k<<endl;
k1f=(6*qa2*qb2+4*a*qb3+qb4);
cout<<"(2) "<<k1f<<endl;
k=k/k1f;
cout <<"Ответ с типом float: "<<k<<endl;
cin>>k;
a1=100;
b1=0.001;
qqa4=pow(a1,4);
cout<<"qqa4 "<<qqa4<<endl;
qqa3=pow(a1,3);
cout<<"qqa3 "<<qqa3<<endl;
qqa2=pow(a1,2);
cout<<"qqa2 "<<qqa2<<endl;
qqb2=pow(b1,2);
cout<<"qqb2 "<<qqb2<<endl;
qqb3=pow(b1,3);
cout<<"qqb3 "<<qqb3<<endl;
qqb4=pow(b1,4);
cout<<"qqb4 "<<qqb4<<endl;
sum1=a1+b1;
qqsum4=pow(sum1,4);
cout<<"qqsum4 "<<qsum4<<endl;
k1=(qqsum4-(qqa4+4*qqa3*b1));
cout<<4*qqa3*b1<<endl;
cout<<qqa4+4*qqa3*b1<<endl;
cout<<"(1) "<<k1<<endl;
k1d=(6*qqa2*qqb2+4*a1*qqb3+qqb4);
cout<<"(1) "<<k1<<endl;
k1=k1/k1d;
cout <<"Ответ с типом double: "<<k1<<endl;
cin>>k1;
}
Re: Посмотрите задачу на С++
Добавлено: 03 мар 2008, 17:46
Anton_XXX
Привет всем!
Помогите составить алгоритм, пожалуйста!
Задача: Найти в двумерном массиве максимальную строку (сумму элементов в строке)...
Я тут уже решил, и нашел только сумму элементов 1 строки...
Код: Выделить всё
#include <stdlib.h>
#include <iostream.h>
int main()
{
int i,j,a,k;
int max,max1,n;
int mas[10][10];
int m[100];
randomize();
for (i=0; i<10; i++)
for (j=0; j<10; j++)
mas[i][j]=random(10);
for (j=0; j<10; j++)
max=max+mas[0][j];
for (i=0; i<10; i++)
{
for (j=0; j<10; j++)
cout<<mas[i][j]<<" ";
cout<<endl;
}
cout<<max;
cin>>a;
}
Можете не решать... подскажите только алгоритм... я сам решу...
Re: Посмотрите задачу на С++
Добавлено: 03 мар 2008, 19:50
Anton_XXX
Все, коллеги... До меня кажется дошло, как решить эту задачу...!
Извиняюсь!
Re: Посмотрите задачу на С++
Добавлено: 03 мар 2008, 20:55
Anton_XXX
Вот, есть еще одна проблемка... не могу найти ошибку в программе... Программа очень простая...
Задача: Написать программу нахождения "!"
Я ее решил, только есть одна ошибка!
пример: 0!=0 - вот это не могу сделать... точнее сделал, но почему-то не верно!
Вот текст программы:
#include <iostream.h>
int main()
{
int n,i,x;
cout<<"Введите n= ";
cin>>n;
if (n=0) x=0; // ВОТ ТУТ!
else
x=1;
for (i=1; i<=n; i++)
x=x*i;
cout<<n<<"!="<<x<<endl;
cin>>n;
}
Подскажите ошибку!
Re: Посмотрите задачу на С++
Добавлено: 03 мар 2008, 21:13
Alex_Burn
Во первых, if (n=0) - это что за условие такое??? (может if (n==0) лучше?)

Во вторых, по определению полагают, что 0! = 1
В третьих, зачем n 2 раза вводишь? Если для задержки, то используй getchar().
Re: Посмотрите задачу на С++
Добавлено: 04 мар 2008, 09:26
airyashov
Код: Выделить всё
if (n==0) x=1; // ВОТ ТУТ!
else
x=1;
for (i=2; i<=n; i++)
x=x*i;
советую также на отрицательное проверить, пользователи они такие.