- •Лабораторная работа № 1
- •Далее создадим файл:
- •Задания1
- •Лабораторная работа № 2
- •Консольный ввод-вывод
- •Чтение и запись символов
- •Чтение и запись строк
- •Форматированный консольный ввод-вывод
- •Форматированный вывод
- •Форматированный ввод
- •7. Варианты задания
- •Лабораторная работа № 3
- •5.2 Оператор if
- •Лабораторная работа № 4
- •Содержание отчета
- •Постановка задачи.
- •Общие сведения
- •Лабораторная работа № 5
- •Оператор for
- •Вариации цикла for
- •Бесконечный цикл
- •Циклы for без тела
- •Задание 2. Циклический вычислительный процесс конечные суммы и произведения
- •Лабораторная работа № 6
- •Оператор цикла while
- •Оператор do … while
- •Оператор break
- •Оператор continue
- •Лабораторная работа № 7
- •5.1 Одномерный массив
- •Создание указателя на массив
- •5.3 Индексация с помощью указателей
- •Сортировка
- •Методические указания.
- •Лабораторная работа № 8
- •Двухмерные массивы
- •Лабораторная работа № 9
- •Лабораторная работа № 11
- •Задача 2. Параметры функции
- •Лабораторная работа № 12
- •Варианты заданий
- •Лабораторная работа № 13
- •Некоторые операции над матрицами
- •Методические указания
- •Варианты заданий
- •Лабораторная работа № 14
- •Решение уравнения методом деления отрезка пополам (бисекций)
- •Методические указания
- •Лабораторная работа № 15
- •Вычисление определенного интеграла
- •6.2.1 Метод средних прямоугольников
- •6.2.1 Метод трапеций
- •Методические указания
- •Варианты заданий
- •Лабораторная работа № 10
- •Структуры (struct)
- •Лабораторная работа № 16
- •Директива #include
- •7. Методические указания
- •8. Варианты заданий.
- •Лабораторная работа № 17
- •Указатель на файл
- •Открытие файла
- •Перенаправление потока
- •Чтение из потока и запись в поток
- •Закрытие потока
- •Использование функций feof() и ferror()
- •Варианты заданий
- •Лабораторная работа № 18
- •Функции обработки символов
- •Функции обработки строк
- •Варианты заданий
- •Лабораторная работа № 19
- •Структуры
- •6.1.1 Доступ к элементам структуры
- •6.1.2 Присваивание структур
- •Массивы структур
- •Передача структур в функции
- •Передача членов структур в функции
- •Передача всей структуры в функцию
- •Указатели на структуры
- •Объявление указателя на структуру
- •Использование указателей на структуру
- •Массивы и структуры в структурах
- •Функции fread () и fwrite ()
- •Варианты заданий
- •Лабораторная работа № 20
- •Например, формула
- •Задание на программирование
Методические указания
7.1 Вычисление корня уравнения каждым из указанных выше методов оформить в виде функции, в которой вычислить количество итераций (повторений цикла).
7.3 Для выбора метода вычисления корня уравнения использовать меню, разработанное с применением массива указателей на функции.
7.4 За начальное приближение x0 принять найденное значение конца отрезка b, на котором заданная функция f (x) меняет знак. Алгоритм определения этого значения приведен в методических указанияx
Варианты заданий
1) Найти корень уравнения
ex – 2x – 10 = 0
с точностью = 10-4 при заданном значении начала отрезка а = 0.
2) Найти корень уравнения
0.1ex –sin2x + 0.5 = 0
с точностью e = 10-4 при заданном значении начала отрезка а = 5.
3) Найти корень уравнения
с точностью e = 10-4 при заданном значении начала отрезка а = -2.
4) Найти корень уравнения
e0.724x+0.3 – 2.831 = 0
с точностью e = 10-4 при заданном значении начала отрезка а = 0.
5) Найти корень уравнения
x + 0.5sin x + 1 =0
с точностью e = 10-4 при заданном значении начала отрезка а = -1.
6) Найти корень уравнения
x – cos x = 0
с точностью e = 10-5 при заданном значении начала отрезка а = 0.
7) Найти корень уравнения
1.4x – x = 0
с точностью e = 10-5 при заданном значении начала отрезка а = 0.
8) Найти корень уравнения
0.5x – ln |x| = 0
с точностью e = 10-5 при заданном значении начала отрезка а = -1.
9) Найти корень уравнения
x3 + sin x – 3.5x + 1 = 0
с точностью e = 10-5 при заданном значении начала отрезка а = 0.
10) Найти корень уравнения
с точностью e = 10-5 при заданном значении начала отрезка а = 0.
11) Найти корень уравнения
(4 + x2)(ex – e-x) = 18
с точностью e = 10-5 при заданном значении начала отрезка а = 1.
12) Найти корень уравнения
3x2 – cos 2x = 1
с точностью e = 10-5 при заданном значении начала отрезка а = 0.
13) Найти корень уравнения
с точностью e = 10-4 при заданном значении начала отрезка а = 0.
14) Найти корень уравнения
с точностью e = 10-5 при заданном значении начала отрезка а = 0.
15) Найти корень уравнения
с точностью e = 10-4 при заданном значении начала отрезка а = 1.
Лабораторная работа № 15
Тема: «Передача функций в качестве параметра функций»
Цель работы
Получение навыков в написании программ с использованием указателей на функции.
Научиться составлять программу вычисления определенного интеграла методам средних прямоугольников и методом трапеций.
Техническое обеспечение
Персональная ЭВМ .
Клавиатура.
Дисплей.
Печатающее устройство.
Программное обеспечение
Операционная система Windows
Система программирования Visual C++ версия 6.0 или Borland C++ версия 3.1 и более поздние версии.
Постановка задачи
Вычислить выражение, указанное в конкретном варианте, используя для вычисления интеграла один из указанных в п. 1.2 методов (по указанию преподавателя). Значение интеграла считать с погрешностью .
Содержание отчета
5.1. Тема и цель работы.
5.2. Схема алгоритма решения задачи.
5.3. Текст программы.
5.4. Результаты выполнения программы.
Общие сведения
. Указатели на функции
Чтобы понять, как работают указатели на функции, необходимо понять, как компилируются и вызываются функции в языке С. По мере компиляции функций исходный код преобразуется в объектный и устанавливается точка(адрес) входа. При вызове функции происходит обращение к данной точке входа. Поэтому указатель на функцию может использоваться для вызова функции.
Адрес функции получается при использовании имени функции без каких-либо скобок или аргументов. (Очень похоже на массивы, где адрес получается с использованием имени массива без индексов.) Рассмотрим следующую программу, предназначенную для демонстрации особенностей объявления.
# include <stdio.h>
# include <string.h>
void check (char a, char b, int (*cmp) (const char *, const char *));
int main (void)
{
char s1[80], s2[80];
int (*p) (const char*, const char*); /* объявление указателя на функцию */
p = strcmp; /* получение адреса функции strcmp */
gets(s1);
gets(s2);
check(s1, s2, p);
return 0;
}
void check (char a, char b, int (*cmp) (const char *, const char *))
{
printf(“Сравнение строк.\n”);
if (! (*cmp) (a,b)) printf(“Равны”);
else printf(“Не равны”);
}
Когда вызывается функция check (), ей передаются два указателя на символы и один указатель на функцию. В функции check () аргументы объявляются как указатели на символы и указатель на функцию. Следует обратить внимание на способ объявления указателя на функцию. Следует использовать аналогичный метод при объявлении других указателей на функцию, за исключением тех случаев, когда отличается возвращаемый тип или передаваемые параметры. Скобки вокруг *cmp необходимы для правильной интерпретации компилятором данного выражения.
При объявлении указателя на функцию можно по-прежнему использовать прототип, как показано в предыдущей программе. Тем не менее в большинстве случаев имена настоящих параметров неизвестны. Поэтому можно оставить имена пустыми или можно использовать любые имена.
Рассмотрим работу функции strcmp () и функции check (). Оператор
if (! (*cmp) (a,b)) printf(“Равны”);
осуществляет вызов функции, в данном случае strcmp (), с помощью cmp, который указывает на данную функцию. Вызов происходит с аргументами a и b. Данный оператор демонстрирует общий ввод использования указателя на функцию для вызова функции, на которую он указывает. Круглые скобки вокруг *cmp необходимы вследствие наличия приоритетов.
На самом деле можно напрямую использовать cmp, как показано ниже:
if (! cmp (a,b)) printf(“Равны”);
Данная версия также вызывает функцию, на которую указывает cmp, но она использует нормальный синтаксис. Использование (*cmp) помогает всем, читающим программу, понять, что указатель на функцию используется для вызова функции вместо функции вместо вызова функции cmp.
Возможно вызвать напрямую функцию check (), используя strcmp, как показано ниже:
check (s1, s2, strcmp);
Данный оператор устраняет необходимость наличия дополнительной переменной-указателя.
Можно задаться вопросом, почему кто-то хочет написать программу таким способом. В данном примере ничего не достигается, но появляются большие проблемы. Тем не менее иногда бывают моменты, когда выгодно передавать функцию в процедуры или хранить массивы функций.