forked from ivan-igorevich/basic-c
moved complete sources to separate files
This commit is contained in:
parent
e100bef95d
commit
aa94b1f738
BIN
build/main.pdf
BIN
build/main.pdf
Binary file not shown.
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
|
@ -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"
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in New Issue