Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Задача на C++

Featured Replies

Да се напише програма, която по дадено реално число x, намира стойността на сумата

y = sinx + sinx2  + sinx3 + ... + sinxn

Моят код

#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
 cout << "Enter x: ";
 double x;
 cin >> x;
 if (!cin)
 {
  cout << "Error, bad input";
 }
 cout << "Enter n: ";
 int n;
 cin >> n;
 if (!cin)
 {
  cout << "Error, bad input";
 }
 double y = 0;
 for (int i = 1; i <= n; i++)
 {
  pow(x, i);
  x = sin(x);
 }
 cout << y;
 return 0;
}
преди 44 минути, Vzino написа:

 

Смяташ степента, но не добавяш към общото. Освен това е ненужно всеки път да смяташ степен и синус.

x = sin(x);
double y = x;
double temp = x;
for (int i = 2; i <= n; i++)
{
	temp *= x;
	y += temp;
}

 

Редактирано от flare (преглед на промените)

Здравейте !

Променете следния код:

преди 52 минути, Vzino написа:

 pow(x, i);
  x = sin(x);

в това:

y += sin(pow(x,i))

В текущия си код, инициализирате y = 0, но не присвоявате абсолютно нищо на променливата - затова постоянно отговора излиза 0.

Резултата от pow(x,i) не се пази никъде (фактически leak-ва) и x постоянно изменя стойност (въпреки, че е входен аргумент ...)

@flare, мисля, че формулата трябва да се интерпретира като:
y = sin(x) + sin(x2) + sin(x3)+ ... + sin(xn)

 (по последни спомени, ако степента беше за sin, то тогава записа мисля, че беше нещо от типа на: y = sin x + sin2x  + sin3x+ ... + sinnx ). А може и да бъркам - бая години изтекоха от тогава, уви ...

Всъщност, нека автора провери каква точно трябва да е. И в двата случая, проблема е в самия цикъл и присвояванията. Вече в зависимост от формулата, решението може да е с промените, публикувани в този пост или горния.

Поздрави !

Редактирано от soundtracker (преглед на промените)

преди 6 минути, soundtracker написа:

 

@flare, мисля, че формулата трябва да се интерпретира като:
y = sin(x) + sin(x2) + sin(x3)+ ... + sin(xn)

Мисля че си прав.

преди 7 минути, Vzino написа:

Благодаря ви!!!

Учудих се, че няма нито един негативен коментар.  :D:D 

Е, днеска е събота, а ние не сме зверове, все пак :) !

  • Автор

sin2x а това го разбирам нещо такова sinsinx?

и ако може да ми обясните какво е a! и а!!

Редактирано от Vzino (преглед на промените)

Факториел    5! = 1х2х3х4х5  6!=1х2х3х4х5х6 или 6!=5!х6

Двоен факториел  (умножаваш само четните или нечетните числа)  5!! = 5х3х1 6!! = 6х4х2     https://en.wikipedia.org/wiki/Double_factorial

връзката между двата е 6!=5!!х6!!

 

Редактирано от ined (преглед на промените)

преди 1 час, Vzino написа:

sin2x а това го разбирам нещо такова sinsinx?

и ако може да ми обясните какво е a! и а!!

sin2x = sin(x) * sin(x) //Всички стойности на y са между 0 и 1 - полезно за неща, свързани със статистика, пораждащи функции и вероятностни модели.  

sinx= sin(x*x) //За стойности на x∈[-√π,√π], y е положителен или 0. Функцията е четна (симетрична спрямо оста y). Удобна за дефиниране и анализ на errorness/отклонение при оценка на дадени резултати. При x → ±∞, синусуидата повишава честотата си и не съм запознат за това дали се използва някъде в практиката, извън интервала [-√π,√π].

sin(sin(...(sin(x)...) не се среща често. А и в практиката, освен за някакви специфични скалирания на тегловни коефициенти, не съм я виждал. Записа, който е зададен в първия пост със сигурност не е за тази формула.

Относно двойния факториел (!!), @ined ме изпревари с отговора :).

Поздрави !

Редактирано от soundtracker (преглед на промените)

  • Автор

Оставям още една задачка ако на някой му се занимава

Задача 7. Дадено е естественото число n (n ≥ 1). Да се напише програма, която пресмята сумата:

    

(1 / 1)n + (1 / 2)n ................... + (1 / n)n;

 

ето го и кода ми

#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
 cout << "Enter n: ";
 double n;
 cin >> n;
 if (!cin)
 {
  cout << "Error, bad input!!!";
 }
 if (n < 1)
 {
  cout << "Error, bad input!!!";
 }
 double g;
 double y;
 for (int i = 1; i <= n; i++)
 {
  g = 1 / i;
  y = pow(g, i);
  y += pow(g, i);
  cout << "Result: " << y << "\n";
 }
 return 0;
}
преди 44 минути, Vzino написа:

(1 / 1)n + (1 / 2)n ................... + (1 / n)n;

А защо трябва да се пише цикъл за нещо, което идеално се смята с една формула?

преди 1 час, Vzino написа:

Забравих да спомена

(Да не се използват функциите exp и lоg).

Ми нямах и намерение :D
Хммм. всъщност без степен не може, но това е едно от нещата дето най-мразя в обучението по програмиране. Да те карат да правиш нещо по грешния начин.

Редактирано от flare (преглед на промените)

преди 1 час, Vzino написа:

Забравих да спомена

(Да не се използват функциите exp и lоg).

