Ввод-вывод для двоичных файлов
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Для выполнения операций ввода-вывода для двоичных файлов:

- int fread(void*ptr,int size, int n, FILE*f), где void*ptr – указатель на область памяти, в которой размещаются считанные из файла данные, int size – размер одного считываемого элемента, int n – количество считываемых элементов, FILE*f – указатель на файл, из которого производится считывание. В случае успешного считывания функция возвращает количество считанных элементов, иначе – отрицательное значение.

- int fwrite(void*ptr,int size, int n, FILE*f), где void*ptr – указатель на область памяти, в которой размещаются считанные из файла данные, int size – размер одного записываемого элемента, int n – количество записываемых элементов, FILE*f – указатель на файл, в который производится запись. В случае успешной записи функция возвращает количество записанных элементов, иначе – отрицательное значение.

Прямой доступ к файлам

Рассмотренные ранее функции обмена с файлами позволяют записывать и считывать данные только последовательно. Операции чтения/записи всегда производятся, начиная с текущей позиции в потоке. Начальная позиция устанавливается при открытии потока и может соответствовать начальному или конечному байту потока в зависимости от режима открытия файла. При открытии потока в режимах "r" и "w" указатель текущей позиции устанавливается на начальный байт потока, при открытии в режиме "a" - за последним байтом в конец файла. При выполнении каждой операции указатель перемещается на новую текущую позицию в соответствии с числом записанных/прочитанных байтов.

Средства прямого доступа дают возможность перемещать указатель текущей позиции в потоке на нужный байт. Для этого используется функция

int fseek(FILE *f, long off, int org), где

FILE *f - – указатель на файл,

long off – позиция смещения

int org – начало отсчета. Начало отсчета задается с помощью одной из определенных в файле stdio.h констант:

SEEK_SET – начало файла;

SEEK_CUR – текущая позиция;

SEEK_END – конец файла.

Функция fseek возвращает 0, если перемещение в потоке выполнено успешно, иначе возвращает ненулевое значение.

Кроме этой функции, для прямого доступа к файлу используются:

long ftell(FILE *f);//получает значение указателя текущей позиции в потоке;

void rewind(FILE *f);//установить значение указателя на начало потока.

Рекомендации по выполнению лабораторной работы

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

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

Пример неверного использования функции feof.

Предположим, нужно считать двоичную информацию – байты из некоторого файла file.bin, размер которого заранее неизвестен. Предположим, что у нас для решения этой задачи написана следующая программа:

#include <stdio.h>

 

void main()

{

char buf[256]; /* массив для считываемых байт, но не символов! */

FILE *in;

in = fopen("file.bin","rb");

if(in != NULL)

{

while(feof(in) == 0) /* читаем до конца файла */

{

fread(buf,1,256,in); /* прочитаем 256 байт из файла */

/*

здесь производится обработка считанной информации

*/

}

fclose(in); /* закроем файл */

}

}

Предположим что в файле file.bin количество байт кратно 256, например, точно 256. В этом случае программа будет выполняться слкдующим образм:

Первое выполнение цикла while:

- функция feof возвращает 0, поскольку файл не закончился;

- функция fread читает из файла 256 байт и признак конца файла не устанавливается, потому что из файла считано столько единиц информации, сколько было запрошено;

Второе выполнение цикла while:

- функция feof возвращает 0, поскольку файл еще не закончился, несмотря на то, что из него считаны все 256 байт;

- функция fread считает из файла 0 байт – файл закончился, содержимое буфера buf не изменяется, и только теперь устанавливается признак конца файла;

Третье выполнение цикла while:

- функция feof возвращает не нулевое значение и цикл завершается.

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

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

#include <stdio.h>

 

void main()

