Автор: Пользователь скрыл имя, 29 Ноября 2011 в 23:54, лабораторная работа
Цель работы: Изучение операторов цикла в языке С++.
Задание. Составить алгоритм решения задачи согласно своему варианту. В отчете предоставить три программы с разными операторами цикла (do … while, while, for). В алгоритме и программе массивов не использовать.
В отчете предоставить описание заданных методов, блок-схемы 2-х функций, реализующих методы решения, блок-схему основной функции и текст программы. Также в отчете должен быть нарисован график заданной функции с интервалом изоляции корня.
Вариант 3.
№ | Уравнение | Методы |
3 | x2-20sin(x)=0 | 3,4 |
При решении нелинейного уравнения методом касательных задаются начальное значение аргумента x0 и точность ε. Затем в точке(x0,F(x0)) проводим касательную к графику F(x) и определяем точку пересечения касательной с осью абсцисс x1. В точке (x1,F(x1)) снова строим касательную, находим следующее приближение искомого решения x2 и т.д. Указанную процедуру повторяем пока |F(xi)| > ε. Для определения точки пересечения (i+1) касательной с осью абсцисс воспользуемся следующей формулой . Условие сходимости метода касательных F(x0)∙F''(x0)>0.
При решении нелинейного уравнения методом итераций воспользуемся записью уравнения в виде x=f(x). Задаются начальное значение аргумента x0 и точность ε. Первое приближение решения x1 находим из выражения x1=f(x0), второе - x2=f(x1) и т.д. В общем случае i+1 приближение найдем по формуле xi+1 =f(xi). Указанную процедуру повторяем пока |f(xi)|>ε. Условие сходимости метода итераций |f'(x)|<1.
Корни функции лежат вблизи точек х=0 и х=3.
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
float funct(float x)
{
return (x*x-20*sinf(x));
}
int bystep(void)
{
int k;
float xk,eps;
cout<<"Vvedite nachalnoe pribligenie x0: ";
cin>>xk;
cout<<"Vvedite pogreshnost eps: ";
cin>>eps;
k=1;
do
{xk=funct(xk);//простая итерация
k++;
}while((fabs(funct(xk))>
if (k<10000)
cout<<"Null function="<<xk<<", Kol-vo shagov= "<<k<<endl;
else
cout<<"Metod ireraciy ne shoditsa"<<endl;
return 0;
};
int kasat(void)
{
int k;
float xk,eps;
cout<<"Vvedite nachalnoe pribligenie x0: ";
cin>>xk;
cout<<"Vvedite pogreshnost eps: ";
cin>>eps;
k=1;
do
{xk=xk-funct(xk)/(2*xk-
k++;
}while((fabs(funct(xk))>
if (k<10000)
cout<<"Null function="<<xk<<", Kol-vo shagov= "<<k<<endl;
else
cout<<"Metod kasatelnix ne shoditsa"<<endl;
return 0;
};
int main(void)
{ int sp;
do{
cout<<"1 - Metod iteraciy"<<endl;
cout<<"2 - Metod kasatelnix"<<endl;
cout<<"Other - exit"<<endl;
cin>>sp;
if (sp==1) bystep();
else if (sp==2) kasat();
}while((sp>0)&&(sp<3));
return 0;
}
Лабораторная работа №8
Тема «обработка одномерных массивов»
Цель работы: Изучение одномерных массивов в языке С++. Знакомство с основными алгоритмами работы с одномерными массивами– определение суммы, произведения элементов, поиска максимального или минимального элемента массива.
Задание. Составить алгоритм решения задачи согласно своему варианту и написать программу на языке С++.
Вариант
3. В массиве x(n) найти значение максимального
элемента и найти, сколько таких элементов.
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
int main(void)
{
int i,n,x[20];
int max,cnt;
cout<<"Entered N: ";
cin>>n;
for(i=0;i<n;i++)
{
cout<<"Entered X["<<setw(2)<<i<<"]: ";
cin>>x[i];
}
max=x[0];//за максимум берем 1-й элемент массива
cnt=1;
for(i=1;i<n;i++) //рассматриваем элементы, начиная со 2-го
{
if (x[i]>max)//найден новый максимум
{max=x[i]; cnt=1;
}
else if (x[i]==max) cnt++; //при повторе увеличиваем кол-во
}
cout<<"Max(X)="<<max<<", count="<<cnt<<endl;
return 0;
}
Лабораторная работа №9
Тема «Указатели и динамические массивы. Использование указателей в качестве аргументов функций»
Цель работы: Знакомство с указателями в С++. Изучение одномерных динамических массивов в языке С++. Знакомство с функциями, возвращающими несколько значений. Рассмотрение на примерах, как указатели используются в качестве параметров функций.
Задание. Составить алгоритм решения задачи согласно своему вариантуи написать программу на языке С++. В отчете предоставить блок-схемы всех функций, текст программы.
Вариант
3. Заданы два целочисленных массива
y(k) и z(m). Определить в каждом массиве среднее
арифметическое простых двухзначных чисел.
Если таких чисел в массиве больше двух,
то удалить их из соответствующего массива.
В программе написать функции: вычисления
среднего арифметического простых двухзначных
чисел в массиве и их количества, удаления
элемента.
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
void del(int *a, int *na, int ii)//передаем ссылку на массив, ссылку на кол-во элементов массива, номер удаляемого элемента
{int i;
for(i=ii+1;i<na[0];i++)
a[i-1]=a[i];// выполняем сдвиг элементов на 1-у позицию влево
*na -=1;//уменьшаем кол-во элементов массива
}
int prost(int x)//проверяем число-простое?
{int i;
for(i=2;i<x;i++) //число не является простым, если остаток от
if (x%i==0) return 0;//от деления на число равен 0
return 1;
}
int sred(int *a, int na, int *k, float *summ)//передаем ссылки на массив и на кол-во элементов; ссылки на переменные для результатов
{int i,cura;
*summ=0;*k=0;
for(i=0;i<na;i++)
{cura=abs(a[i]);
if ((cura>10)&&(cura<99))//
{if (prost(cura))
{ *summ+=a[i];//увеличиваем сумму
*k +=1;//увеличиваем счетчик
} } }
if (*k>1) *summ/=*k;//находим среднее арифметическое
return 0;
}
int main(void)
{ int *y, *z;
int i,k,m,*ky,*kz;
float *my, *mz;
cout<<"Vvedite razmer Y:";
cin>>k;
y=new int[k];//выделяем память для массива
for (i=0;i<k;i++)
{cout<<"Entered Y["<<setw(2)<<i<<"]= ";
cin>>y[i]; }
ky=new int;//памыть для
my=new float;//результатов
sred(y,k,ky,my);
cout<<"Array Y"<<endl;
for(i=0;i<k;i++)//
cout<<setw(8)<<y[i];
if (ky[0]>0)//выводим среднее и количество простых