Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
3
Добавлен:
14.11.2017
Размер:
582.65 Кб
Скачать

Вычисление значения многочлена по методу Горнера

S = ax5 + bx4 + cx3 + dx2 + ex + f = = f + x(e + x(d + x(c + x(b + x(a))))) =

S = f + x∙s4 s4 = e + x∙s3 s3 = d + x∙s2 s2 = c + x∙s1 s1 = b + x∙s0

s0 = a

Нет необходимости возведения в степень. Коэффициенты задаются массивом или вводятся в процессе вычисления многочлена. Возможно вычисление и итерационным, и рекурсивным методом.

Технология и языки программирования

21

Ввод по шаблону элементов матрицы, вывод матрицы для контроля и суммирование ее элементов

#include <stdio.h>

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

{

int m[10][10];

printf("How many rows and columns? -> "); int r, c;

scanf("%d%d", &r, &c); int i,j;

for(i=0; i<r; i++) for(j=0; j<c; j++)

{

printf("m[%d][%d]= ",i,j); scanf("%d",&m[i][j]);

}

puts("\nShow matrix:"); for(i=0; i<r; i++)

{

for(j=0; j<c; j++) printf("%3d",m[i][j]); putchar('\n');

}

int sum =0; for(i=0; i<r; i++)

for(j=0; j<c; j++) sum += m[i][j]; printf("\nSum = %d\n\n",sum);

return 0;

}

Технология и языки программирования

22

Перестановка строк матрицы, номера которых задаются с клавиатуры

#include <stdio.h> #define n 3

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

{

int m[n][n] = {{1,2,3},{4,5,6},{7,8,9}}; int i, j, t;

for(i = 0; i < n; i++)

{

for(j = 0; j < n; j++) printf("%3d", m[i][j]); putchar('\n');

}

putchar('\n'); printf("Enter a,b -> "); int a,b;

scanf("%d%d", &a, &b); putchar('\n'); //swap rows

for(j = 0; j < n; j++)

{

t = m[a][j]; m[a][j] = m[b][j]; m[b][j] = t;

}

printf("Swap %d and %d rows:\n\n",a,b); for(i = 0; i < n; i++)

{

for(j = 0; j < n; j++) printf("%3d", m[i][j]); putchar('\n');

}

return 0;

}

Технология и языки программирования

23

Основные алгоритмы

Поиск в массиве

- вывод индекса элемента массива, который равен по значению некоторой заданной переменной или константе, или же вывод специальной информации, например -1, если такого элемента в массиве нет. Может быть много вариантов постановки задачи: массивы различной размерности; если несколько элементов, удовлетворяющих условию, то вывод всех индексов или только индекса первого вхождения (минимального), или последнего и т.п.

Простейший алгоритм - линейный поиск в одномерном массиве,

нахождение индекса первого вхождения в массив искомого (целевого) элемента, вывод -1, в случае неудачи

Алгоритм

Перебираем один за другим элементы массива, увеличивая индексы, начиная с 0, пока не встретим искомый или пока не дойдем до конца

Если встретили, то заканчиваем поиск и выводим индекс найденного элемента, если не встретили, то выводим -1

Если массив не упорядочен, то это единственно-возможный метод поиска. Число шагов алгоритма пропорционально размеру массива N, в среднем - N/2.

Технология и языки программирования

24

Основные алгоритмы

Быстрый поиск в упорядоченном (по возрастанию или по убыванию) массиве

Для определенности далее будем рассматривать поиск в массиве, упорядоченном по возрастанию

Метод дихотомии (половинного деления) – классический алгоритм поиска, обычно иллюстрируемый описанием того, как поймать льва в пустыне. Алгоритм такой: делим пустыню на две равные части, смотрим, где лев. Ту половину, где его нет отбрасываем, а ту где он есть снова делим на две части. . . Так делаем до тех пор, пока лев не окажется в клетке.

Число шагов такого алгоритма является минимально возможным. При увеличении размера массива оно растет не линейно, а логарифмически.

Например, если число элементов массива равно 4096, то при линейном поиске требуется в среднем 2048 шагов, а при дихотомическом – максимум 12 шагов.

Технология и языки программирования

25

Основные алгоритмы

Пример реализации программы двоичного поиска. Если элемент не найден, выводится -1.

#include <stdio.h>

int main(void)

{

const int N = 10;

int A[] = {0,1,2,3,4,5,6,7,8,9}; // элементы массива упорядочены по возрастанию int G = 6; // элемент, место которого в массиве мы ищем

int k = -1;

int L = 0; // левая граница области поиска

int R = N-1; // правая граница области поиска while ( R >= L )

{

int M = (R + L) / 2; // делим область пополам if (G == A[M]) { k = M; break;} // попали в цель!

if (G < A[M]) R = M - 1; // отбрасываем правую половину if (G > A[M]) L = M + 1; // отбрасываем левую половину

}

printf("Index = %d\n\n", k); return 0;

}

Технология и языки программирования

26

Основные алгоритмы

Решение уравнений

Метод деления интервала поиска корней пополам

Метод половинного деления позволяет находить один действительный корень

уравнения практически любого типа. Если уравнение имеет несколько корней, то они предварительно должны быть разделены, т.е. на каждом отрезке поиска должен быть точно один корень уравнения.

Уравнение должно иметь вид f(x) = 0. Здесь f(x) – произвольная функция

аргумента х, которая задается в виде программной функции в тексте

программы. При запуске программы задаются границы интервала поиска корня и наибольшая допустимая погрешность нахождения решения.

Перед началом итерационного поиска корней левая и правая границы интервала поиска устанавливаются равными границам, заданным в исходных данных. Далее в процессе решения на каждом шаге цикла вычисляется середина текущего интервала поиска и определяются знаки функции на концах интервала и в его середине. Та половина интервала, в пределах которой функция не изменила знак отбрасывается, а другая половина снова делится пополам и т.д. Процесс поиска корня заканчивается, когда значение функции в середине какого-то интервала станет меньше заданной

погрешности. Метод решения проиллюстрирован рисунком на след. слайде

Технология и языки программирования

27

Иллюстрация метода решения

y

(1)

Корень

 

 

 

уравнения

 

 

f(x)=0

(3)

x

0

(4)

 

y=f(x)

(2)

Технология и языки программирования

28

Пример программы решения уравнения cos(x) – x = 0

#include <stdio.h> #include <stdlib.h> #include <math.h>

float f(float);

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

{

printf("Enter root search interval bounds a,b -> "); float a,b;

scanf("%f%f", &a, &b); printf("Enter max error in % -> "); float err = 0.1;

scanf("%f", &err); puts("\n"); err /= 100;

float L = 0.0; float R = 1000.0; float M = 0.0;

while (fabs(f(M)) > err)

{

M = (L + R)/2;

if (f(L)*f(M) < 0) R = M; else if (f(M)*f(R) < 0) L = M;

}

printf("The result = %f\n\n", M); return 0;

}

float f(float x)

{

return cos(x) - x;

}

Программа тестировалась при a=0.0, b=1.0, err = 0.1. Результат 0.739098 (более точно 0.739085)

Технология и языки программирования

29

Основные алгоритмы

Решение уравнений вида f(x) = x методом итераций

Уравнение предварительно приводится к виду f(x) = x.

Этим методом можно решить не любое уравнение, а только такое в котором функция y = f(x) в окрестности пересечения с линией y = x изменяется медленнее, чем функция y = x.

В этой окрестности выбирается начальное приближение х0. Находится значение функции в этой точке, т.е. f(x0).

Находится значение х, при котором значение функции y = x равно значению функции f(x0). Это значение принимается за следующее приближение корня уравнения х1.

Находится значение функции f(x1). Находится следующее значение х, при котором значение линейной функции y = x равно значению f(x1).

Оно принимается за следующее приближение корня уравнения х2 . . .

Процесс итераций заканчивается тогда, когда значения обеих функций y = f(x) и y = x совпадут в пределах заданной погрешности.

Иллюстрация метода дана на следующем слайде

Технология и языки программирования

30

Соседние файлы в папке Бочаров презентации 1 семестр