{

char buf[256]; /* массив для считываемых байт, но не символов! */

FILE *in;

size_t n_obj;

in = fopen("file.bin","rb");

if(in != NULL)

{

while((n_obj=fread(buf,1,256,in)) != 0) /* читаем до конца файла */

{

/*

здесь производится обработка считанной информации

n_obj – количество действительно прочитанных

единиц информации

*/

}

fclose(in); /* закроем файл */

}

}

Содержание отчета

Отчет по лабораторной работе должен содержать:

- задание лабораторной работы, соответствующее варианту

- структурную схему алгоритма программы и подпрограммы (подпрограмм)

- текст программы

- результаты работы программы

Лабораторная работа 10

Цель работы

Изучение функций для работы со строками.

Задание

Разработать программу и подпрограмму (подпрограммы), выполняющую действия согласно варианту задания

Задание
Выравнивание текста по правой границе. Правая граница определяется как сумма длины максимальной строки и некоторого числа D>0. Каждый символ табуляции во входном файле заменяется на n пробелов (1<=n<=8).
Создать выходной зашифрованный файл на основе входного. Шифрование файла выполняется по следующему правилу: в каждом слове строки первый символ меняется местами со вторым, третий с четвертым и так далее. Выполнить дешифровку созданного файла.
Выравнивание текста по центру при заданной длине строки. Длина строки для центрирования определяется как сумма длины максимальной строки и некоторого числа D>0.
Формирование строк текста одинаковой длины (в два раза меньше максимальной в исходном тексте) путем разбиения или объединения строк. Каждый символ табуляции во входном файле заменяется на 3 пробела.
Форматирование текста по правилам: после каждого символа, не являющегося буквой или цифрой, вставляется один пробел; после точки – пробел, а следующее слово начинается с большой буквы.
Выравнивание строк текста до заданной (не меньше максимальной) путем добавления пробелов между словами.

Теоретическая часть

Строки в языке Си

Для символьных данных в Си введен тип char. Для представления символьной информации используются символы, символьные переменные и текстовые константы.

Примеры:

const char c='c'; /* символ – занимает один байт, его значение не меняется */

char a,b; /* символьные переменные, занимают по одному байту, значения меняются */

const char *s="Пример строки\n" ; /* текстовая константа */

Строка описывается как массив символов. Число элементов массива равно числу элементов в строке плюс символ конца строки (\0). Поскольку строка – это массив, то для работы со строками очень удобно использовать указатели.

Пример. Записать введенную строку символов в обратном порядке.

#include<stdio.h>

void main()

{

int top,bot;

char string[10],temp; /*описание строки как массива символов*/

scanf("%s",string);

/* при вводе строк символ & не используется, так как имя массива является указателем на его начало */

for(top=0,bot=10;top<bot:top++,bot--)

{

temp=string[top];

string[top]=string[bot];

string[bot]=temp;

}

printf("%s\n",string);

}

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

Пример:

void main()

{

char s1[10] = "string1";

int k = sizeof(s1);

char s2[] = "string2";

k=sizeof(s2);

char s3[] = {'s','t','r','i','n','g','3'}

k=sizeof(s3);

char *s4 = "string4"; /* указатель на строку, ее нельзя изменить */

k=sizeof(s4);

}

Результаты:

s1 – выделено 10 байт

s2 – выделено 8 байт (7+1 байт под \0)

s3 – выделено 8 байт (7+1 байт под \0)

s4 – размер указателя sizeof(char *)

Операции со строками

Для ввода и вывода символьных данных в библиотеке stdio.h определены следующие функции:

- int getchar(void) - осуществляет вод одного символа их входного потока, при этом она возвращает один байт информации (символ) в виде значения типа int. Это сделано для распознавания ситуации, когда при чтении будет достигнут конец файла.

- int putchar (int c) – помещает в стандартный выходной поток символ c.

- char* gets(char*s) – считывает строку s из стандартного потока до появления символа '\n', сам символ '\n' в строку не заносится.

