Примечание: матрицы во всех заданиях после ввода элементов, а также результирующие матрицы вывести в стандартном виде
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