moved complete sources to separate files

This commit is contained in:
Ivan I. Ovchinnikov 2021-08-23 12:42:16 +03:00
parent e100bef95d
commit aa94b1f738
5 changed files with 82 additions and 85 deletions

Binary file not shown.

View File

@ -143,24 +143,7 @@ for (i = 0; i < significative; i++) {
printf("%d powered by %d is %d \n", base, significative, result); printf("%d powered by %d is %d \n", base, significative, result);
\end{lstlisting} \end{lstlisting}
Конечно, мы можем спросить у пользователя какое число, и в какую степень он хочет возвести, для этого применим уже привычные нам конструкции. Так, весь код программы будет иметь следующий вид: Конечно, мы можем спросить у пользователя какое число, и в какую степень он хочет возвести, для этого применим уже привычные нам конструкции. Так, весь код программы будет иметь следующий вид:
\begin{lstlisting}[language=C,style=CCodeStyle] \lstinputlisting[language=C,style=CCodeStyle]{../sources/power.c}
#include<stdio.h>
int main(int argc, char *argv[]) {
int i;
int base;
int significative;
int result = 1;
printf("Enter base: ");
scanf("%d", &base);
printf("Enter significative: ");
scanf("%d", &significative);
for (i = 0; i < significative; i++) {
result *= base;
}
printf("%d powered by %d is %d \n", base, significative, result);
}
\end{lstlisting}
Запустим нашу программу, введем для базы значение два, для показателя десять. Убедимся, что наша программа работает корректно, $2^{10}=1024$. Запустим нашу программу, введем для базы значение два, для показателя десять. Убедимся, что наша программа работает корректно, $2^{10}=1024$.
\begin{verbatim} \begin{verbatim}
$ ./program $ ./program
@ -201,29 +184,7 @@ if (dividers == 3)
break; break;
\end{lstlisting} \end{lstlisting}
Если количество целочисленных делителей не изменилось, то мы прекратим текущую итерацию цикла при помощи ключевого слова \code{continue}. Как мы знаем, оператор \code{continue} передаст управление в логическую конструкцию цикла, заставив программу проигнорировать все дальнейшие инструкции в рамках текущей итерации. Если количество целочисленных делителей достигнет трёх, что будет означать нецелесообразность дальнейших вычислений, мы разорвем цикл при помощи ключевого слова \code{break}. И полный получившийся код приложения будет такой: Если количество целочисленных делителей не изменилось, то мы прекратим текущую итерацию цикла при помощи ключевого слова \code{continue}. Как мы знаем, оператор \code{continue} передаст управление в логическую конструкцию цикла, заставив программу проигнорировать все дальнейшие инструкции в рамках текущей итерации. Если количество целочисленных делителей достигнет трёх, что будет означать нецелесообразность дальнейших вычислений, мы разорвем цикл при помощи ключевого слова \code{break}. И полный получившийся код приложения будет такой:
\begin{lstlisting}[language=C,style=CCodeStyle] \lstinputlisting[language=C,style=CCodeStyle]{../sources/prime.c}
#include<stdio.h>
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}
Естественно, повторимся, этот код можно оптимизировать по множеству направлений, как минимум, сократив как количество проверок, так и границы проверок (нет смысла проверять числа больше, чем $\sqrt{number}$). Дополнительно можно не проверять чётные числа, например. Естественно, повторимся, этот код можно оптимизировать по множеству направлений, как минимум, сократив как количество проверок, так и границы проверок (нет смысла проверять числа больше, чем $\sqrt{number}$). Дополнительно можно не проверять чётные числа, например.
\begin{verbatim} \begin{verbatim}
$ ./program $ ./program
@ -291,50 +252,7 @@ default:
Оператор \code{switch()\{\}} последовательно проверит входящую переменную на соответствие описанным в кейсах значениях. В случае, если значение совпадёт, будет выполнен блок кода до оператора \code{break;}, если же значение переменной не совпадёт ни с одним из описанный в кейсах, выполнится блок по умолчанию \code{default}. Оператор \code{switch()\{\}} последовательно проверит входящую переменную на соответствие описанным в кейсах значениях. В случае, если значение совпадёт, будет выполнен блок кода до оператора \code{break;}, если же значение переменной не совпадёт ни с одним из описанный в кейсах, выполнится блок по умолчанию \code{default}.
\frm{Важно помнить, что в случае отсутствия внутри \code{case} оператора \code{break;}, программа будет выполнять последующие кейсы, пока не найдёт \code{break;} или пока не закончится конструкция \code{switch()\{\}}, то есть пока не встретится её закрывающая фигурная скобка.} \frm{Важно помнить, что в случае отсутствия внутри \code{case} оператора \code{break;}, программа будет выполнять последующие кейсы, пока не найдёт \code{break;} или пока не закончится конструкция \code{switch()\{\}}, то есть пока не встретится её закрывающая фигурная скобка.}
В кейсах мы опишем присваивание результата в переменную \code{result}, а после выхода из \code{switch()\{\}} - вывод результата в консоль. Кейсом по умолчанию будет вывод пользователю сообщения о невозможности распознать оператор. Так получается, что даже если мы ввели неизвестный оператор, программа попытается вывести в консоль результат, что неприемлемо. Поэтому кейс по умолчанию должен содержать также и оператор \code{return 1;} вынуждающий программу экстренно завершиться с кодом ошибки \code{1}. Получится такой код: В кейсах мы опишем присваивание результата в переменную \code{result}, а после выхода из \code{switch()\{\}} - вывод результата в консоль. Кейсом по умолчанию будет вывод пользователю сообщения о невозможности распознать оператор. Так получается, что даже если мы ввели неизвестный оператор, программа попытается вывести в консоль результат, что неприемлемо. Поэтому кейс по умолчанию должен содержать также и оператор \code{return 1;} вынуждающий программу экстренно завершиться с кодом ошибки \code{1}. Получится такой код:
\begin{lstlisting}[language=C,style=CCodeStyle] \lstinputlisting[language=C,style=CCodeStyle]{../sources/calculator.c}
#include <stdio.h>
int main (int argc, char *argv[]) {
float first;
float second;
float result;
int operator;
printf("Enter first operand: ");
scanf("%f", &first);
printf("/nEnter 1 for (+), 2 for (-), 3 for (*), 4 for (/): ");
scanf("%d", &operator);
if (operator == 4) {
do {
printf("/nEnter second operand: ");
scanf("%f", &second);
} while (second == 0);
} else {
printf("/nEnter second operand: ");
scanf("%f", &second);
}
switch (operator) {
case 1:
result = first + second;
break;
case 2:
result = first - second;
break;
case 3:
result = first * second;
break;
case 4:
result = first / second;
break;
default:
printf("Unknown operator\n");
return 1;
}
printf("Result is: %f \n", result);
return 0;
}
\end{lstlisting}
Запустив описанный нами калькулятор, убедимся что все работает. Сымитируем нерадивого пользователя и несколько раз попробуем ввести при использовании четвёртого оператора цифру ноль, программа естественно не даст нам этого сделать. Запустив описанный нами калькулятор, убедимся что все работает. Сымитируем нерадивого пользователя и несколько раз попробуем ввести при использовании четвёртого оператора цифру ноль, программа естественно не даст нам этого сделать.
\begin{verbatim} \begin{verbatim}
$ ./program $ ./program

