Главная > Уроки > Алгоритм и исполнитель

Записывайся на этот курс на Stepike!

Алгоритм и исполнитель

В этом уроке разберём некоторые теоретические понятия, которые формализуют понятие программирования. Заодно точнее сформулируем основную задачу вашего обучения.

Для начала предлагаю вам немного поиграться со следующей детской игрушкой. Пройдите первые пять заданий, возвращайтесь назад и продолжайте чтение урока.

Скриншот игры на code.org

Рис.1 Скриншот игрового поля на code.org

Надеюсь, у вас всё получилось. Теперь на этом примере опишем несколько основных понятий:

  • исполнитель;
  • система команд исполнителя;
  • алгоритм.

В игрушке мы управляем красной птичкой. Задача каждого этапа: добраться птичкой до свиньи. Птичка умеет выполнять определённые команды, например: переместить вперёд, повернуть налево, повернуть направо и др.

Человек, машина или устройство, которые умеют выполнять некоторые команды, называется исполнителем. В этой игрушке, очевидно, исполнитель – птичка. Набор команд, которые понимает и умеет выполнять исполнитель, называют системой команд исполнителя.

Последовательность команд, которую должен выполнить исполнитель для решения задачи, называется алгоритмом.

Необходимо заострить внимание на нескольких моментах.

Важно!

Исполнитель может выполнять только те команды, которые входят в его систему команд.

Это означает, например, что нельзя написать исполнителю-птичке: «Иди к свинье!». Точнее записать можно, но только ничего не произойдёт, т.к. исполнитель таких команд не знает.

Имеющиеся команды вы можете записывать в любом порядке, который посчитаете правильным. Ваша задача как программиста – разделить большую сложную задачу на маленькие отдельные шаги, каждый из которых будет понятен исполнителю. Снова работает принцип «разделяй и властвуй».

Важно!

Исполнитель выполняет точно то, что предписывает ему алгоритм.

Исполнитель-птичка очень доверчивая. Она не подвергает сомнению то, что вы пишете в программе. Если, например, вы забудете развернуть птичку, то она врежется в стенку. Поэтому вы должны следить за всем самостоятельно.

Ваши будущие программы часто будут работать не так, как вы задумывали. Ошибки случаются у всех. Тут важно понимать, что это не компьютер дурак, а вы допустили ошибку в алгоритме. Не уподобляйтесь плохим программистам, у которых во всём всегда виновата программа.

Теперь от наглядного примера перейдём к компьютерным реалиям. Мы пишем программы для компьютера, а значит, компьютер в нашем случае является исполнителем. Система команд – стандартные функции и конструкции языка Си.

В чём состоит основная задача вашего обучения основам программирования? Овладеть навыком алгоритмического мышления. То есть научиться записывать решение различных задач в виде алгоритма для конкретного исполнителя (в нашем случае компьютера).

Итак, подытожим:

Компьютерная программа – алгоритм решения какой-либо задачи, записанный на языке программирования.

Алгоритм – точное описание порядка действий, которые должен выполнить исполнитель для того, чтобы решить задачу.

Исполнитель – человек или некоторое устройство, которое может понимать и выполнять определённый набор команд.

Система команд исполнителя – набор команд, которые понимает и умеет выполнять исполнитель.

Основная задача данного курса – научиться записывать решение различных задач в виде алгоритмов для компьютера.

Сохрани в закладки или поддержи проект.

Практика

Решите предложенные задачи. Для удобства работы сразу переходите в полноэкранный режим


Подборка задач из Единого государственного экзамена на тему Анализ и построение алгоритмов для исполнителей (*.doc) на сайте К.Ю. Полякова. И ответы для самопроверки.
Зеркала на этом сайте: Задачи и ответы (нужный столбец отмечен зелёным цветом)

Дополнительные материалы

  1. Определение алгоритма в этом уроке, конечно, совершенно неформальное. В теоретической информатике существуют строгие определения этого понятия. Для этого, например, вводится такое понятие как Машина Тьюринга. Подробнее об этом можно прочитать на википедии, викиучебнике или посмотреть на степике урок А. Шеня. А на сайте К.Ю. Полякова можно скачать тренажёр Машина Тьюринга.
  2. Тем, кто решает задачи на Stepikе посвящается:

    Как же в проге ошибку исправить?
    Ведь бывает, не ровен же час.
    Нажимаю я кнопку "Отправить"
    И думаю:"Может сейчас?"
    (c) Дроздова Дария Ивановна

Оставить комментарий

Чтобы код красиво отображался на странице заключайте его в теги [code] здесь писать код [/code]

Комментарии

