- •Содержание:
- •Введение.
- •Задача 1(№127)
- •Текст программы:
- •Задача 2(№133)
- •Текст программы:
- •Задача 3(№145)
- •Текст программы:
- •Задача 4(№161)
- •Текст программы:
- •Задача 5(№172)
- •Текст программы:
- •Задача 6(№177)
- •Текст программы:
- •Задача 7(№187)
- •Текст программы:
- •Текст программы:
- •Задача 9(№200)
- •Текст программы:
- •Список используемой литературы
Задача 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;
}