- int puts(const char* s) записывает строку в стандартный поток, добавляя в конецс троки символ '\n', в случае удачного завершения возвращает значение, больше или равное 0, и отрицательное значение (EOF=-1) в случае ошибки.

Описание функции работы со строками содержится в стандартной библиотеке string.h. Ниже приведены прототипы этих функций и их описания.

Прототип функции Краткое описание
char *strcpy(char *s ,const char *ct) копирует строку ct в строку s, включая '\0'; возвращает s
char *strncpy(char *s ,const char *ct, size_t n) копирует не более n символов строки ct в s; возвращает s. Дополняет результат символами '\0', если символов в ct меньше n
char *strcat(char *s ,const char *ct) приписывает ct к s; возвращает s
char *strncat(char *s ,const char *ct, size_t n) приписывает не более n символов ct к s, завершая s символом '\0'; возвращает s
int strcmp(const char *cs, char *st) сравнивает cs и ct; возвращает <0, если cs<ct; 0, если cs==ct; и >0, если cs>ct
int strncmp(const char *s ,const char *ct) сравнивает не более n символов cs и ct; возвращает <0, если cs<ct, 0, если cs==ct, и >0, если cs>ct
char *strchr(const char *cs, int c) возвращает указатель на первое вхождение c в cs или, если такового не оказалось, NULL
char *strrchr(const char *cs, int c) возвращает указатель на последнее вхождение c в cs или, если такового не оказалось, NULL
size_t strspn(const char *cs ,const char *ct) возвращает длину начального сегмента cs, состоящего из символов, входящих в строку ct
size_t strcspn(const char *cs ,const char *ct) возвращает длину начального сегмента cs, состоящего из символов, не входящих в строку ct
char *strpbrk(const char *cs ,const char *ct) возвращает указатель в cs на первый символ, который совпал с одним из символов, входящих в ct, или, если такового не оказалось, NULL
char *strstr(const char *cs, const char *ct) возвращает указатель на первое вхождение ct в cs или, если такового не оказалось, NULL
size_t strlen(const char *cs) возвращает длину cs
char * strerror(int n) возвращает указатель на зависящую от реализации строку, соответствующую номеру ошибки n
char * strtok(char *s, const char *ct) strtok ищет в s лексему, ограниченную символами из ct;

Функция strtok предназначена для разбиения строки на лексемы – лексические единицы, разделенные так символами-разделителями. При первом вызове функции указатель s не должен быть равен NULL, а должен указывать на строку, подлежащую разбиению. Функция ищет в строке s первую лексему, состоящую из символов, не входящих в ct; а на место первого символа, совпадающего с одним из символов, заданных в ct, записывается символ '\0', и функция возвращает указатель на лексему.

Каждый последующий вызов функции strtok, в котором первый аргумент равен NULL, возвращает указатель на следующую лексему, которую функция будет искать сразу за концом предыдущей.

Функция strtok возвращает NULL, если больше никакой лексемы не обнаружено. Символы-разделители, задаваемые параметром ct, могут изменяться от вызова к вызову.

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

#include<stdio.h>

#include<string.h>

void main()

{

char string[] = "Строка, содержащая несколько\tлексем.";

char delim[] = "\t ,."; /* символы-разделители */

char *ptr;

ptr = strtok(string,delim); /* выделим первую лексему */

while(ptr != NULL) /* если лексема найдена, продолжим поиск */

{

printf("Очередная лексема: %s\n",ptr);

ptr = strtok(NULL, delim);

}

}

В результате выполнения приведенной программы на экран будет выведено следующее:

Очередная лексема: Строка

Очередная лексема: содержащая

Очередная лексема: несколько

Очередная лексема: лексем

ВНИМАНИЕ!!! Поскольку функция strtok(char *s, const char *ct) записывает символ '\0' на место очередного разделителя в строке s, то после работы функции строка s оказывается "испорченной". Так, в приведенном выше примере после завершения цикла while длина строки string вместо первоначальных 36 символов станет равна 6, потому что на место символа 'запятая' будет записан символ '\0'.

