functions refactoring in multicolumn draft

This commit is contained in:
ivan-igorevich 2021-08-24 07:22:56 +03:00
parent 9586a31f27
commit bb68a8cd2d
1 changed files with 44 additions and 29 deletions

View File

@ -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.