Показать полную графическую версию : [решено] Помогите найти ошибки в решении выражения
399Dmitr933
27-06-2013, 13:33
Составить программу по вычислению заданного выражения тремя циклами. Все неизвестные переменные вводятся с клавиатуры. Результаты вычислений выдать на экран и в файл.
http://forum.oszone.net/attachment.php?attachmentid=100842&stc=1&d=1372325496
вот что получилось у меня:
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <math.h>
#include <fstream>
using namespace std;
ofstream out ("text.txt");
void main()
{
cout << "Input n (n>5)\n";
int n,i;
cin >> n;
float so=0,ph1=1,ph2=1;
float *a = new float[n];
float *b = new float[n];
float *p1 = new float[n];
float *p2 = new float[n];
for (i=0;i<(n-5);i++)
{
a[i]=rand()%100-35;
b[i]=rand()%100-50;
}
for (i=1;i<(n-3);i++)
{
ph1=ph1*a[i];
p1[i]=ph1;
}
for (i=0;i<(n-3);i++)
{
ph2=ph2*b[i+3];
p2[i]=ph2;
so=so+(p1[i]-p2[i]-5);
}
printf("%2.3f",so);
out.close();
getch();
}
Результат выражения явно далёк от истины...
for (i=1;i<(n-3);i++)
{
ph1=ph1*a[i]; »
Инициализацию переменных кто будет делать?
so=so+(p1[i]-p2[i]-5); »
Эта строка мне не понятна. Почему в цикле?
Вообще сделайте так:
Запишите выражение, пронумеруйте порядок действий, а когда будете писать код, то в комментариях укажите этот самый номер.
Все ориентироваться и понимать будет проще.for (i=0;i<(n-5);i++)
{
a[i]=rand()%100-35;
b[i]=rand()%100-50;
} »
Почему a и b задаются случайным образом?
Произведения можно считать в одном цикле, а вот сумму нужно вынести в отдельный. Переменные ph1 и ph2 обязательно нужно инициализировать. Нужно так же проверить инициализацию переменной счетчика и условие выхода в каждом цикле.
Почему a и b задаются случайным образом? »
Они и не случайным задаются. Функция rand() ведь не проинициализирована. А вот почему человек пишет такую конструкцию вместо того чтобы просто прописать тестовые значения - это и правда вопрос.
399Dmitr933
29-06-2013, 16:14
Инициализацию переменных кто будет делать? »
float so=0,ph1=1,ph2=1;
float *a = new float[n];
float *b = new float[n];
float *p1 = new float[n];
float *p2 = new float[n];
вот же она или я что то не понимаю?
Эта строка мне не понятна. Почему в цикле?
по заданию три цикла надо
Почему a и b задаются случайным образом? »
их нужно генерировать случайно, но в задании об этом забыли указать
Функция rand() ведь не проинициализирована. »
подскажите как инициализировать?
вот же она или я что то не понимаю? »
Да, она. Инициализацию ph1, ph2 проглядел.
Нахождение строки в цикле мне все равно не понятно. Здесь ошибка.
Что значит "По заданию три цикла" ?
Три цикла всего? На всю программу? Или три цикла на решение (решение не учитывает в себе инициализацию переменных[подготовку входных данных]!)
подскажите как инициализировать? »
randomize в помощь.
----
Послушайте, а что это вообще за бред?
Причем здесь указатели? Проще то никак нельзя объявить? Зачем вам работа с памятью, если вы только циклы начали проходить? float *a = new float[n];
float *b = new float[n];
float *p1 = new float[n];
float *p2 = new float[n]; »
----
Дальше самое решение.
Ладно, бог с ней, инициализацией. Допустим с горем пополам память выделили.
for (i=0;i<(n-5);i++)
{
a[i]=rand()%100-35;
b[i]=rand()%100-50;
} »
Назначили переменным некоторые значения.
По хорошему тут надо спросить. Где именно должны формироваться значения a, b[i]?
До циклов счета произведений ИЛИ во время счета циклов произведений?
for (i=1;i<(n-3);i++)
{
ph1=ph1*a[i];
p1[i]=ph1;
} »
Получили накопительное произведение, которое нас не просили получать. for (i=0;i<(n-3);i++)
{
ph2=ph2*b[i+3];
p2[i]=ph2;
so=so+(p1[i]-p2[i]-5);
} »
Мало того мы здесь получаем накопительное произведение по b, мало того, что мы получаем его не правильно (не правильный диапазон n, не правильный диапазон b), так мы здесь еще умудряемся получать кукую то накопительную сумму от не до конца посчитанных произведений!!!
Далее хорошо бы уточнить, как именно соотносится переменная i=1..n в сумме, с i=1..(n-3) и i=3..(n) в произведениях, и в ai,bi ?
Допустим соотносятся верно и ошибок нет, и я просто паникую. Допустим.
Какой смысл считать 5 раз произведения, если от i (что в сумме) не зависит получаемое значение в скобках?
Может как то к умножению перейти?
----
Еще раз:
Записать выражение, пронумеровать порядок действий, в комментариях к циклам указать номер действия!(Это не прихоть, это объязаловка)
Проверить, что порядок выполняется правильно!
Т.к. сейчас вы просто что-то написали, не понимая "что именно" вы написали.
Строки с циклами (т.е. все что между [I]float *p2 = new float[n]; и printf("%2.3f",so);) стереть, забыть и написать решение заново. Не забывая про нумерацию действий!
399Dmitr933
29-06-2013, 19:55
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <math.h>
#include <fstream>
#include <time.h>
using namespace std;
ofstream out ("text.txt");
void main()
{
srand(time(0));
float n,i;
float a=rand()%20,b=rand()%5;
float pro1,pro2,sym,skobka;
cout << "Input n \n";
cin >> n;
////////////////////////////
pro1=1;
for (i=1;i<=(n-3);i++)
{
pro1=pro1*(a*i);
}
/////////////////////////////
pro2=1;
for (i=3;i<=n;i++)
{
pro2=pro2*(b*i);
}
///////////////////////////////
skobka=0;
skobka=pro1-pro2-5;
///////////////////////////////
sym=0;
for (i=1;i<=n;i++)
{
sym=sym+skobka;
}
///////////////////////////////
out << a;
cout << "\na = " << a;
//
out << b;
cout << "\nb = " << b;
//
out << pro1;
cout << "\npro1 = " << pro1;
//
out << pro2;
cout << "\npro2 = " << pro2;
//
out << skobka;
cout << "\nskobka = " << skobka;
/////////////////////////////////////
out << "\nREZYL'TAT " << sym;
cout << "\nREZYL'TAT " << sym;
out.close();
getch();
}
попробывал иначе
у меня просто в чём проблема я учил ВБ 2010, а сейчас С++ 6ой версии. вот и сижу почти всё подряд гуглю. и пока что си в голове хреново укладывается
399Dmitr933, for (i=1;i<=(n-3);i++)
{
pro1=pro1*(a*i);
}
...
{
pro2=pro2*(b*i);
} »
Почему a*i и b*i ? По условию a-i'тое и b-i'тое. Это не умножение.пока что си в голове плохо укладывается »
Дело не в языке программирования, а алгоритме.
----
В остальном похоже на правду. Хоть и неказисто.
399Dmitr933
29-06-2013, 20:50
По условию a-i'тое и b-i'тое »
значит и с математикой всё плохо)
не подскажите как переделать?
не подскажите как переделать? »
неа! :)
От банального "лень", среднего "диплом у меня уже есть", и далее куда то туда, в облака и высокие цели.
float n,i; »
Почему float? Ладно еще n, но для i лучше подойдет unsigned int. Кроме того, тип float может вызывать очень неприятный баг, связанный с погрешностью округления. Так что лучше использовать целочисленные типы.
И кстати, зачем вы используете объявление кучи переменных в одной строке? Лучше не жалеть строк.
for (i=1;i<=(n-3);i++)
for (i=3;i<=n;i++)
for (i=1;i<=n;i++)
Использовать одну переменную-счетчик в нескольких циклах в пределах одной области видимости можно, но нежелательно.
float a=rand()%20,b=rand()%5;
В задании наверное предполагается что a и b это числовые последовательности, а не числа. Вернитесь к варианту с массивами, но вот указатели пока не трогайте. Для статических массивов есть вариант проще.
Сам алгоритм вычисления тут довольно простой. Сначала считаете произведения. Как я уже упоминал, в данном случае их можно посчитать в одном цикле. Затем считаете сумму. Самое интересное, что суммируемое выражение тут не зависит от i. Так что можно просто вычислить выражение в скобках и умножить на n.
Попробуйте сначала нарисовать блок-схему или записать алгоритм псевдокодом, а потом уже переносить это на C++.
399Dmitr933
04-07-2013, 22:22
В общем сдал как было. Приняли как есть, тройка стоит. Всем большое спасибо за помощь! Тему закрываем.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.