Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Помогите найти ошибки в решении выражения (http://forum.oszone.net/showthread.php?t=263281)

399Dmitr933 27-06-2013 13:33 2175216

Помогите найти ошибки в решении выражения
 
Составить программу по вычислению заданного выражения тремя циклами. Все неизвестные переменные вводятся с клавиатуры. Результаты вычислений выдать на экран и в файл.

http://forum.oszone.net/attachment.p...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();
}

Результат выражения явно далёк от истины...

lxa85 27-06-2013 15:35 2175275

Цитата:

Цитата 399Dmitr933
for (i=1;i<(n-3);i++)
{
ph1=ph1*a[i]; »

Инициализацию переменных кто будет делать?
Цитата:

Цитата 399Dmitr933
so=so+(p1[i]-p2[i]-5); »

Эта строка мне не понятна. Почему в цикле?
Вообще сделайте так:
Запишите выражение, пронумеруйте порядок действий, а когда будете писать код, то в комментариях укажите этот самый номер.
Все ориентироваться и понимать будет проще.
Цитата:

Цитата 399Dmitr933
for (i=0;i<(n-5);i++)
{
a[i]=rand()%100-35;
b[i]=rand()%100-50;
} »

Почему a и b задаются случайным образом?

torauma 27-06-2013 17:11 2175336

Произведения можно считать в одном цикле, а вот сумму нужно вынести в отдельный. Переменные ph1 и ph2 обязательно нужно инициализировать. Нужно так же проверить инициализацию переменной счетчика и условие выхода в каждом цикле.
Цитата:

Цитата lxa85
Почему a и b задаются случайным образом? »

Они и не случайным задаются. Функция rand() ведь не проинициализирована. А вот почему человек пишет такую конструкцию вместо того чтобы просто прописать тестовые значения - это и правда вопрос.

399Dmitr933 29-06-2013 16:14 2176381

Цитата:

Цитата lxa85
Инициализацию переменных кто будет делать? »

Код:

        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];

вот же она или я что то не понимаю?


Цитата:

Эта строка мне не понятна. Почему в цикле?
по заданию три цикла надо

Цитата:

Цитата lxa85
Почему a и b задаются случайным образом? »

их нужно генерировать случайно, но в задании об этом забыли указать


Цитата:

Цитата torauma
Функция rand() ведь не проинициализирована. »

подскажите как инициализировать?

lxa85 29-06-2013 18:26 2176439

Цитата:

Цитата 399Dmitr933
вот же она или я что то не понимаю? »

Да, она. Инициализацию ph1, ph2 проглядел.
Нахождение строки в цикле мне все равно не понятно. Здесь ошибка.
Что значит "По заданию три цикла" ?
Три цикла всего? На всю программу? Или три цикла на решение (решение не учитывает в себе инициализацию переменных[подготовку входных данных]!)
Цитата:

Цитата 399Dmitr933
подскажите как инициализировать? »

randomize в помощь.

----
Послушайте, а что это вообще за бред?
Причем здесь указатели? Проще то никак нельзя объявить? Зачем вам работа с памятью, если вы только циклы начали проходить?
Цитата:

Цитата 399Dmitr933
float *a = new float[n];
float *b = new float[n];
float *p1 = new float[n];
float *p2 = new float[n]; »

----
Дальше самое решение.
Ладно, бог с ней, инициализацией. Допустим с горем пополам память выделили.
Цитата:

Цитата 399Dmitr933
for (i=0;i<(n-5);i++)
{
a[i]=rand()%100-35;
b[i]=rand()%100-50;
} »

Назначили переменным некоторые значения.
По хорошему тут надо спросить. Где именно должны формироваться значения a[i], b[i]?
До циклов счета произведений ИЛИ во время счета циклов произведений?

Цитата:

Цитата 399Dmitr933
for (i=1;i<(n-3);i++)
{
ph1=ph1*a[i];
p1[i]=ph1;
} »

Получили накопительное произведение, которое нас не просили получать.
Цитата:

Цитата 399Dmitr933
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 (что в сумме) не зависит получаемое значение в скобках?
Может как то к умножению перейти?
----

Еще раз:
Записать выражение, пронумеровать порядок действий, в комментариях к циклам указать номер действия!(Это не прихоть, это объязаловка)
Проверить, что порядок выполняется правильно!

Т.к. сейчас вы просто что-то написали, не понимая "что именно" вы написали.
Строки с циклами (т.е. все что между float *p2 = new float[n]; и printf("%2.3f",so);) стереть, забыть и написать решение заново. Не забывая про нумерацию действий!

399Dmitr933 29-06-2013 19:55 2176480

Код:


#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ой версии. вот и сижу почти всё подряд гуглю. и пока что си в голове хреново укладывается

lxa85 29-06-2013 20:18 2176491

399Dmitr933,
Цитата:

Цитата 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
пока что си в голове плохо укладывается »

Дело не в языке программирования, а алгоритме.
----
В остальном похоже на правду. Хоть и неказисто.

399Dmitr933 29-06-2013 20:50 2176502

Цитата:

Цитата lxa85
По условию a-i'тое и b-i'тое »

значит и с математикой всё плохо)

не подскажите как переделать?

lxa85 29-06-2013 21:26 2176515

Цитата:

Цитата 399Dmitr933
не подскажите как переделать? »

неа! :)
От банального "лень", среднего "диплом у меня уже есть", и далее куда то туда, в облака и высокие цели.

torauma 01-07-2013 09:18 2177163

Цитата:

Цитата 399Dmitr933
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 2179544

В общем сдал как было. Приняли как есть, тройка стоит. Всем большое спасибо за помощь! Тему закрываем.


Время: 06:16.

Время: 06:16.
© OSzone.net 2001-