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

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

Восстановить пароль Регистрация
 
2009
2 / 2 / 0
Регистрация: 23.11.2009
Сообщений: 35
23.01.2010, 01:17     Проверка 3-ех примеров (Решать ничего не нужно) #1
Всем привет! =) У меня такая проблемка,кто сталкивался,или может решить,помогите пожалуйста =) Буду очень признателен! Итак,даны три задачи:
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();
}
Посмотрите пожалуйста внимательнее...потому что если например я где-то неправильно сделал накапливание, закрыл или наоборот открыл цикл преждевременно то получается совсем другой ответ.
Заранее благодарен вам!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2010, 01:17     Проверка 3-ех примеров (Решать ничего не нужно)
Посмотрите здесь:

[C++]10 примеров непереносимого кода. C++
Классы в решение примеров C++
C++ Решение 4х примеров
C++ Решение 2 математических примеров на C++
Доработка примеров учебника. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
23.01.2010, 01:29     Проверка 3-ех примеров (Решать ничего не нужно) #2
Я придумал универсальный совет (которому много лет следую сам)
Если в некоторой точке программы есть сомнения, выводите сомнительные переменные!

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

Попробуйте.
И может ассы вам будут не так уж и нужны
(хотя, это немного печально)
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
23.01.2010, 06:07     Проверка 3-ех примеров (Решать ничего не нужно) #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.
2009
2 / 2 / 0
Регистрация: 23.11.2009
Сообщений: 35
23.01.2010, 21:08  [ТС]     Проверка 3-ех примеров (Решать ничего не нужно) #4
valeriikozlov, я ввёл переменную a для того чтобы знак перед дробью каждый раз менялся...даже по условию задачи видно...потом переменную с я ввел для возведения дроби в степень...поскольку знаменатель дроби начинается с 4ех, то я сделал с=2 и с каждым шагом оно будет увеличиваться на 1...переменная b считает всё это...ну потом идет сумма z, которая накапливается в s.
Я считаю, что всё правильно, но если есть ошибки, то покажите пожалуйста и исправьте.
И как насчет первых двух задач?

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

Добавлено через 6 часов 29 минут
народ!!!
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.01.2010, 08:20     Проверка 3-ех примеров (Решать ничего не нужно) #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++)
2009
2 / 2 / 0
Регистрация: 23.11.2009
Сообщений: 35
24.01.2010, 13:22  [ТС]     Проверка 3-ех примеров (Решать ничего не нужно) #6
Цитата Сообщение от valeriikozlov Посмотреть сообщение
У Вас в коде переменная exp ранее нигде не объявлена, поэтому компилятор и ругается.
Ну ведь я же подключил директиву препроцессора #include<math.h>, следовательно она будет работать без объявления.

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

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

Если в моих рассуждения есть ошибка, то покажите как должна быть полностью рабочая программа. Буду очень признателен.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.01.2010, 15:08     Проверка 3-ех примеров (Решать ничего не нужно) #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 Посмотреть сообщение
Если в моих рассуждения есть ошибка, то покажите как должна быть полностью рабочая программа. Буду очень признателен.
У Вас практически все получилось. Еще немного и все заработает.
2009
2 / 2 / 0
Регистрация: 23.11.2009
Сообщений: 35
24.01.2010, 17:40  [ТС]     Проверка 3-ех примеров (Решать ничего не нужно) #8
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Приведите пример устных вычислений. Программа у Вас считает правильно.
Ну вот, например, при вводе 1, выдается 0,75, а должно 1,25.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.01.2010, 17:46     Проверка 3-ех примеров (Решать ничего не нужно) #9
Ну вот, например, при вводе 1, выдается 0,75, а должно 1,25.
В третьей задаче при начальном объявлении переменной a, присвой ей значение не 1, а -1. Должно помочь.
2009
2 / 2 / 0
Регистрация: 23.11.2009
Сообщений: 35
24.01.2010, 19:16  [ТС]     Проверка 3-ех примеров (Решать ничего не нужно) #10
а что если записать b=M_E*b?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.01.2010, 19:41     Проверка 3-ех примеров (Решать ничего не нужно) #11
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Соответственно писать нужно так:
Код C++1 b=M_E*b;
и я об этом!
2009
2 / 2 / 0
Регистрация: 23.11.2009
Сообщений: 35
24.01.2010, 20:59  [ТС]     Проверка 3-ех примеров (Решать ничего не нужно) #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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2010, 06:35     Проверка 3-ех примеров (Решать ничего не нужно)
Еще ссылки по теме:

Задача с решением примеров C++
C++ Выручайте! Нужно переделать прогу под двусвязный список.ничего не понимаю)

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

Или воспользуйтесь поиском по форуму:
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.01.2010, 06:35     Проверка 3-ех примеров (Решать ничего не нужно) #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();
}
Yandex
Объявления
25.01.2010, 06:35     Проверка 3-ех примеров (Решать ничего не нужно)
Ответ Создать тему
Опции темы

Текущее время: 05:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru