Информационные системы и технологии

Разбиение задачи на несколько более простых подзадач. Вычисление логарифма с использованием ряда Тейлора при небольших значениях. Функция поиска строки с максимальной суммой. Создание дополнительной функции. Процедура печати строки с максимальной суммой.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 17.08.2013
Размер файла 171,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Контрольная работа

«Информационные системы и технологии»

Вариант 6

Задание 1. Ввести массив А(5)=(2.0 , 0, 0.6664, 0, 0.4150) и использовать его для вычисления ln x по формуле

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

По условию задания требуется произвести вычисления логарифма, используя в ряд Тейлора. Известное разложение логарифмической функции в окрестности точки Х = 0 имеет вид:

.

или .

Однако вычислять логарифм с помощью знакочередующегося ряда, который сходится очень медленно, крайне затруднительно. Например, чтобы найти ln 2 с точность 0,00001 потребуется сложить 100 000 членов ряда, то есть выполнить сто тысяч итераций. Поэтому используется вспомогательное разложение:

из которого путем преобразований получается заданная формула:

.

Каждое слагаемое под знаком суммы есть произведение заданного коэффициента на целую нечетную степень постоянного числа u. Оформим вычисление u отдельной подпрограммой в виде функции. Тип функции выбираем Real, так как значение u является заведомо дробным числом:

function FRACT(x:real):real; {объявление функции}

const

c: real = 1.414213562373; {константа корень из 2}

Begin {начало функции}

FRACT:=(2*x-c)/(2*x+c);

End; {конец функции}

Для вычисления логарифма используем накапливаемую сумму, к которой в завершение прибавляем константу b = -0.5*ln(2). Для вычисления степени числа u используем накапливаемое произведение, поскольку в общем случае uk = uk-1*u, т. е. uk есть произведение предыдущей степени числа на само число. Формально для нахождения результата требуется выполнить 3 итерации, при которых k примет значения 0, 1 и 2. При этом 2k + 1 примет значения 1, 3 и 5. Однако, учитывая два нулевых значения массива А(5) (при которых сумма не будет увеличиваться, а произведение продолжит считаться), рациональнее выполнить цикл из 5-ти итераций. Тогда переменная цикла будет служить индексом для вызова очередного значения А(5) и для нахождения степени u не потребуется создания дополнительной функции. Тип функции выбираем Real:

function LOG(x:real):real; {объявление функции}

const

a: array [1..5] of real = (2.0 , 0, 0.6664, 0, 0.4150);

{объявление массива}

b:real = -0.5*ln(2); {константа b}

Var

u,Pr_u,Sum:real;

Begin {начало функции}

Pr_u:=1; {начальное значение произведения}

u:=FRACT(x); {обращение к функции FRACT}

for i:=1 to 5 do begin

Pr_u:=Pr_u*u; {возведение в степень с помощью накопления произведений}

Sum:=Sum+a[i]*Pr_u; {суммирование ряда Тейлора}

end;

LOG:=b+Sum;

End; {конец функции}

Разработаем структуру программы:

1. Очистка экрана от результатов предыдущих программ и вычислений.

2. Ввод числа x > 0.

3. Остановка программы при вводе числа меньше либо равного нулю, так как нахождение логарифма в этом случае не имеет математического смысла.

4. Вывод значения ln x путем обращения к функции LOG и из функции LOG к функции FRACT.

В качестве параметра в обе функции будет передаваться значение х. Текст программы при этом будет небольшим:

Begin {начало программы}

clrscr; {очистка экрана}

Write('zadaite thislo x = '); {ввод числа}

readln(x);

if x<=0 then begin

Write('Halt!!!'); {не корректный ввод}

Halt; {остановка программы}

end;

Write('LN(',x,') = ',LOG(x):1:5);

readln; {ожидание нажатия клавиши Enter}

end. {конец программы}

Сравнивая результаты работы программы со значениями, найденными на калькуляторе, следует заметить, что приемлемая точность вычисления логарифма обеспечивается только при небольших значениях х.

задача логарифм строка функция

Задание 2. Заполнить случайными числами 3 матрицы размерностью (n?n). Найти в каждой из них строку, с наибольшей суммой.

Решение

Разработаем структуру программы. Вначале надо выполнить ввод с клавиатуры числа n, задающего размерность массивов. Затем с каждым из массивов следует проделать следующие действия:

1. Заполнить случайными числами.

2. Вывести на экран заполненные массивы.

3. Подсчитать суммы строк и найти наибольшую в каждом массиве.

4. Вывести на экран строки найденные строки.

Первое и второе действия можно объединить, поэтому необходимо написать 3 подпрограммы. В качестве параметра в подпрограммы будет передаваться одномерный массив, состоящий из трех двухмерных массивов a:array [1..3] of Mas. Технически проще было бы сразу объявить трехмерный массив размером (n?n?3), но это противоречило бы условию задачи, т.к. требуется задать три массива.

Две подпрограммы оформлены в виде процедуры Zap_Wrt, заполняющей и печатающей массив и Wiw_Wrt, печатающей строку массива с максимальной суммой. Третья подпрограмма оформлена в виде функции, которую во время своей работы использует вторая процедура Wiw_Wrt. Это позволяет сократить рабочую часть программы до семи строк:

Write('Wwedite rasmer n<=100 ');

Readln(n);

For i := 1 to 3 do begin

Zap_Wrt(a[i],n); {заполнение и печать i-го массива}

Wiw_Wrt(a[i],n); {печать строки с максимальной суммой}

Writeln; {печать разделительной строки}

end;

Полный текст программы представлен ниже:

Program STROKA; {название программы}

