Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
2009
2 / 2 / 0
Регистрация: 23.11.2009
Сообщений: 35
#1

Проверка 3-ех примеров (Решать ничего не нужно) - C++

23.01.2010, 01:17. Просмотров 737. Ответов 12
Метки нет (Все метки)

Всем привет! =) У меня такая проблемка,кто сталкивался,или может решить,помогите пожалуйста =) Буду очень признателен! Итак,даны три задачи:
1) Даны натуральные числа n и m. Вычислить:
[IMG]http://s47.***********/i116/1001/8d/8242f61cfad2.jpg[/IMG]
2) Дано натуральное число n. Вычислить:
[IMG]http://s55.***********/i148/1001/0d/e2f9e20d615b.jpg[/IMG]
3) Дано натуральное число n. Вычислить (1+1/4)+(1-1/9)+(1+1/16)+(1-1/25)+...для n слагаемых.

Решения:
1)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
 
int f(int n)  /*стоит ли вместо int ставить float?*/
{ if (n==0||n==1) return 1;
  else return n*f(n-1);
}
 
void main()
{ clrscr();
  int i,j,a=1,b=1,n,m;
  float s=0,z=0;
  cin>>n>>m;
  for(i=1;i<=n;i++)
     { a=-1*a;
       for(j=1;j<=m;j++)
      {b=2*b;
       z=a*b/(f(i)+f(j));}  /*должно ли накапливаться z?*/
       s+=z;}
  cout<<s;
  getch();
}
2)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
 
int f(int n)
{ if (n==0||n==1) return 1;
  else return n*f(n-1);
}
 
void main()
{ clrscr();
  int i,j,a=1,b=1,n,m;
  float s=0,z=0;
  cin>>n>>m;
  for(i=1;i<=n;i++)
     { a=-1*a;
       b=exp*b; /*почему в компиляторе ошибка указывается на экспонент?*/
       z=a*b/(3*f(i)); /*накапливается ли z?*/
       s+=z;}
  cout<<s;
  getch();
}
3)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
 
void main()
{ clrscr();
  int a=1,b,n,c=2,i;
  float s=0,z=0;
  cin>>n;
  for(i=1;i<=n;i++)
     {a=-1*a;
      b=c*c; c++; /*почему программа вся в целом неправильна...например число, которое вводят в программу, потом же и выводится?*/
      z=1+a/b;
      s+=z;}
  cout<<s;
  getch();
}
Посмотрите пожалуйста внимательнее...потому что если например я где-то неправильно сделал накапливание, закрыл или наоборот открыл цикл преждевременно то получается совсем другой ответ.
Заранее благодарен вам!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2010, 01:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка 3-ех примеров (Решать ничего не нужно) (C++):

Какие типовые коммерческие задачи нужно уметь решать на С++? - C++
всем привет. около года основательно изучаю С++, сейчас заканчиваю книгу стивен прата. Но еще не разу не работал в комерции. Хочу для...

Выручайте! Нужно переделать прогу под двусвязный список.ничего не понимаю) - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; struct Node { int memSize; Node *Next; }; Node *BegList; using namespace...

Решать ничего не нужно, просто ответьте - Механика
Сама задача: К концам легкой и нерастяжимой нити, перекинутой через блок, подвешены грузы массами m1=0,2 кг и m2=0,3 кг. Во сколько раз...

четырехполюсник(ничего решать не нужно, ток подсказать) - Электричество и магнетизм
есть у меня формула с комплексным числом: Z = (U/I)*e^(jφ) что такое j, и как мне посчитать Z ??? мне известно U, I, φ, e

Ответьте кто-нибудь на вопрос, решать ничего не нужно) - Базы данных
Вопрос: почему когда записываешь программу с базой данных на флешку, то она открывается нормально, а когда на СД-диск - выбивает ошибку???...

Подскажите формулу (ничего решать не надо) - Экономика
Есть данные по задачи (а именно: трудоотдача(?!), фондоотдача, отдача оборотных активов и отдача рекламных и информационных затрат)....

12
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
23.01.2010, 01:29 #2
Я придумал универсальный совет (которому много лет следую сам)
Если в некоторой точке программы есть сомнения, выводите сомнительные переменные!

cout << x << y < endl
Или
printf("%.. %..\n", x, y);

