
семинар 4_ Си 2013.ppt
- Количество слайдов: 10
Задача 1. Вычислить число чётных, нечётных, кратных 3 -м и 4 -м среди первых 1000 членов ряда Фибоначчи. Ряд Фибоначчи: 1, 1, 2, 3, 5. . . Каждый последующий член ряда равен сумме двух предыдущих. Обозначим: k 1 – количество нечётных; k 2 – количество чётных; k 3 – количество кратных 3; k 4 – количество кратных 4 чисел Фибоначчи.
Также можно использовать оператор continue, который передаёт управление на начало следующей итерации ближайшего цикла: if (!(f 3%3)) k 3++; //f 3%3==0 if (f 3%2)//нечетное { k 1++; continue; } k 2++; if (!(f 3%4)) k 4++;
Некоторые синтаксические особенности Си Функцией называется логически завершённый фрагмент кода программы, оформленный по специальным правилам. Использование функций позволяет упростить отладку программ и избежать повторения однотипных фрагментов кода. Программа на Си представляет собой совокупность функций, одна из которых – функция main() – главная – всегда выполняется первой. Остальные функции могут находиться как до главной, так и после неё. При этом если вызываемая функция идёт после вызывающей, то предварительно должен быть указан прототип вызываемой функции – заголовок с добавлением точки с запятой. Си допускает вложенность функций и рекурсивный вызов (вызов функцией самой себя).
Описание функции [<тип результата>] <имя функции>([<список формальных параметров с указанием их типов>]) { <операторы> } Если тип функции не указан, то тип ее результата int. Если тип результата отличен от void, то в теле функции должен быть хотя бы один оператор return <выражение>; Вызов функции [<имя переменной>=]<имя функции>([<список фактических параметров без указания типов>]); Имя переменной не указывается, если тип функции void. Тип переменной должен соответствовать типу результата функции или быть приводимым к нему.
Пример 1. void hello() { printf(“Hello”); } //вызов hello(); void означает, что функция не возвращает значения при помощи return. () означают, что у функции нет входных параметров.
Пример 2. Суммирование двух чисел int sum(int a, int b) { int s ; s=a+b; return (s); } /* тело функции можно заменить на return a+b; */ Оператор return возвращает результат функции. Вызов функции int x, y, s; s=sum (x, y); x, y – фактические параметры. Вызов функции может осуществляться как из выражения, так и самостоятельно: y=2 -sum(x, y); s=sum (x+2, 3) ; sum(x, 10); /* правильно, но бессмысленно*/
Оператор return передаёт в вызывающую функцию только одну величину. Передача параметров в приведенном примере осуществляется по значению. Это значит, что в вызываемой функции для каждого формального параметра выделяется область памяти, куда копируются значения фактических параметров при вызове. В подпрограмме все операции осуществляются только с копиями переменных. Для получения результатов из подпрограммы-функции следует использовать указатели в качестве формальных параметров. Рассмотрим пример – функцию, которая меняет местами два числа.
Вариант 1. до перестановки x=5, y=2 после перестановки x=5, y=2 void f 1(int a, int b) {int t; //для перестановки a b 5 2 t=a; a=b; b=t; } int main() x y 2 5 {int x=5, y=2; printf(“до перестановки x=%d, y=%dn”, x, y); f 1(x, y); printf(“после перестановки x=%d, y=%dn”, x, y); return 0; } При передаче параметров по значению во временной памяти создаются копии параметров. После выхода из функции копии уничтожаются и память освобождается.
Вариант 2. Передача параметров по адресу. Этот вариант правильный – происходит перестановка значений. void f 2(int *a, int *b) { int t; //перестановка значений t=*a; *a=*b; *b=t; } a b 0 x 22 ff 20 x y 5 0 x 22 ff 20 0 x 22 ff 1 c 2 0 x 22 ff 1 c //вызов int main() {int x=5, y=2; printf(“до перестановки x=%d, y=%dn”, x, y); f 2(&x, &y); printf(“после перестановки x=%d, y=%dn”, x, y); return 0; } до перестановки x=5, y=2 после перестановки x=2, y=5
По адресу необходимо передавать • переменные, значения которых изменяются в функции; • переменные, занимающие большой объем памяти – массивы, структуры и т. п.