Работа с последовательностями в Паскаль abc.net
Содержание:
- Пример работы с последовательностью
- Генерация и формирование последовательностей
- Вывод последовательностей
- Решение задач
- Создание и вывод
Пример работы с последовательностью
Последовательности — это абстрактный набор данных, которые можно перебирать.
Последовательностью может быть, например, последовательность чисел:
арифметическая прогрессия: 1 3 5 7 9
или
геометрическая прогрессия: 1 2 4 8 16
Тип последовательности: Sequence of Real
, Sequence of Integer
Наиболее близким типом данных к последовательности является массив.
Рассмотрим стандартный пример работы с числовым рядом, БЕЗ использования последовательности:
Пример: Вывести сумму 10 чисел
Без использования последовательности:
1 2 3 4 5 6 7 8 9 |
begin var s:=0.0; for var i:=1 to 10 do begin var x:=ReadReal; s+=x; end; print(s) end. |
Данный стиль написания программы считается плохим, т.к. основной алгоритм смешивается с вводом (ReadReal
).
Ввод данных необходимо отсоединить от основного алгоритма. Для этого используем последовательность:
// накапливаем последовательность, переменная q хранит ее var q:=ReadSeqReal(10); var s:=0.0; foreach var x in q do s+=x; print(s) end.
Теперь алгоритм находится отдельно от ввода, программа стала более модифицируема.
Остается оформить основной алгоритм в виде функции:
1 2 3 4 5 6 7 8 9 10 |
function Sum(q: sequence of real):real; begin var s:=0.0; foreach var x in q do s+=x; result:=s end; begin print(Sum(ReadSeqReal(10))) end. |
Генерация и формирование последовательностей
Итак, мы рассмотрели, как сформировать последовательность через ввод с клавиатуры:
ReadSeqInteger
ReadSeqReal
Теперь рассмотрим, как генерируются последовательности.
Генераторы последовательностей:
Range(a,b: integer)
: sequence of integer
print(Range(1,10)); // [1,2,3,4,5,6,7,8,9,10]
Range(a,b,step: integer)
: sequence of integer
print(Range(1,10,2)); // [1,3,5,7,9]
Range(c1,c2: char)
: sequence of char
print(Range('a','k')); // [a,b,c,d,e,f,g,h,i,j,k]
Partition(a,b: real; n: integer)
: sequence of real
print(Partition(0.0, 6.0, 4)); // делим поровну на 4 части [0, 1.5, 3, 4.5, 6]
SeqRandomInteger(n: integer[; a,b: integer])
: sequence of integer;
var q:=SeqRandomInteger(5,10,20); print(q); // [12,18,16,14,16]
SeqRandomReal(n: integer[; a,b: real])
: sequence of real;
var q:=SeqRandomReal(3, 1.0, 5.0); print(q); // [4.98996168374548,2.22339218166815,2.81110574389394]
Seq(params a: array of T)
: sequence of T;
foreach var x in Seq (1,3,8) do print(x*x); // 1 9 64
SeqFill(count: integer; x: T)
: sequence of T;
begin var q:=SeqFill(7,5); print(q); // [5,5,5,5,5,5,5] end.
Следует учесть, что последовательности формируются каждый раз, как только с ними организовывается цикл или работает метод:
Вывод последовательностей
Print(delim: string := ' ')
: sequence of T;
var q:=SeqRandomInteger(5,10,20); q.Print('/'); // 16/11/13/10/13
Println(delim: string := ' ')
: sequence of T;
Решение задач
Создание и вывод
Задание seq 1: Создайте целые числа последовательности от -20 до 30 с шагом 3 (Range
).
Пример вывода:
[-20,-17,-14,-11,-8,-5,-2,1,4,7,10,13,16,19,22,25,28]
[файл: seq01.pas
]
Задание seq 2: Создайте целые числа последовательности от -4 до 4 с шагом 2 (Range
)
[файл: seq02.pas
]
Задание seq 3: Создайте N случайных чисел последовательности от -50 до 100
(SeqRandom
)
Пример вывода:
введите n >>15 [-23,13,-27,2,46,-26,10,92,60,-9,75,28,85,7,18]
[файл: seq03.pas
]
Задание seq 4: Создайте N
чисел последовательности, заполненные 5 (SeqFill
)
[файл: seq04.pas
]
Задание seq 5: Создайте N
чисел последовательности c вводом
[файл: seq05.pas
]
Пример: Написать функцию, которая в последовательности ищет количество максимальных элементов
Выполнение:
1 2 3 4 5 6 7 8 9 10 11 |
function findCountMax(a: sequence of integer):integer; begin var k:=a.Max(); foreach var i in a do if i=k then result+=1; end; begin var c:=Seq(1,5,2,10,1,10); println('кол-во макс ',findCountMax(c)); c.Print(); end. |
Задание seq 6: Написать функцию, которая в последовательности ищет сумму элементов
Пример вывода:
1 5 2 10 1 сумма 19
[файл: seq06.pas
]
Задание seq 7: Написать функцию, которая в последовательности ищет среднее арифметическое элементов
Пример вывода:
1 6 2 -10 1 18 среднее арифметическое = 3
[файл: seq07.pas
]
Добрый день, товарищи!
В этой статье мы познакомимся с циклом While, с помощью которого будем находить последовательность чисел. Пока что цикл и его возможности мы подробно разбирать не будем, для этого скоро выйдет отдельная статья, сегодня просто познакомимся и посмотрим, как он работает.
Начнем!
Для начала: наша последовательность будет выглядеть следующим образом:
Эта последовательность довольно интересна и называется “треугольными числами”. Смотрите, каждое число больше другого сначала на 1, потом на 2, потом на 3, 4, 5,6….. и так вплоть до 100. Вот поэтому сегодня мы выведем эти числа с помощью нового для нас цикла While.
1. Переменные
Нам нужны две переменные. Переменная s будет использоваться для нахождения и вывода последовательности, а i будет мотать наш цикл.
На всякий случай присвоим переменной s значение 0, чтобы быть уверенными, что программа будет работать правильно.
2. Синтаксис While
Цикл похож на For, но в этом случае он гораздо более гибкий, потому что шаг цикла задает программист.
В данном примере синтаксиса мы запускаем счетчик до 100. Соответственно у цикла будет 100 витков. Для этого и понадобилась переменная i.
На русском While это “пока”, поэтому прочитать этот код можно таким образом:
Пока (i меньше или равно 100) делать
*какой-то код*
3. Создаем нашу последовательность
Последовательность мы выведем по формуле выше. Соответственно, чем больше значение i тем больше будет наше число в последовательности.
Сразу его и выводим, для наглядности.
Еще одно существенное отличие Вайла от Фора, это то, что шаг цикла нужно задавать самостоятельно, и, чаще всего, в конце цикла.
Так мы и сделаем, прибавив к i единицу.
4. Посмотрим, что получилось
Цикл While вывел нам то, что мы от него ожидали, последовательность, как на картинке выше:
Весь код нашей небольшой программы будет выглядеть так:
Кроме того, создать в каких либо целях остальные последовательности тоже не представляет труда. Вы можете менять значения переменной s как захотите, или как того потребует задание.
Чтож, а сейчас спасибо за просмотр, скоро будет полноценное знакомство с циклом While, заходите на огонек.
Данный человек всегда открыт для обсуждения контента и общения с подписчиками, если найдутся какие либо вопросы то я обязательно постараюсь ответить на них.
По возможности я попросил бы подписаться и оценить публикацию. Сейчас это критически важно для развития канала. Так то!
Доброго вам всем здоровьица в эти трудные времена!
Урок 12. Циклы и числовые последовательности
Просмотров 3.3к. Обновлено 23 ноября 2020
Урок их серии: «Язык программирования Паскаль«.
В предыдущем уроке было показано, как используются операторы цикла в задачах на целочисленную арифметику.
В этом уроке будет описано использование операторов цикла для обработки числовых последовательностей.
Алгоритм для обработки последовательнойтей относится к одному из двух типов: поиск, проверка условий.
Для последовательностей характерно, что в каждый момент времени нам доступен только один элемент последовательности. Поэтому все алгоритмы строятся с учетом однократного последовательного просмотра.
На этом уроке рассмотрим несколько программ на языке программирования Паскаль. В каждой из них одновременно рассматривается только очередной элемент последовательности, без учета остальных (массивы не используются). Алгоритиы для решения таких задач называются алгоритмами с линейным поиском.
Пример 1. Вводится последовательность из N целых чисел. Найти сумму всех отрицательных чисел.
Переменные:
n — количество чисел;
i — переменная цикла;
x — очередное число;
sum — сумма отрицательных чисел.
program primer_1; Var i,n,x,sum:integer; Begin Writeln('Введите длину последовательности N= '); Readln(n); Sum:=0; For I:=1 to n do Begin Writeln('Введите ', i, '-ое число: ’); Readln(x); if x < 0 then sum:=sum+x end; If sum = 0 then writeln('Отрицательных чисел нет.’) Else writeln(‘Сумма отрицательных чисел = ’, sum); End.
Пример 2. Вводится последовательность ненулевых чисел, 0 – конец последовательности. Определить, сколько раз последовательность меняет знак.
Переменные:
old — предыдущее число;
new- обрабатываемое число;
k — количество смен знака ;
i — порядковый номер числа в последовательности.
program primer_2; Var old, new: real; k: integer; Begin Write('Введите первое число: '); Readln(old); Write('Введите второе число: ’); Readln(new); k:=0; i:=2; Repeat If new*old < 0 then k := k+1; old:=new; i:=i+1; Write(‘Введите ',i, '-ое число:’); Readln(new); Until new = 0; If k > 0 then writeln('Последовательность меняет знак ',k,' раз') else writeln('Последовательность не меняет знак ’); end.
В этом уроке было показано, как использовать операторы цикла для обработки числовых последовательностей.
В следующем уроке будет описано использование подпрограмм.
Следующий урок: Подпрограммы в языке Паскаль
Здесь приведены примеры программ и алгоритмов, используемых в курсе Основы программирования для студентов 1 курса ФИИТ мехмата ЮФУ
Редактировать
Последовательности – опредление
Последовательность – набор элементов, которые можно перебирать один за другим.
Последовательность:
- Вообще говоря не хранится в памяти целиком
- Задает алгоритм получения значений одно за другим
- В каждый момент в памяти одно значение
- Цикл по последовательности – цикл foreach
- Массивы и списки – разновидности последовательностей
Пользовательские генераторы последовательностей
function Arithm(n: integer; a0,h: real): sequence of real;
begin
var x := a0;
loop n do
begin
yield x;
x += h;
end;
end;
begin
Arithm(10,11,3).Println;
foreach var x in Arithm(10,11,3) do
Print(x);
end.
Оператор yield возвращает значение из генератора и запоминает место, на котором мы остановились в функции. При вычислении следующего значения код продолжает выполняться с запомненного места.
Генераторы бесконечных последовательностей
function inf: sequence of integer;
begin
while True do
yield 1;
end;
function Take(s: sequence of integer; n: integer): sequence of integer;
begin
var i := 1;
foreach var x in s do
begin
yield x;
i += 1;
if i > n then break;
end;
end;
begin
Take(inf,10).Print;
end.
Простые задачи на последовательности
Задача 1. Симметрична ли последовательность
a.SequenceEqual(a.Reverse);
Задача 2. Все ли элементы последовательности различны
a.Count = a.Distinct.Count;
Задача 3. Совпадают ли первая и вторая половина последовательности длины n
var n2 := n div 2;
a.Take(n2).SequenceEqual(a.Skip(n2));
Задача 4. Найти второй максимум последовательности
a.OrderDescending.Distinct.Skip(1).First;
Задача 5. Функция проверки x на простоту
function IsPrime(x: integer) := (2..x.Sqrt.Round).All(i -> x mod i <> 0);
Задача 6. Количество простых чисел, меньших n
function IsPrime(x: integer) := (2..x.Sqrt.Round).All(i -> x mod i <> 0);
begin
var n := 50000;
(2..n).Where(IsPrime).Count.Println;
MillisecondsDelta.Println;
end.
Задача 7. Табулирование значений функции
PartitionPoints(1,2,10).PrintLines(x -> $'{x,4:f1} {Sin(x),7:f4}');
0 / 0 / 0 Регистрация: 27.12.2013 Сообщений: 21 |
|
1 |
|
Задача: найти последовательность чисел27.12.2013, 19:54. Показов 1730. Ответов 2
Добрый вечер форумчане, помогите пожалуйста решить задачку. Задание выполнить с использованием любого цикла:
0 |
newyork7776 351 / 344 / 279 Регистрация: 21.05.2013 Сообщений: 1,312 |
||||||||||||
28.12.2013, 01:34 |
2 |
|||||||||||
Сообщение было отмечено Bamp как решение Решениеfor to do Кликните здесь для просмотра всего текста
while do Кликните здесь для просмотра всего текста
repeat until Кликните здесь для просмотра всего текста
1 |
0 / 0 / 0 Регистрация: 27.12.2013 Сообщений: 21 |
|
29.12.2013, 16:14 [ТС] |
3 |
Спасибо!
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
29.12.2013, 16:14 |
Помогаю со студенческими работами здесь Найти наименьшее из четных чисел, входящих в последовательность A[1]-1, A[1], A[2], …, A[n] и количество нечетных чисел Вводится последовательность из 15 целых чисел. Найти количество четных чисел Вводится произвольная последовательность целых чисел,заканчивающаяся нулем. Найти среднее арифметическое четных чисел С клавиатуры вводится последовательность дробных чисел(окончание ввода-0) найти сумму всех чисел,количество отрицательных и количество положительных. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 3 |