Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Помогите найти ошибки в решении выражения

Ответить
Настройки темы
C/C++ - [решено] Помогите найти ошибки в решении выражения

Аватара для 399Dmitr933

Пользователь


Сообщения: 33
Благодарности: 21


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: 399Dmitr933
Дата: 04-11-2021
Составить программу по вычислению заданного выражения тремя циклами. Все неизвестные переменные вводятся с клавиатуры. Результаты вычислений выдать на экран и в файл.

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();
}
Результат выражения явно далёк от истины...

Отправлено: 13:33, 27-06-2013

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Цитата 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 задаются случайным образом?

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:35, 27-06-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 121
Благодарности: 35

Профиль | Отправить PM | Цитировать


Произведения можно считать в одном цикле, а вот сумму нужно вынести в отдельный. Переменные ph1 и ph2 обязательно нужно инициализировать. Нужно так же проверить инициализацию переменной счетчика и условие выхода в каждом цикле.
Цитата lxa85:
Почему a и b задаются случайным образом? »
Они и не случайным задаются. Функция rand() ведь не проинициализирована. А вот почему человек пишет такую конструкцию вместо того чтобы просто прописать тестовые значения - это и правда вопрос.

Отправлено: 17:11, 27-06-2013 | #3


Аватара для 399Dmitr933

Пользователь


Сообщения: 33
Благодарности: 21

Профиль | Отправить PM | Цитировать


Цитата 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() ведь не проинициализирована. »
подскажите как инициализировать?

Отправлено: 16:14, 29-06-2013 | #4


Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Цитата 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);) стереть, забыть и написать решение заново. Не забывая про нумерацию действий!

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Последний раз редактировалось lxa85, 29-06-2013 в 18:33.


Отправлено: 18:26, 29-06-2013 | #5


Аватара для 399Dmitr933

Пользователь


Сообщения: 33
Благодарности: 21

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
#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, 29-06-2013 в 20:05.


Отправлено: 19:55, 29-06-2013 | #6


Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


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:
пока что си в голове плохо укладывается »
Дело не в языке программирования, а алгоритме.
----
В остальном похоже на правду. Хоть и неказисто.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 20:18, 29-06-2013 | #7


Аватара для 399Dmitr933

Пользователь


Сообщения: 33
Благодарности: 21

Профиль | Отправить PM | Цитировать


Цитата lxa85:
По условию a-i'тое и b-i'тое »
значит и с математикой всё плохо)

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

Отправлено: 20:50, 29-06-2013 | #8


Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


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

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:26, 29-06-2013 | #9


Пользователь


Сообщения: 121
Благодарности: 35

Профиль | Отправить PM | Цитировать


Цитата 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++.

Отправлено: 09:18, 01-07-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Помогите найти ошибки в решении выражения

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Kerio - Помогите в решении проблемы scorpion456 Тест-форум 2 19-11-2011 09:49
Разное - Помогите в решении задач..Pascal Retark Программирование и базы данных 2 06-05-2010 14:37
Прочее - [решено] нестандартное применение ADSL - модема --- помогите в решении courageous Сетевые технологии 3 12-02-2010 20:43
Delphi - Срочно!Не могу найти ошибки.Помогите!!! VM007 Программирование и базы данных 5 04-06-2009 07:57
Помогите в решении ошибки!!! мразь Хочу все знать 5 31-08-2007 10:18




 
Переход