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