uses crt; {открытие библиотеки процедур}

Type

Mas = array [1..100,1..100] of Integer;

Var

a:array [1..3] of Mas;

n,i,j: byte;

{Процедура заполнения}

Procedure Zap_Wrt (Var d: Mas;n:integer);

Var

k,m: byte;

Begin

For k := 1 to n do begin

For m := 1 to n do begin

d[k,m] := random(100);

Write(d[k,m]:5);

end;

Writeln;

end;

End;

{Функция поиска строки с максимальной суммой}

Function sum_max (d: Mas;n:integer):byte;

Var

k,m,i_max: byte;

s:array[1..100] of real;

s_max:real;

Begin

For k := 1 to n do begin

s[k]:=0;

For m := 1 to n do

s[k]:=s[k]+d[k,m];

if k=1 then begin

s_max:=s[k];

i_max:=1;

end;

if s_max<s[k] then begin

s_max:=s[k];

i_max:=k;

end;

end;

sum_max:=i_max; {функции присваивается значение номера строки с максимальной суммой}

End;

{Процедура печати строки с максимальной суммой}

Procedure Wiw_Wrt (d: Mas;n:integer);

Var

k,m: byte;

Begin

k:=sum_max(d,n);

Write('Stroka-maximum: ');

For m := 1 to n do

Write(d[k,m]:5);

Writeln;

End;

Begin

Write('Wwedite rasmer n<=100 ');

Readln(n);

For i := 1 to 3 do begin

Zap_Wrt(a[i],n); {заполнение и печать i-го массива}

Wiw_Wrt(a[i],n); {печать строки с максимальной суммой i-го массива}

Writeln;

end;

end. {конец программы}

Пример работы программы для трех массивов размером (5?5):

Задание 3. Определить, что будет выведено на печать в каждом из 4-х вариантов:

Var c,d : integer;

Procedure P (x,y : integer);

begin y:=x+1 end;

Procedure Q (x : integer; var y : integer);

begin y:=x+1 end;

Procedure R (var x, y : integer);

begin y:=x+1 end;

begin

c:=15: d:=4; P(c+d, d); writeln (d);

c:=15; d:=4; Q(c+d, d); writeln (d);

c:=15; d:=4; R(c+d, d); writeln (d);

c:=15; d:=4; R(c, d); writeln (d);

Решение

В процедуре P используются формальные параметры - значения, следовательно, не зависимо от содержимого процедуры, фактический параметр d не изменится (он останется равным 4).

В процедуре Q формальный параметр y - параметр-переменная, он при выполнении процедуры изменяет свое значение, становится равным x+1. При этом x получает значение c+d=15+4=19. Подставляем значение 19 в выражение: x+1 = 19+1= 20. Это и есть итоговое значение d по возвращении в головную программу.

В процедуре R формальные параметры - переменные, следовательно, фактическим параметром не может быть выражение. В этом случае имеет место синтаксическая ошибка. При 2-м вызове процедуры R формальные параметры x и y изначально получают значения c и d, т. е. 15 и 4 соответственно. Параметр y при выполнении процедуры изменяется y:=x+1=15 + 1 = 16.

Ответ: 4, 20, синтаксическая ошибка, 16.

Библиографический список

a. Попов, В. Б. Тurbo Pascal для школьников [Текст] /

2. В. Б. Попов. - М. : Финансы и статистика, 2004. - 525 с.

a. Епанешников, А. М. Программирование в среде Turbo-Pascal 7.0. [Текст] / А. М. Епанешников, В. А. Епанешников. М. : Диалог МИФИ, 2003. - 288 с.

b. Культин, Н. В. Tupbo-Pascal в задачах и примерах [Текст] / Н. В. Культин. СПб. : БХВ Санкт -Петербург, 2005. -156 с.

c. Марченко, А. И. Программирование в среде Turbo-Pascal 7.0. [Текст] / А. И. Марченко, Л. А. Марченко. - Киев : ВЕК+, М.: Бином Универсал, 2008. - 496 с.

Размещено на Allbest.ru


Подобные документы

  • Понятие стандартной библиотеки C++. Количество удобных операций и методов. Создание пустой строки и конструктор копирования. Создание строки на основе нуль-терминальной строки. Примеры использования конструкторов. Присвоение строки типа string.

    презентация [221,2 K], добавлен 04.05.2012

  • Понятие и использование командной строки. Открытие командной строки. Команды, выполняемые с помощью командной строки. Как выполнить команду с повышенными привилегиями. Изменение внешнего вида окна командной строки с помощью параметров командной строки.

    презентация [948,2 K], добавлен 22.10.2014

  • Особенности работы в режиме командной строки в системе Matlab. Переменные и присваивание им значений. Комплексные числа и вычисления в системе Matlab. Вычисления с использованием функции sqrt. Неправильное использование функций с комплексными аргументами.

    дипломная работа [1,9 M], добавлен 30.07.2015

  • Разработка графического интерфейса для ввода начальных значений, отображения результатов и тестирования методов собственного класса на языке программирования С++. Подсветка цветом выбранных операндов в процессе их инициализации и вывода на дисплей.

    курсовая работа [234,6 K], добавлен 27.12.2014

  • Выбор программ CodeVisionAVR и Altium Designer для быстрой реализации бегущей строки на микроконтроллере с применением программного симулятора. Реализация передачи данных, отображение текста на экране LCD. Составление эксплуатационной документации.

    курсовая работа [723,5 K], добавлен 17.11.2014

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

    курсовая работа [537,9 K], добавлен 25.01.2010

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

    курсовая работа [197,8 K], добавлен 06.10.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.