Document 150491

advertisement
ВОЛЖСКИЙ ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ (ФИЛИАЛ)
ФЕДЕРАЛЬНОГО ГОСУДАРСТВЕННОГО БЮДЖЕТНОГО ОБРАЗОВАТЕЛЬНОГО
УЧРЕЖДЕНИЯ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
КАФЕДРА «ИНФОРМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ»
Д.Н. Лясин, О.Ф. Абрамова
Программирование циклических процессов на языке С++
Методические указания
Волгоград 2015
УДК 004.056
Рецензент:
канд. тех. наук доцент В. И. Капля
Издается по решению редакционно-издательского совета
Волгоградского государственного технического университета
МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ЛАБОРАТОРНЫМ РАБОТАМ: Программирование
циклических процессов на языке С++/ Сост. Лясин Д.Н., Фадеева М.В..; Волгоград. гос.
техн. ун-т. - Волгоград, 2015, – 16 с.
Содержатся сведения, необходимые для изучения основ программирования циклических процессов на языке С++: рассмотрены операторы циклов
языка, особенности их применения, приведены примеры решения типовых
задач. Приведены варианты заданий к лабораторным работам.
Предназначены для студентов, обучающихся по направлениям
230100 "Информатика и вычислительная техника" и 231000 "Программная
инженерия" всех форм обучения в рамках курса «Основы программирования»
Ил. 5. Библиогр.: - 6 назв.
Волгоградский государственный технический университет, 2015
 Волжский политехнический институт