Нека само да уточним формулата:

(1/1)*n + (1/2)*n + ... + (1/n)*n

ли е или 

(1/1)^n + (1/2)^n + ... + (1/n)^n 

Ако е първото, то кода Ви математически не е правилен. Всъщност, фактически дори и втората версия не отговаря на кода Ви. Това, което в момента правите е по-скоро нещо, което е по формулата:

(1/1)^1 + (1/2)^2 + ... + (1/n)^n 

а резултата за y накрая е винаги 

y = 2*[(1/n)^n]

преди 2 часа, Vzino написа:

for (int i = 1; i <= n; i++)
 {
  g = 1 / i;
  y = pow(g, i); // <= Това не трябва да го има. На всяка итерация от цикъла си, губите моментната стойност на y - това ще даде грешен резултат. Също така, самата операция изисква и променливата n да участва, но не виждам къде е
  y += pow(g, i); // <= Трябва ли да се повдига на степен ? Проверете условието - изглежда трябва умножение само, без степенуване. Освен това, спрямо горния коментар, y реално ще е равно на y = 2*pow(g, i) след този ред.
  cout << "Result: " << y << "\n";  // <= Това не трябва да е в цикъла изобщо. Резултата ще се изведе, след като цикъла с изчисления приключи.
 }

Едно възможно решение е следното:

преди 2 часа, Vzino написа:

for (int i = 1; i <= n; i++)
 {
  g = 1 / i;
  y += n * g;  // Или направо може да се изчислява като y += n / i 
 }

cout << "Result: " << y << "\n";

Или ако все пак е степен

преди 2 часа, Vzino написа:

for (int i = 1; i <= n; i++)
 {
  g = 1;
  for (int t = 1; t <= i; t++) {g *= (1/i);} //Фактически, това ще симулира повдигането на степен.
  y += g;
 }

cout << "Result: " << y << "\n";

 

преди 1 час, flare написа:

А защо трябва да се пише цикъл за нещо, което идеално се смята с една формула?

В случая, че става дума за (1/1)*n + (1/2)*n + ... + (1/n)*n, не съм убеден, че може да се изчисли по директна формула. Ако опростим израза:

S = (1/1)*n + (1/2)*n + ... + (1/n)*n <=> n * [(1/1) + (1/2) + ... + (1/n)], това, което остава в скобите е сума на хармоничния ред. По дефиниция, хармоничния ред е разходящ (за n → ∞, S → ∞), и частичната му сума няма директна формула, по която да се изчисли (има добри приближения, използващи константата на Ойлер-Маскерони).

Относно сумата S = (1/1)^n + (1/2)^n + ... + (1/n)^n, за n > 1, реда е сходящ (тъй като разликата на всеки два съседни елемента е < 1/(n^2)), но не съм срещал универсална формула за частична сума на подобен ред.

Поздрави !

П.С. Само за протокола да отбележа, но в 1:40 бистрим анализ и сума на редици ?! Нещо не е както трябва май :D !

Редактирано от soundtracker (преглед на промените)

естествените числа са цели положителни  

повдигане на степен без използване на функции от math.h може да се направи е с цикъл като n-1 умножиш числото със себе си,

може да се направи и по-сложно но по-бързо с умножение и повдигане на квадрат.

може да се направи и с цели числа и после да се дели 1 на тях ама при големи стойности на n ще се получава препълване,

докато ако се повдига на степен 1/i като число с плаваща запетая при големи стойности на n просто числата стават прекалено малки и вече не влияят на крайната сума и можем да прекъснем изчисленията примерно при eps=1e-20

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
 int n,m=1;
 cout << "Enter n: ";
 cin >> n;
 if (n < 1)
 {
  cout << "Error, bad input!!!";
  exit(1);
 }
 while (m<=n) m*=2;
 m/=4;
 double y=1.0;
 for (int i = 2; i <= n; i++)
 {
     double k=1/(double)i;
     double x=k;
     int mask=m;
     while(mask)
     {
        x*=x;
        if (n&mask) x*=k;
        mask/=2;
     }
     if (x<1e-20) break;
     y+=x;
      
 }
 cout << "Result: " <<setprecision(15)<< y << "\n";
 return 0;
}

 

 

 

Редактирано от ined (преглед на промените)

  • Автор

Задача 5.  Да се напише програма, която  изчислява реципрочното число на произведението на тези елементи на редицата a0, a1, ..., an-1 (1 ≤ n 50), за които е в сила релацията 2 < аi < i!.

 


#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
int a[50];
int n;
int i, j;
int main()
{
 cout << "N= ";
 cin >> n;
 if (!cin)
 {
  cout << "Error, bad input";
  return 1;
 }
 if (n < 1 || n > 50)
 {
  cout << "Error, bad input";
  return 1;
 }
  for (j = 0; j < n - 1; j++)
  {
   cout << "a[" << i << "]= ";
   cin >> a;
   if (!cin)
   {
    cout << "Error, bad input";
    return 1;
   }
   if (a < 2)
   {
    a++;
   }
   if (a > i - 2)
   {
    a--;
   }
  }
  return 0;
}
Благодаря за досегашната помощ!

Редактирано от Vzino (преглед на промените)

нещо ти е сбъркано условието: за а0, а1, а2 какво число ще въведеш по-голямо от 2 но по-малко от 1 (0!, 1!) или по-голямо от 2 но по-малко от 2 (2!):)

Редактирано от ined (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.