Компания ALT Linux
Опубликован: 07.03.2015 | Доступ: свободный | Студентов: 2135 / 487 | Длительность: 24:14:00
Лекция 3:

Операторы управления

3.5 Решение задач с использованием циклов

Рассмотрим использование циклических операторов на конкретных примерах.

Задача 3.10. Написать программу решения квадратного уравнения ax^2+bx+c =0. Предусмотреть проверку ввода данных.

Решение квадратного уравнения было подробно рассмотрено в задаче 3.4. Однако алгоритм, изображённый на рис. 3.15, не будет работать, если пользователь введёт нулевое значение в переменную a (при попытке вычислить корни уравнения произойдёт деление на ноль). Чтобы избежать подобной ошибки нужно в программе предусмотреть проверку входных данных, например, так как показано на рис. 3.24. Вводится значение переменной a, если оно равно нулю, то ввод повторяется, иначе следует алгоритм вычисления корней квадратного уравнения. Здесь применяется цикл с постусловием, так как значение переменной необходимо ввести, а затем проверить его на равенство нулю.

Блок-схема проверки ввода данных

Рис. 3.24. Блок-схема проверки ввода данных

Программа решения задачи:

#include <iostream>
#include <math.h>
using namespace std;
int main ( )
{
	float a, b, c, d, x1, x2;
	//Проверка ввода значения коэффициента a .
	do //Выполнять тело цикла пока а равно нулю
	{
	cout<<" a = "; cin >>a;
	}
	while ( a==0);
	cout<<" b = "; cin >>b;
	cout<<" c = "; cin >>c;
	d=b* b-4*a*c;
	if (d<0) cout<<" Нет вещественных корней";
	else
	{
	x1=( -b+sqrt (d) ) /2/a;
	x2=( -b- sqrt (d) ) /(2 *a );
	cout<<" X1 = "<<x1<<" \t X2 = "<<x2<<" \n ";
	}
	return 0;
}
		

Задача 3.11. Найти наибольший общий делитель (НОД) натуральных чисел A и B.

Входные данные: A и B.

Выходные данные: A — НОД.

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

Таблица 3.2. Поиск НОД для чисел A = 25 и B = 15.
Шаг A B
Исходные данные 25 15
Шаг 1 10 15
Шаг 2 10 5
Шаг 3, НОД 5 5

В блок–схеме, представленной на рис. 3.25, для решения поставленной задачи используется цикл с предусловием, то есть тело цикла повторяется до тех пор, пока A не равно B. Следовательно, при создании программы воспользуемся циклом while:

#include <iostream>
using namespace std;
int main ( )
{
	unsigned int a, b;
	cout<<" A = "; cin>>a;
	cout<<" B = "; cin>>b;
	//Если числа не равны, выполнять тело цикла
	while ( a!=b)
	//Если число A больше, чем B, то уменьшить его значение на B,
	if ( a>b) a=a-b;
	//иначе уменьшить значение числа B на A
	else b=b-a;
	cout<<" НОД= "<<a<<" \n ";
	return 0;
}
		

Результат работы программы не изменится, если для её решения воспользоваться циклом с постусловием do...while:

#include <iostream>
using namespace std;
int main ( )
{
	unsigned int a, b;
	cout<<" A = "; cin >>a;
	cout<<" B = "; cin >>b;
	do
	if ( a>b ) a=a-b; else b=b-a;
	while ( a !=b );
	cout<<" НОД= "<<a<<" \n ";
	return 0;
}
		
Поиск наибольшего общего делителя двух чисел.

Рис. 3.25. Поиск наибольшего общего делителя двух чисел.
Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?