ЛАБОРАТОРНАЯ РАБОТА №3
по курсу Информатика
Ряды, цепные дроби.
Группа: АБ 121
Студент: Дик М.Е.
Преподаватель: Малявко А.А.
Новосибирск 2011
1. Цель работы:
Научиться решать задачи связанные с рядами и цепными дробями
2. Задание 3: Определить корень третьей степени от Z по итерационной формуле, пока |Wn+1 - Wn| < e
Wn+1 = Wn +(1/3)(Z/ Wn2- Wn)
начальное значение
Z/3, если Z >= 0 W0= 3 Z если Z < 0Использовать функцию F(w) = w + (1/3)(Z/ w2- w)
Алгоритм решения задачи: Вводится значение переменной Z, затем в зависимости от ее знака, ей присваивается значение, после чего запускается цикл с предусловием, в ходе которого вычисляется корень третьей степени из введенного с клавиатуры числа.
4. Текст программы решения задачи:
#include "stdafx.h"
//#include <stdio.h>
#include <conio.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"russian");
//Объявление переменных
float z = 0;
float wn1 = 0;
float wn = 0;
float e = 0;
float x = 0;
//Ввод данных
printf("Введите Z: ");
scanf("%f",&z);
printf("Введите точность(разделение целой и дробной части через запятую): ");
scanf("%f",&e);
//Определение корня третьей степени
wn = 0;
wn1 = 0;
if (z < 0)
wn = 3 * z;
else
wn = z / 3;
x = wn;
while (x > e)
{
wn1 = wn + (z / (wn * wn) - wn) / 3;
x = wn1 > wn? wn1 - wn: wn - wn1;
wn = wn1;
//printf("%f %f %f\n", e, x, Wn);
}
printf("%9.2f",wn1);
getchar();
getchar();
return 0;
}
5. Результаты работы программ:
2. Задание: Вычислить квадратный корень из произвольного вещественного числа А>0 по итерационной формуле, пока |Yn+1 - Yn| < e
Yn+1 = 0.5(Yn +A/Yn) и полагая Y0=A
3. Алгоритм решения задачи:
Вводятся данные с клавиатуры, затем запускается цикл с предусловием в ходе которого вычисляется квадратный корень, по формуле приведенной в условии задачи.
4. Текст программы решения задачи:
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"russian");
//Объявление переменных
float A=0;
float Yn1=0;
float Yn=0;
float e=0;
float x=0;
//Ввод значений переменных
printf("Введите число А: ");
scanf("%f", &A);
printf("Введите точность: ");
scanf("%f", &e);
//Вычисление корня
Yn = A;
x = A;
while (x > e)
{
Yn1 = (Yn + A/Yn) / 2;
x = Yn1 > Yn? Yn1 - Yn: Yn - Yn1;
Yn = Yn1;
}
printf("%f",Yn);
getchar();
getchar();
return 0;
}
5. Результаты работы программ:
2. Задание 5: Получение N-го числа Фибоначи, т.е. числа из последовательности
0 1 1 2 3 5 8 13 21 34
ci= ci-1 + ci-2 (c1 = 0 c2 = 1) n=10 c=34
Алгоритм решения задачи: После ввода данных, запускается цикл-счетчик в котором находится n-ый член последовательности, путем воспроизведения этой последовательности до n-ого члена.
4. Текст программы решения задачи:
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"russian");
//Объявление переменных
int c=0;
int cp=1; //сi-1 из формулы
int cpp=0; //ci-2 из формулы
int i=0;
int n=0;
//Ввод данных
printf("Введите номер элемента последовательности: ");
scanf("%d",&n);
//Нахождение n-ого члена последовательности
for (i=3;i<=n;i++)
{
c=cpp+cp;
cpp=cp;
cp=c;
}
printf("%d",c);
getchar();
getchar();
return 0;
}
5. Результаты работы программ:
2. Задание 7:
Нахождение наибольшего общего делителя двух чисел N и M по рекуррентному соотношению
(N=23345 M=9135 => 1015 N=238 M=347 => 34)
Nk = Nk-2 - INT(Nk-2 / Nk-1) N k-1 k=2,3...
N0 = max(|N|, |M|) N1 = min(|N|, |M|)
Если Nk = 0 => НОД = Nk-1
Алгоритм решения задачи: После ввода данных, переменным N и M присваивается модуль их же значения, затем запускается цикл с предусловием, в ходе которого по формуле представленной в условии задачи, находится наибольший общий делитель.
4. Текст программы решения задачи:
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"russian");
//Объявление переменных
int N = 0;
int M = 0;
int Npp = 0;// Nk-2 из формулы
int Np = 0; //Nk-1 из формулы
int i = 0;
//Ввод данных
printf("Введите N и M: ");
scanf("%d%d",&N,&M);
// модуль числа
N = N > 0? N: - N;
M = M > 0? M: - M;
// нахождение начальных значений
Npp = N > M? N: M;
Np = N < M? N: M;
// нахождение НОД
while (N!= 0)
{
N = Npp - (Npp / Np) * Np;
Npp = Np;
Np = N;
}
//вывод
printf("%d",Npp);
getchar();
getchar();
return 0;
}
5. Результаты работы программ:
2. Задание: Преобразование десятичного числа X в цепную или непрерывную дробь, производится выделением целой части X, а затем целых частей.
Xi = 1/(Xi-1 - INT(Xi-1))
Алгоритм решения задачи: После ввода данных запускается цикл-счетчик в ходе которого по формуле представленной в условии задачи, находится цепная дробь до n-ого элемнта.
4. Текст программы решения задачи:
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"russian");
//Объявление переменных
int integralpart = 0;
float xi = 0; //Xi из формулы
float xi1 = 0; //Xi-1 из формулы
int i = 0;
int n = 0;
//Ввод данных
printf("Введите десятичное число: ");
scanf("%f", &xi1);
printf("Введите количество элементов дроби: ");
scanf("%d", &n);
//Нахождение непрерывной дроби
xi = xi1;
for (i=0; i<=n; i++)
{
if (xi1!= integralpart)
{
integralpart = xi/1;
printf("%d, ", integralpart);
xi = 1 / (xi1 - integralpart);
xi1 = xi;
}
}
getchar();
getchar();
return 0;
}
5. Результаты работы программ:
6. Выводы и заключение: В ходе проделанной работы я научился решать задачи с цепными дробями и рядами.