42
sources/calculator.c Normal file
View File

@ -0,0 +1,42 @@
#include <stdio.h>
int main (int argc, char *argv[]) {
float first;
float second;
float result;
int operator;
printf("Enter first operand: ");
scanf("%f", &first);
printf("/nEnter 1 for (+), 2 for (-), 3 for (*), 4 for (/): ");
scanf("%d", &operator);
if (operator == 4) {
do {
printf("/nEnter second operand: ");
scanf("%f", &second);
} while (second == 0);
} else {
printf("/nEnter second operand: ");
scanf("%f", &second);
}
switch (operator) {
case 1:
result = first + second;
break;
case 2:
result = first - second;
break;
case 3:
result = first * second;
break;
case 4:
result = first / second;
break;
default:
printf("Unknown operator\n");
return 1;
}
printf("Result is: %f \n", result);
return 0;
}

16
sources/power.c Normal file
View File

@ -0,0 +1,16 @@
#include<stdio.h>
int main(int argc, char *argv[]) {
int i;
int base;
int significative;
int result = 1;
printf("Enter base: ");
scanf("%d", &base);
printf("Enter significative: ");
scanf("%d", &significative);
for (i = 0; i < significative; i++) {
result *= base;
}
printf("%d powered by %d is %d \n", base, significative, result);
}

21
sources/prime.c Normal file
View File

@ -0,0 +1,21 @@
#include<stdio.h>
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"
);
}