diff --git a/main.tex b/main.tex index aa3cbb3..412e633 100644 --- a/main.tex +++ b/main.tex @@ -89,38 +89,53 @@ x = 110 $ \end{verbatim} Как уже было сказано, параметры - это переменные, которые хранят в себе некоторые начальные значения вызова функции. Параметризация позволяет использовать одни и те же функции с разными исходными данными. Приглядимся повнимательнее к хорошо знакомой нам функции \code{printf();}. Строка, которую мы пишем в круглых скобках в двойных кавычках - это аргумент функции. То есть мы знаем, что функция умеет выводить на экран строки, как именно - нам нет дела, а какие именно строки - мы указываем в качестве аргумента. Функция \code{printf();} примечательна еще и тем, что она может принимать в себя нефиксированное количество аргументов. Описание работы таких функций, а также их написание выходит далеко за пределы основ языка, нам важно помнить что мы можем это использовать. В аргументе функции \code{printf()} мы можем написать заполнитель соответствующего типа и, например, вызвать нашу функцию \code{sum}. -\subsection{Оформление функций. Рефакторинг кода} -Теперь мы без проблем можем оформить уже существующие у нас программы в виде функций. Например, оформим в виде функции программу проверки простоты числа. Для этого опишем функцию которая возвращает целое число, назовем ее \code{isPrime()}, в качестве параметра она будет принимать целое число, назовем его \code{number}. Найдем в предыдущих разделах (стр. \hyperref[code:isPrime]{\pageref{code:isPrime}}) программу определения простоты числа и скопируем в тело функции. -% Внесем небольшие правки, уберем вывод т.к. это проверяющая функция, вывод оставим для основной части. И допишем если делителей 2 то число простое, возвращаем 1. Если же делителей больше – число не простое, возвращаем 0. -% Такой вывод можно записать и другим способом, return (d == 2) – это выражение в случае истины вернет 1 в случае лжи 0. -% Можно воспользоваться тернарным оператором, т.е. написать -% return (d == 2) ? 1 : 0 – если условие в скобках истинно вернется 1, ложно – 0.; -% Выйти из функции мы можем на любом этапе ее выполнения, например если делителей уже 3, то мы можем вернуть 0. +\subsection{Оформление функций. Понятие рефакторинга} +Теперь мы без проблем можем оформить уже существующие у нас программы в виде функций. Например, оформим в виде функции программу проверки простоты числа. Для этого опишем функцию которая возвращает целое число, назовем ее \code{isPrime()}, в качестве параметра она будет принимать целое число, назовем его \code{number}. Найдем в предыдущих разделах (стр. \hyperref[code:isPrime]{\pageref{code:isPrime}}) программу определения простоты числа и скопируем в тело функции. Внесем небольшие правки, уберем вывод так как это будет, можно сказать, классическая проверяющая функция, вывод оставим для функции \code{int main (int argc, char *argv[])}, пусть о наличии у нас терминала <<знает>> только она. +\frm{Такой процесс, перенос участков кода между функциями, выделение участков кода в функции, синтаксические, стилистические и другие улучшения, называетя \textbf{рефакторингом}. Обычно, рефакторингом занимаются сами разработчики в свободное от основной деятельности времени, в периоды код ревью или по необходимости улучшить читаемость/повторяемость собственного кода.} +Следовательно, допишем условия: если делителей два, то число простое, возвращаем \code{ИСТИНУ}, то есть любое ненулевое значение, в нашем примере - единицу. Если же делителей больше – число не простое, возвращаем \code{ЛОЖЬ}, в нашем случае, это ноль. Такой вывод можно записать и другим способом, \code{return (d == 2)} – это выражение в случае истины вернет единицу в случае лжи ноль. Или можно воспользоваться тернарным оператором, то есть, написать \code{return (d == 2) ? 1 : 0}: если условие в скобках истинно вернется единица, ложно – ноль. Также важно, что выйти из функции мы можем на любом этапе ее выполнения, например если делителей уже три, то нам нужно не завершать цикл, а вернуть \code{ЛОЖЬ} из функции. +\begin{multicols}{2} +\begin{lstlisting}[language=C,style=CCodeStyle] +int isPrime(int number){ + int d = 0, i = 1; + while(i <= number){ + if(number % i++ ==0) + d++; + else + continue; + if (d == 3) return 0; + } + //if (d == 2) return 1; + //else return 0; + //return (d == 2) ? 1 : 0; + return (d == 2) - -% int isPrime(int number){ -% int d = 0, i = 1; -% while(i <= number){ -% if(number % i++ ==0) -% d++; -% else -% continue; -% if (d == 3) break; -% } -% //if (d == 2) return 1; -% //else return 0; - -% return (d == 2) - - -% //return (d == 2) ? 1 : 0; - -% } - - -% if (d == 3) return 0; +} +\end{lstlisting} +\columnbreak +\begin{lstlisting}[language=C,style=CCodeStyle] +int main(int argc, char *argv[]) { + int number; + int dividers = 0, i = 1; + printf("Enter number: "); + scanf("%d", &number); + while (i <= number) { + if (number++ % i == 0) { + dividers++; + } else { + continue; + } + if (dividers == 3) + break; + } + printf("Number %d is%s prime", + number, + (dividers == 2) ? "" : " not" + ); +} +\end{lstlisting} +\end{multicols} % Немного подправим вывод, внесем в него вызов функции isPrime и объявим переменную int num, которую будем передавать в качестве аргумента в функцию isPrime.