forked from ivan-igorevich/basic-c
functions refactoring in multicolumn draft
This commit is contained in:
parent
9586a31f27
commit
bb68a8cd2d
73
main.tex
73
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.
|
||||
|
|
Loading…
Reference in New Issue