Попробуйте.
И может ассы вам будут не так уж и нужны
(хотя, это немного печально)
0
valeriikozlov
Эксперт С++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
23.01.2010, 06:07 #3
Цитата Сообщение от 2009 Посмотреть сообщение
/*почему программа вся в целом неправильна...например число, которое вводят в программу, потом же и выводится?*/
Тут во всем виновата математика. Смотрим что получается:
C++
1
2
3
4
5
6
7
8
  int a=1,b,n,c=2,i;
  float s=0,z=0;
  cin>>n;
  for(i=1;i<=n;i++)
     {a=-1*a;// эта переменная принимает значения -1, потом 1, потом снова -1 и так циклически
      b=c*c; c++; // с каждым циклом переменная с (начальное значение которой 2) возрастает и переменная b также возрастает
      z=1+a/b;// вот здесь поподробнее: a/b (вспоминаем что a принимает значения только 1 или -1, b принимает значения от 4 и более) когда a и b объявлены как int то у нас при делении 1 (или -1) на 4 и большие числа всегда будет получаться 0 (а не ноль целых сколько-то десятых или сотых и т.п.). В результате при каждом прохождении цикла это выражение будет следующим: z=1+0;
      s+=z;}// ну и s в результате будет равна n
Попробуйте переменную a (можно даже и b) объявить не int а float.
1
2009
2 / 2 / 0
Регистрация: 23.11.2009
Сообщений: 35
23.01.2010, 21:08  [ТС] #4
valeriikozlov, я ввёл переменную a для того чтобы знак перед дробью каждый раз менялся...даже по условию задачи видно...потом переменную с я ввел для возведения дроби в степень...поскольку знаменатель дроби начинается с 4ех, то я сделал с=2 и с каждым шагом оно будет увеличиваться на 1...переменная b считает всё это...ну потом идет сумма z, которая накапливается в s.
Я считаю, что всё правильно, но если есть ошибки, то покажите пожалуйста и исправьте.
И как насчет первых двух задач?

Добавлено через 3 часа 46 минут
почему?

Добавлено через 6 часов 29 минут
народ!!!
0
valeriikozlov
Эксперт С++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.01.2010, 08:20 #5
2009, Вы это пробовали для третьей задачи:
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Попробуйте переменную a (можно даже и b) объявить не int а float.
По второй:
Цитата Сообщение от 2009 Посмотреть сообщение
b=exp*b; /*почему в компиляторе ошибка указывается на экспонент?*/
z=a*b/(3*f(i)); /*накапливается ли z?*/
У Вас в коде переменная exp ранее нигде не объявлена, поэтому компилятор и ругается.
Переменная z не накапливается, а вычисляется при каждом прохождении цикла
for(i=1;i<=n;i++)
И отсюда видно что каждый раз z будет равна a*b/(3*(i!));

По первой задаче:

