Файл: Обзор языков программирования высокого уровня (Решение циклических алгоритмов).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 06.04.2023

Просмотров: 105

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

until (условие);

Цикл будет исполняется до тех пор, пока условие является ложным (false). Как только условие примет значение истина (true), выполнение цикла будет прервано. Если условие является истинным изначально, тогда цикл выполнится один раз. Следует обратить внимание на то, что конструкция repeat-until выполняет роль операторных скобок, что позволяет размещать внутри нее более одного оператора.

Рисунок 9 — Цикл с постусловием

Операторы break и continue вызываются внутри циклов. Break выполняет прерывание выполнения цикла и затем передает управление следующему после цикла оператору. Continue осуществляет прерывание текущей итерации цикла, после чего передает управление следующей итерации цикла (repeat-until), или условию, предшествующему этой итерации (for, while-do). Следует отметить, что при использовании оператора break, для выхода из цикла for, счетчик цикла не портится.

Рисунок 10 — Цикл с оператором break Рис. 6 — Цикл с оператором continue

Когда требуется выполнение одного цикла внутри другого, понадобится конструкция с вложенными циклами (см. рисунок 11). Допускается вложение любых типов циклов и любое их количество друг в друге.

Рисунок 11 — Вложенные циклы

Рассмотрев блок-схемы и основные принципы циклических алгоритмов, переходим к созданию программ с их применением.

Ниже представлен пример цикла на языке C:

while(условие){ оператор;}

...продолжение...

или

while(условие){

операторы; ... }

...продолжение...

Пример цикла:

int x;

x = 10;

While (x > 0) { Printf ("x=%d\n", x);

x = x - 1;} printf("Конец.\n");

printf("x стало равно %d.\n", x);/* печатает 0 */

Цикл for ("для каждого") Этот цикл является просто иной записью одного из вариантов цикла while. Он служит обычно для выполнения определенного действия несколько раз, не "пока истинно условие", а "выполнить N-раз". У такого цикла есть "переменная цикла" или "счетчик повторений".

int i;

i = a; /* начальная инициализация */

while(i < b){ тело_цикла;

i += c; /* увеличение счетчика */}

...продолжение...

переписывается в виде

int i;for(i=a; i < b; i += c) тело_цикла;

Тело_цикла будет выполнено для значений i

a

a+c

a+c+c

...

пока i < b

В простейшем случае:

for(i=1; i <= N; i++)

Printf ("i=%d\n", i)

i означает "номер повторения".

Цикл на языке С++

Вычислим сумму всех целых чисел от 0 до 100. Для этого воспользуемся оператором цикла for:


int sum = 0;

int i;

for (i = 1; i <= 100; i = i + 1)

sum = sum + i; //

Циклы в языке Java

Основной оператор цикла в языке Java— оператор while — выглядит так:

while (логВыр) оператор

Циклические алгоритмы в различных языках программирования высокого уровня мы рассмотрели, теперь попробуем записать алгоритм используя цикл while-do в программу — интерпретатор программного кода Borland Turbo Pascal.

Для организации ввода чисел нам понадобится переменная. Объявляем ее, и добавляем в окно программы следующую строку:

var e:integer;

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

m:integer;

В нашем случае цикл while-do требует счетчик. Прописываем новую переменную count. Как можно заметить, всем переменным присваивается тип данных — integer. Данный тип данных является целочисленным и служит для представления целых чисел.

count:integer;

Теперь проинициализируем счетчик. Для этого в программе прописываем:

count:=1;

Результат записанных строк можно наблюдать на рисунке 12.

Рисунок 12 — Введение счетчика в программу.

Создадим переменную, отвечающую за произведение чисел. Пропишем:

m:=1;

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

Для организации цикла while-do вписываем в программу строку:

while count<11 do

Такое значение в качестве граничного результата выбрано для того, чтобы при невыполнении условия цикл больше не выполнялся. Нам нужно, чтобы цикл прекращал выполнение после 10-й итерации.

Организуем операторные скобки, прописывая дополнительные строки:

begin

и окончание циклической составляющей:

end;

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

Чтобы показать пользователю в программе, какие конкретно данные она требует для ввода с клавиатуры, прописываем новую строку:

write('Введите ',count,'-ое значение:');

Результат заданных строк мы видим на рисунке 13.


Рисунок 13 — Ввод данных с клавиатуры

Запросим переменную с клавиатуры. Для чего пропишем:

readln(a);

Далее, увеличиваем счетчик на 1:

count:=count+1;

Добавляем полученное значение к произведению:

m:=m*a;

Организуем вывод на экран строки с результатом. Прописываем:

writeln('Произведение введенных чисел равняется: ',m);

Проверим действие программы, выбрав пункт меню «Run» (либо ctrl+f9).

Текст программы и ее запуск представлен на рисунке 14

Рисунок 14 — Запуск программы

Запускаем программу и вводим любые числа входящие в диапазон от 1 до 5.

Рисунок 15 — Результат выданный программой

Теперь попробуем создать алгоритм с вложенным циклом применив цикл for-to. Для этого запросим с клавиатуры 10 чисел и найдем их среднее арифметическое значение.

Для организации цикла for-to необходимо объявить переменную-счетчик. Объявляем переменную прописав:

var count:integer;

Для запроса целочисленных данных от пользователя нужна переменная типа integer. Для этого сопоставляем переменную «a» c нужным типом:

a:integer;

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

sum:integer;

