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

книги / Программирование на языке Си

..pdf
Скачиваний:
15
Добавлен:
12.11.2023
Размер:
17.16 Mб
Скачать

534

Программирование на языке Си

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

10.5. Ф ункции и указатели

Первая часть задания. Оформить в виде функции с прото­ типом

double function (double х);

итерационный алгоритм, запрограммированный в соответствии с заданием §10.2 для функции f(x) из табл. 10.3. Используя соз­ данную функцию, вычислить грубое приближение интеграла:

t f ( x ) d x * j 'j [ j (y0 + 2yi+..2yi+...+2ym„l +ут),

где А = -----

т

Здесь [а,Ь] - отрезок, определенный для функции f(x) из за­ дания 2 (см. табл. 10.3);

т - количество интервалов равномерного разбиения отрезка [а,Ь] (см. задание из §10.2).

Вторая часть задания. Здесь предусматривается монотон­ ное увеличение количества интервалов разбиения исходного интервала [а,Ь]. Требуется написать функцию для вычисления с максимально возможной точностью определенного интеграла на заданном интервале [а, Ь] от функции, указатель на которую передается как значение параметра. Прототип функции для вы­ числения интеграла:

double integral (double(*pXdouble), double a, double b, unsigned int *N, double *H);

Глава 10. Задачи по программированию

535

Использовать один из следующих численных методов интег­ рирования:

1. Метод (формула) Симпсона (парабола, проведенная через

3 ординаты на концах двух соседних интервалов). Справедлива для четного количества п равных отрезков, на которые разбива­ ется интервал [а,Ь\.

h|/(х)г/х * -h( у 0 + 4у, + 2у2 + 4у3 + 2у4 +...+2у„_2 + 4у„_, + у „),

а

П

2. Метод (формула) трапеций:

|/ ( х ) Л * ^ (у 0 + 2у, +...+2у„_, + у„ ),

где h = Ъ - а

3. Метод (формула) Ньютона (правило трех восьмых). Для п, кратного 3:

}/(*У * * ~(У о + + Зу2 + 2у3 + Зу4 + Зу5

а

+ 2у6+...+2у„_з +3у„_2 + 3у„ч + у„),

где Л = Ь

п

4. Метод Гаусса (вариант повышенной сложности). См., на­ пример, "квадратуру Гаусса" в "Справочнике по математике" И.Н. Бронштейна, К.А. Семендяева. - М.: Наука, 1981.

С помощью разработанных функций function(), integral) вычислить значение определенного интеграла для функции f(x) из задания §10.2 на интервале [а,Ь], определенного там же.

536

Программирование на языке Си

С помощью параметров unsigned int *N и double *Н вер­ нуть в основную программу количество отрезков, на которые разбивается интервал интегрирования [а,Ь], и величину каждого отрезка.

Пояснения.

При вычислении сравнивать два последующих результата, удваивая количество шагов следующего счета. Увеличивая ко­ личество интервалов, сохранять предыдущие значения {у,} в массиве. Это уменьшит время счета, но потребует модификации алгоритма и динамического выделения памяти для массивов. Зозмо: на нехватка памяти, следует предусмотреть защиту.

В качестве основы для выполнения задания можно использо­ вать следующую программу. В ней определенный интеграл вы­ числяется для функции у = sh(x) на интервале [2,3] методом трапеций при фиксированном числе шагов. Точность не оцени­ вается.

/* Вычисление определенного интеграла от гиперболического синуса */

#include <stdio.h>

/* Вычисление гиперболического синуса: */ double fsinh(double х)

