
Практикум по программированию на языке С,
Вычислительная физика, Теория алгоритмов.
ФНБИК МФТИ
2015-2016 учебный год
1. Написать программу для приближенного вычисления значений функции exp(x) с некоторой заданной точностью eps с помощью разложения по формуле Тэйлора. Программа должна выводить таблицу, состоящую из следующих столбиков:
1) Количество слагаемых в сумме в формуле Тэйлора
2) Приближенное значение функции exp(x), вычисленное по формуле Тэйлора с количеством слагаемых, равным значению из первого столбика
3) Модуль разности приближенного значения exp(x) из второго столбика и значения exp(x), вычисленного с помощью функции exp(x) из стандартной библиотеки языка C.
2. Написать программу для решения уравнений f(x) - c = 0 методами деления отрезка пополам и хорд. В программе должны быть использованы следующие функции
int solve(int method, double a, double b, double eps, double param);
double solve_bis(double a, double b, double eps, double param);
double solve_chord(double a, double b, double eps, double param);
Здесь method - метод для решения уравнения, method == 1 используется метод бисекции, method == 2 используется метод хорд, method == 3 используются последовательно оба метода; a и b - левая и правая границы отрезка, на котором ищется корень; eps - требуемая точность; param - значение параметра c в функции f(x) - c = 0.
Функция solve проверяет условие (f(a) - c)*(f(b) - c) < 0, и если оно ложно, возвращает в функцию main значение 1. Если данное условие истинно, то функция solve вызывает в зависимости от значения параметра method соответствующие функции solve_bis, solve_chord либо обе, печатает приближенные значения корня, возвращенные solve_bis и solve_chord и возвращает в main значение 0.
3. Написать программу для поиска седловой точки в двумерном массиве. Программа должна также искать минимальный и максимальный элементы в данном массиве. Содержательная часть программы, реализующая алгоритм поиска седловой точки, должна быть оформлена в виде отдельной функции, которая принимает в качестве аргументов указатель на начало массива, количество строк и столбцов в массиве, указатель на переменную, в которую будет записано значение элемента, который есть седловая точка, указатели на переменные, в которые будут записаны значения минимального и максимального элементов массива. Функция должна возвращать 0, если седловая точка найдена, и 1, если в массиве нет седловой точки.
Для создания массива, в котором будет седловая точка, можно использовать значения функции x*x - y*y, вычисленные на равномерной сетке в плоскости xy. Для создания массива, в котором не будет седловой точки, можно использовать псевдослучайные числа.
4. Написать функции, имитирующие работу функций strlen, strcpy и strstr из стандартной библиотеки языка С:
int my_strlen(char *str);
void my_strcpy(char *source, char *target);
int my_strstr(chat *haystack, char *needle);
Функция strstr возвращает смещение относительно начала haystack, начиная с которого встречается needle или -1, если needle в haystack не встерчается.
5. Написать программу для разбиения исходного файла на фрагменты заданной длины или на заданное количество фрагментов одинаковой длины (за исключением последнего файла, в котором будет содержаться остаток исходного файла). При запуске программа должна получать из командной строки следующие параметры:
1. Имя исходного файла
2. -s 1024, здесь значение 1024 приведено для примера, оно может быть произвольным и задает размер в байтах одного фрагмента, на которые нужно разбить исходный файл.
3. -n 100 , здесь значение 100 приведено для примера, оно может быть произвольным и задает количество фрагментов одинаковой длины, на которые нужно разбить исходный файл.
4. -b base, здесь base имя "основы" для имен файлов с фрагментами, то есть эти файлы будут иметь имена
base_1.txt, base_2.txt и т. д.
Программа должна проверять корректность данных, введенных пользователем в командной строке, выводить сообщение об ошибке и завершать работу, если данные некорректны.
Параметры -s и -n являются взаимоисключающими, допускается наличие в командной строке только одного из них.
Примеры запуска программы:
split file_ini.txt -s 2048 -b name
Файл file_ini.txt должен быть разбит на части длиной 2048 байтов, которые будут называться name_1.txt, name_2.txt и т. д.
split myfile.dat -n 200 -b base
Файл myfile.dat должен быть разбит на 200 равных частей, которые будут называться base_1.txt, base_2.txt и т. д.
Для успешной работы программы под операционными системами семейства MS WINDOWS, необходимо открывать файлы для чтения и записи в "двоичном режиме", т. е. использовать в качестве второго аргумента функции fopen "rb" или "wb".
6. Написать программу для вычисления определенных интегралов от функций методом трапеций с использованием указателей на функции. В программе должна присутствовать функция
double find_int(double a, double b, double eps, double (* f) (double x)), где a и b - левый и правый пределы интегрирования, eps - требуемая точность, f - указатель на подинтегральную функцию. Функция find_int должна возвращать приближенное значение интеграла.
7. Написать программу для создания и использования "базы данных" об успеваемости студентов. Данные об одном студенте должны храниться в структуре следующего вида:
struct stud
{
char *first_name, *last_name;
int year, month, day;
double av_grade;
struct stud *next;
};
Здесь first_name и last_name - указатели на имя и фамилию студента; year, month, day - год, месяц и день рождения студента, av_grade - текущий средний балл студента, next - указатель на структуру, хранящую информацию о следующем студенте.
Программа должна предоставлять пользователю следующие возможности:
1. Считывать исходную базу данных из файла, имя файла должно запрашиваться у пользователя,
2. Записывать текущую базу данных в файл, имя файла должно запрашиваться у пользователя,
3. Выводить текущее содержимое базы данных на экран,
4. Добавлять запись в базу данных как вводя данные с клавиатуры, так и считывая данные из файла, имя файла должно запрашиваться у пользователя,
5. Удалять произвольные записи из базы данных,
6. Искать студентов в базе данных по фамилии.
Все записи базы данных должны быть объединены в связный список.