Переменная, отвечающая за суммирование, должна быть проинициализирована перед использованием, поэтому в качестве значения переменной устанавливаем - 0:

sum:=0;

Рисунок 16 — Ввод элемента для суммирования

Создадим цикл для ввода 10-ти значений, которые буду вводиться пользователем. Пропишем в коде программы:

for count:=1 to 10 do

При использовании в цикле нескольких операций, нужно ставить операторные скобки. Для этого пропишем:

begin

и

end;

Организуем ввод с клавиатуры очередного значения. Прописываем:

readln(a);

В результате наш алгоритм выглядит таким образом, см. рисунок 17.

Рисунок 17 — Ввод нового значениями

Прописываем новую строку, которая будет объяснять пользователю, что конкретно необходимо ввести с клавиатуры на запрос программы:

write (‘Введите ‘, count, ‘-тое значение:’);

Не забываем, что в каждой итерации цикла нужно прибавить новое значение к сумме:

sum:=sum+a;

Теперь осталось вывести результат на экран, прописываем:

writeln (‘Ср. арифметическое = ’, sum/10);

Запускаем как обычно пунктом меню «Run» либо нажатием комбинации клавиш ctrl+f9. Ниже представлен текст полной программы.


Рисунок 18 — Полный текст программы

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

На рисунке ниже представлен результат нахождения среднего арифметического значения на основе введенных пользователем числовых данных. Отметим, что сумму среднего арифметического мы находили путем суммирования всех полученных значений и поделив на их количество (10) .

Рисунок 19 — Результат нахождения среднего арифметического.

Итак, были рассмотрены несколько вариантов написания программы с использованием циклов. Как можно увидеть из примеров, важно относится к написанию программы с должным вниманием, с упором на то, чтобы потенциальный пользователь мог без особых проблем с ней взаимодействовать.

2.2 Работа с массивами

Массивы, как и циклы, - величайшее изобретение программирующего человечества. Массивы приходят на помощь тогда, когда приходится иметь дело с наборами однотипных и однородных данных.

Такой набор, имеющий общее для всех своих элементов имя, и называется массивом. Тип «Массив» является представителем группы структурных типов Паскаля.

Динамическим называется массив, размер которого может меняться во время исполнения программы.

Пример динамического массива на С:

byteArray : Array of Byte

multiArray : Array of Array of string

Пример динамического массива на С++:

float *array1;

int **array2;

array1 = new float[10];

array2 = new int*[16];

for(int i = 0; i < 16; ++i)

array2[i] = new int[8];

delete []array1;

for(int i = 0; i < 16; ++i)

delete []array2[i];

delete []array2;

Гетерогенным называется массив, в разные элементы которого могут быть непосредственно записаны значения, относящиеся к различным типам данных. Массив, хранящий указатели на значения различных типов, не является гетерогенным, так как собственно хранящиеся в массиве данные относятся к единственному типу — типу «указатель». Гетерогенные массивы удобны как универсальная структура для хранения наборов данных произвольных типов

Недостатками для статического (обычного) массива является  отсутствие динамики, невозможность удаления или добавления элемента без сдвига других ; для динамического и/или гетерогенного массива — более низкое (по сравнению с статическим) быстродействие и дополнительные накладные расходы на поддержку динамических свойств и/или гетерогенности.


К достоинству статистического массива относится: лёгкость вычисления адреса элемента по его индексу, для динамического массива одинаковое время доступа ко всем элементам, для гетерогенного массива небольшой размер элементов: они состоят только из информационного поля

Работа с многомерными массивами всегда связана с организацией вложенных циклов. Рассмотрим пример написания такого массива. Создадим новую программу и пропишем там следующее:

program n3-massive;

begin

end.

Далее нужно определить массив, который будет использоваться для хранения 10-ти значений введенных пользователем. Прописываем:

var a:array[1..10] of integer;

Довольно часто обработка массива производится при помощи цикла for. Для использование данного цикла определяем переменную выступающую в роли счетчика:

i:integer;

Ввод данных с клавиатуры будет осуществляться в цикле for. Добавляем его в код программы:

for i:=1 to 10 do

В теле цикла будет присутствовать составной оператор, поэтому вводим:

begin

end;

Рисунок 20 — Составной оператор цикла

Выдаем запрос на ввод очередного элемента. Прописываем:

write (‘Введите’,i,’-ый элемент’);

Запросим i-ый элемент у пользователя. Прописываем:

readln(a[i]);

Для нахождения максимального значения создаем еще одну переменную:

max:integer;

Присваиваем переменной значение - 0:

max:=0;

Организуем цикл для поиска максимального значения. Производим перебор всех элементов массива.

for i:=1 to 10

begin

end;

Рисунок 21 — Цикл для поиска максимального значения.

Проверяем, больше ли очередной элемент массива, чем значение в переменной max? Если это так, то записываем данное значение в max. Для этой операции в алгоритм программы добавляем строку:

if (a[i]>max) then max:=a[i];

Организуем вывод результата работы программы:

write (‘максимальное значение в массиве:’, max);

Рисунок 22 — Полная программа выполняющая поиск максимального значения

Запускаем программу, вводим по запросу 10 чисел, и получаем в качестве результата наибольшее из введенных значений.

Рисунок 23 — Результат работы программы

Для поиска минимального значения создаем новую переменную — min:

min: integer

Затем меняем условие:

if (a[i]<max) then min:=a[i];

После чего код программы примет такой вид: