1. Подсчитать число и сумму положительных, число и произведение отрицательных элементов заданного массива A(N).
2. Дана матрица A(N, M). Найти ее наибольший элемент и номера строки и столбца, на пересечении которых он находится.
3. Заданные векторы X(N) и Y(N) преобразовать по правилу: большее из xi и yi принять в качестве нового значения xi, а меньшее – в качестве нового значения yi.
4. В каждой строке заданной матрицы A(N, M) вычислить сумму, количество и средне арифметическое положительных элементов.
5. Элементы заданного массива b(n) переписать в новый массив a(n) в обратном порядке.
6. Дана матрица A(N, N). Переписать элементы ее главной диагонали в одномерный массив Y(N) и разделить их на максимальный элемент главной диагонали.
7. В заданной матрице A(N, M) поменять местами столбцы с номерами P и Q.
8. Записать подряд в массив A(N) элементы заданного массива B(2N), стоящие на четных местах, а элементы, стоящие на нечетных местах, записать в массив C(N).
9. По трем заданным матрицам A(N, N), B(N, N), C(N, N) построить матрицу Х того же размера, каждый элемент которой определяется по формуле xij=max{ aij, bij, cij}.
10. В заданном массиве A(N) вместо a1 записать наибольший элемент массива, а вместо aN – наименьший элемент массива.
11. В заданном массиве A(N) положительные элементы уменьшить вдвое, а отрицательные заменить на значения их индексов.
12. В заданном массиве X(N,M) все числа различны. В каждой строке выбирается минимальный элемент, затем среди этих чисел выбирается максимальное. Напечатать номер строки массива Х, в которой расположено выбранное число.
13. Для заданной матрицы A(N, N) найти сумму элементов, расположенных в строках с отрицательным элементом на главной диагонали.
14. В заданном массиве A(N) определить число элементов, меньших заданного значения.
15. Даны целочисленные матрицы A(N, M), B(N, M). Подсчитать количество пар (aij, bij) для которых aij< bij.
16. Вывести на печать номера точек, лежащих в круге радиусом R с центром в начале координат. Координаты точек заданы массивами X(N), Y(N).
17. Дана матрица A(N, M). Определить число ненулевых элементов в каждой строке матрицы.
18. Дана матрица A(N, M). Определить отношение числа ненулевых элементов в каждой строке матрицы к общему числу ненулевых элементов в матрице.
19. Из заданной матрицы A(N, M) удалить строку с номером К и столбцы с номерами Р и Q. Матрицу уплотнить.
20. В заданном массиве A(N, M) переставить строки так, чтобы суммы их элементов возрастали.
ЛАБОРАТОРНАЯ РАБОТА №4
Тема: Функции
(4 часа)
Каждая программа на языке С – это совокупность функций. Функции – это фундаментальные логические элементы, служащие для выполнения действий, связанных с решением поставленной задачи.
Определение функции включает:
· Тип значения, возвращаемого функцией (если значение не возвращается, то тип функции – void).
· Число и тип формальных параметров.
· Код (тело) функции, который должен быть выполнен при вызове функции.
Следует различать описание и определение функции. Описание делает возможным доступ к функции (помещает ее в область видимости). Определение задает действия, выполняемые функцией при ее вызове.
Действия, выполняемые при обращении к функции, задает ее тело – составной оператор (блок), обязательным элементом которого служат внешние фигурные скобки {}. Имя функции, тип результата, совокупность параметров и их свойства задают заголовок функции.
Рассмотрим функции, возвращающие значения целого или вещественного типа. Таким образом, типом результата может быть char, int, long, float, double или long double. Могут быть добавлены signed и unsigned. Если тип результата не указан, то по умолчанию предполагается целый тип int. Допустимы функции, не возвращающие результата. В этом случае для них должен быть использован тип void.
Имя неглавной функции (не main) – это произвольно выбираемый идентификатор. Имя функции не должно совпадать со служебными словами и с другими именами в программе.
Структура стандартного определения функции:
тип_результата имя_функции (спецификация_формальных_параметров) {
определения объектов;
исполняемые операторы; }
Спецификация_формальных_параметров – это объединение списка формальных параметров с их спецификацией, т. е. набор идентификаторов с соответствующей спецификацией, отделяемых друг от друга запятыми. Пример функции:
double f(int a, float b, double d)
{ /*тело функции*/}
Принципиально важным оператором тела функции является оператор возврата из функции в точку ее вызова:
return выражение; или return;
Выражение в операторе возврата задает возвращаемое функцией значение. Применение оператора return допустимо и в функции main(). В отличие от «неглавных» функций, откуда возврат выполняется в вызывающую функцию, выполнение оператора return; или return выражение; в функции main() приводит к завершению программы. Управление при таком выходе передается вызывающей программе, например операционной системе, которая может анализировать значение выражения, использованного в операторе возврата.
Примеры:
float fun1(int a, float b){
return a*b-a/b; }
int fun2 (int a, int b, float c){
int i,s;
s=0;
for(i=a; i<b; i+=c)
s+=i;
return s; }
void fun3 (int a, int b, int c){
clrscr();
printf(“\n Результат вызова функции fun3 с входными параметрами a=%d, b=%d, c=%d”,a,b,c);
printf(“\nPress any key…”); getch(); }
Для обращения к функции используется элементарное (первичное) выражение, называемое «вызов функции»:
имя_функции (список фактических параметров)
Значение этого выражения – возвращаемое функцией значение. Список фактических параметров – это список выражений, заменяющих формальные параметры функции. Соответствие между формальными и фактическими параметрами устанавливается по порядку их расположения в списках. Фактические параметры (аргументы) передаются из вызывающей программы в функцию по значению, т. е. вычисляется значение каждого аргумента, и именно оно используется в теле функции вместо заменяемого формального параметра.
Между формальными и фактическими параметрами должно быть соответствие по типам. В случае несоответствия формальных и фактических параметров компилятор автоматически добавляет команды преобразования типов, что возможно только в том случае, если такое приведение типов допустимо.
Так как вызов функции является выражением, то после выполнения операторов тела функции в точку вызова возвращается некоторое значение, тип которого строго соответствует типу, указанному перед именем функции в ее определении (и прототипе). Например, функция
float ft(double x, int n){
if (x<n)return x;
return n;}
всегда возвращает значение типа float.
Особое внимание нужно уделить правилам передачи параметров при обращении к функциям. Синтаксис языка С предусматривает только один способ передачи параметров – передачу по значениям. Это означает, что формальные параметры функции локализованы в ней, т.е. недоступны вне определения функции и никакие операции над формальными параметрами в теле функции не изменяют значений фактических параметров.
Примеры вызова функций:
Z=fun1(5,22.5)+fun1(5,10.01);
Z=fun2(3,5,.1);
fun3(1,2,5);
Тип возвращаемого функцией значения определяется только типом результата, указанным в определении функции перед ее именем. В первом примере переменная Z должна быть описана как float, во втором – как int, в третьем – функция не возвращает никаких значений.
Стандарт языка С предусматривает обязательное описание функции со стандартным заголовком с помощью прототипа:
тип_результата имя_функции (спецификация_формальных_параметров);
Здесь спецификация_формальных_параметров представляет собой список типов и, возможно, имен параметров функции.
Отличия прототипа функции от ее заголовка заключаются в следующем:
- во-первых, прототип всегда заканчивается признаком конца оператора (символ «;»);
- во-вторых, в прототипе могут не указываться имена специфицируемых параметров.
Прототип может не использоваться только в том случае, когда определение функции находится в том же файле, где размещена вызывающая ее программа, и это определение помещено выше вызывающей программы. Прототипы приведенных выше функций могут быть такими:
float fun1 (int, float);
fun2 (int a, int b, float c);
void fun3 (int, int, int);
Контрольные вопросы:
1. Определение функций.
2. Описание функции и тип возвращаемого значения.
3.Формальные и фактические параметры функции.
4. Вызов функции.
5. Передача параметров в функции. Соответствие фактических и формальных параметров функции.
6. Прототип функции.
7. Рекурсивные функции.
Задание на выполнение:
Выполнить задания лабораторной работы №3 в виде функций с входными параметрами, таким образом, чтобы номер выполняемого задания задавался с клавиатуры, а выполнение задание предварялось сообщением типа «Выполняется задание №…». Вывод этого сообщения также оформить в виде функции.
ЛАБОРАТОРНАЯ РАБОТА №5