Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПрограммированиеРГР_Матюшков.docx
Скачиваний:
3
Добавлен:
21.09.2019
Размер:
58.39 Кб
Скачать

Задача 7(№187)

Постановка задачи: Напишите программу для работы со стеком целых чисел. Помещайте вводимые числа в стек, найдите сумму чисел, помещенных в стек, максимальное число в стеке.

Текст программы:

#pragma hdrstop

#include "UnStack.h"

#pragma package(smart_init)

//файл Stack.cpp

#include <iostream.h>

static const int SZ=1000;

static int s[SZ];

static int sp = 0;

//push: поместить c в стек

void push(int c)

{

if(sp<SZ)

s[sp++]=c;

else

cerr<<"Stek polon, "<<char(c)<<"ne pomeshaetsya \n";

}

//pop: извлечь элемент из вершины стека

int pop()

{

if(sp>0)

return s[--sp];

else{

cerr<<"Stek pust\n";

return EOF;

}

}

bool isEmpty()

{

if(sp==0) return true;

else return false;

}

//Необходимо найти сумму элементов в стеке,

// а также максимальный элемент стека

#pragma argsused

//Файл StackArray.cpp

#include <iostream>

using namespace std;

#include <stdlib.h>

#include <conio.h>

#include "UnStack.h"

//Программа работает со стеком чисел

int main(int argc, char* argv[])

{

int c,i,sum = 0;

cout<<"Vvodite elementi steka: ";

for (i = 0; i <= 4; i++) {

cin>>c;

push(c);

}

int max = pop();

sum+=max;

cout<<"\nStack: "<<max<<" ";

while(isEmpty() == false){

c=pop();

cout<<c<<" ";

sum+=c;

if(c>max) max = c;

}

cout<<"\nSumma = "<<sum<<"\n";

cout<<"Max = "<<max;

getch();

return 0;

}

Задача 8(№192)

Постановка задачи: Напишите функцию для решения полного кубического уравнения

с комплексными коэффициентами. Подстановкой

,

получается каноническое уравнение

,

где

.

Каноническое уравнение решается по формулам Кардано

Алгоритм решения: Алгоритм решения задачи состоит в следующем. Организовываем класс для комплексных чисел. Входными данными будут коэффициенты a,b,c,d. p и q – комплексные коэффициенты в каноническом уравнении, которые мы находим с помощью формул. Далее находим корни y и подставляем их в формулу для нахождения z.

Текст программы:

#ifndef UnComplexH

#define UnComplexH

#include <math.h>

class Complex

{

double re, im;

public:

Complex()

{re=0; im=0;}

Complex(double x)

{re = x; im=0;}

Complex(double x, double y)

{re=x; im=y;}

double Arg();

double Abs();

Complex& operator+=(Complex z)

{

re+=z.re; im+=z.im; return *this;

}

Complex& operator -=(Complex z)

{

re-=z.re; im-=z.im; return *this;

}

Complex operator*(Complex);

Complex operator*(double);

Complex operator/(Complex);

Complex operator-();

void Roots(int m, Complex rts[]);

void Print();

};

Complex operator+(Complex z, Complex t);

Complex operator-(Complex z, Complex t);

Complex operator*(double a, Complex z);

Complex Pow(Complex z, int m);

Complex Polar(double mod, double arg);

#endif

#include "UnComplex.h"

#include <iostream>

using namespace std;

double Complex::Arg()

{return atan2(im,re);}

double Complex::Abs()

{return sqrt(re*re+im*im);}

Complex Complex::operator*(Complex z)

{

Complex t(re*z.re-im*z.im, re*z.im+im*z.re);

return t;

}

Complex Complex::operator*(double a)

{return *this * Complex(a);}

Complex Complex::operator/(Complex z)

{

double r=(re*z.re+im*z.im)/(z.re*z.re+z.im*z.im);

double i=(-re*z.im+im*z.re)/(z.re*z.re+z.im*z.im);

return Complex(r,i);

}

Complex Complex::operator-()

{

return Complex(-re,-im);

}

void Complex::Roots(int m, Complex rts[])

{

double angle=Arg();

double mod=Abs();

mod=pow(mod, 1.0/m);

for(int k=0; k<m; k++)

rts[k]=Polar(mod,(angle+2*k*M_PI)/m);

}

void Complex::Print()

{ cout<<"("<<re<<","<<im<<")";}

Complex operator+(Complex z, Complex t)

{return z+=t;}

Complex operator-(Complex z, Complex t)

{return z-=t;}

Complex operator*(double a,Complex z)

{

Complex t(a, 0);

return z*t;

}

Complex Polar(double mod, double arg)

{ return Complex(mod*cos(arg), mod*sin(arg)); }

Complex Pow(Complex z, int m)

{

double angle = z.Arg();

double mod = z.Abs();

angle *=m;

double mp=1.0;

for(int k=0; k<m; k++)

mp*=mod;

return Polar(mp, angle);

}

#include "UnComplex.h"

#include <iostream>

using namespace std;

#include <conio.h>

#include <windows.h>

char Buff[500];

char* Rus(char* in)

{

CharToOem(in, Buff);

return Buff;

}

int main(int argc, char* argv[])

{

const double eps =0.1E-4;

int a,b,c,d;

cout<<Rus("Решаем полное кубическое уравнение \n"

"a*z^3+b*z^2+c*z+d=0\n");

cout<<Rus("Введите a: ");

cin>>a;

cout<<Rus("Введите b: ");

cin>>b;

cout<<Rus("Введите c: ");

cin>>c;

cout<<Rus("Введите d: ");

cin>>d;

//Расчёт коэффициентов в каноническом уравнении

Complex p=-(b^2)/(3*a^2)+c/a;

Complex q=(2*b^3)/(27*a^3)-(b*c)/(3*a^2)+d/a;

Complex inner[2];

//Массивы для первого и второго кубического корня

Complex root3_1[3], root3_2[3];

Complex D; //Дискриминант кубического уравнения

D=q*q/4+p*p*p/27;

D.Roots(2, inner); //Квадратный корень из дискриминанта

//Первое выражение под куб.корнем

Complex D1= (-0.5)*q+ inner [0];

//Второе выражение под куб.корнем

Complex D2=(-0.5)*q-inner[0];

D1.Roots(3, root3_1);//извлечение первого кубического корня

D2.Roots(3, root3_2);//извлечение второго кубического корня

Complex p3 = -p/3; //критерий для отбора корней

Complex y; //переменная для корня канонического уравнения

Complex z; //переменная для корня полного уравнения

Complex prod; //произведение кубических корней

for(int i=0; i<3; i++)

for(int j=0; j<3; j++){

prod = root3_1[i]*root3_2[j];

double err=(prod-p3).Abs();

if(err<eps){

y=root3_1[i]+root3_2[j];

z=y-b/3*a; //подстановка

cout<<Rus("\nКорень z = "); z.Print();

}

}

getch();

return 0;

}