{

int i=0;

double v,s,ss,u; v = s =* x;

do /* Цикл до машинного нуля */

{

i++ ;

ss= s ; u = v;

v = u*x*x/(i*2)/ (i*2+l); s = ss + v;

}

while(s != ss); return s;

>

/* Функция для вычисления интеграла методом трапеций с фиксированным.числом шагов: */

Глава 10. Задачи по программированию

537

double integral(double (*f)(double), double

a ,

double b)

 

 

 

(

 

 

 

 

int n=50;

 

 

 

int

i ;

 

 

 

double h = (b-a)/n;

 

double s , x = a ;

 

s =

f (a)

+

f (b) ;

 

for

(i =

1;

i < n; i++)

 

(

x = x + h;

 

 

 

 

s '+= f(x)*2;

 

)

return s*h/2;

)

void main()

{

double a=2.0, b=3.0; printf("\n интеграл = %le",

integral(fsinh,a,b));

>

Результат выполнения программы:

Интеграл: 6.305676е+00

10.6. Ф ункции и м ассивы

Обобщенная формулировка задания. Написать функцию для вычисления массива значений первой производной функции f(x) в заданных точках х/ оси аргумента на интервале [а,Ь]. Ука­ затель на дифференцируемую функцию передается как значе­ ние параметра. Оценить и выбрать внутри функции величину шагов Aj, необходимых для оценки значений производной в точке х/ (см. ниже приближенные формулы).

Прототип исследуемой функции (от которой берется произ­ водная):

double function(double х);

538

Программирование на языке Си

Возможны два варианта решения поставленной задачи.

1.Прототип функции для вычисления массива производных

спроизвольным (неравномерным) разбиением интервала [а,Ь\.

double

‘derivatives(

double (*f)

(double),/* f - указатель на функцию */

double

x[

] /* Массив значений аргумента хА */

int k,

 

/*

Количество Значений аргумента */

double

D [ ]);

/* Значения шагов А± */

2.Прототип функции для вычисления массива производных

сравномерным разбиением интервала [а,Ь\.

double ‘derivatives(

указатель на функцию */

double (*f) (double) ,/* f -

/* Границы интервала по хА:*/

double a, double b,

 

int к, / ‘Количество значений аргумента */

double D [ ]) ;/* Значения

шагов Ад. */

Приближенные формулы вычисления, f ( xQ) - первой про­ изводной функции y=f(x) в точке х 0 (рис. 10.1.):

Рис. 10.1. Иллюстрация х формулам оценки значений производной

Глава 10. Задачи по программированию

539

У а = / { Х о ) = ^ г ( - У - 1 + У \ ) ;

 

 

 

у о = / (*о) = 12Д

- 8>"-1 + 8^i

- у * 2 );

У „ = /\х 0) = ^ - ( - у 0 + у1);

А

У о = / ( х о )

=

^ т ( - 1 У о + * У \ ~ У г ) ' >

 

 

У о = / ( х о )

=

7 7 Г г ( - З У - \ “ 10Л +18>’| - 6 У 2 + У } ) -

 

 

12Д

Массив-результат со значениями первой производной следу­ ет формировать как динамический массив внутри функции derivatives(). Функция должна возвращать его адрес, т.е. указа­ тель на него типа double * (его адрес).

Массив-результат double d[ ] для значений шагов Д| нужно определить в вызывающей функции.

Используя функцию derivatives(), вычислить значение пер­ вой производной для функции f(x) из задания §10.2 в точках из интервала [а,Ь], заданного там же. Заполнить табл. 10.4.

 

 

 

Т аблица 10.4

Аргумент

Значение

Первая производная

Шаг Д|

•*/

ФУНКЦИИ f(X j)

 

 

 

 

 

"аналитическое"

приближенное

 

 

 

значение

значение

 

t

 

fa'(x)

ш

 

х о = а

 

 

 

 

Хт-Г-Ь

540

Программирование на языке Си

"Аналитическое" значение производной f a'(xi) для табл. 10.4

вычислить, предварительно выполнив дифференцирование по аргументу х функции f(x). Полученное аналитическое выраже­ ние для производной fa (x) оформить в виде дополнительной функции с прототипом

double dir(double х);

Выбрать или разработать самостоятельно метод подбора ша­ га Aj вдоль оси аргумента при вычислении производной f n '(x). Например, используйте последовательное уменьшение величи­ ны Aj до достижения "машинной точности". Учтите, что это достижение (сходимость) не гарантируется, поэтому необходи­ мо, по крайней мере, ограничить количество итераций либо вве­ сти ограничение на величину Д(

10.7.Работа со структурам и

1.Выбрать предметную область для базы данных и предло­ жить структуру для описания отдельных записей базы данных. Выбранная структура должна иметь не менее пяти полей (эле­ ментов) двух или более типов.

Пр и м ер . Структура "Государство"

Элементы (поля, компоненты) структуры:

название страны;

столица;

государственный язык;

численность населения;

площадь территории.

2. Написать функцию для формирования одномерного мас­ сива структур, значения которых вводятся из стандартного входного потока (с клавиатуры). При вводе структур можно реализовать один из следующих механизмов:

ввод заранее заданного количества структур;

ввод до появления структуры с заданным признаком;

диалог с пользователем о необходимости продолжать ввод.

Глава 10. Задачи по программированию

541

3.Написать функцию для записи в файл массива структур.

4.Написать функцию чтения в массив структур из файла.

5.Написать функцию дополнения уже существующего мас­ сива структур новыми структурами.

6.Написать функцию поиска структуры с заданным значени­ ем выбранного элемента.

7.Написать функцию постраничного вывода на экран дис­ плея содержимого массива структур.

8.Написать функцию поиска структур (записей) с заданными признаками (например, выбор структур по заданному диапазону значений элемента).

9.Написать функцию упорядочения массива структур по за­ данному полю (элементу). Например, упорядочить государства по численности населения или в алфавитном порядке названий стран.

10.Написать функцию полного обновления файла, например, массив структур переписывается в файл после упорядочения. Продемонстрировать:

сохранение данных в файле после завершения программы;

разные упорядочения совокупности структур;

поиск подходящих структур (по значению элемента, по диапазону значений элемента).

10.7.1. Варианты структур для выполнения работы

1."Человек":

фамилия; имя; пол; национальность; вероисповедание; рост; вес; дата рождения (год, месяц, число); номер теле­ фона; домашний адрес (почтовый индекс, страна, область, район, город, улица, дом, квартира).

2."Школьник"'.

фамилия; имя; отчество; класс; пол; дата рождения (год, месяц, число); домашний адрес (см. п. 1).

542

Программирование на языке Си

3."Покупатель

фамилия; имя; отчество; адрес: штат (губерния, область); город; улица; номер дома; номер квартиры; номер кредит­ ной карточки или номер счета.

4."Пациент":

фамилия; имя; год рождения; номер телефона; домашний адрес (см. п. 1); номер медицинской карты; группа крови.

5."Спортивная команда":

название; из какого города; сколько игр сыграла; сколько набрала очков (проиграла, выиграла, ничья); количество игроков.

6."Стадион ":

название; виды спорта; год постройки; адрес; вместимость (зрителей); количество арен, площадок.

7."Владелецавтомобиля":

имя; номер автомобиля; номер техпаспорта; дата рожде­ ния; телефон; отделение регистрации ГИБДД.

8."Автомобиль":

марка; цвет; серийный номер; регистрационный номер; количество дверей; год выпуска; цена.

9."Фильм":

название; режиссер (фамилия, имя); страна; год выпуска; стоимость (расходы на выпуск); доход.

10."Музыкальный товар":

носитель (грампластинка, аудиокассета, лазерный диск); порядковый номер в каталоге; название; исполнитель (фа­ милия, имя); время звучания; количество произведений; цена по каталогу. .1

11. "Альбом вокально-инструментальной группы":

название группы; название альбома; количество песен на диске/кассете; год выпуска альбома; фирма-произво­ дитель.

Глава 10. Задачи по программированию

543

12. "Государство

название страны; столица; государственный язык; населе­ ние (число жителей); площадь территории; денежная еди­ ница; курс валюты относительно рубля (доллара); государственный строй.

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

10.8.С писки и деревья

Всоответствии с индивидуальным заданием необходимо создать программную систему для обслуживания конкретной сложной динамической структуры данных (списка, дерева или стека). Указанные в задании действия (создание пустой струк­ туры данных, ее инициализация и т.п.) должны быть оформлены

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

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

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

Соседние файлы в папке книги