Цитата Сообщение от 2009 Посмотреть сообщение
int f(int n) /*стоит ли вместо int ставить float?*/
{ if (n==0||n==1) return 1;
else return n*f(n-1);
}
Нет смысла, т.к. результат всегда будет целое число.
Цитата Сообщение от 2009 Посмотреть сообщение
z=a*b/(f(i)+f(j));} /*должно ли накапливаться z?*/
Переменная z каждый раз вычисляется заново в циклах:
Цитата Сообщение от 2009 Посмотреть сообщение
for(i=1;i<=n;i++)
{ a=-1*a;
for(j=1;j<=m;j++)
1
2009
2 / 2 / 0
Регистрация: 23.11.2009
Сообщений: 35
24.01.2010, 13:22  [ТС] #6
Цитата Сообщение от valeriikozlov Посмотреть сообщение
У Вас в коде переменная exp ранее нигде не объявлена, поэтому компилятор и ругается.
Ну ведь я же подключил директиву препроцессора #include<math.h>, следовательно она будет работать без объявления.

Цитата Сообщение от valeriikozlov Посмотреть сообщение
Переменная z не накапливается, а вычисляется при каждом прохождении цикла
Значит мне следует поставить:
z+=1+a/b ?

Цитата Сообщение от valeriikozlov Посмотреть сообщение
Попробуйте переменную a (можно даже и b) объявить не int а float.
Я пробовал...изменения почти не происходят...при вводе 5 выводится 4,81, при вводе 100 выводится 99,82, то есть совсем незначительные изменения. А при устном счете получается результат далекий от этих.

Если в моих рассуждения есть ошибка, то покажите как должна быть полностью рабочая программа. Буду очень признателен.
0
valeriikozlov
Эксперт С++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.01.2010, 15:08 #7
Цитата Сообщение от 2009 Посмотреть сообщение
Сообщение от valeriikozlov
У Вас в коде переменная exp ранее нигде не объявлена, поэтому компилятор и ругается.
Ну ведь я же подключил директиву препроцессора #include<math.h>, следовательно она будет работать без объявления.
В библиотеке math.h есть функция exp(). Но Вы используете exp как неописанную нигде ранее переменную:
Цитата Сообщение от 2009 Посмотреть сообщение
b=exp*b; /*почему в компиляторе ошибка указывается на экспонент?*/
А Вам нужно использовать число e: число Эйлера или число Непера. В библиотеке math.h есть это число:
#define M_E 2.71828182845904523536
Соответственно писать нужно так:
C++
1
b=M_E*b;
Если на эту строчку компилятор Ваш будет ругаться, то тогда после подключения библиотек в начале файла напишите строчку:
C++
1
#define M_E        2.71828182845904523536
Цитата Сообщение от 2009 Посмотреть сообщение
Цитата:Сообщение от valeriikozlov
Переменная z не накапливается, а вычисляется при каждом прохождении цикла
Значит мне следует поставить:
z+=1+a/b ?
Нет. В третьем коде не нужно. Там идет накопление в переменной s, значение которой и выводится на экран как результат. (хотя можно было просто накапливать значения в z , а переменную s вообще не использовать)
В первом коде нужно как раз накапливать z по этому принципу, а s убрать. И выводить на экран как результат значение z.
Во втором коде этот в этом направлении ничего менять не нужно.

Цитата Сообщение от 2009 Посмотреть сообщение
Цитата:Сообщение от valeriikozlov
Попробуйте переменную a (можно даже и b) объявить не int а float.
Я пробовал...изменения почти не происходят...при вводе 5 выводится 4,81, при вводе 100 выводится 99,82, то есть совсем незначительные изменения. А при устном счете получается результат далекий от этих.
Приведите пример устных вычислений. Программа у Вас считает правильно.

Цитата Сообщение от 2009 Посмотреть сообщение
Если в моих рассуждения есть ошибка, то покажите как должна быть полностью рабочая программа. Буду очень признателен.
У Вас практически все получилось. Еще немного и все заработает.
1
2009
2 / 2 / 0
Регистрация: 23.11.2009
Сообщений: 35
24.01.2010, 17:40  [ТС] #8
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Приведите пример устных вычислений. Программа у Вас считает правильно.
Ну вот, например, при вводе 1, выдается 0,75, а должно 1,25.
0
valeriikozlov
Эксперт С++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.01.2010, 17:46 #9
Ну вот, например, при вводе 1, выдается 0,75, а должно 1,25.
В третьей задаче при начальном объявлении переменной a, присвой ей значение не 1, а -1. Должно помочь.
1
2009
2 / 2 / 0
Регистрация: 23.11.2009
Сообщений: 35
24.01.2010, 19:16  [ТС] #10
а что если записать b=M_E*b?
0
valeriikozlov
Эксперт С++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.01.2010, 19:41 #11
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Соответственно писать нужно так:
Код C++1 b=M_E*b;
и я об этом!
0
2009
2 / 2 / 0
Регистрация: 23.11.2009
Сообщений: 35
24.01.2010, 20:59  [ТС] #12
Теперь проблемас первой задачкой. Вот она немного измененная:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
 
int f(int n)
{ if (n==0||n==1) return 1;
  else return n*f(n-1);
}
 
void main()
{ clrscr();
  int i,j,a=1,n,m;
  float z=0,b=1;
  cin>>n>>m;
  for(i=1;i<=n;i++)
     { a=-1*a;
       for(j=1;j<=m;j++) b=2*b;
       z+=a*b/(f(i)+f(j));}
  cout<<z;
  getch();
}
Собственно, при вводе n=1 и m=1 выдается z=-0,66667, хотя устно проверив z=-0,66667 должен выдаваться при n=2 и m=2.
0
valeriikozlov
Эксперт С++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.01.2010, 06:35 #13
1.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
 
int f(int n)
{ if (n==0||n==1) return 1;
  else return n*f(n-1);
}
 
void main()
{ clrscr();
  int i,j,a=1,n,m;
  float z=0,b;
  cin>>n>>m;
  for(i=1;i<=n;i++)
     { a=-1*a; b=1;
  for(j=1;j<=m;j++){ b=2*b;
  z+=a*b/(f(i)+f(j));}}
  cout<<z;
  getch();
}
0
25.01.2010, 06:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2010, 06:35
Привет! Вот еще темы с ответами:

Объясните один момент в программе, ничего решать не надо - Visual Basic .NET
Public Class Form1 Dim A(), B(), C() As Single Private Sub vvod_mas(ByRef z() As Single, ByRef n As Integer) Dim i...

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

нужно сделать, чтобы работали кнопки запуска примеров - JavaScript
В созданном приложении &quot;Испытатель скриптов&quot; нужно сделать, чтобы работали кнопки запуска примеров. Сам текст примера отображается в...

по какой формуле нужно решать? - Теория вероятностей
Для посева пшеницы заготовлено семян, среди которого 95% 1-го сорта, 3% 2-го и 2% 3-го сорта. Вероятность того, что из семян вырастет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru