4. Написать функцию, которая вычисляет для заданной квадратной матрицы A её симметричную часть S(ij)=(A(ij)+A(ji))/2 и кососимметричную часть K(ij)=(A(ij)-A(ji))/2.
5. Написать функцию “шапочка” f(x), зависящую от параметров a и b: если |x| >a то f(x)=0 иначе f(x)=b*exp(-a2/(a2-|x|2)). В качестве параметров передать a,b,x.
6. Написать функцию поиска максимального и минимального элементов одномерного массива. В основной программе вызвать эту функцию для двух разных массивов.
7. Написать функцию, которая сортирует одномерный массив в порядке убывания методом пузырька. В основной программе вызвать эту функцию для двух разных массивов.
8. Написать функцию, которая по двум заданным одномерным массивам (A размера m и B размера n) вычисляет двумерный массив c(ij)=a(i)*b(j) и возвращает его максимальный элемент.
9. Написать функцию определителя квадратной матрицы A размера 3x3:
detA=a(1,1)a(2,2)a(3,3)+a(3,1)a(1,2)a(2,3)+a(2,1)a(3,2)a(1,3)-a(3,1)a(2,2)a(1,3)-a(1,1)a(3,2)a(2,3)-a(2,1)a(1,2)a(3,3).
10. Написать функцию вычисления суммы ряда y=sinx-(sin2x)/2+…
+(-1)n+1sin(nx)/n с точностью до eps=0.001. В качестве параметров передать x (в радианах) и eps.
11. Написать функцию вычисления ряда y=x+x3/3!+…+x2n+1/(2n+1)! с точностью до eps=0.0001. В качестве параметров передать x и eps.
12. Написать функцию обработки матриц A и B одинакового размера m x n. Получить матрицу C =max(a(i,j),b(i,j)), и матрицу D=min(a(i,j),b(i,j)). Матрицы C и D вывести в главной программе.
4. КОНТРОЛЬНЫЕ ВОПРОСЫ
4.1. Описание функции. Для чего объявляется прототип?
4.2. Что такое формальные и фактические параметры? Локальные и глобальные?
4.3. Как можно передавать массив в функцию?
4.4. Способы вызова функций.
Лабораторная работа № 7
Рекурсии
1. ЦЕЛЬ РАБОТЫ: Изучение методов использования алгоритмов и программ с рекурсиями в языке Си.
2. ОСНОВНЫЕ СВЕДЕНИЯ
В языке Си функции могут вызывать сами себя, т.е. обладать свойством рекурсивности. Рекурсивная функция обязательно должна содержать в себе условие окончания рекурсивности, чтобы не вызвать зацикливания программы. При каждом рекурсивном вызове создается новое множество локальных переменных. Т.о. переменные, расположенные вне вызываемой функции, не изменяются.
Пример. Составить рекурсивную функцию, вычисляющую факториал числа n следующим образом: n!= 1 , если n<= 1 и n!= ( n -1 )! · n, если n > 1
long fact( int n)
{ if (n <=1) return l;
else return (n * fact ( n -1 )); // функция fact вызывает саму себя
}
Таким образом, последовательно вызываются функции f(n), f(n-1),f(n-2)…f(1).
Достоинством рекурсий является компактная запись, а недостатком – расход времени и памяти на повторные вызовы функции и передачу ей копий параметров.
3. ВЫПОЛНЕНИЕ РАБОТЫ
Составить алгоритмы и программы с использованием рекурсии в соответствии с вариантом задания.
Варианты заданий
Все значения передавать функциям в виде параметров.
1. Ввести с клавиатуры целое число N. Используя рекурсию, распечатать сначала последовательность, состоящую из N букв 'А', а затем из N букв 'В'.
2. Напечатать в обратном порядке последовательность чисел, признаком конца которой является 0.
3. Водится любое целое число b и вещественные a, c. Вычислить z=a b +c b , используя рекурсивную функцию x n 1, если n = 0x n = 1/ x -n , если n < 0
x × x n-1 , если n > 0
4. Для N=12 найти числа Фибоначчи, которые вычисляются следующим образом: F(0)=1, F(1)=2, F(N)=F(N-2)+F(N-1)
5. Методом деления отрезка пополам найти с точностью EPS=0,0001 корень уравнения cos(2/x)-2*sin(1/x)+1/x=0
6. Даны целые числа m и n, где 0<=m<=n. Вычислить рекурсивно число сочетаний по формуле:
7. Дана последовательность положительных чисел, признаком конца которых служит отрицательное число. Используя рекурсию, подсчитать количество чисел и их сумму.
8. Дана последовательность ненулевых целых чисел, признаком конца которых служит 0. Используя рекурсию, напечатать сначала все отрицательные, а потом – все положительные числа этой последовательности.
9. Дан вектор Х из N вещественных чисел. Найти минимальный элемент вектора, используя вспомогательную рекурсивную функцию, находящую минимум среди последних элементов вектора Х, начиная с N-го.
10. Дана строка символов, в конце которой стоит точка. Напечатать строку в обратном порядке.
11. Задан вещественный массив из N. Упорядочить его по возрастанию методом быстрой сортировки: выбрать средний элемент массива и переставить элементы так, чтобы слева от выбранного элемента были меньшие, а справа только большие (т.о. выбранный элемент окажется на окончательном месте). Затем применить этот способ рекурсивно к левой и правой части массива.
12. Имеется 10 населенных пунктов. Дана последовательность пар чисел пар чисел I и J (I<J), указывающих, что I –ый J-ый пункты соединены дорогой. Признак конца этой последовательности - пара нулей. Используя рекурсию, определить, можно ли по этим дорогам попасть из 1-го пункта в N-ый.
4. КОНТРОЛЬНЫЕ ВОПРОСЫ
4.1. Что такое рекурсия?
4.2. Как меняются локальные и глобальные переменные в рекурсиях?
4.3. Где находится окончание рекурсии?
Лабораторная работа № 8
Структуры
1. ЦЕЛЬ РАБОТЫ: Приобретение практических навыков в составлении алгоритмов и программ со структурами.
2. ОСНОВНЫЕ СВЕДЕНИЯ
Структура – это фиксированное число элементов одного или нескольких типов. Т.е. в отличие от массивов, в которых содержатся элементы одного типа, в структурах могут содержаться элементы как одного, так и разных типов. Элементами структуры могут быть базовые типы, массивы, указатели, структуры и т.д. Элементы структуры вместе с их описанием называются полями. Над полями можно выполнять действия, допустимые для данных этого типа.
Все структуры должны быть описаны до использования. Все идентификаторы полей в структуре должны быть различными.
Например, структуру Воок можно описать следующим образом:
struct card {char аuthor [15]; char title[20]; int year ; float cena;} Book;
или struct card { char аuthor [15]; char title[20]; int year ; float cena;};
stuct card Book;
Тип структуры (например, card) вводит только шаблон и с его именем не связан никакой конкретный объект. Объект (например, структура Book) должен быть также объявлен. Обращение к полю структуры выполняется с помощью составного имени, которое состоит из имени_структуры . имени_поля. Например, присвоить значения элементам записи Author и Title можно так: Book.author= “Довгаль С.И.”; Book.title=”Турбо Паскаль V 7.0”;
Ввод цены книги с клавиатуры : scanf (“%f”, &Book.cena);
Можно создавать массив структур: Struct card bibl[100];
Обращение к полю элемента массива: bibl[i].title;
Пример: Дана информация о 10 товарах: название, цена, количество. Вычислить общую стоимость товара, название которого вводится с клавиатуры.
//lab7_1
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define n 10
main()
{
int i,k; float sum; //k-количество искомых товаров, sum- их общая стоимость.
struct tov {char name[10]; float c; int kol;} t; //Объявление структуры t
struct tov mag[n]; //объявление массива структур mag[n]
char nazv[10]; //Наименование искомого товара
clrscr();
printf(“\n Введите информацию о товарах \n“);
for (i=0;i<n;i++)
{ printf("\n наименование , цена, количество : ");
scanf("%s %f %d",t.name,&t.c,&t.kol); //Заполнение информацией структуры t
mag[i]=t; //Присвоение i-му элементу массива структуры t целиком
}
printf("\n введите искомый товар: ");
scanf("%s",nazv);
for (i=0,sum=0,k=0;i<n;i++)
if (strcmp(mag[i].name,nazv)==0)
{ sum+=mag[i].c*mag[i].kol;
k++;
}
printf("Товаров %s %d, их стоимость %5.2f ",nazv,k,sum);
getch();
}
3. ВЫПОЛНЕНИЕ РАБОТЫ
В соответствии с вариантом написать и выполнить программу.
Варианты заданий
1. Дана информация о пяти студентах. Запись имеет вид: фамилия, год рождения, факультет. Вывести данные о студентах по факультетам.
2. Дана информация о пяти школах. Запись имеет вид: номер школы, год, количество выпускников, число поступивших в ВУЗы. Вывести данные об общем количестве выпускников и доле поступивших в ВУЗ.
3. Дана информация о пяти комнатах в общежитии. Запись имеет вид: фамилии, номер комнаты, факультет, площадь. Вывести данные о комнатах по факультетам, а также количество комнат на факультетах.
4. Дана информация о пяти рабочих цеха. Запись имеет вид: фамилия, размер зарплаты, стаж работы. Вывести данные о рабочем с наибольшей зарплатой и наименьшим стажем.
5. Дана информация о четырех вузах. Запись имеет вид: название вуза, число студентов, количество факультетов, количество кафедр. Вывести данные об общем числе студентов, факультетов и кафедр.
6. Дана информация о шести вкладчиках в сберкассы. Запись имеет вид: фамилия, район, социальное положение, величина вклада. Вывести данные о том, сколько среди вкладчиков служащих, рабочих и колхозников.
7. Дана информация о пяти больных. Запись имеет вид: фамилия, возраст, пол, давление. Вывести данные о больных с повышенным давлением (больше 140) .
8. Дана информация о пяти квартирах. Запись имеет вид: фамилия владельца, площадь, число комнат, этаж. Вывести данные о квартирах с площадью меньше 30 кв.м и подсчитать их количество.
9. Дана информация о шести студентах. Запись имеет вид: фамилия, год рождения, место рождения, факультет. Вывести данные о старших по возрасту студентах, предполагая что год рождения может быть одинаков.
10. Дана информация о пяти школах. Запись имеет вид: номер школы, год, количество выпускников, число поступивших в ВУЗы. Вывести данные о школе с самым большим отношением числа поступивших к числу выпускников.
11. Дана информация о пяти комнатах в общежитии. Запись имеет вид: фамилии, номер комнаты, факультет, площадь. Вывести данные о комнате, в которой наименьшая площадь.
12. Дана информация о пяти квартирах. Запись имеет вид: фамилия владельца, площадь, число комнат, этаж. Вывести данные о квартирах с самой большой площадью и самой маленькой.