close

Вход

Забыли?

вход по аккаунту

?

Лаба 6

код для вставкиСкачать
 Лабораторная работа № 6
Программирование с использованием функций
Цель работы: 1) изучить правила описания функций; 2) приобрести навыки использования функций при написании программ на языке C
.
Теоретические сведения
Функции
–
это базовые блоки С, в котор
ых выполняются все операции. Стандартный вид функции следующий:
спецификатор
_типа
имя_функции
(
список параметров
)
{
тело функции
}
Спецификатор_типа определяет тип возвращаемого функцией значения с помощью оператора return
. Это может быть любой допустим
ый тип. Список параметров –
это разделнный запятыми список переменных, получающих значение аргументов при вызове функции. Функция может быть без параметров.
Оператор return
Оператор return
имеет два назначения. Во
-
первых, немедленный выход из функции. Т
о есть он осуществляет выход в вызывающий функцию код. Во
-
вторых, может использоваться для возврата значения.
Выход из функции
Имеется два способа окончания работы функции и передачи управления вызывающему коду. Первый способ предполагает достижение посл
еднего оператора функции, после чего работа функции заканчивается при встрече }. Например, следующая функция выводит на экран строку:
void pr_reverse(char *s)
{
register int t;
for(t=strlen(s)
-
1; t > -
1; t
--
) printf(“%c”,s[t]);
}
После отображения ст
роки функция ничего не делает, поэтому управление передатся вызвавшему е коду.
Тем не менее, не многие функции используют данный метод окончания своего выполнения. Большинство функций используют оператор return
для окончания выполнения с целью возврата з
начения или упрощения кода функции и увеличения его эффективности путм создания нескольких точек выхода. Например, функция, показанная ниже, возвращает или индекс первого появления подстроки, указываемой в s
2, в строке, указываемой в s
1, или -
1, если не обнаружено совпадений:
int find_substr(char *s1, char *s2)
{
register int t;
char *p, *p2;
for(t=0; s1[t]; t++) {
p = &s1[t];
p
2 = s
2;
while(*p2 && *p2==*p) {
p++;
2
p2++;
}
if(!*p2) return t;
}
return –
1;
}
Надо обратить внимание, ка
к два оператора return
упрощают функцию.
Возвращаемые значения
Все функции, кроме функций типа void
, возвращают значения. Данное значение определяется в операторе return
. Если функция не определена как void
и если не указано возвращаемое значение, то воз
вращается случайное значение. Если функция не объявлена как void
, она может использоваться в качестве операнда в любом корректном выражении. Следовательно, каждое из следующих выражений корректно:
x = power(y);
if (max(x, y) > 100) printf(“greater”);
fo
r(ch=getchar(); isdigit(ch); )…;
Тем не менее функция не может стоять с левой стороны оператора присваивания. Оператор типа
swap(x, y) = 100;
неправилен. Компилятор выдаст ошибку.
Если функция объявляется как void
, она не может использоваться в выражени
ях.
Аргументы функции
Если функция использует аргументы, она должна объявлять переменные, получающие значения аргументов. Данные переменные называются формальными параметрами функции. Они ведут себя так же, как и обычные локальные переменные, то есть соз
даются при входе в функцию и уничтожаются при выходе из не. Как показано в примере, объявление параметров происходит после имени функции, но перед открывающей скобкой функции:
/* возвращает 1 в случае, если с является частью строки s
; в противном случае возвращается 0*/
int is_in(char *s, char c)
{
while(*s)
if(*s==c) return 1;
else s++;
return 0;
}
Передача по значению и передача по ссылке
Обычно подпрограммы могут передавать аргументы двумя способами. Первый называется передачей по значению. Д
анный метод копирует содержимое аргумента в формальный параметр подпрограммы. Изменения, сделанные в параметре, не влияют на значение переменной, используемой при вызове.
Передача по ссылке является вторым способом передачи аргументов. В данном методе копи
руется адрес аргумента. В подпрограмме адрес используется для доступа к настоящему аргументу, используемому при вызове. То есть, изменения, сделанные в параметре, влияют на содержимое переменной, используемой при вызове.
Создание передачи по ссылке
3
Хотя,
как правило, передача параметров в С происходит по значению, можно передать параметр по ссылке. Поскольку в данном случае происходит передача адреса аргумента, возможно изменение значения аргумента, находящегося вне функции.
Указатели передаются в функции
, как и обычные значения. Конечно, необходимо объявлять параметры типа указатель. Ниже приведена функция swap
(), обменивающая значение двух целочисленных аргументов:
void swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y =temp;
}
Важно помнит
ь, что swap
() (или любая другая функция, использующая указатели на параметры) должна вызываться с адресами аргументов. Следующая программа демонстрирует правильный способ вызова swap
():
#include <stdio.h>
void swap(int *x, int *y);
int main(void)
{
int x, y;
x = 10;
y = 20;
swap(&x, &y);
printf(“%d %d”, x, y);
return 0;
}
Передача массивов в функции
Когда массив используется в качестве аргумента функции, передается только адрес массива, а не копия всего массива. При вызове функции с именем масс
ива в функцию передается указатель на первый элемент массива. (Надо помнить, что в С имена массивов без индексов –
это указатели на первый элемент массива.) Параметр должен иметь тип, совместимый с указателем. Имеется три способа объявления параметра, пред
назначенного для получения указателя на массив. Во
-
первых, он может быть объявлен как массив, как показано ниже:
#include <stdio.h>
void display(int num[10]);
int main(void)
{
int t[10], i;
for(i=0; i<10; i++) t[i]=i;
display(t);
return 0;
}
void
display(int num[10])
{
int i;
for(i=0; i<10; i++) printf(“%d “, num[i]);
4
}
Хотя параметр num
объявляется как целочисленный массив из десяти элементов, С автоматически преобразует его к указателю на переменную целого типа, поскольку не существует парам
етра, который мог бы принять весь массив.
Следующий способ состоит в объявлении параметра для указания на безразмерный массив, как показано ниже:
void display(int num[])
{
int i;
for(i=0; i<10; i++) printf(“%d “, num[i]);
}
Последний способ, которым м
ожет быть объявлен num
, -
через указатель.
void display(int *num)
{
int i;
for(i=0; i<10; i++) printf(“%d “, num[i]);
}
Контрольные вопросы
1. Каков допустимый уровень вложенности функции в языке С?
2. Как определить функцию? Что такое прототип функ
ции? Всегда ли обязательно объявление прототипов?
3. Как передать информацию функции?
4. Для чего служит оператор return? Обязательно ли его использование?
5
Лабораторное задание
Составить программу с использованием функций для своего варианта задания.
Пор
ядок выполнения лабораторной работы
1.
При домашней подготовке ознакомиться с примерами программирования, рассмотренными в разделе "Теоретические сведения" лабораторной работы.
2.
Нарисовать блочную структуру программы для своего варианта и составить таблицу дос
тупности глобальных имен в функциях, описанных в этой программе.
3.
Составить файл с текстом программы для своего варианта задания.
4.
Отладить программу с помощью средств отладки ИСРП и выполнить ее на компьютере. Результаты показать преподавателю.
5.
Оформить отч
ет и защитить работу.
Требования к отчету
Отчет должен содержать:
1)
конспект теоретической части;
2)
лабораторное задание;
3)
порядок выполнения лабораторной работы;
4)
результаты выполнения программ.
Варианты заданий
Номер варианта
Задание 1,22
Задать значения ве
щественным элементам массивов А = {a
i
| i = 0,1,...,7}, B = {b
j
j = 0,1,...,5}, C = {c
k
k = 0,1,...,9}, D = {d
n
n = 0,1,...,9} и вычислить 2,23
Задать значения целочисленным элементам массивов
А = {a
j
| i = 0, 1,..., 8}, B = {b
j
j = 0, 1,...,5}, C = {c
k
k
=
0,1,...,6} и вычислить 3, 24
Задать значения целоч
исленным элементам массивов
М = {m
i
i = 0, 1,...,7}, L = {l
j
j = 0, 1,...,6}, C = {c
k
k
=
0,
1,...,8} и вычислить
6
4, 25
Задать значения вещественным элементам массивов А = {a
i
鸞ﴬﴠﭢ
j
ﴠﴬﴠﭣ
k
1, 2,..., 10} и вычислить Задать †
значения целочисленным элементам матриц А = {a
ij
}, B = {b
jj
}, где i = 0, 1, 2, 3; j = 0, 1, 2,..., 6 и сформировать массивы С и D, состоящие из максимальных элементов столбцов матриц А и В соответственно.
Задать значения вещественным элементам массивов ﴠﭡ
i
} и B = {b
i
}, где i = 0, 1, 2,...,9 и вычислить элементы массивов X = {x
i
} и Y = {y
i
} по формулам:
†
Задать значения целочисленным элементам матриц ﴠﴠﭭ
ij
} и N = {n
ij
}, где i = 0, 1, 2,..., 7; j = 0, 1, 2,..., 5 и сформировать массивы С и D, состоящие из максимальных элементов строк матриц M и N соответственно.
Задать значения вещественным элементам матриц А = {а
ij
} и Q = {q
ij
}, где i = 0, 1, 2,..., 6; j = 0, 1, 2,
..., 4 и сформировать массивы B и R, состоящие из минимальных элементов столбцов матриц A и Q соответственно.
Задать значения целочисленным элементам матриц ﴠﭰ
ij
} и Q = {q
ij
}, где i = 0, 1, 2,..., 4; j = 0, 1, 2,..., 7 и сформировать массивы
R и T из сумм отрицательных элементов строк матриц P и Q соответственно.
Задать значения вещественным элементам матриц С = {с
ij
} и D = {d
ij
}, где i = 0, 1, 2,..., 5; j = 0, 1, 2,..., 5 и сформировать массивы X и Y из произведений положительных эле
ментов столбцов матриц C и D соответственно.
Задать значения целочисленным элементам матриц ﴠﭷ
ij
} и Z = {z
ij
}, где i = 0, 1, 2; j = 0, 1, 2,..., 7 и сформировать массивы T и S соответственно из элементов матриц W и Z, больших заданного числа
Р.
Задать значения вещественным элементам матриц ﴠﭢ
ij
} и D = {d
ij
}, где i = 0, 1, 2,...,7; j = 0, 1, 2, 3, и сформировать массивы Y и Z, состоящие соответственно из элементов матриц B и D, меньших заданного числа R.
Задать значения веще
ственным элементам матриц Р = {р
ij
}, Q = {q
ij
}, где i = 0, 1, 2,..., 5; j = 0, 1, 2,..., 8 и сформировать массивы R и T, состоящие из минимальных элементов столбцов матриц P и Q соответственно.
Задать значения целочисленным элементам массивов С
= {с
i
} и D = {d
i
}, где i = 0, 1, 2,..., 6 и вычислить элементы массивов S = {s
i
} и T = {t
i
}, где i = 0, 1, 2,..., 6, по формуле:
††††††
††
†
†††
†
Задать значения вещественным элементам масси
вов ﴠﭡ
i
}, B = {b
i
}, C = {c
i
}, где i = 0, 1, 2,...,6 и вычислить 7
16
Задать значения целочисленным элементам матриц ﴠﭡ
ij
}, B = {b
ij
}, где i = 0, 1; j = 0, 1, 2 и вычислить элементы матриц Y = {y
ij
}, Z = {z
ij
} по формулам †
††††
†††
Задать значения целочисленным элементам матриц ﴠﭡ
i
j
}, B = {b
i
j
}, где i = 0, 1, 2,..., 5; j = 0, 1, 2, 3 и вычислить элементы массивов X = {x
i
j
}, Y = {y
i
j
} по формулам:
††††
††
††
†††††
Задать значения вещественным элементам массивов ﴠﭸ
i
| i = 0, 1, 2,..., 5}, Y = {y
j
| j = 0, 1, 2,..., 7}, Z = {z
k
| k = 0, 1, 2,..., 9}, и вычислить
†††
†
если Задать значения вещественным элементам четырех квадратных матриц 5
го порядка и вычислить квадрат той из матриц, у которой наибольшая сумма диагональных элементов.
Задать значения целочисленным элементам матриц А = {а
ij
}, B =
{b
ij
}, где i = 0, 1, 2, 3, 4 j = 0, 1, 2, 3 и вычислить величины ††
0
/x
4
+ x
1
/x
3
+ ... +x
4
/x
0
,
T= y
0
/y
4
+ y
1
/y
3
+ ... + y
4
/y
0
,
где x
i
, y
i
-
максимальные элементы i
х строк матриц А и В соответственно.
Задать целочисленные значения элементам к
вадратных матриц A = {a
ij
}, B = {b
ij
}, C = {c
ij
} и векторам (матрицам
столбцам) X = {x
i
}, Y = {y
i
}, Z = {z
i
}, где i = 0, 1, 2,..., 4, j = 0, 1, 2,..., 4 и вычислить вектор W = AX+BY –
Автор
maximrazor
Документ
Категория
Без категории
Просмотров
270
Размер файла
112 Кб
Теги
лаба
1/--страниц
Пожаловаться на содержимое документа