Uploaded by vu_chundyshko

Алгоритмизация и программирование

advertisement
Алгоритмизация
и
Программирование
КУРС ЛЕКЦИЙ В ПРИМЕРАХ
(PASCAL, C, PYTHON)
НА ПРА В Л Е НИЯ :
1 0 . 03 . 0 1 - И Н Ф О Р М А Ц И О Н Н А Я Б Е З О П АС Н О С Т Ь
0 9 . 03 . 03 - П Р И К Л А Д Н А Я И Н Ф О Р М АТ И К А
А В ТО Р:
ЧУНДЫШКО В.Ю.
К А Н Д И Д АТ Т Е Х Н И Ч Е С К И Х Н А У К ,
ДОЦЕНТ
Понятие алгоритма
АЛГОРИТМ - заранее заданная последовательность
однозначно описанных и трактуемых действий,
позволяющих получить за конечное число шагов решение
задачи, определяемое исходными данными.
Правильно записанный алгоритм должен обладать
определенными свойствами.
Основной характеристикой алгоритма является его
вычислительная сложность.
Основные свойства алгоритма
1. Детерминированность (определённость). Предписываемые алгоритмом действия должны быть однозначно
описаны и не допускать различные трактовки. В каждый момент времени следующее действие должно
однозначно определяться текущим состоянием системы. Таким образом, алгоритм выдаёт один и тот же
результат для одних и тех же исходных данных. (Вероятностные алгоритмы, выполнение которых зависит от
генерируемых в процессе выполнения случайных данных, могут рассматриваться как детерминированные,
если включить правило генерации случайных чисел в состав алгоритма).
2. Конечность (результативность) — при корректно заданных исходных данных алгоритм должен завершать
работу и выдавать результат после выполнения конечного числа действий.
3. Массовость - возможность применять многократно один и тот же алгоритм для любой задачи одного класса
или для решения одной задачи при различных исходных данных.
4. Выполнимость - алгоритм должен содержать описание только таких действий, которые являются
выполнимыми в рамках средств, используемых для решения задачи.
5. Дискретность – алгоритм должен быть представлен как последовательное выполнение простых шагов.
Шагом называется каждое действие алгоритма.
Способы описания алгоритмов
• запись на подмножестве естественного языка,
• на псевдокоде,
• графическое представление (с помощью графсхемы или диаграммы активности),
• текст программы на языке программирования.
Запись на подмножестве естественного языка
Запись алгоритма с использованием ограниченного числа конструкций
естественного языка, исключающая неоднозначную трактовку алгоритма.
Например, запишем на естественном (русском) языке алгоритм решения
задачи вывода на печать большего из двух вводимых значений x и y:
1. Ввести значение x.
2. Ввести значение y.
3. Если x < y, то напечатать "у", иначе напечатать "х".
В этом алгоритме используются алгоритмические структуры - линейная
последовательность операций и ветвление (шаг 3).
Линейная последовательность в данном примере состоит из операций
ввода/вывода данных.
Псевдокод
искусственный неформальный язык,
позволяющий однозначно трактовать
описываемые на нем действия.
Используется для описания алгоритмов.
Псевдокод удобен тем, что позволяет
программисту сосредоточиться на
формулировке алгоритма, не задумываясь
над синтаксическими особенностями
конкретного языка программирования.
Графическое представление (с помощью граф-схемы
или диаграммы активности)
При описании алгоритма с помощью граф-схем (блок-схем) он
изображается геометрическими фигурами (блоками),
связанными по управлению линиями (направлениями потока)
со стрелками. В блоках записывается последовательность
действий.
Данный способ по сравнению с другими способами записи
алгоритма имеет ряд преимуществ. Он нагляден: каждая
операция вычислительного процесса изображается отдельной
геометрической фигурой. Кроме того, графическое
изображение алгоритма наглядно показывает разветвления
путей решения задачи в зависимости от различных условий,
повторение отдельных этапов вычислительного процесса и
другие детали.
Оформление граф-схем должно соответствовать
определенным требованиям. В настоящее время действует
единая система программной документации (ЕСПД), которая
устанавливает правила разработки, оформления программ и
программной документации. В ЕСПД определены и правила
оформления граф-схем алгоритмов.
Граф-схемы примеры
Языки программирования
(классификация и обзор)
Формальная знаковая система, предназначенная для описания структур данных и
алгоритмов в форме, пригодной для дальнейшей компиляции или интерпретации и
исполнения на компьютере.
Язык программирования определяет набор лексических, синтаксических и
семантических правил, используемых при составлении компьютерной программы.
Язык программирования используется для однозначного описания способа решения
той или иной задачи на компьютере. Определяется заданием алфавита, синтаксиса
(грамматики) и семантики. Язык программирования позволяет программисту точно
определить то, на какие события будет реагировать компьютер, как будут храниться и
передаваться данные, а также какие именно действия следует выполнять над этими
данными при различных обстоятельствах. Описание способа решения задачи
(алгоритма) представляет собой совокупность правильных предложений (инструкций)
языка программирования.
Языки программирования
(классификация и обзор)
Все языки программирования делят на:
· языки низкого уровня
· языки высокого уровня.
К языкам низкого уровня относят машинные языки и языки символического кодирования: (Автокод,
Ассемблер). инструкции таких языков – это машинные команды, но записанные мнемоническими
кодами, а в качестве операндов используются не конкретные адреса, а символические имена. Все
языки низкого уровня ориентированы на определенный тип компьютера, т. е. являются машиннозависимыми. Машинно-зависимые языки – это языки, наборы инструкций и изобразительные
средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти
и т.д.).
Языки программирования высокого уровня (Фортран, Алгол, Кобол, Паскаль, Бейсик, Си, Пролог)
машинно-независимы, т.к. они ориентированы не на систему команд той или иной ЭВМ, а на систему
инструкций, ориентированных на решение запись определенных классов алгоритмов. Процесс
программирования на этих языках существенно более эффективен. Однако программы, написанные
на языках высокого уровня, занимают больше памяти и медленнее выполняются, чем программы на
машинных языках.
Язык программирования низкого уровня
Язык программирования, близкий к
программированию непосредственно в
машинных кодах используемого процессора
компьютера (или виртуального процессора,
например как в Java, или .NET).
Языки низкого уровня используют особенности
конкретного семейства процессоров.
Инструкции таких языков представляют собой
машинные команды, обычно записанные
мнемоническими кодами, легче
воспринимаемыми человеком, а в качестве
операндов используются не конкретные адреса,
а символические имена.
Общеизвестный пример низкоуровневого языка
— Ассемблер. Также к языкам низкого уровня
можно причислить MSIL, применяемый в
платформе Microsoft .NET, Форт, Java байт код.
Язык программирования высокого уровня
Язык программирования, инструкции которого ориентированы на краткое описание структур данных и операций
над ними, а не на систему команд конкретного компьютера. Языки высокого уровня позволяют работать со
структурами данных (массивами, записями, строками, файлами и т.д.) Языки высокого уровня не только облегчают
решение сложных задач программирования, но и упрощают переносимость программ с компьютера одного типа на
компьютер другого типа. Использование разнообразных трансляторов и интерпретаторов обеспечивает связь
программ, написанных при помощи языков высокого уровня, с различными операционными системами и
оборудованием, в то время как исходный код этих программ остаётся, в идеале, неизменным.
Независимость высокоуровневых языков от аппаратной реализации компьютера помимо множества плюсов имеет
и минусы. В частности, она не позволяет просто и точно управлять аппаратными средствами компьютера.
Программы, написанные на языках высокого уровня, проще для понимания программистом, но менее эффективны,
чем их аналоги, создаваемые при помощи низкоуровневых языков. Одним из следствий этого стало добавление
поддержки того или иного языка низкого уровня (язык ассемблера) в ряд современных профессиональных
высокоуровневых языков программирования.
Примеры языков программирования высокого уровня: C++, Visual Basic, Java, Python, Ruby, Perl, Pascal. Первым
языком программирования высокого уровня считается компьютерный язык Plankalkul разработанный немецким
инженером Конрадом Цузе ещё в 1942—1946 гг. Однако, широкое применение высокоуровневых языков началось с
возникновением Фортрана и созданием компилятора для этого языка (1957).
https://tiobe.com/tiobe-index/
Индекс TIOBE (TIOBE programming community index) — индекс, оценивающий популярность языков программирования, на основе подсчёта
результатов поисковых запросов, содержащих название языка (запрос вида +"<language> programming"). Для формирования индекса используется
поиск в нескольких наиболее посещаемых (по данным Alexa) порталах: Google, Blogger, Wikipedia, YouTube, Baidu, Yahoo!, Bing, Amazon.
1. Java
2. JavaScript
3. Python
Несмотря на наличие более молодых и
Крайне трудно представить себе webПродолжающий набирать обороты язык
амбициозных товарищей по цеху, Java все
приложение или сайт без JavaScript. На
программирования. На змеином языке
еще держит позиции. Кроме того, что на
сегодняшний день это самый
можно написать всё, что пожелает душа.
нем можно писать что угодно, он является
популярный язык по опросу
Бонусом к тому, он полностью
одним из самых высокооплачиваемых
разработчиков Stack Overflow.
бесплатный и обладает множеством
языков программирования. При желании на
Плюсы:
библиотек. Также сегодня Python часто
Java можно создать и настольное
• огромнейшее сообщество,
преподается в учебных заведениях. И, как
приложение, и игру, и мобильное
множество учебных пособий;
вишенка на торте, нейронные сети, ИИ,
приложение.
• можно запустить на любом
робототехника – для всего этого у Python
Плюсы:
компьютере, был бы браузер;
есть библиотеки.
• кроссплатформенность;
• тоже достаточно просто в освоении.
Плюсы:
• множество фреймворков на любой вкус и
Минусы:
• высокая скорость обработки;
цвет;
• крайне легко сделать ошибку из-за
• множество библиотек;
• относительная простота изучения.
отсутствия проверки при компиляции
• доступность фактически на любой ОС.
Минусы:
и типов;
Минусы:
• не слишком производителен, несмотря
• код можно обфусцировать*, но не
• отсутствие привычных в ООП
на все ухищрения JIT-компилятора;
скрыть
модификаторов доступа;
• фреймворки достаточно громоздки и
• непривычный синтаксис.
сложны.
5. C#
6. PHP
По сути он построен на C и C++, однако более
Конечно, существует просто огромное количество
мягок к разработчикам. На нем так же можно
шуток про PHP разработчиков. Но при этом
писать фактически всё. А с недавних пор и
количество сайтов, написанных с использованием
кроссплатформенные приложения. Синтаксис
PHP все еще велико. Сам язык продолжает
чем-то напоминает Java, потому, зная один из
развиваться и не теряет популярности.
этих языков, вы сможете относительно
Плюсы:
безболезненно изучить второй.
• ходит легенда, что он прост в изучении;
Плюшки:
• достаточно большое сообщество;
• простота в изучении;
• множество учебных материалов.
• широкое сообщество и куча онлайн курсов;
Минусы:
• кроссплатформенность.
• язык крайне узконаправлен;
Минусы:
• некоторые особенности при преобразованиях
• слишком много синтаксического сахара;
типов, формата 333 == ‘333foo’. (И не говорите,
• достаточно просто дизассемблируется, то есть
что это нормально!)
ваше приложение легко можно разобрать на
запчасти и угнать.
*Обфускация - процесс, в результате которого код программы приобретает вид, трудный для анализа
4. C++
Плюсы по-прежнему являются той базой,
которая служит начинающим
программистам. Да, отстрелить себе пару
пальцев или целую ногу на С++ проще
простого. Однако это действительно
очень мощный язык программирования,
позволяющий создать любой
программный продукт. Кроме того, если
вы действительно хорошо знаете этот
язык, у вас есть все шансы найти себя в
Google или Facebook.
Плюсы:
• большое сообщество;
• возможность создавать
производительные и
отказоустойчивые приложения;
• совместимость с железом.
Минусы:
• колоссальная легкость в
отстреливании себе конечностей
(сложность в изучении);
• множество сложных синтаксических
конструкций.
Линейные алгоритмы
Обмен значений численных переменных
Задача:
Пользователь вводит два числа. Одно число присваивается одной переменной, а второе число - другой. Необходимо обменять значения переменных так, чтобы значение первой
переменной оказалось во второй, а второй переменной - в первой.
Алгоритм решения:
Существует два способа обменять значения
переменных.
Способ №1. Используем промежуточную
("буферную«) переменную. Этот способ
подходит для любых типов данных.
Пусть первое введенное значение присвоено
переменной a, второе - b.
Присвоим некой третьей переменной
(например, c) значение хранимое в a. Таким
образом окажется, что одно и то же значение
будет сохранено в двух переменных.
Запишем значение переменной b в a. Таким
образом, мы "затрем" прежнее содержимое a, а
значение b будет храниться в двух переменных.
Однако значение a не потеряно, т.к. заранее
было сохранено в c. Теперь мы можем присвоить
переменной b значение хранимое в c.
В результате данных трех присвоений окажется,
что в переменной a будет значение b, в b значение a.
Способ №2. Путем арифметических операций.
Этот способ подходит только для численных
данных.
Запишем в переменную a сумму значений двух
переменных: a и b.
Переменной b присвоить разность между новым
значением переменной a и значением b. Таким
образом в b окажется старое значение a.
Переменной a присвоить разность между ее
текущим значением и новым значением
переменной b. В результате в a окажется старое
значение b.
Реализация на разных языках программирования
Язык С
Язык Pascal
Язык Python
// Способ №1:
// Способ №1
# Способ №1:
var a,b,c: integer;
begin
readln(a);
readln(b);
writeln('a=',a,'; b=',b);
c := a;
a := b;
b := c;
writeln('a=',a,'; b=',b);
end.
#include <stdio.h>
main() {
int a,b,c;
scanf("%d", &a);
scanf("%d", &b);
printf("a=%d; b=%d\n", a, b);
c = a;
a = b;
b = c;
printf("a=%d; b=%d\n", a, b);
}
a = int(input())
b = int(input())
print('a=%d; b=%d' % (a,b))
c = a
a = b
b = c
print('a=%d; b=%d' % (a,b))
// Способ №2:
// Способ №2
var a,b: integer;
begin
readln(a);
readln(b);
writeln('a=',a,'; b=',b);
a := a + b;
b := a - b;
a := a - b;
writeln('a=',a,'; b=',b);
end.
#include <stdio.h>
main() {
int a,b,c;
scanf("%d", &a);
scanf("%d", &b);
printf("a=%d; b=%d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("a=%d; b=%d\n", a, b);
}
# Способ №2:
a = int(input())
b = int(input())
print('a=%d; b=%d' % (a,b))
a = a + b
b = a - b
a = a - b
print('a=%d; b=%d' % (a,b))
# Способ №3:
a = int(input())
b = int(input())
print('a=%d; b=%d' % (a,b))
a,b = b,a
print('a=%d; b=%d' % (a,b))
Для Python существует и третий способ решения задачи - через кортеж. Выглядит это, например,
так: a,b = b,a. В результате данного действия значение b окажется связанным с a, значение a - с b.
Линейные алгоритмы
Вычисление площадей и периметров фигур
Задача:
Вычислить площадь и периметр:
• треугольника по данным трем сторонам,
• прямоугольника по данным ширине и высоте,
• круга по заданному радиусу.
Алгоритм решения:
Площади и периметры фигур можно найти по следующим формулам:
• Периметр треугольника: P = a + b + c
Площадь треугольника: S = (p(p−a)(p−b)(p−c)), где p = P/2
• Периметр прямоугольника: P = 2(a + b)
Площадь прямоугольника: S = ab
• Периметр круга: P = 2πr
Площадь круга: S = πr2
Длины сторон и радиус вводятся пользователем.
Реализация на разных языках программирования
Язык С
Язык Pascal
var
a,b,c: word;
w,h: word;
r: word;
P,S: real;
begin
readln (a,b,c);
P := (a + b + c) / 2;
S := sqrt(P * (P - a) * (P - b) * (P - c));
writeln('P=',a+b+c,'; S=',S:5:2);
readln(w,h);
writeln('P=',(w+h)*2,'; S=',w*h);
readln(r);
P := 2 * pi * r;
S := pi * r * r;
writeln('P=',P:5:2,'; S=',S:5:2);
end.
#include <stdio.h>
#include <math.h>
#define PI 3.14159
main() {
int a,b,c;
float p,S;
printf("Длины сторон треугольника: ");
scanf("%d%d%d", &a,&b,&c);
p = (a+b+c)/2;
S = sqrt(p*(p-a)*(p-b)*(p-c));
printf("P = %d; S = %.2f\n\n", (a+b+c), S);
printf("Ширина и высота прямоугольника: ");
scanf("%d%d", &a,&b);
printf("P = %d; S = %d\n\n", (a+b)*2, a*b);
printf("Радиус круга: ");
scanf("%d", &a);
printf("P = %.2f; S = %.2f\n", 2*PI*a, PI*pow(a,2));
}
Язык Python
import math
print("Введите длины сторон треугольника: ")
a = int(input("a="))
b = int(input("b="))
c = int(input("c="))
p = (a+b+c)/2
s = math.sqrt(p*(p-a)*(p-b)*(p-c))
print("P=%d; S=%.2f" % (a+b+c, s))
print("Введите длины сторон прямоугольника: ")
a = int(input("a="))
b = int(input("b="))
print("P=%d; S=%d" % ((a+b)*2, a*b))
print("Введите радиус круга: ")
r = int(input("r="))
print("P=%.2f; S=%.2f" % (2*math.pi*r, math.pi*r**2))
Алгоритмы ветвления
Оператор условия
Оператор выбора
Алгоритмы ветвления
Вводятся координаты (x;y) точки и радиус круга (r).
Определить принадлежит ли данная точка кругу, если его центр находится в начале координат.
Точка принадлежит кругу, если находится внутри его или на его окружности.
Из любой точки координатной плоскости можно провести отрезок к началу координат. Если длина этого отрезка больше радиуса круга, то точка лежит за
пределами круга и, следовательно, не принадлежит ему. Если же отрезок, соединяющий точку и начало координат, меньше радиуса круга с центром в начале
координат или равен ему, то точка будет принадлежать кругу.
Отрезок между любой точкой и нулевой точкой (началом координат) является гипотенузой прямоугольного треугольника, катеты которого равны значениям x и
y координаты данной точки.
Таким образом задача сводится к двум действия:
• Нахождение длины отрезка между точкой и началом координат по теореме Пифагора (квадрат длины гипотенузы равен сумме квадратов длин катетов).
• Сравнению полученного значения с радиусом круга.
Реализация на разных языках программирования
Язык Pascal
var x,y,r,h: real;
begin
write('координаты точки: ');
readln(x,y);
write('радиус круга: ');
readln(r);
h := sqrt(x*x + y*y);
if h > r then writeln('Точка не
принадлежит кругу')
else writeln('Точка принадлежит
кругу');
end.
Язык С
#include <stdio.h>
#include <math.h>
main() {
float x,y,r,h;
printf("Координаты точки: ");
scanf("%f%f", &x,&y);
printf("Радиус круга: ");
scanf("%f", &r);
h = sqrt(x*x + y*y);
printf("Гипотенуза равна %.2f. ", h);
if (h > r) printf("Точка не принадлежит
кругу.\n");
else printf("Точка принадлежит
кругу.\n");
}
Язык Python
from math import sqrt
x = float(input("x="))
y = float(input("y="))
r = float(input("r="))
h = sqrt(x**2 + y**2)
print("Расстояние до точки от
начала координат равно %.2f" % h)
if h > r:
print("точка находится за
пределами круга")
else:
print("точка принадлежит
кругу")
Алгоритмы ветвления
По длинам трех отрезков, введенных пользователем, определить возможность существования треугольника, составленного из этих отрезков.
Если такой треугольник существует, то определить, является ли он разносторонним, равнобедренным или равносторонним.
Треугольник существует только тогда, когда сумма длин любых его двух сторон больше третьей стороны. Иначе две стороны просто "укладываются" на третьей.
Треугольник является разносторонним, если все его стороны имеют разную длину; треугольник будет равнобедренным, если любые две его стороны равны между собой, но
отличны от третьей; и треугольник является равносторонним, когда все его стороны равны.
Алгоритм:
Прежде чем выяснять вид треугольника, необходимо удостовериться, что треугольник существует.
Если треугольник существует, то можно сначала проверить на неравенство три его стороны. Если они не равны друг другу, то треугольник разносторонний. Если это не так,
то следующим шагом будет проверка на равенство всех сторон треугольника. Если все стороны равны, делается вывод о том, что треугольник равносторонний. Иначе
остается только один вариант - равнобедренный треугольник.
Язык Python
Язык Pascal
Язык С
#include <stdio.h>
var
a,b,c: word;
begin
write('a='); readln(a);
write('b='); readln(b);
write('c='); readln(c);
if (a+b <= c) or (a+c <= b) or (b+c
<= a) then
writeln('Такой треугольник не
существует.')
else
if (a <> b) and (a <> c) and (b <>
c) then
writeln('Это разносторонний
треугольник.')
else
if (a = b) and (b = c) then
writeln('Это равносторонний
треугольник.')
else
writeln('Это равнобедренный
треугольник.');
end.
main() {
int a,b,c;
scanf("%d%d%d", &a, &b, &c);
if (a+b <= c || a+c <= b || b+c <= a)
printf("Треугольник не существует.\n");
else
if (a != b && a != c && b != c)
printf("Разносторонний\n");
else
if (a == b && b == c)
printf("Равносторонний\n");
else
printf("Равнобедренный\n");
}
a = int(input("a = "))
b = int(input("b = "))
c = int(input("c = "))
if a + b <= c or a + c <= b or b + c <= a:
print("Треугольник не существует")
elif a != b and a != c and b != c:
print("Разносторонний")
elif a == b == c:
print("Равносторонний")
else:
print("Равнобедренный")
Цикл с параметром.
Пример: Задача нахождения факториала введенного числа
Пояснение к задаче и алгоритм решения
Факториалом числа называют произведение всех натуральных чисел до этого числа включительно.
Например, факториал числа 4 равен 1*2*3*4*5 =120.
Записывается факториал так: 5! = 120.
Алгоритм решения:
1. Присвоим переменной, накапливающей произведение натуральных чисел, начальное значение 1.
2. Присвоим переменной-счетчику значение 2.
3. Пока переменная счетчик не достигнет числа, введенного пользователем,
4. умножать значение переменной, в которой накапливается произведение, на значение переменной
счетчика,
5. увеличивать счетчик на 1.
Реализация на разных языках программирования
Язык Pascal
var
n,i: byte;
f: longint;
begin
readln(n);
if n<>0 then f:=1;
for i:=2 to n do f := f*i;
writeln(f);
end.
Язык С
#include <stdio.h>
main() {
unsigned short n,i;
unsigned int f;
scanf("%d",&n);
if (n != 0) f=1;
for (i=2; i<=n; i++) f*=i;
printf("%d\n",f);
}
Язык Python
n = int(input())
f = 0
if n > 0: f = 1
for i in range(2,n+1):
f *= i
print(f)
Цикл с предусловием и оператор выбора
Простейший калькулятор
Написать программу, которая будет складывать, вычитать, умножать или делить два числа. Числа и знак операции вводятся пользователем. После выполнения вычисления программа не должна завершаться, а
должна запрашивать новые данные для вычислений. Завершение программы должно выполняться при вводе символа '0' в качестве знака операции. Если пользователь вводит неверный знак (не '0', '+', '-', '*', '/'),
то программа должна сообщать ему об ошибке и снова запрашивать знак операции. Также сообщать пользователю о невозможности деления на ноль, если он ввел 0 в качестве делителя.
Алгоритм:
Запустить бесконечный цикл.
1.Запросить ввод знака операции.
2.Если был введен '0', то прервать цикл операцией break.
3.Если был введен один из знаков арифметических операций, то в зависимости от того, какой знак был введен, выполнить соответствующее ему арифметическое действие.
При этом при делении проверить не был ли введен ноль. Если это так, то вывести сообщение, иначе выполнить деление.
4.Иначе сообщить о неверно введенном знаке.
Язык Pascal
var
x,y,z: real;
sign: char;
begin
while True do begin
write('sign: '); readln(sign);
if sign = '0' then break;
if sign in ['+','-','*','/'] then begin
write('x='); readln(x);
write('y='); readln(y);
case sign of
'+': begin z := x + y; writeln(z:5:2) end;
'-': begin z := x - y; writeln(z:5:2); end;
'*': begin z := x * y; writeln(z:5:2); end;
'/': if y <> 0 then begin
z := x / y;
writeln(z:5:2)
end
else
writeln('Division by zero!');
end;
end
else writeln('Bad sign!')
end;
end.
Язык С
#include <stdio.h>
main() {
float x,y;
char sign='+';
while (sign != '0') {
printf("Знак: ");
scanf("%c%*c", &sign);
if (sign == '0') { break; }
if (sign == '+' || sign == '-' || sign == '*' || sign == '/') {
printf("x=");
scanf("%f%*c", &x);
printf("y=");
scanf("%f%*c", &y);
switch (sign) {
case '+':
printf("%.2f\n", x+y);
break;
case '-':
printf("%.2f\n", x-y);
break;
case '*':
printf("%.2f\n", x*y);
break;
case '/':
if (y != 0) printf("%.2f\n", x/y);
else printf("Деление на ноль!\n");
}
}
else printf("Неверно указан знак операции\n");
}
}
Язык Python
print("Ноль в качестве знака операции завершит
работу программы")
while True:
s = input("Знак (+,-,*,/): ")
if s == '0': break
if s in ('+','-','*','/'):
x = float(input("x="))
y = float(input("y="))
if s == '+':
print("%.2f" % (x+y))
elif s == '-':
print("%.2f" % (x-y))
elif s == '*':
print("%.2f" % (x*y))
elif s == '/':
if y != 0:
print("%.2f" % (x/y))
else:
print("Деление на ноль!")
else:
print("Неверный знак операции!")
Вложенные циклы
Вложенные циклы
Вывести на экран таблицу умножения (от 1 до 9)
Алгоритм:
Перебрать во внешнем цикле числа от 1 до 9. Для каждого из них перебрать во внутреннем цикле числа от 1 до
9. Во внутреннем цикле выполнять умножение переменных-счетчиков внешнего и внутреннего циклов. Таким
образом на одну итерацию внешнего цикла произойдет девять итераций внутреннего, и сформируется одна
строка таблицы умножения. После каждой строки надо перейти на новую. Это делается во внешнем цикле,
после того как закончится выполняться внутренний.
Для построения таблицы необходимо использовать форматированный вывод, т.е. задавать ширину столбцов,
иначе произойдет сдвиг, т.к. количество цифр в каждой строке различно.
Реализация на разных языках программирования
Язык Pascal
var i,j: byte;
begin
for i:=1 to 9 do
begin
for j:=1 to 9 do
write(i*j:4);
writeln;
end;
end.
Язык С
#include <stdio.h>
main() {
int i,j;
for (i=1; i<10; i++) {
for (j=1; j<10; j++)
printf("%4d", i*j);
printf("\n");
}
}
Язык Python
for i in range(1,10):
for j in range(1,10):
print("%4d" % (i*j), end='')
print()
Вложенные циклы
Найти совершенные числа
Найти все совершенные числа до 10000. Совершенное число - это такое число, которое равно сумме всех своих делителей,
кроме себя самого. Например, число 6 является совершенным, т.к. кроме себя самого делится на числа 1, 2 и 3, которые в
сумме дают 6.
Алгоритм:
В цикле, перебирая натуральные числа до 10000,
1. присвоить переменной, в которой будет накапливаться сумма делителей, 0.
2. В цикле от 1 до половины текущего натурального числа
1. пытаться разделить исследуемое число нацело на счетчик внутреннего цикла.
2. Если делитель делит число нацело, то добавить его к переменной суммы делителей.
3. Если сумма делителей равна исследуемому натуральному числу, то это число совершенно и следует вывести его на экран.
Реализация на разных языках программирования
Язык Pascal
var
i,j,s: word;
begin
for i := 1 to 10000 do
begin
s := 0;
for j:=1 to i div 2 do
if i mod j = 0 then
s := s+j;
if s = i then
write(i,' ');
end;
writeln;
end.
Язык С
#include <stdio.h>
main() {
int i,j,s,l;
for (i=2; i<10000; i++) {
s = 0;
for (j=1; j < i; j++)
if (i%j == 0)
s += j;
if (s == i)
printf("%d\n", i);
}
}
Язык Python
for i in range(2,10000):
s = 0
for j in range(1,i):
if i%j == 0:
s += j
if s == i:
print(i)
Если i поделить на 2, то программа работает неправильно.
Массивы данных
Заполнение и вывод массивов
Все три массива должны иметь одинаковую размерность и тип.
Заполнить один массив случайными
числами, другой - введенными с
клавиатуры числами, в ячейки третьего
записать суммы соответствующих ячеек
первых двух. Вывести содержимое
массивов на экран.
Заполнение массива случайными числами:
Перебирать индекс массива от начала до конца, записывать в каждую его ячейку случайно сгенерированное число.
Заполнение массива значениями с клавиатуры:
Перебирать индекс массива от начала до конца, записывать в каждую его ячейку число, введенное с клавиатуры.
Заполнение массива суммами значений из других массивов:
Перебирать индекс массива от начала до конца, записывать в каждую его ячейку сумму значений из ячеек под таким же индексом из двух первых массивов.
Вывод массива на экран:
Перебирать индекс массива от начала до конца, выводить на экран значение ячейки массива под каждым индексом.
const N = 10;
var a,b,c: array[1..N] of byte;
i: byte;
begin
randomize;
for i:=1 to N do
a[i] := random(100);
write('Введите десять чисел до 100: ');
for i:=1 to N do
read(b[i]);
for i:=1 to N do
c[i] := a[i] + b[i];
for i:=1 to N do
write(a[i]:4);
writeln;
for i:=1 to N do
write(b[i]:4);
writeln;
for i:=1 to N do
write(c[i]:4);
writeln;
end.
Язык Python
Язык С
Язык Pascal
#include <stdio.h>
#define N 10
main () {
int a[N], b[N], c[N], i;
srand(time(NULL));
for (i=0; i<N; i++)
a[i] = rand() % 100;
printf("Введите %d чисел: ", N);
for (i=0; i<N; i++)
scanf("%d", &b[i]);
for (i=0; i<N; i++)
c[i] = a[i] + b[i];
for (i=0; i<N; i++) printf("%5d", a[i]);
printf("\n");
for (i=0; i<N; i++) printf("%5d", b[i]);
printf("\n");
for (i=0; i<N; i++) printf("%5d", c[i]);
printf("\n");
}
# 1-й вариант:
# 2-й вариант:
from random import random
N = 10
a = [0,0,0,0,0,0,0,0,0,0]
b = [0,0,0,0,0,0,0,0,0,0]
c = [0,0,0,0,0,0,0,0,0,0]
for i in range(N):
a[i] = int(random() * 100)
from random import random
N = 10
a = []
b = []
c = []
for i in range(N):
n = int(random() * 100)
a.append(n)
print("Введите числа")
for i in range(N):
b[i] = int(input())
for i in range(N):
c[i] = a[i] + b[i]
print(a)
print(b)
print(c)
print("Введите числа")
for i in range(N):
n = int(input())
b.append(n)
for i in range(N):
n = a[i] + b[i]
c.append(n)
print(a)
print(b)
print(c)
Сумма четных положительных элементов массива
Задача: В массиве, содержащем положительные и отрицательные целые числа, вычислить сумму четных
положительных элементов.
Язык Python
Язык С
Язык Pascal
const N = 10;
var
a: array[1..N] of integer;
i: byte;
sum: integer;
begin
randomize;
for i:=1 to N do a[i]:=random(10)-5;
for i:=1 to N do write(a[i]:4);
writeln;
sum := 0;
for i:=1 to N do begin
if (a[i]>0) and (odd(a[i])=false) then
sum := sum + a[i];
end;
writeln(sum);
end.
#include <stdio.h>
#define N 10
from random import random
N = 10
arr = [0] * N
for i in range(N):
arr[i] = int(random() * 10) - 5
print(arr)
s = 0
for i in range(N):
if arr[i] >= 0 and arr[i]%2 == 0:
s += arr[i]
print(s)
main() {
int a[N];
int i, sum;
srand(time(NULL));
for (i=0; i<N; i++) {
a[i] = rand() % 10 - 5;
printf("%4d", a[i]);
}
printf("\n");
sum = 0;
for (i=0; i<N; i++)
if (a[i] >= 0 && a[i]%2==0)
sum += a[i];
printf("%d\n",sum);
[2, 2, -2, -3, -3, 1, 4, 4, -5, 2]
14
}
2
4
-5
2
-1
-4
-5
-5
3
3
-1
-1
8
4
-5
4
-5
-1
0
1
-2
-5
Количество положительных, отрицательных и равных нулю элементов массива
Сгенерировать 20 случайных целых чисел в диапазоне от -5 до 4, записать их в ячейки массива. Посчитать
сколько среди них положительных, отрицательных и нулевых значений. Вывести на экран элементы массива и
посчитанные количества.
1.Присвоить счетчикам положительных, отрицательных и нулевых чисел значения 0.
2.В цикле
1. генерировать случайное число и записывать его в соответствующую ячейку массива,
2. выводить на экран,
3. сравнивать с нулем и в зависимости от результата увеличить на 1 либо счетчик пложительных чисел, либо отрицательных, либо нулевых.
3.Вывести на экран значения счетчиков.
Язык С
Язык Pascal
const N = 20;
var
a: array[1..N] of integer;
i, pos, neg, zero: byte;
begin
randomize;
pos := 0;
neg := 0;
zero := 0;
for i:=1 to N do begin
a[i] := random(10)-5;
write(a[i]:3);
if a[i] < 0 then
neg := neg + 1
else
if a[i] > 0 then
pos := pos + 1
else
zero := zero + 1;
end;
writeln;
writeln('Положительных: ', pos);
writeln('Отрицательных: ', neg);
writeln('Равных нулю: ', zero);
end.
#include <stdio.h>
#define N 20
main() {
srand(time(NULL));
int a[N],i,neg,pos,zero;
neg = 0;
pos = 0;
zero = 0;
for (i=0; i<N; i++) {
a[i] = rand() % 10 - 5;
printf("%3d", a[i]);
if (a[i] > 0) pos += 1;
else if (a[i] < 0) neg += 1;
else zero += 1;
}
printf("\nПоложительных:
%d\n", pos);
printf("Отрицательных: %d\n", neg);
printf("Равных нулю: %d\n", zero);
}
Язык Python
from random import random
neg = pos = zero = 0
a = []
for i in range(20):
n = int(random() * 10) - 5
a.append(n)
print(n, end=' ')
if n > 0:
pos += 1
elif n < 0:
neg += 1
else:
zero += 1
print("\nПоложительных: ", pos)
print("Отрицательных: ", neg)
print("Равных нулю: ", zero)
-4 3 -4 3 -2 3 4 -2 -4 3 -4 -3 0 1 4 -2 2 0 -3 -4
Положительных: 8
Отрицательных: 10
Равных нулю: 2
Разложить положительные и отрицательные числа по разным массивам
Случайные числа в диапазоне от -5 до 5 разложить по двум массивам: в одни помещать только положительные, во второй - только
отрицательные. Числа, равные нулю, игнорировать. Вывести на экран все сгенерированные случайные числа и элементы обоих массивов.
•Изначально оба массива пусты. Присвоим двум разным переменным-индексам массивов нули.
•В цикле выполняем следующие действия.
•
Генерируем случайное число и выводим его на экран.
•
Если очередное число положительное, то увеличиваем индекс массива на единицу и записываем в соответствующую ячейку это число.
•
Если же генерируется отрицательное число, то увеличиваем индекс массива отрицательных чисел и записываем в массив число.
•В циклах от первого до последнего элемента выводим на экран содержимое массивов положительных и отрицательных чисел. Их переменные-индексы указывают
на количество элементов в массивах.
Язык Pascal
const
N = 21;
var
b,c: array[1..N] of integer;
num: integer;
i, j, k: byte;
begin
randomize;
j := 0;
k := 0;
for i:=1 to N do begin
num := random(11)-5;
write(num:3);
if num > 0 then begin
j := j+1;
b[j] := num;
end
else if num < 0 then begin
k := k + 1;
c[k] := num;
end;
end;
writeln;
for i:=1 to j do write(b[i]:3);
writeln;
for i:=1 to k do write(c[i]:3);
writeln;
end.
Язык Python
Язык С
#include <stdio.h>
#define N 20
main() {
int a[N], b[N], i,j,k, n;
srand(time(NULL));
j = 0;
k = 0;
for (i=0; i<N; i++) {
n = rand()%11 - 5;
printf("%3d", n);
if (n > 0) {
a[j] = n;
j += 1;
} else
if (n < 0) {
b[k] = n;
k += 1;
}
}
printf("\n");
for (i=0; i<j; i++) printf("%3d", a[i]);
printf("\n");
for (i=0; i<k; i++) printf("%3d", b[i]);
printf("\n");
}
from random import random
a = []
b = []
for i in range(20):
n = int(random() * 11) - 5
print(n, end=', ')
if n > 0:
a.append(n)
elif n < 0 :
b.append(n)
print()
print(a)
print(b)
На Питоне данная задача решается проще,
т.к. можно опустить индексы списков и
просто добавлять элементы в конец
списков. Также можно вывести весь список
на экран, вызвав переменную с которой он
связан, а не обращаться к каждому
элементу отдельно.
-3, -5, -2, 2, -5, 5, -3, -3, 5, 2, 0, -4, 5, 1, -5, 2, -1, 5, 3, 4,
[2, 5, 5, 2, 5, 1, 2, 5, 3, 4]
[-3, -5, -2, -5, -3, -3, -4, -5, -1]
Сортировка методом пузырька
Сортировка методом пузырька
Отсортировать массив, заполненный случайными числами, по возрастанию. Для сортировки использовать
метод "пузырька". Вывести на экран массив в исходном и отсортированном виде.
Сортировка методом пузырька заключается в том, что по массиву осуществляются множественные проходы. На каждом проходе очередной элемент сравнивается со следующим за
ним. И если он больше (при сортировке по возрастанию), то элементы массива меняются местами.
Таким образом при первом проходе по массиву при сортировке по возрастанию последним в массиве оказывается самое большое значение. При следующем проходе на
предпоследнем месте окажется максимальное из оставшихся чисел. Сравнивать последнее и предпоследнее числа нет смысла. Поэтому количество просматриваемых элементов
массива на каждом проходе сокращается на 1. Количество проходов равно количеству элементов массива за вычетом единицы, т.к. происходит попарное сравнение.
Язык Pascal
Язык С
Язык Python
const
N = 10;
var
arr: array[1..N] of integer;
i, j, k: integer;
begin
randomize;
for i:=1 to N do begin
arr[i] := random(256);
write (arr[i]:4);
end;
writeln;
for i:=1 to N-1 do
for j:=1 to N-i do
if arr[j] > arr[j+1] then
begin
k := arr[j];
arr[j] := arr[j+1];
arr[j+1] := k
end;
#include <stdio.h>
#define N 10
main() {
int a[N], i, j, b;
srand(time(NULL));
for (i=0; i<N; i++) {
a[i] = rand()%100;
printf("%3d", a[i]);
}
printf("\n");
for (i=0; i < N-1; i++) {
for (j=0; j < N-i-1; j++) {
if (a[j] > a[j+1]) {
b = a[j];
a[j] = a[j+1];
a[j+1] = b;
}
}
}
for (i=0; i<N; i++)
printf("%3d", a[i]);
printf("\n");
for i:=1 to N do
write (arr[i]:4);
writeln;
end.
}
from random import random
a = [0]*10
for i in range(10):
a[i] = int(random()*100)
print(a)
for i in range(9):
for j in range(9-i):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
print(a)
В Питоне при обмене значений переменных можно
обойтись без буферной переменной. Это делается с
помощью присваивания в одном выражении. Такая
возможность существует, т.к. в Python перед
присваиванием в подобных выражениях сначала
формируются кортежи.
Сортировка выбором
Сортировка выбором
Используя сортировку выбором отсортировать элементы массива по возрастанию
Сортировка выбором заключается в поиске в каждом проходе по массиву максимального элемента из оставшихся и перемещении его на последнее место в просматриваемой части массива.
В первом проходе просматривается весь массив, во втором - нет смысла просматривать последний элемент, на третьем - два последних опускаются из области поиска и т.д.
Переменной-счетчику внешнего цикла сначала присваивается индекс последнего элемента массива. Цикл выполняется до тех пор, пока индекс не дойдет до первого элемента (не включая его).
Во вложенном цикле осуществляется поиск максимального элемента. Достаточно сохранить в переменной лишь его индекс, а не значение.
После вложенного цикла происходит обмен последнего элемента просматриваемой части массива (на него указывает счетчик внешнего цикла) на найденный максимум.
Язык Pascal
const n = 10;
var
arr: array[1..n] of byte;
max, id, i, j: byte;
begin
randomize;
for i := 1 to n do begin
arr[i] := random(100);
write(arr[i]:4)
end;
writeln;
Язык С
#include <stdio.h>
#define N 10
main() {
int a[N];
int i, id, j, b;
srand(time(NULL));
for (i=0; i<N; i++) {
a[i] = rand()%100;
printf("%3d", a[i]);
}
printf("\n");
j = N-1;
while (j > 0) {
id = 0;
for (i=1; i<=j; i++)
if (a[i] > a[id]) id = i;
b = a[id];
a[id] = a[j];
a[j] = b;
j -= 1;
}
j := n;
while j > 1 do begin
id := 1;
for i := 2 to j do
if arr[i] > arr[id] then
id := i;
max := arr[id];
arr[id] := arr[j];
arr[j] := max;
j := j - 1
end;
for i := 1 to n do
write(arr[i]:4);
writeln;
end.
for (i=0; i<N; i++) {
printf("%3d", a[i]);
}
printf("\n");
}
Язык Python
from random import random
a = [0]*10
for i in range(10):
a[i] = int(random()*100)
print(a)
j = 9
while j > 0:
m = 0
for i in range(1,j+1):
if a[i] > a[m]:
m = i
a[m], a[j] = a[j], a[m]
j -= 1
print(a)
Вычислить элементы матрицы по формуле
Элементы матрицы NxM вычисляются по формуле A[i,j] = sin(N*i+M*j) при индексации с единицы или по
формуле A[i,j] = sin(N*(i+1)+M*(j+1)) при индексации с нуля. Если полученный таким образом элемент
матрицы отрицателен, то заменить его на 0. Вывести конечную матрицу на экран.
Язык Pascal
const N = 3; M = 4;
var
mtx: array[1..N,1..M] of real;
i,j: byte;
begin
for i:=1 to N do begin
for j:=1 to M do begin
mtx[i,j] := sin(N*i+M*j);
if mtx[i,j] < 0 then
begin
mtx[i,j] := 0;
write(mtx[i,j]:7:0);
end
else
write(mtx[i,j]:7:2);
end;
writeln;
end;
end.
Язык С
#include <stdio.h>
#include <math.h>
#define N 3
#define M 4
main() {
float mtx[N][M];
short i, j;
srand(time(NULL));
Язык Python
from math import sin
N = 3
M = 4
mtx = []
for i in range(N):
a = []
for j in range(M):
a.append(sin(N*(i+1) + M*(j+1)))
mtx.append(a)
for (i=0; i<N; i++) {
for (j=0; j<M; j++) {
mtx[i][j] = sin(N * (i+1) + M * (j+1));
if (mtx[i][j] < 0) {
mtx[i][j] = 0;
printf("%7.0f", mtx[i][j]);
} else printf("%7.2f", mtx[i][j]);
}
printf("\n");
}
for i in range(N):
for j in range(M):
if mtx[i][j] < 0:
mtx[i][j] = 0
print("%7.0f" % mtx[i][j], end='')
else:
print("%7.2f" % mtx[i][j], end='')
print()
}
В Python и Си требуется импортировать библиотеку с
математическими функциями.
Найти столбец матрицы с максимальной суммой элементов
Для решения данной задачи необходимо найти сумму элементов каждого столбца матрицы, после чего сравнить между собой суммы. При этом надо запомнить, какому столбцу принадлежит какая сумма.
Однако не будем сначала искать все суммы, а после выполнять сравнений. Вычислив сумму элементов очередного столбца, сравним ее со значением переменной, предназначенной для хранения
максимальной суммы. Если текущая окажется больше, то запишем ее в указанную переменную. Кроме того, запомним в отдельной переменной номер текущего столбца.
Если сумма следующего столбца окажется больше, то снова перезапишем указанные переменные. Если же меньше или равна, то перезаписывать не будем.
Перебрав таким образом всю матрицу, мы найдем столбец с максимальной суммой элементов. Но только первый. Данный вариант решения задачи приводится в примерах кода ниже.
Если же в матрице содержится несколько столбцов с одинаковой максимальной суммой и все их надо определить, то задача решается немного по-другому. Сначала ищется максимум, при этом номер столбца
запоминать не надо. После этого снова считаются суммы столбцов и при совпадении с ранее найденным максимальным значением номер столбца выводится на экран.
Язык Pascal
const
N = 5; M = 10;
var
a: array[1..N,1..M] of integer;
i, j, col_max: byte;
sum, sum_max: integer;
begin
randomize;
for i:=1 to N do begin
for j:=1 to M do begin
a[i,j] := random(10);
write(a[i,j]:3);
end;
writeln;
end;
Язык С
#include <stdio.h>
#define M 10
#define N 5
main() {
int a[N][M];
int i, j, s, sum, col;
srand(time(NULL));
for (i=0; i<N; i++) {
for (j=0; j<M; j++) {
a[i][j] = rand() % 10;
printf("%5d", a[i][j]);
}
printf("\n");
}
printf("\n");
sum_max := -1;
col_max := 0;
for j:=1 to M do begin
sum := 0;
for i:=1 to N do
sum := sum + a[i,j];
if sum > sum_max then begin
sum_max := sum;
col_max := j;
end;
end;
writeln('Столбец ',col_max,', сумма ',sum_max);
end.
sum = 0;
col = 0;
for (j=0; j<M; j++) {
s = 0;
for (i=0; i<N; i++) s+=a[i][j];
printf("%5d", s);
if (s > sum) {
sum = s;
col = j;
}
}
printf("\n %d \n", col+1);
}
Язык Python
rom random import random
M = 10
N = 5
a = []
for i in range(N):
b = []
for j in range(M):
b.append(int(random()*11))
print("%3d" % b[j], end='')
a.append(b)
print()
for i in range(M):
print(" --", end='')
print()
max_sum = 0
col = 0
for i in range(M):
s = 0
for j in range(N):
s += a[j][i]
print("%3d" % s, end='')
if s > max_sum:
max_sum = s
col = i
print()
print(col+1)
0898222868
71173163 88
8708579089
2616264 658
43 68791217
Столбец 10, сумма 40
Строковый тип данных
Примеры обработки строк
Количество строчных и прописных букв в строке
Посчитать количество строчных (маленьких) и прописных (больших) букв в введенной строке. Учитывать
только английские буквы.
1.Ввести две переменные для подсчета строчных и прописных букв. Присвоить им нули.
2.Перебирая символы строки от первого до последнего (номер последнего определяется длиной строки),
1. если очередной символ - это буква, которая не меньше "a" и не больше "z", то увеличить на 1 переменную-счетчик строчных букв,
2. иначе аналогично проверить принадлежность символа диапазону от "A" до "Z". Если символ ему принадлежит, то увеличить
счетчик прописных букв.
Как видно из алгоритма, небуквенные символы вообще не учитываются. Тот факт, что буквы можно сравнивать связан с тем, что в таблице
кодов символов они идут друг за другом по порядку. Например, буква "a" имеет код на единицу меньше, чем "b", т.е. стоит перед "b".
Язык Pascal
var
#include <stdio.h>
str: string;
i, len, let_b, let_s: byte;
begin
readln(str);
len := length(str);
let_b := 0;
let_s := 0;
for i:=1 to len do
if (str[i] >= 'a') and (str[i] <= 'z') then
let_s := let_s + 1
else
if (str[i] >= 'A') and (str[i] <= 'Z') then
let_b := let_b + 1;
writeln(let_s);
writeln(let_b);
end.
Язык С
main() {
char str[255];
int i,let_b, let_s;
gets(str);
let_s = 0;
let_b = 0;
for (i=0; str[i]!='\0'; i++)
if (str[i] >= 'a' && str[i] <= 'z') let_s += 1;
else
if (str[i] >= 'A' && str[i] <= 'Z') let_b += 1;
printf("%d\n", let_s);
printf("%d\n", let_b);
}
Язык Python
s = input()
let_s = 0
let_b = 0
for i in s:
if 'a' <= i <= 'z':
let_s += 1
else:
if 'A' <= i <= 'Z':
let_b += 1
print(let_s)
print(let_b)
heLLo WOrld tEmp
9
5
Количество слов в строке
Вводится строка, состоящая из слов, разделенных пробелами. Требуется посчитать количество слов в ней.
1.Введем счетчик слов и переменную-флаг, сигнализирующую, находимся ли мы внутри слова или нет.
2.Если очередной символ не пробел, и флаг показывает, что мы не внутри слова, то следует увеличить переменную-счетчик слов и изменить флаг.
3.Иначе если текущий символ пробел, то установить флаг в значение "вне слова". (Когда символ не пробел, и мы находимся внутри слова, то ничего
делать не надо.)
Язык Pascal
var
str: string;
i, count: byte;
flag: boolean;
begin
readln(str);
count := 0;
flag := false;
for i:=1 to length(str) do
begin
if (str[i] <> ' ') and (flag = false) then
begin
count := count + 1;
flag := true;
end
else
if str[i] = ' ' then
flag := false;
end;
writeln(count);
end.
Язык С
Язык Python
#include <stdio.h>
# 1-й вариант ("классический"):
main() {
char str[255];
int i,count,flag;
gets(str);
count = 0;
flag = 0;
for (i=0; str[i]!='\0'; i++)
if (str[i] != ' ' && flag == 0) {
count += 1;
flag = 1;
} else
if (str[i] == ' ') flag = 0;
printf("%d\n", count);
}
s = input()
count = 0
flag = 0
for i in range(len(s)):
if s[i] != ' ' and flag == 0:
count += 1
flag = 1
else:
if s[i] == ' ':
flag = 0
print(count)
# 2-й вариант (через преобразование в список):
s = input()
s = s.split()
l = len(s)
print(l)
one two tree?
3
Метод split() разбивает строку по пробелам (по умолчанию)
или символам, которые передаются как аргументы.
Возвращает список.
Удаление из строки повторяющихся символов
Вводится строка. Требуется удалить из нее повторяющиеся символы и все пробелы. Например, если было
введено "abc cde def", то должно быть выведено "abcdef".
Проще всего задачу решить, если формировать результирующую строку в другой переменной, а не изменять значение переменной, которой
была присвоена введенная строка.
Извлекать каждый символ введенной строки. Если он не встречается в новой строке и не является пробелом, то добавлять его в конец новой
строки.
Язык Pascal
var
s1,s2: string;
c: char;
i: byte;
begin
readln(s1);
s2 := '';
for i:=1 to length(s1) do begin
c := s1[i];
if (pos(c,s2) = 0) and (c <> ' ') then
s2 := s2 + c
end;
writeln(s2);
end.
Язык С
#include <string.h>
main() {
char s[100], s_new[100];
char c, i, j;
gets(s);
j = 0;
for (i=0; i<strlen(s); i++) {
c = s[i];
if (strchr(s_new,c) == NULL && c != ' ') {
s_new[j] = c;
j += 1;
}
}
s_new[j] = '\0';
puts(s_new);
}
Язык Python
s = input()
s_new = ''
for i in range(len(s)):
if s_new.find(s[i]) == -1 and s[i] != ' ':
s_new += s[i]
print(s_new)
abc cde def
abcdef
Язык Python
Комбинированные типы данных
Структуры, записи
Вариант 1. Использование встроенного типа данных complex:
Программа сложения и умножения комплексных чисел
Используя записи, написать программу сложения и умножения двух комплексных чисел.
Комплексные числа состоят из действительной и мнимой частей, обе являются вещественными числами.
Например, 1.5+0.3i. Здесь 1.5 - действительная часть, 0.3 - мнимая часть, i - так называемая мнимая
единица. Части комплексных чисел могут быть отрицательными величинами. Например, -3+1.5i, 2-2i, 10.5-1.25i.
Если даны комплексные числа a и b, где их действительные части обозначены как a.x и b.x, а мнимые как a.y и b.y, то их сумма и произведение находятся по формулам:
a + b = (a.x + b.x) + (a.y + b.y)i
a * b = (a.x * b.x - a.y * b.y) + (a.x * b.y + a.y * b.x)i
В задаче используется структура данных (запись), представляющая комплексное число. Структура
содержит два поля для хранения действительной и мнимой части. Для каждого комплексного числа
используется переменная типа объявленной структуры.
Язык Pascal
type
complex = record
x: real;
y: real;
end;
var
a,b,sum,mult: complex;
begin
writeln('Число A');
write('
действ. часть: '); readln(a.x);
write('
мнимая часть: '); readln(a.y);
writeln('Число B');
write('
действ. часть: '); readln(b.x);
write('
мнимая часть: '); readln(b.y);
sum.x := a.x + b.x;
sum.y := a.y + b.y;
mult.x := a.x * b.x - a.y * b.y;
mult.y := a.y * b.x + a.x * b.y;
writeln('Сумма:
', sum.x:2:2, '+',sum.y:2:2,'j');
writeln('Произв.: ', mult.x:2:2, '+',mult.y:2:2,'j');
end.
Число A
действ. часть: -1.24
мнимая часть: 0.5
Число B
действ. часть: 2.1
мнимая часть: -0.1
Сумма: 0.86+0.40j
Произв.: -2.55+1.17j
Язык С
#include <stdio.h>
struct complex {float x, y;};
main() {
struct complex a, b, sum, mult;
printf("Число A\n");
printf("
действ. часть: "); scanf("%f",&a.x);
printf("
мнимая часть: "); scanf("%f",&a.y);
printf("Число B\n");
printf("
действ. часть: "); scanf("%f",&b.x);
printf("
мнимая часть: "); scanf("%f",&b.y);
sum.x = a.x + b.x;
sum.y = a.y + b.y;
mult.x = a.x * b.x - a.y * b.y;
mult.y = a.y * b.x + a.x * b.y;
printf("Сумма:
%.2f+%.2fj\n", sum.x,sum.y);
printf("Произв.: %.2f+%.2fj\n", mult.x,mult.y);
}
1.
2.
3.
В Python есть встроенный тип данных комплексные числа, который поддерживает
операции сложения и умножения.
Однако можно определить свой тип данных, используя классы. В них также можно
использовать перегрузку операторов, т.е в данном случае переопределить
операции сложения и умножения для своего типа данных.
Также можно использовать словари с двумя ключами - действительной и мнимой
частью комплексного числа.
a = input()
b = input()
a = complex(a)
b = complex(b)
suma = a + b
mult = a * b
print(suma)
print(mult)
# Вариант 2. Определение собственного класса и перегрузка
операторов:
class Cmplx:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, obj):
self.sumax = self.x + obj.x
self.sumay = self.y + obj.y
def __mul__(self, obj):
self.multx = self.x * obj.x - self.y * obj.y
self.multy = self.y * obj.x + self.x * obj.y
x = float(input())
y = float(input())
a = Cmplx(x,y)
x = float(input())
y = float(input())
b = Cmplx(x,y)
a + b
a * b
print('Сумма:
%.2f+%.2fj' % (a.sumax, a.sumay))
print('Произв.: %.2f+%.2fj' % (a.multx, a.multy))
# Вариант 3. Использование словарей:
a = {'x':0, 'y':0}
b = {'x':0, 'y':0}
a['x'] = float(input())
a['y'] = float(input())
b['x'] = float(input())
b['y'] = float(input())
suma = {}
mult = {}
suma['x'] = a['x'] + b['x']
suma['y'] = a['y'] + b['y']
mult['x'] = a['x'] * b['x'] - a['y'] * b['y']
mult['y'] = a['y'] * b['x'] + a['x'] * b['y']
print('Сумма:
%.2f+%.2fj' % (suma['x'], suma['y']))
print('Произв.: %.2f+%.2fj' % (mult['x'], mult['y']))
Определить студентов с баллом выше среднего
Пользователь вводит данные о количестве студентов, их фамилии, имена и балл для
каждого. Программа должна определить средний балл и вывести фамилии и имена
студентов, чей балл выше среднего.
studs = {}
В программе надо создать тип структуры с полями для имени и фамилии студента и балла. После этого создать
массив структур, где каждый элемент массива - это информация об одном студенте.
Алгоритм будет таков:
1.Запросить количество студентов.
2.Выполнить цикл записи информации о студентах в поля структур, находящихся в массиве. При этом
необходимо суммировать баллы в отдельную переменную.
3.Вычислить средний балл, разделив полученную сумму баллов на количество студентов.
4.Выполнить цикл прохода по массиву структур. Если значение поля балла очередного студента больше
найденного среднего, то вывести на экран значение поля его фамилии и имени.
Язык Pascal
type
studs = record
sname: string[50];
eval: integer;
end;
var
arr_studs: array[1..15] of studs;
sum: integer;
average: real;
i,n: byte;
begin
write('Количество студентов: ');
readln(n);
sum := 0;
for i:=1 to n do
with arr_studs[i] do begin
write(i,'-й студент: ');
readln(sname);
write('Балл: ');
readln(eval);
sum := sum + eval;
end;
average := sum / n;
writeln;
writeln('Средний балл:
', average:2:0, '. Студенты с баллом выше
среднего:');
for i:=1 to n do
if arr_studs[i].eval > average then
writeln(arr_studs[i].sname);
end.
Язык С
#include <stdio.h>
struct studs {
char fname[20];
char lname[20];
int point;
};
Язык Python
n = int(input("Количество студентов: "))
s = 0
for i in range(n):
sname = input(str(i+1) + "-й студент: ")
point = int(input("Балл: "))
studs[sname] = point
s += point
avrg = s / n
print("\nСредний балл: %.0f. Студенты с баллом выше среднего:" % avrg)
for i in studs:
if studs[i] > avrg:
Количество студентов: 10
1-й студент: Иванов Иван
print(i)
main() {
struct studs arr[15], *a;
int sum, i, n;
float average;
printf("Количество студентов: ");
scanf("%d",&n);
sum = 0;
for (i=0, a=arr; i<n; i++, a++) {
printf("%d-й студент: ", i+1);
scanf("%s%s",a->fname,a->lname);
printf("Балл: ");
scanf("%d",&(a->point));
sum += a->point;
}
average = sum / n;
printf("Средний балл: %.0f. Студенты с баллом выше среднего:\n", average);
for (i=0, a=arr; i<n; i++, a++)
if (a->point > average)
printf("%s %s\n", a->fname, a->lname);
}
Балл: 63
2-й студент: Илюшин Илья
Балл: 74
3-й студент: Петров Петр
Балл: 32
4-й студент: Митин Дмитрий
Балл: 50
5-й студент: Настина Настя
Балл: 95
6-й студент: Родионов Родион
Балл: 84
7-й студент: Сергеев Сергей
Балл: 68
8-й студент: Женин Женя
Балл: 72
9-й студент: Кристинина Кристина
Балл: 45
10-й студент: Владов Влад
Балл: 75
Средний балл: 66. Студенты с баллом выше среднего:
Илюшин Илья
Настина Настя
Родионов Родион
Сергеев Сергей
Женин Женя
Владов Влад
Вычислить значения функции y=f(x) на заданном диапазоне
Вычислить значения нижеприведенной функции в диапазоне значений x от -10 до 10 включительно с шагом, равным 1.
y = x2 при -5 <= x <= 5;
y = 2*|x|-1 при x < -5;
y = 2x при x > 5.
Вычисление значения функции оформить в виде программной функции, которая принимает значение x, а возвращает полученное значение функции (y).
В основной ветке программы вызывать функцию в цикле от -10 до 10. Текущее значение счетчика цикла передавать в качестве значения функции. Значение,
которое возвращает функция, выводить на экран.
В теле функции в зависимости от значения x вычислять значение y. Для этого следует использовать ветвление. Возвращать в основную ветку значение y.
Язык Pascal
var
Язык С
#include <stdio.h>
i: integer;
int func(int x);
function func(x: integer): integer;
begin
if (x >= -5) and (x < 5) then
func := x * x
else
if x < -5 then
func := 2 * abs(x) - 1
else
func := 2 * x
end;
begin
for i:=-10 to 10 do
write(func(i):4);
writeln;
end.
main() {
int i;
for (i=-10; i<=10; i++)
printf("%d ", func(i));
printf("\n");
}
Язык Python
def func(x):
if -5<=x<=5:
return x*x
elif x < -5:
return 2*abs(x)-1
else:
return 2*x
for i in range(-10,11):
print(func(i), end=' ')
print()
int func(int x) {
int y;
if (x >= -5 && x <= 5) y = x*x;
else if (x < -5) y = 2 * abs(x) - 1;
else y = 2 * x;
return y;
}
19 17 15 13 11 25 16 9 4 1 0 1 4 9 16 25 12 14 16 18 20
Функция, вычисляющая среднее арифметическое элементов массива
Написать функцию, которая вычисляет среднее арифметическое элементов массива, переданного ей в качестве аргумента.
Среднее арифметическое определяется как сумма элементов, деленная на их количество.
Параметром функции является целочисленный массив, возвращает она вещественное число.
В теле функции элементы перебираются в цикле, каждый добавляется к переменной, в которой накапливается сумма. После завершения работы цикла полученная сумма делится на
количество элементов в массиве. Полученное значение возвращается из функции в основную ветку программы. Здесь оно может быть присвоено какой-либо переменной или сразу
выведено на экран.
Язык Pascal
const N = 10;
type
arrtype = array[1..N] of integer;
var
arr: arrtype;
i: byte;
avrg: real;
procedure fill_array(var a: arrtype);
begin
for i:=1 to N do a[i]:=random(50)+1;
end;
function average(a:arrtype):real;
var sum:integer;
begin
sum := 0;
for i:=1 to N do sum:=sum+a[i];
average := sum / n;
end;
begin
randomize;
fill_array(arr);
for i:=1 to N do write(arr[i]:4);
writeln;
avrg := average(arr);
writeln(avrg:3:2);
end.
Язык С
#include <stdio.h>
#define N 10
float average(int arr[]);
main() {
int a[N];
int i, min1, min2, buff;
srand(time(NULL));
for (i=0; i<N; i++) {
a[i] = rand() % 100;
printf("%3d", a[i]);
}
printf("\n %.2f\n", average(a));
}
float average(int arr[]) {
int sum, i;
sum = 0;
for (i=0; i<N; i++) sum += arr[i];
return sum/N;
}
Язык Python
from random import random
N = 10
def average(a):
s = 0
for i in range(N):
s += a[i]
return s/N
arr = [0] * N
for i in range(N):
arr[i] = int(random() * 100)
b = average(arr)
print(arr)
print(b)
В языке Python есть
встроенная функция sum(),
которая возвращает сумму
элементов переданного ей
списка. Поэтому код
s = 0
for i in range(N):
s += a[i]
можно заменить на
s = sum(a)
82 35 2 32 56 55 33 41 99 45
48.00
Download