Функции, начинающиеся с mem и описанные в библиотеке string.h, предназначены для работы с объектами, рассматриваемыми как массивы байт, а не символов.

Прототип функции Краткое описание
void *memcpy(void *s, const void *ct, size_t n) копирует n символов из ct в s и возвращает s
void *memmove(void *s, const void *ct, size_t n) делает то же самое, что и memcpy, но работает и в случае "перекрывающихся" объектов.
int memcmp(const void *cs, const void *ct, size_t n) сравнивает первые n символов cs и ct; выдает тот же результат, что и функция strcmp
void *memchr(cs, int c, size_t n) возвращает указатель на первое вхождение символа c в cs или, если среди первых n символов c не встретилось, NULL
void *memset(void *s, int c, size_t n) размещает символ c в первых n позициях строки s и возвращает s

ПРИМЕЧАНИЕ. Если в функциях копирования используются объекты, перекрывающиеся в памяти, то, за исключением функции memmove, поведение функций не определено. Функции сравнения рассматривают аргументы как массивы элементов типа unsigned char.

Содержание отчета

Отчет по лабораторной работе должен содержать:

- задание лабораторной работы, соответствующее варианту

- структурную схему алгоритма программы и подпрограммы (подпрограмм)

- текст программы

- результаты работы программы

Лабораторная работа 11

Цель работы

Изучение функций для работы со строками и символами.

Задание

Разработать программу и подпрограмму (подпрограммы), выполняющую действия согласно варианту задания

Задание
Изменить порядок строк в текстовом файле на обратный.
В тексте программы на Си удалить все комментарии.
В тексте программы на языке Си подсчитать количество идентификаторов.
Преобразовать текстовый файл, удалив из него все нечетные слова.
В тексте программы на языке Си заменить все ключевые слова int на integer, а char на character.
Преобразовать текстовый файл, изменив в каждой нечетной строке порядок слов.

Теоретическая часть

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

Функции проверки символов описаны в заголовочном файле <ctype.h>. Аргумент каждой из функций имеет тип int; значение, возвращаемое функциями, тоже имеет тип int. Функции возвращают ненулевое значение ("истина"), когда аргумент c удовлетворяет описанному условию или принадлежит указанному классу символов, и нуль в противном случае.

Функция "Истина", если
isalnum(c) isalpha(c) или isdigit(c) есть истина
isalpha(c) isupper(c) или islower(c) есть истина
isupper(c) c - буква верхнего регистра
islower(c) c - буква нижнего регистра
isdigit(c) c - десятичная цифра
isxdigit(c) c - шестнадцатеричная цифра
iscntrl(c) c - управляющий символ
isgraph(c) c - печатаемый символ кроме пробела
isprint(c) c - печатаемый символ, включая пробел
ispunct(c) c - печатаемый символ кроме пробела, буквы или цифры
isspace(c) c - пробел, смена страницы ('\f'), новая строка ('\n'), возврат каретки ('\r'), табуляция ('\t'), вертикальная табуляция (\'v')

В наборе семибитных ASCII-символов печатаемые символы находятся в диапазоне от 0x20 (' ') до 0x7E ('~'); управляющие символы - от 0 (NUL) до 0x1F (US) и 0x7F (DEL). Помимо перечисленных в таблице в библиотеке ctype.h объявлены еще две функции:

int tolower(int c) – переводит символ c в нижний регистр;

int toupper(int c) - переводит символ c в верхний регистр.

Если c - буква на верхнем регистре, то tolower(c) выдаст эту букву на нижнем регистре; в противном случае она вернет символ c. Если c - буква на нижнем регистре, то toupper(c) выдаст эту букву на верхнем регистре; в противном случае она вернет символ c.

Содержание отчета

Отчет по лабораторной работе должен содержать:

- задание лабораторной работы, соответствующее варианту

- структурную схему алгоритма программы и подпрограммы (подпрограмм)

- текст программы

- результаты работы программы

Лабораторная работа 12

Цель работы

Изучение математических функций стандартной библиотеки math.h.

Задание

Составить программу и подпрограмму (подпрограммы) для вычисления функции F(x) в виде бесконечного ряда с точностью 10-6. В программе организовать вычисление этого ряда для двух значений x и проверку получаемых результатов путем сравнения с соответствующей библиотечной функцией.

Распечатать таблицу значений функции для значений x, изменяющихся в диапазоне 0...A с шагом 0.1. Таблица должна содержать не более M строк.

F(x) Разложение в ряд A M
sin(x) x-x3/3!+x5/5!-…+(-1)nx(2n+1)/(2n+1)!+…
exp(x) 1+x1/1!+x2/2!+x3/3!+…+xn/n!+…
cos(x) 1-x2/2!+x4/4!-…+(-1)nx2n/(2n)!+…
sh(x) x+x3/3!+x5/5!+…+x(2n+1)/(2n+1)!+…
ch(x) 1+x2/2!+x4/4!+…+x2n/(2n)!+…
sin(x)/x 1-x2/3!+x4/5!-…+(-1)nx2n/(2n+1)!+…

Теоретическая часть

В заголовочном файле <math.h> описываются математические функции и определяются некоторые макросы, используемы при определении ошибок, возникающих при вызове и выполнении функций из библиотеки math.h

Константы EDOM и ERANGE (описанные в <errno.h>) задают отличные от нуля целочисленные константы, используемые для фиксации ошибки области и ошибки диапазона; константа HUGE_VAL определена как положительное значение типа double.

Ошибка области возникает, если аргумент функции выходит за область значений, для которой она определена. Фиксация ошибки области осуществляется присвоением переменной errno значения EDOM; значение, возвращаемое функцией, зависит от реализации.

Ошибка диапазона возникает тогда, когда результат функции не может быть представлен в виде double. В случае переполнения функция возвращает HUGE_VAL с правильным знаком и в переменную errno устанавливается значение ERANGE. Если результат оказывается меньше, чем возможно представить данным типом, функция возвращает нуль, а устанавливается ли в этом случае errno в ERANGE, зависит от реализации.

В приведенной ниже таблице x и y имеют тип double, n - тип int, и все функции возвращают значения типа double. Углы в тригонометрических функциях задаются в радианах.

Прототип функции Краткое описание
sin(x) синус x
cos(x) косинус x
tan(x) тангенс x
asin(x) арксинус x в диапазоне [-p/2, p/2], x в диапазоне [-1,1]
acos(x) арккосинус x в диапазоне [0, p], x в диапазоне [-1,1]
atan(x) арктангенс x в диапазоне [-p/2, p/2]
atan2(y,x) арктангенс y/x в диапазоне [-p, p]
sinh(x) гиперболический синус x
cosh(x) гиперболический косинус x
tanh(x) гиперболический тангенс x
exp(x) Экспоненциальная функция ex
log(x) натуральный логарифм ln(x), x > 0
log10(x) десятичный логарифм log10(x), x > 0
pow(x,y) xy, ошибка области, если x = 0 или y<=0 или x<0 и y – не целое
sqrt(x) квадратный корень из x, x >= 0
ceil(x) наименьшее целое в виде double, которое не меньше x
floor(x) наибольшее целое в виде double, которое не больше x
fabs(x) абсолютное значение x
ldexp(x, n) x*2n
frexp(x, int *еxр) разбивает x на два сомножителя, первый из которых - нормализованная дробь в интервале [1/2, 1), которая возвращается, а второй - степень двойки, эта степень запоминается в *exp. Если x - нуль, то обе части результата равны нулю
modf(x,double *ip) разбивается на целую и дробную части, обе имеют тот же знак, что и x. Целая часть запоминается в *ip, дробная часть выдается как результат
fmod(x, y) остаток от деления x на y в виде числа с плавающей точкой. Знак результата совпадает со знаком x. Если y равен нулю, результат зависит от реализации

Содержание отчета

Отчет по лабораторной работе должен содержать:

- задание лабораторной работы, соответствующее варианту

- структурную схему алгоритма программы и подпрограммы (подпрограмм)

- текст программы

- результаты работы программы

Лабораторная работа 13

Цель работы

Изучение математических функций стандартной библиотеки math.h и стандартной библиотеки stdlib.h

Задание

1. Разработать программу и подпрограмму (подпрограммы), вычисляющую корень уравнения с точностью ε = FLT_EPSILON*2 (значение константы FLT_EPSILON определено в файле float.h).

Метод приближения, функция и начальные координаты отрезка, содержащего корень, приведены в таблице.

Метод приближения Функция Границы отрезка
деление отрезка пополам x-ln(x+0.5)-0.5 0 ¸ 2
метод хорд (2*sin2(x))/3-0.75*cos2(x) 0 ¸ p/2
деление отрезка пополам x2 * 2x – 1 0 ¸ 1
метод хорд x2-sin(5x) 0.5 ¸ 0.6
деление отрезка пополам (4+x2)(ex-e-x)-18 1.2 ¸ 1.3
метод хорд x2-1.3*ln(x+0.5)-2.8x+2.35 1.7 ¸ 2.7

2. Разработать программу и подпрограмму (подпрограммы), вычисляющую значение интеграла с точностью ε = 0.0005.

Интегрируемая функция и пределы интегрирования приведены в таблице, начальное число отрезков разбиения n = 10.

Функция Границы отрезка
e-x*cos(px/4) 0 ¸ 2
Ötg(x) 0 ¸ p/6
ex/x 1 ¸ 7
cos(x)/x p/2 ¸p
Ö (1+cos2x) 0 ¸ p
ex*sin2x 0 ¸ 5

Теоретическая часть

Функции, предназначенные для преобразования чисел, запроса памяти и других задач объединены в стандартной библиотеке stdlib.h.

Прототип Описание
double atof(const char *s) переводит s в double; эквивалентна strtod(s, (char**) NULL).
int atoi(const char *s) переводит s в int; эквивалентна (int)strtol(s, (char**)NULL, 10).
int atol(const char *s) переводит s в long; эквивалентна strtol(s, (char**) NULL, 10).
double strtod(const char *s, char **endp) преобразует первые символы строки s в double, игнорируя начальные символы-разделители; запоминает указатель на непреобразованный конец в *endp (если endp не NULL), при переполнении она выдает HUGE_VAL с соответствующим знаком, в случае, если результат оказывается меньше, чем возможно представить данным типом, возвращается 0; в обоих случаях в errno устанавливается ERANGE.
long strtol(const char *s, char **endp, int base) преобразует первые символы строки s в long, игнорируя начальные символы-разделители; запоминает указатель на непреобразованный конец в *endp (если endp не NULL). Если base находится в диапазоне от 2 до 36, то преобразование делается в предположении, что на входе - запись числа по основанию base. Если base равно нулю, то основанием числа считается 8, 10 или 16; число, начинающееся с цифры 0, считается восьмеричным, а с 0x или 0X - шестнадцатеричным. Цифры от 10 до base-1 записываются начальными буквами латинского алфавита в любом регистре. При основании, равном 16, в начале числа разрешается помещать 0x или 0X. В случае переполнения функция возвращает LONG_MAX или LONG_MIN (в зависимости от знака), a в errno устанавливается ERANGE.
unsigned long strtoul(const char *s, char **endp, int base) работает так же, как и strtol, с той лишь разницей, что возвращает результат типа unsigned long, а в случае переполнения - ULONG_MAX.
int rand(void) выдает псевдослучайное число в диапазоне от 0 до RAND_MAX; RAND_MAX не меньше 32767.
void srand(unsigned int seed) использует seed в качестве начального значения для новой последовательности псевдослучайных чисел. Изначально параметр seed равен 1.
void *calloc(size_t nobj, size_t sze) возвращает указатель на место в памяти, отведенное для массива nobj объектов, каждый из которых размера size, или, если памяти запрашиваемого объема нет, NULL. Выделенная область памяти обнуляется.
void *malloc(size_t size) возвращает указатель на место в памяти для объекта размера size или, если памяти запрашиваемого объема нет, NULL. Выделенная область памяти не инициализируется.
void *realloc(void *p, size_t size) перевыделяет память заменяет для объекта, на который указывает p. Для части, размер которой равен наименьшему из старого и нового (size) размеров, содержимое не изменяется. Если новый размер больше старого, дополнительное пространство не инициализируется, realloc возвращает указатель на новое место памяти или, если требования не могут быть удовлетворены, NULL (*p при этом не изменяется).
void free(void *р) освобождает область памяти, на которую указывает p; эта функция ничего не делает, если p равно NULL. В p должен стоять указатель на область памяти, ранее выделенную одной из функций: calloc, malloc или realloc.
void abort(void *р) вызывает аварийное завершение программы, ее действия эквивалентны вызову raise(SIGABRT).
void exit(int status) вызывает нормальное завершение программы. Функции, зарегистрированные с помощью atexit, выполняются в порядке, обратном их регистрации. Производится опорожнение буферов открытых файлов, открытые потоки закрываются, и управление возвращается в среду, из которой был произведен запуск программы. Значение status, передаваемое в среду, зависит от реализации, однако при успешном завершении программы принято передавать нуль. Можно также использовать значения EXIT_SUCCESS (в случае успешного завершения) и EXIT_FAILURE (в случае ошибки).
int atexit(void (*fcn)(void)) регистрирует fcn в качестве функции, которая будет вызываться при нормальном завершении программы; возвращает ненулевое значение, если регистрация не может быть выполнена.
int system(const char *s) пepeдaeт cтpoку s oпepaциoннoй cpeдe для выпoлнeния. Если s – NULL и существует командный процессор, то system возвращает ненулевое значение. Если s не NULL, то возвращаемое значение зависит от реализации.
char *getenv(const char *name) возвращает строку среды, связанную с name, или, если никакой строки не существует, NULL. Детали зависят от реализации.
void *bsearch(const void *key, const void *base, size_t n, size_t size, int (*cmp)(const void *keyval, const void *datum)) ищет среди base[0]...base[n-1] элемент с подходящим ключом *key. Функция cmp должна сравнивать первый аргумент (ключ поиска) со своим вторым аргументом (значением ключа в таблице) и в зависимости от результата сравнения выдавать отрицательное число, нуль или положительное значение. Элементы массива base должны быть упорядочены в возрастающем порядке, bsearch возвращает указатель на элемент с подходящим ключом или, если такого не оказалось, NULL.
void qsort(void *base, size_t n, size_t size, int (*cmp)(const void *, const void *)) сортирует массив base[0]...base[n-1] объектов размера size в возрастающем порядке. Функция сравнения cmp - такая же, как и в bsearch.
int abs(int n) возвращает абсолютное значение аргумента типа int.
long labs(long n) возвращает абсолютное значение аргумента типа long.
div_t div(int num, int denom) вычисляет частное и остаток от деления num на denom. Результаты типа int запоминаются в элементах quot и rem структуры div_t.
ldiv_t ldiv(long num, long denom) вычисляет частное и остаток от деления num на denom. Результаты типа long запоминаются в элементах quot и rem структуры ldiv_t.

Рекомендации по выполнению лабораторной работы

Определение корней функции

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

F(x)= anxn+…+a2x2+a1x+a0

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

Дата: 2016-10-02, просмотров: 269.