Программирование на языках высокого уровня - Учебное пособие

бесплатно 0
4.5 80
Алгоритмы обработки данных на языке программирования СИ. Приемы работы с интегрированной средой разработки, Использование разнообразных трансляторов и интерпретаторов, обеспечивающих связь программ с различными операционными системами и оборудованием.


Аннотация к работе
Для типов данных char, short, int, long с квалификаторами signed, unsigned составить программу, которая, используя операцию присваивания, выполняет указанные преобразования типов, и вывести полученные результаты. signed char ? unsigned char ? unsigned long ? signed long ? signed short int ? unsigned short int ? unsigned int ? signed int ? signed int ? unsigned int ? unsigned short int ? signed short int ? signed long unsigned long unsigned char signed char Если в выражении в программе на языке Си используются операнды различных типов, то это выражение не считается ошибочным, а в нем производится автоматическое преобразование типов операндов: ? если в выражении используются операнды разных типов, то операнд с меньшей длиной приводится к операнду с большей длиной. Если операнд равен 0, результат операции будет равен 1, если операнд - не ноль, результат операции = 0 увеличение операнда на единицу: префиксная операция - увеличивает операнд до его использования, постфиксная операция увеличивает операнд после его использования. уменьшение операнда на единицу: префиксная операция - уменьшает операнд до его использования, постфиксная операция уменьшает операнд после его использования. вычисление размера (в байтах) для объекта того типа, который имеет операнд обращение к элементу структуры (по указателю) обращение к элементу структуры В языке Си условный оператор имеет две формы записи: if (выражение) оператор1 оператор3 и if (выражение) оператор1 else оператор2 оператор3 Файл, связанный с потоком, можно открыть в одном из 6 режимов: Режим Описание режима открытия файла r Файл открывается для чтения, если файл не существует, то возвращается ошибка. w Файл открывается для записи, если файл не существует, то он будет создан, если файл уже существует, то вся информация из него стирается. a Файл открывается для добавления, если фай не существует, то он будет создан, если существует, то информация из него не стирается, можно выполнять запись в конец файла r Файл открывается для чтения и записи, изменить размер файла нельзя, если файл не существует, то возвращается ошибка. w Файл открывается для чтения и записи, если файл не существует, то он будет создан, если файл уже существует, то вся информация из него стирается.

План
Содержание

Аннотация .

Список литературы
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 из стандартного потока до появления символа "

", сам символ "

" в строку не заносится.

? int puts(const char* s) записывает строку в стандартный поток, добавляя в конецс троки символ "

", в случае удачного завершения возвращает значение, больше или равное 0, и отрицательное значение (EOF=-1) в случае ошибки.

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

Прототип функции char *strcpy(char *s ,const char *ct) char *strncpy(char *s ,const char *ct, size_t n) char *strcat(char *s ,const char *ct) char *strncat(char *s ,const char *ct, size_t n) int strcmp(const char *cs, char *st) int strncmp(const char *s ,const char *ct) char *strchr(const char *cs, int c) char *strrchr(const char *cs, int c) size_t strspn(const char *cs ,const char *ct) size_t strcspn(const char *cs ,const char *ct) char *strpbrk(const char *cs ,const char *ct)

Краткое описание копирует строку ct в строку s, включая "\0"; возвращает s копирует не более n символов строки ct в s; возвращает s. Дополняет результат символами "\0", если символов в ct меньше n приписывает ct к s; возвращает s приписывает не более n символов ct к s, завершая s символом "\0"; возвращает s сравнивает cs и ct; возвращает 0, если cs>ct сравнивает не более n символов cs и ct; возвращает 0, если cs>ct возвращает указатель на первое вхождение c в cs или, если такового не оказалось, NULL возвращает указатель на последнее вхождение c в cs или, если такового не оказалось, NULL возвращает длину начального сегмента cs, состоящего из символов, входящих в строку ct возвращает длину начального сегмента cs, состоящего из символов, не входящих в строку ct возвращает указатель в cs на первый символ, который совпал с одним из символов, входящих в ct, или, если такового не оказалось, NULL

41

Прототип функции char *strstr(const char *cs, const char *ct) size_t strlen(const char *cs) char * strerror(int n) char * strtok(char *s, const char *ct)

Краткое описание возвращает указатель на первое вхождение ct в cs или, если такового не оказалось, NULL возвращает длину cs возвращает указатель на зависящую от реализации строку, соответствующую номеру ошибки n strtok ищет в s лексему, ограниченную символами из ct;

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

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

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

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

#include #include void main()

{ char string[] = "Строка, содержащая несколько\тлексем."; char delim[] = "\t ,."; /* символы-разделители */ char *ptr;

ptr = strtok(string,delim); /* выделим первую лексему */ while(ptr != NULL) /* если лексема найдена, продолжим поиск */ { printf("Очередная лексема: %s

",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) void *memmove(void *s, const void *ct, size_t n) int memcmp(const void *cs, const void *ct, size_t n) void *memchr(cs, int c, size_t n) void *memset(void *s, int c, size_t n)

Краткое описание копирует n символов из ct в s и возвращает s делает то же самое, что и memcpy, но работает и в случае "перекрывающихся" объектов. сравнивает первые n символов cs и ct; выдает тот же результат, что и функция strcmp возвращает указатель на первое вхождение символа c в cs или, если среди первых n символов c не встретилось, NULL размещает символ c в первых n позициях строки s и возвращает s

42

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

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

Отчет по лабораторной работе должен содержать: ? задание лабораторной работы, соответствующее варианту

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

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

43

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

Цель работы

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

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



1

2

3

4

5

6

Задание

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

В тексте программы на Си удалить все комментарии.

В тексте программы на языке Си подсчитать количество идентификаторов.

Преобразовать текстовый файл, удалив из него все нечетные слова.

В тексте программы на языке Си заменить все ключевые слова int на integer, а char на character.

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

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

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

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

Функция isalnum(c) isalpha(c) isupper(c) islower(c) isdigit(c) isxdigit(c) iscntrl(c) isgraph(c) isprint(c) ispunct(c) isspace(c)

"Истина", если isalpha(c) или isdigit(c) есть истина isupper(c) или islower(c) есть истина c - буква верхнего регистра c - буква нижнего регистра c - десятичная цифра c - шестнадцатеричная цифра c - управляющий символ c - печатаемый символ кроме пробела c - печатаемый символ, включая пробел c - печатаемый символ кроме пробела, буквы или цифры c - пробел, смена страницы ("\f"), новая строка ("

"), возврат каретки ("

"), табуляция ("\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.

44

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

Отчет по лабораторной работе должен содержать: ? задание лабораторной работы, соответствующее варианту

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

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

45

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

Цель работы

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

Задание

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

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

№ F(x)

1 sin(x)

2 exp(x)

3 cos(x)

4 sh(x)

5 ch(x)

6 sin(x)/x

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

1-x2/3! x4/5!-… (-1)nx2n/(2n 1)! … 5 6

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

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

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

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

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

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

Прототип функции sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) atan2(y,x) sinh(x) cosh(x)

Краткое описание синус x косинус x тангенс x арксинус x в диапазоне [-?/2, ?/2], x в диапазоне [-1,1] арккосинус x в диапазоне [0, ?], x в диапазоне [-1,1] арктангенс x в диапазоне [-?/2, ?/2] арктангенс y/x в диапазоне [-?, ?] гиперболический синус x гиперболический косинус x

46

Прототип функции tanh(x) exp(x) log(x) log10(x) pow(x,y) sqrt(x) ctrial) floor(x) fabs(x) ldexp(x, n) frexp(x, int *exp)

modf(x,double *ip) fmod(x, y)

Краткое описание гиперболический тангенс x

Экспоненциальная функция ex натуральный логарифм ln(x), x > 0 десятичный логарифм log10(x), x > 0 xy, ошибка области, если x = 0 или y<=0 или x<0 и y - не целое квадратный корень из x, x >= 0 наименьшее целое в виде double, которое не меньше x наибольшее целое в виде double, которое не больше x абсолютное значение x x?2n разбивает x на два сомножителя, первый из которых - нормализованная дробь в интервале [1/2, 1), которая возвращается, а второй - степень двойки, эта степень запоминается в *exp. Если x - нуль, то обе части результата равны нулю разбивается на целую и дробную части, обе имеют тот же знак, что и x. Целая часть запоминается в *ip, дробная часть выдается как результат остаток от деления x на y в виде числа с плавающей точкой. Знак результата совпадает со знаком x. Если y равен нулю, результат зависит от реализации

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

Отчет по лабораторной работе должен содержать: ? задание лабораторной работы, соответствующее варианту

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

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

47

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

Цель работы

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

Задание

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

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

№ Метод приближения

1 деление отрезка пополам

2 метод хорд

3 деление отрезка пополам

4 метод хорд

5 деление отрезка пополам

6 метод хорд

Функция x ln(x 0.5)-0.5 (2*sin2(x))/3-0.75*cos2(x) x2 * 2x - 1 x2-sin(5x) (4 x2)(ex-e-x)-18 x2-1.3*ln(x 0.5)-2.8x 2.35

Границы отрезка

0 ? 2

0 ? ?/2

0 ? 1

0.5 ? 0.6

1.2 ? 1.3

1.7 ? 2.7

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

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

№ Функция

1 e-x*cos(?x/4) 2 ?tg(x)

3 ex/x

4 cos(x)/x 5 ? (1 cos2x)

6 ex*sin2x

Границы отрезка

0 ? 2

0 ? ?/6

1 ? 7

?/2 ??

0 ? ?

0 ? 5

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

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

Прототип double atof(const char *s) int atoi(const char *s) int atol(const char *s) double strtod(const char *s, char **endp)

long strtol(const char *s, char **endp, int base)

Описание переводит s в double; эквивалентна strtod(s, (char**) NULL). переводит s в int; эквивалентна (int)strtol(s, (char**)NULL, 10). переводит s в long; эквивалентна strtol(s, (char**) NULL, 10). преобразует первые символы строки s в double, игнорируя начальные символы-разделители; запоминает указатель на непреобразованный конец в *endp (если endp не NULL), при переполнении она выдает HUGE_VAL с соответствующим знаком, в случае, если результат оказывается меньше, чем возможно представить данным типом, возвращается 0; в обоих случаях в errno устанавливается ERANGE. преобразует первые символы строки s в long, игнорируя начальные символы-разделители; запоминает указатель на непреобразованный конец в *endp (если endp не NULL). Если base находится в диапазоне от 2 до 36, то преобразование делается в предположении, что на

48

Прототип

unsigned long strtoul(const char *s, char **endp, int base) int rand(void)

void srand(unsigned int seed)

void *calloc(size_t nobj, size_t sze)

void *malloc(size_t size)

void *realloc(void *p, size_t size)

void free(void *р)

void abort(void *р)

void exit(int status)

int atexit(void (*fcn)(void))

int system(const char *s)

char *getenv(const char *name)

Описание входе - зtrial числа по основанию base. Если base равно нулю, то основанием числа считается 8, 10 или 16; число, начинающееся с цифры 0, считается восьмеричным, а с 0x или 0X -шестнадцатеричным. Цифры от 10 до base-1 записываются начальными буквами латинского алфавита в любом регистре. При основании, равном 16, в начале числа разрешается помещать 0x или 0X. В случае переполнения функция возвращает LONG_MAX или LONG_MIN (в зависимости от знака), a в errno устанавливается ERANGE. работает так же, как и strtol, с той лишь разницей, что возвращает результат типа unsigned long, а в случае переполнения - ULONG_MAX. выдает псевдослучайное число в диапазоне от 0 до RAND_MAX; RAND_MAX не меньше 32767. использует seed в качестве начального значения для новой последовательности псевдослучайных чисел. Изначально параметр seed равен 1. возвращает указатель на место в памяти, отведенное для массива nobj объектов, каждый из которых размера size, или, если памяти запрашиваемого объема нет, NULL. Выделенная область памяти обнуляется. возвращает указатель на место в памяти для объекта размера size или, если памяти запрашиваемого объема нет, NULL. Выделенная область памяти не инициализируется. перевыделяет память заменяет для объекта, на который указывает p. Для части, размер которой равен наименьшему из старого и нового (size) размеров, содержимое не изменяется. Если новый размер больше старого, дополнительное пространство не инициализируется, realloc возвращает указатель на новое место памяти или, если требования не могут быть удовлетворены, NULL (*p при этом не изменяется). освобождает область памяти, на которую указывает p; эта функция ничего не делает, если p равно NULL. В p должен стоять указатель на область памяти, ранее выделенную одной из функций: calloc, malloc или realloc. вызывает аварийное завершение программы, ее действия эквивалентны вызову raise(SIGABRT). вызывает нормальное завершение программы. Функции, зарегистрированные с помощью atexit, выполняются в порядке, обратном их регистрации. Производится опорожнение буферов открытых файлов, открытые потоки закрываются, и управление возвращается в среду, из которой был произведен запуск программы. Значение status, передаваемое в среду, зависит от реализации, однако при успешном завершении программы принято передавать нуль. Можно также использовать значения EXIT_SUCCESS (в случае успешного завершения) и EXIT_FAILURE (в случае ошибки). регистрирует fcn в качестве функции, которая будет вызываться при нормальном завершении программы; возвращает ненулевое значение, если регистрация не может быть выполнена. передает строку s операционной среде для выполнения. Если s - NULL и существует командный процессор, то system возвращает ненулевое значение. Если s не NULL, то возвращаемое значение зависит от реализации. возвращает строку среды, связанную с name, или, если никакой строки не существует, NULL. Детали зависят от реализации.

49

Прототип void *bsearch(const void *key, const void *base, size_t n, size_t size, int (*cmp)(const void *keyval, const void *datum))

void qsort(void *base, size_t n, size_t size, int (*cmp)(const void *, const void *)) int abs(int n) long labs(long n) div_t div(int num, int denom)

ldiv_t ldiv(long num, long denom)

Описание ищет среди base[0]...base[n-1] элемент с подходящим ключом *key. Функция cmp должна сравнивать первый аргумент (ключ поиска) со своим вторым аргументом (значением ключа в таблице) и в зависимости от результата сравнения выдавать отрицательное число, нуль или положительное значение. Элементы массива base должны быть упорядочены в возрастающем порядке, bsearch возвращает указатель на элемент с подходящим ключом или, если такого не оказалось, NULL. сортирует массив base[0]...base[n-1] объектов размера size в возрастающем порядке. Функция сравнения cmp - такая же, как и в bsearch. возвращает абсолютное значение аргумента типа int. возвращает абсолютное значение аргумента типа long. вычисляет частное и остаток от деления num на denom. Результаты типа int запоминаются в элементах quot и rem структуры div_t. вычисляет частное и остаток от деления num на denom. Результаты типа long запоминаются в элементах quot и rem структуры ldiv_t.

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

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

Численные методы позволяют найти решения определенных задач, заранее зная, что полученные результаты будут вычислены с определенной погрешностью, поэтому для многих численных методов необходимо заранее знать "уровень точности", которому будет соответствовать полученное решение. В связи с этим задача нахождения корней многочлена вида trial anxn … a2x2 a1x a0 представляет особый интерес, т.к. формулы нахождения корней даже кубического уравнения достаточно сложны, а если необходимо отыскать корни многочлена большей степени, то без помощи численных методов не обойтись. Рассмотрим два наиболее известных (и простых) методов нахождения корней: метод деления отрезка пополам и метод хорд.

Метод деления отрезка пополам

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

Исходные данные к методу деления отрезка пополам: ? дана функция f(x);

? определена допустимая погрешность Q;

? определен некоторый интервал [a,b], содержащий решение уравнения.

Алгоритм нахождения корня: 1. Вычисляем значение координаты x, беря середину отрезка [a,b], т.е. x= (a b)/2 2. Вычисляем значения f(a), f(b), f(x), и осуществляем следующую проверку: Если |f(x)| <= Q, то корень с указанной точностью найден.

Если |f(x)| > Q, т.е. необходимая точность еще не достигнута, то формируем два интервала: [a,x] и [x,b] проверяем знаки f(a), f(b), f(x). На концах одного из этих интервалов знаки функции будут одинаковы, а на другом - различны. Именно тот интервал, на концах которого знаки различны, мы берем за основу при следующей итерации, т.е. приравниваем либо a, либо b к х.

3. Переходим к пункту 1.

50

Рис. 9. Метод деления отрезка пополам Метод хорд

Исходные данные к методу деления отрезка пополам: ? дана функция F(x);

? определена допустимая погрешность Q;

? определен некоторый интервал [a,b], содержащий решение уравнения.

Алгоритм нахождения корня: 1. Строим хорду, проходящую через точки f(a) и f(b) и вычисляем точку пересечения (x) хорды с осью абсцисс.

Формула прямой, проходящей через точки а и в, т.е. хорды: y=k*x y0, где k =

y0 = тогда точка х пересечения хорды с осью абсцисс будет вычисляться по формуле: x =

2. Вычисляем значения f(a), f(b), f(x), и осуществляем следующую проверку: Если |f(x)| <= Q или длина отрезка [a,b] <= Q, то корень с указанной точностью найден.

Если |f(x)| > Q, т.е. необходимая точность еще не достигнута, то формируем два интервала: [a,x] и [x,b] проверяем знаки F(a), F(b), F(x). На концах одного из этих интервалов знаки функции будут одинаковы, а на другом - различны. Именно то интервал, на концах которого знаки различны, мы берем за основу при следующей итерации, т.е. приравниваем либо a, либо b к х.

3. Переходим к пункту 1.

51

Рис. 10. Метод хорд

Вычисление интеграла

Известно, что определенный интеграл функции f(x) типа на интервале [a,b] численно представляет собой площадь криволинейной трапеции ограниченной прямыми x=0, y=a, y=b и функцией y=f(x) (едних прямоугольников (рис. 3)). Есть два метода вычисления этой площади или определенного интеграла — метод трапеций (Рис. 2) и метод средних прямоугольников (Рис. 3).

Рис. 11. Криволинейная трапеция

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

52

Рис. 12. Метод трапеций

, где h - длина отрезка, n - число отрезков и для метода средних прямоугольников:

Рис. 13. Метод средних прямоугольников

, где h - длина отрезка, n - число отрезков

Алгоритм вычисления интеграла по любому из методов будет выглядеть следующим образом: 1. При заданном числе отрезков разбиения вычисляется (по заданному методу) первоначальное приближение S0

2. Числоотрезков разбиения увеличивается на k (например, k=5) и вычисляется новое значение интеграла S1

3. Если |S0-S1| <= заданной точности, то за точное значение интеграла принимается значение S1

53

В противном случае за первоначальное приближение S0 принимается значение S1 и алгоритм повторяется, начиная с п.2

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

Отчет по лабораторной работе должен содержать: ? задание лабораторной работы, соответствующее варианту

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

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

54

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

Цель работы

Закрепление пройденного материала: основные элементы языка Си, массивы, условные операторы, функции, стандартные библиотеки.

Задание

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

При выводе графика функции на экран ось X расположить горизонтально (количество позиций по оси X = 78), а ось Y - вертикально (количество позиций по оси Y = 25).

При выводе графика функции в выходной файл ось X расположить вертикально (количество позиций по оси X = 60), а ось Y - горизонтально (количество позиций по оси Y = 80), каждый столбец гистограммы пометить значением функции. После гистограммы вывести масштаб функции по оси Y.

Функция и координаты отрезка приведены в таблице.

№ Функция

1 у = ?2*sin(x)?- ?cos(3*x)?

2 y = 2*sin(x) 3*cos(2*x) 3 y = (x-3)/(x2 2)

4 y = x2 * exp(-x)

5 y = exp(-x) * sin(2x)

6 y = (x 2)2/3 - (x-2)2/3

Границы отрезка

-?/2 ? ?

-?/2 ? ?/2

-1 ? 4

-1 ? 2

-?/2 ? 2?

-3 ? 2.5

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

При выполнении даннной лабораторной работы необходимо учитывать следующее: 1. Графики функций, выводимые на экран, должны быть отмасштабированы в соответствии с заданными диапазонами (количество позиций по оси X и количество позиций по оси/Y) и на каждом графике должны быть отображены оси X и Y.

В связи с этим можно предложить следующие варианты масштабирования функций: a) Пусть ymax и ymin - максимальное и минимальное значения функции, график которой должен быть построен, а xmin и xmax - границы отрезка по оси Х.

В зависимости от вида функции возможны следующие случаи расчета масштаба функции: График функции имеет вид, приведенный на Error! Not a valid bookmark self-reference.

Рис. 14. График функции (вариант 1)

55

В этом случае диапазон изменения х будет xmin=0 - xmax, а диапазонизменения функции - ymin и ymax.

График функции имеет вид, приведенный на Error! Not a valid bookmark self-reference.

Рис. 15. График функции (вариант 2)

В этом случае диапазон изменения х будет xmin - xmax, а диапазонизменения функции - ymin и ymax.

График функции имеет вид, приведенный на Error! Not a valid bookmark self-reference.

Рис. 16. График функции (вариант 3)

В этом случае диапазон изменения х будет xmin =0 - xmax, а диапазонизменения функции -ymin=0 и ymax.

График функции имеет вид, приведенный на Error! Not a valid bookmark self-reference.

Рис. 17. График функции (вариант 4)

В этом случае диапазон изменения х будет xmin=0 - xmax, а диапазонизменения функции - ymin и ymax=0.

Значения границ отрезка по оси Х и значений ymin и ymax для расположения графика функции в других квадрантах получаются аналогично. b) Масштаб функции по оси Y рассчитывается как my = (ymax-ymin)/, а шаг изменения аргумента х - как dx = (xmax-xmin)/

56

2. На основании полученных масштабов строятся требуемые графики функций и оси координат.

График функции, построенный на экране, должен иметь вид, аналогичный приведенному на осям x и y можно не указывать (с точностью до функции и символов, используемых для обозначения точек функции). Значения по осям X и Y можно не указывать.

Рис. 18. Вид графика на экране

График функции в виде гистограммы должен иметь вид, аналогичный приведенному на ен масштаб функции по оси y !! (с точностью до функции и символов, используемых для обозначения точек функции). Значения по осям X и Y можно не указывать. На гистограмме ОБЯЗАТЕЛЬНО должны быть указаны значения функции для соответствующих "столбиков" и в тех позициях, как показано на рисунке. Количество символов после десятичной точки для значений функции на гистограмме должно быть не меньше 3. Символы для построения гистограммы выбираются произвольно.

!!! После гистограммы должен быть выведен масштаб функции по оси Y !!!

Рис. 19. График в виде гистограммы

57

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

Отчет по лабораторной работе должен содержать: ? задание лабораторной работы, соответствующее варианту

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

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

58
Заказать написание новой работы



Дисциплины научных работ



Хотите, перезвоним вам?