Ната
[/#include <stdio.h>

int main() {
double e4, e5, e6;
e4=1+1/1+(1/2)+(1/6)+(1/24);
e5=e4 + 1/120;
e6=e5+1/(6*5*4*3*2*1);

printf("%.5lfn%.5lfn%.5lfn", e4,e5,e6);
return 0;
}]

Помогите пожалуйста, это 14 задачка, что не так?
KaDeaT
Когда вы пишите, например, 1/120 происходит деление целого на целое. Результат такого деления в этом случае 0. Поэтому у вас получится, что e4=e5=e6.

Внимательно прочитайте 4 урок. Там написано как с этим бороться.
pchristi
Не заметил, что в этой "детской игрушке" нужно пройти всего 5 уровней, в итоге просидел там весь день над решением всевозможных задач)
KaDeaT
Ничего страшного. Это пойдёт на пользу!
Василий
Задание 73:
"Вещественное число х, полученное от деления произведения цифр четных разрядов числа А на произведение цифр нечётных разрядов числа А."
Sample Input:

3421
Sample Output:

1.50

Я думаю, получается, наоборот, деление произведений нечетных на четные...
KaDeaT
Неправильно думаете. =)

Разряды в числе начинают считать с единиц, т.е. с крайней правой цифры числа. При этом счёт начинается с единицы, а не с нуля.

В этом примере в первом разряде записана цифра 1.
Андрей
Задание про количество капель и молекул воды.

Масса одной молекулы воды приблизительно равна 3 times 10^{-23}3?10
?23
грамм. Масса одной капли воды приблизительно 0.050.05 гр. В одном гранёном стакане approx 249.5?249.5 гр. Напишите программу, которая вычисляет количество капель и молекул воды в NN гранёных стаканах воды.

#include <stdio.h>
#include <math.h>
int main() {
int n, drops;
double molecules, massdrop, massglass, massmolecule;

scanf("%d", &n);
massmolecule = 3e-23;
massdrop = 0.05;
massglass = 249.5;

drops = massglass/massdrop;
molecules = massglass/massmolecule;

printf("%d %.3e", drops, molecules);

return 0;
}

Test input:
1

Test output:
4990 8.317e+24


То есть показывает, что я решил задание верно. Но программа такой ответ не принимает. Подскажите пожалуйста, что я должен исправить? У меня ошибка в решении?
Андрей
Задание про количество капель и молекул воды.

Масса одной молекулы воды приблизительно равна 3 times 10^{-23}3?10
?23
грамм. Масса одной капли воды приблизительно 0.050.05 гр. В одном гранёном стакане approx 249.5?249.5 гр. Напишите программу, которая вычисляет количество капель и молекул воды в NN гранёных стаканах воды.

#include <stdio.h>
#include <math.h>
int main() {
int n, drops;
double molecules, massdrop, massglass, massmolecule;

scanf("%d", &n);
massmolecule = 3e-23;
massdrop = 0.05;
massglass = 249.5;

drops = massglass/massdrop;
molecules = massglass/massmolecule;

printf("%d %.3e", drops, molecules);

return 0;
}

Test input:
1

Test output:
4990 8.317e+24


То есть показывает, что я решил задание верно. Но программа такой ответ не принимает. Подскажите пожалуйста, что я должен исправить? У меня ошибка в решении?
ab500
#include <stdio.h>
#include <math.h>
int main() {
int N,out;
N = scanf("%d", &N);
double h2o,drop,out2;
drop = 0.05;
h2o = 3e-23;
out = (N * 249.5)/drop;
out2 = (N * 249.5)/h2o;
printf("%d %.3e",out, out2);

return 0;
}
Failed test #2 of 12. Wrong answer

This is a sample test from the problem statement!

Test input:
3

Correct output:
14970 2.495e+25

Your code output:
4990 8.317e+24

не пойму почему не перемножает количество стаканов
Назар Лукьянов
Задача с экспонентой. Не понимаю, почему выдает ошибку. Ответ правильный, формат вывода тоже корректный

#include <stdio.h>
#include <math.h>

int main() {
int x;
float n1, n2, n3, n4, n5, n6, e1, e2;
n1 = 1.0;
n2 = 2*n1;
n3 = 3*n2;
n4 = 4*n3;
n5 = 5*n4;
n6 = 6*n5;
scanf("%d", &x);
e1 = exp(x);
e2 = 1 + (x/n1) + (pow(x, 2)/n2) + (pow(x, 3)/n3) + (pow(x, 4)/n4) + (pow(x, 5)/n5);
printf("%.6fn%.6f", e1, e2);
return 0;
}