Лабораторная работа №4
Программирование циклических процессов на языке С++
Цель: Изучение алгоритмов работы циклов и принципы их программирования на языке С++.
1. Основные сведения
Цикл — разновидность управляющей конструкции в высокоуровневых
языках программирования, предназначенная для организации многократного
исполнения набора инструкций. Основная цель циклов – сократить размер
текста программы, когда в ходе вычислений требуется многократное выполнение некоторых инструкций, например обработка нескольких результатов
опыта по одному и тому же алгоритму или перебор записей в базе данных
для поиска по заданному условию. Циклический процесс можно реализовать
без использования специализированных операторов, применяя условный
оператор if и оператор безусловного перехода goto. Однако такой подход является неэффективным, поскольку использование оператора goto нарушает
иерархическую структуру программы и затрудняет понимание написанного
кода. В языке С++ для реализации циклических вычислительных процессов
используются операторы while, do while и for.
Оператор цикла while называется циклом с предусловием и имеет следующий формат:
while (выражение) оператор
В качестве выражения допускается использовать любое выражение языка Си, а в качестве тела любой оператор, в том числе пустой или составной.
Схема выполнения оператора while следующая (рис.1):
1. Вычисляется выражение.
2. Если выражение ложно, то выполнение оператора while заканчивается
и выполняется следующий по порядку оператор. Если выражение истинно, то
выполняется тело оператора while.
3. Процесс повторяется с пункта 1.
≠0
=0
выражение
оператор
Рис. 1. Схема алгоритма работы цикла while
В операторе while вначале происходит проверка условия продолжения
цикла предваряет непосредственно циклические вычисления, поэтому опера3
тор while удобно использовать в ситуациях, когда тело оператора не всегда
нужно выполнять, а также когда заранее неизвестно количество необходимых для выполнения шагов цикла.
Рассмотрим пример, в котором необходимо просуммировать вводимые
с клавиатуры числа до тех пор, пока не будет введено нулевое значение.
int Sum=0, x; //в Sum будем накапливать сумму, в x хранить
//очередное введенное число
cin>>x;
//вводим первое число
while (x!=0) //пока x не равно нулю, можно короче: while(x)
{
Sum+=x;
//складываем очередное введенное число с суммой
cin>>x; //ввод следующего числа
}
cout<<Sum; //вывод посчитанной суммы
Если первое введенное пользователем число будет равно нулю, тело
цикла не будет выполнено ни разу. Количество шагов цикла заранее неизвестно и зависит от ввода пользователя.
Оператор do while
Оператор цикла do while называется оператором цикла с постусловием
и используется в тех случаях, когда необходимо выполнить тело цикла хотя
бы один раз. Формат оператора имеет следующий вид:
do {тело} while (выражение);
Схема выполнения оператора do while (рис.2):
1. Выполняется тело цикла (которое может быть составным оператором).
2. Вычисляется выражение.
3. Если выражение ложно, то выполнение оператора do while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполнение оператора продолжается с пункта 1.
оператор
≠0
выражение
=0
Рис. 2. Схема алгоритма работы цикла do while
Рассмотрим вариант решения предыдущей задачи с суммированием
вводимых с клавиатуры чисел с использованием цикла do while.
int Sum=0, x; //в Sum будем накапливать сумму, в x хранить
//очередное введенное число
do
4
{
cin>>x;
Sum+=x;
//ввод числа
//складываем очередное введенное число с суммой
}
while (x!=0) //пока x не равно нулю, можно короче: while(x)
cout<<Sum; //вывод посчитанной суммы
В данном примере тело цикла обязательно выполнится, даже если первым введенным пользователем числом будет ноль, поскольку условие продолжения цикла проверяется после него. Однако это приведет лишь к сложению текущего значения суммы с нулем и не исказит результата.
Операторы while и do while могут быть вложенными.
Пример:
int i,j,k;
...
i=0; j=0; k=0;
do { i++;
j--;
while (a[k] < i) k++;
}
while (i<30 && j<-30);
Оператор for представляет самые мощные средства организации цикла
в языке Си++. Он имеет следующий формат:
for ( выражение 1 ; выражение 2 ; выражение 3 ) оператор
Выражение 1 предназначено для выполнения предвычислений, вычисляется однократно до начала цикла. Обычно используется для установления
начальных значений переменных, управляющих циклом. Выражение 2 - это
выражение, определяющее условие, при котором тело цикла будет выполняться. Выражение 3 – итерационное, вычисляется после выполнения каждого шага цикла. Обычно определяет изменение переменных, управляющих
циклом.
Схема выполнения оператора for (рис.3):
1. Вычисляется выражение 1.
2. Вычисляется выражение 2.
3. Если значения выражения 2 отлично от нуля (истина), выполняется
оператор тела цикла (если необходимо циклически выполнить совокупность
операторов, они оформляются в составной оператор), вычисляется выражение 3 и осуществляется переход к пункту 2, если выражение 2 равно нулю
(ложь), то управление передается на оператор, следующий за оператором for.
5
выражение 1
≠0
=0
выражение 2
оператор
выражение 3
Рис. 3. Схема алгоритма работы цикла for
Оператор цикла вида for (выражение 1; выражение 2; выражение 3)
тело цикла ; может быть заменен оператором while следующим образом:
выражение 1;
while (выражение 2)
{ тело цикла;
выражение 3;
}
Существенно то, что проверка условия всегда выполняется в начале
цикла. Это значит, что тело цикла может ни разу не выполниться, если
условие выполнения сразу будет ложным и цикл for может заменит цикл
while. Рассмотренный пример суммирования чисел с использованием цикла
for можно переписать следующим образом:
int x, Sum;
cin >> x;
for (Sum = 0;
(
Sum += x;
cin >> x;
}
cout << Sum;
//вводим первое число
x!=0; )
//складываем очередное введенное число с суммой
//ввод следующего числа
//вывод посчитанной суммы
Чаще всего оператор for используется в циклах, для которых можно заранее вычислить количество выполняемых шагов. Рассмотрим пример.
int i,b;
for (i=1; i<10; i++)
cout<<i<<”^2=”<<i*i<<endl;;
В этом примере вычисляются и выводятся на экран квадраты чисел от
1 до 9. Переменная i выполняет роль счетчика цикла, начальное значение ей
присваивается в выражении 1 оператора for, модификация (увеличение на 1)
производится в выражении 3, а проверка на достижения предельного значения – в выражении 2. Таким образом, строка вида
for (cчетчик_цикла=начальное_значение;
6
счетчик_цикла<предельное_значение+1; счетчик_цикла+=шаг_изменения)
является канонической для языка С++ и используется очень часто. Необходимо также отметить, что в подобной интерпретации (цикл со счетчиком)
оператор for не накладывает никаких ограничений на переменную цикла: она
может быть, например, вещественного типа, шаг ее изменение может быть
отличен от 1 или -1.
Некоторые варианты использования оператора for повышают его гибкость за счет возможности использования нескольких переменных, управляющих циклом.
Пример:
int main()
{ int top, bot;
char string[100], temp;
for ( top=0, bot=100 ; top < bot ; top++, bot--)
{ temp=string[top];
string[bot]=temp;
}
return 0;
}
В этом примере, реализующем запись строки символов в обратном порядке, для управления циклом используются две переменные top и bot. Отметим, что на месте выражение 1 и выражение 3 здесь используются несколько
выражений, записанных через запятую, и выполняемых последовательно.
Наличие в операторе for модифицирующего выражения 3 позволяет в
некоторых случаях сосредоточить в нем все необходимые действия. В следующем примере вычисляется факториал введенного с клавиатуры числа.
unsigned int n, f;
cin >> n;
for (unsigned int i=2, f=1; i<=n; f*=i++);
cout << f;
В последнем примере оператор тела цикла вырожден в пустой оператор, поскольку все необходимые для вычисления действия (вычисление факториала последовательным перемножением чисел, модификация переменной
цикла) сосредоточены в модифицирующем выражении оператора for.
Еще один пример с использованием пустого оператора в теле цикла for.
for (i=0; t[i]<=10 ; i++) ;
В данном примере переменная цикла i принимает значение номера первого элемента массива t, значение которого больше 10.
Другим вариантом использования оператора for является бесконечный
цикл. Для организации такого цикла можно использовать пустое условное
выражение, а для выхода из цикла обычно используют дополнительное условие и оператор break. Обобщенный шаблон подобного цикла:
for (;;)
{ ...
if (условие окончания цикла)
...
}
break;
7
Оператор break предназначен для принудительного завершения охватывающего оператора. Оператор break обеспечивает прекращение выполнения самого внутреннего из объединяющих его операторов switch, do while,
for, while. После выполнения оператора break управление передается оператору, следующему за прерванным.
Оператор continue используется только внутри операторов цикла, но в
отличие от break прерывает выполнение текущей итерации цикла, передавая
управление на начало следующей итерации цикла, при этом выражение 3
оператора for будет выполнено.
Рассмотрим пример работы этих операторов на основе программы, вычисляющей произведение 20 введенных с клавиатуры чисел.
int pr=1, val, i;
for (i=1; i<=20; i++)
//перемножаем 20 чисел
{
cin >> val;
//вводим очередное число
if (val==1) continue; //если ввели единицу – к следующему числу
if (val==0)
//если ввели 0
{pr=0;break;}
//обнуляем произведение, выходим из цикла
pr*=val;
//домножаем текущее произведение на введенное число
}
cout << pr;
//выводим полученное произведение
Если пользователь вводит единицу, то она не изменяет значения произведение и можно перейти к следующему числу. Если же введен ноль, то произведение будет равно нулю независимо от оставшихся чисел и цикл можно
завершить.
Необходимо отметить, что операторы break и continue относятся к
группе операторов передачи управления, и поэтому их использование многими экспертами в области программирования считается неприемлемым, как
нарушающее принципы структурного программирования, согласно которых
у оператора цикла должна быть одна точка выхода. Например, предыдущий
пример с перемножением чисел можно переписать без использования этих
операторов, сохраняя ту же функциональность реакции на нулевые и единичные элементы:
int pr=1, val, i;
for (i=1; i<=20 && pr!=0; i++) //перемножаем 20 чисел, если
//произведение стало равно 0 –
//прекращаем цикл
{
cin >> val;
//вводим очередное число
if (val!=1)
//если ввели единицу – к следующему числу
pr*=val;
//домножаем текущее произведение на введенное число
}
cout << pr;
//выводим полученное произведение
8
Контрольные вопросы
1. Какие операторы цикла языка Си++ вам известны?
2. Чем отличаются операторы цикла с пред- и постусловием?
3. Чем оператор цикла for отличается от оператора while?
4. Как сформулировать несколько условий продолжения/выхода из цикла?
5. Как принудительно завершить работу циклического оператора?
6. *Как можно организовать итерационный вычислительный процесс, не
используя операторов цикла?
9
Порядок выполнения работы
1. Ознакомьтесь с теоретическими основами программирования циклических процессов на языке С++ в настоящих указаниях и конспектах лекций.
2. Получите вариант задания у преподавателя.
3. Составьте алгоритм решения задачи согласно варианту задания, оформите его в графической форме.
4. Используя разработанный алгоритм, напишите программу .
5. Отладьте разработанную программу и покажите результаты работы
программы преподавателю.
6. Составьте отчет по лабораторной работе.
7. Отчитайте работу преподавателю.
Содержание отчета
Отчет по лабораторной работе должен содержать следующие сведения:
- название и цель работы;
- вариант задания;
- графическую схему алгоритма решения задачи;
- листинг разработанной программы с комментариями;
- результаты работы программы.
Пример оформления отчета:
Вариант№11 (пример)
1. Дано n целых чисел. Найти количество отрицательных значений и количество тех значений, которые больше первого из n чисел. Числа по
одному вводятся с клавиатуры.
#include <math.h>
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP (1251);
int x=0,c=0,n=4,first,otric=0,bol=0,i;
system(“cls”);
cout<<"Введите 1-oe число: ";
cin>>first;
if (first<0) otric++;
for (i=2;i<=n;i++)
{
cout<<"Введите "<<i<<"-oe число: ";
cin>>x;
if (x<0) otric++;
10
if (x>first) bol++;
}
cout<<"Количество отрицательных чисел:"<<otric<<"\n";
cout<<"Количество чисел, больших первого: "<<bol;
system(“pause”);
return 0;
}
11
Начало
otric=0; bol=0
Ввод:first
first<0
otric++
i=2; i<n
Ввод: х
х<0
otric++
x>first
bol++
i++
Вывод:
bol,
otric
Конец
Рис. 4. Блок-схема алгоритма решения задачи 11.1
12
Дана последовательность чисел. Определить количество чисел, две последних цифры которых кратны 3.
Начало
count=0
Ввод числа x
c=x%100
n=c/10
i=c%10
x>9 and n mod
3=0 and
i mod 3=0
да
count++
нет
да
x!=0
нет
Кол-во искомых чисел: count
Конец
Рис. 5. Блок-схема алгоритма решения задачи 11.2
#include <math.h>
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP (1251);
int x,c,n,i,count=0;
system(“cls”);
do
{
cout<<"Введите число: ";
cin>>x;
c=x%100;
n=c/10;
i=c%10;
if (x>9 && n%3==0 && i%3==0) count++;
}
13
while(x!=0);
cout<<"Количество искомых чисел: "<<count;
system(“puase”);
return 0;
}
Варианты заданий
Вариант№1
1. Даны n целых чисел. Определить, являются ли эти числа равными или
все они не меньше заданного А.
2. Дана последовательность чисел. Определить порядковый номер числа,
которое содержит наибольшее количество цифр.
Вариант№2
1. Дана последовательность целых чисел, конец которой обозначен
нулем. Определить, кратны ли числа последовательности своему порядковому номеру.
2. Дано число. Разделить цифры, стоящие на нечётных местах на 3. Если
не делятся без остатка, то оставить без изменения.
Вариант№3
1. Дано n целых чисел. Найти количество отрицательных значений и количество тех значений, которые больше первого из n чисел. Числа по
одному вводятся с клавиатуры.
2. Дана последовательность чисел. Посчитать сумму цифр всех отрицательных чисел.
Вариант№4
1. 1. Дана последовательность целых чисел, конец которой обозначен нулем. Определить, все ли числа являются положительными
или положительные числа чередуются с отрицательными.
2. Дана последовательность чисел. Посчитать сумму цифр всех чётных
чисел.
14
Вариант№5
1. Дана последовательность целых чисел. Известно, что среди них несколько раз встречаются
два подряд идущих нуля. Определить,
сколько раз встречается эта ситуация.
2. Дана последовательность чисел. Посчитать произведение цифр последнего числа, кратного 5.
Вариант№6
1. Дана последовательность целых чисел до 0. Найти сумму целых чисел,
которые одновременно больше 20, меньше 100 и кратны 3.
2. Дана последовательность чисел. Посчитать произведение цифр первого
числа, кратного 3.
Вариант№7
1. Дана последовательность n целых чисел, где n- задано. Определить
,все ли числа попадают в заданный интервал [ x, y ].
2. Дано число. Посчитать сумму цифр, стоящих на чётных местах числа.
Вариант№8
1. Дана последовательность вещественных чисел. Определить, образуют
ли они возрастающую последовательность.
2. Дано число. Посчитать произведение тех цифр числа, которые кратны
3.
Вариант№9
1. Дана последовательность целых чисел. Определить количество чисел,
кратных разности текущего и предыдущего чисел.
2. Дано число. Посчитать разность между первым и последним числом.
Вариант№10
1. Дана последовательность из 100 целых чисел. Определить количество
чисел в наиболее длинной подпоследовательности из подряд идущих
нулей.
2. Дано число. Разделить каждую цифру числа на его порядковый номер.
Полученное число напечатать.
15
Литература
1. Б. Керниган, Д.Ритчи. Ясык программирования Си. М.: Вильямс, 2015
г., - 304с.
2. Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы. Построение
и анализ. М: Вильямс, 2011 г. – 1296с.
3. Г. Шилдт. С++ Базовый курс. М: Вильямс, 2014 г. – 624с.
4. Страуструп Б. Язык программирования С++. Специальное издание.
СПб.: Бином, 2011 г., 1136с.
5. Фомин С.С. Подбельский В.В. Курс программирования на языке Си:
М.:ДМК Пресс, 2013 г. – 384с.
6. Седжвик Р. Алгоритмы на Си++. М.: Вильямс, 2011 г., - 2056с.
16
Учебное издание
Дмитрий Николаевич Лясин
Марина Викторовна Фадеева
Программирования циклических процессов на языке Си++
Методические указания
План электронных изданий 2015 г. Поз. №
Подписано на « Выпуск в свет» . .15. Уч-изд. л.
На магнитоносителе.
.
Волгоградский государственный технический университет.
400131, г. Волгоград, пр. Ленина, 28, корп. 1.
17
Download