Опубликован: 07.03.2015 | Уровень: для всех | Доступ: свободно | ВУЗ: Компания ALT Linux
Лекция 4:

Использование функций при программировании на C++

4.4 Решение задач с использованием функций

Рассмотрим несколько задач с применением функций.

Задача 4.1. Вводится последовательность из N целых чисел, найти среднее арифметическое совершённых чисел и среднее геометрическое простых чисел последовательности.

Напомним, что целое число называется простым, если оно делится нацело только на само себя и единицу. Подробно алгоритм определения простого числа описан в задаче 3.15 (рис. 3.29). В этой задаче кроме простых чисел фигурируют совершённые числа. Число называется совершённым, если сумма всех делителей, меньших его самого, равна этому числу. Алгоритм, с помощью которого можно определить делители числа, подробно рассмотрен в задаче 3.14 (рис. 3.28).

Для решения поставленной задачи понадобятся две функции:

  • prostoe — определяет, является ли число простым, аргумент функции целое число N; функция возвращает 1, если число простое и 0 — в противном случае.;
  • soversh — определяет, является ли число совершённым; входной параметр целое число N; функция возвращает 1, если число является совершённым и 0 — в противном случае.
#include <iostream>
#include <math.h>
unsigned int prostoe ( unsigned int N) //Описание функции.
{
	//Функция определяет, является ли число простым.
	int i, pr;
	for ( pr =1, i =2; i<=N/ 2; i ++)
	if (N%i ==0) { pr =0; break; }
	return pr;
}
unsigned int soversh ( unsigned int N) //Описание функции.
{
	//Функция определяет, является ли число совершённым.
	unsigned int i, S;
	for ( S=0, i =1; i<=N/ 2; i ++)
		if (N%i ==0) S+=i; //Сумма делителей.
	if ( S==N) return 1;
	else return 0;
}
using namespace std;
int main ( )
{
	unsigned int i,N,X, S, kp, ks;
	long int P;
	cout <<"N="; cin >>N;
	for ( kp=ks=S=0,P=1, i =1; i<=N; i ++)
	{
		cout <<"X="; cin >> X; //Вводится элемент последовательности.
		if ( prostoe (X) ) // X — простое число.
		{
			kp++; //Счётчик простых чисел.
			P*=X; //Произведение простых чисел.
		}
		if ( soversh (X) ) //X — совершённое число.
		{
			ks++; //Счётчик совершённых чисел.
			S+=X; //Сумма совершённых чисел.
		}
	}
	if ( kp>0) //Если счётчик простых чисел больше нуля,
		//считаем среднее геометрическое и выводим его,
		cout<<"Среднее геометрическое="<<pow(P, ( float ) 1/kp )<<endl;
	else //в противном случае –– сообщение об отсутствии простых чисел.
		cout<<"Нет простых чисел\n";
	if ( ks>0) //Если счётчик совершённых чисел больше нуля,
		//считаем среднее арифметическое и выводим его,
		cout<<"Среднее арифметическое="<<(float ) S/ ks<<endl;
	else //в противном случае — сообщение об отсутствии совершённых чисел.
		cout<<"Нет совершённых чисел\n";
	return 0;
}
		

Задача 4.2. Вводится последовательность целых чисел, 0 — конец последовательности. Найти минимальное число среди простых чисел и максимальное — среди чисел, не являющихся простыми.

Для решения данной задачи создадим функцию prostoe, которая будет проверять, является ли число N простым. Входным параметром функции будет целое положительное число N. Функция будет возвращать значение 1, если число простое, и 0 — в противном случае. Алгоритм поиска максимума (минимума) подробно описан в задаче 3.20 (рис. 3.31).

Текст программы:

#include <iostream>
using namespace std;
unsigned int prostoe ( unsigned int N)
{
	int i, pr;
	for ( pr =1, i =2; i>=N/ 2; i ++)
	if (N%i ==0) { pr =0; break; }
	return pr;
}
int main ( )
{
	int kp=0,knp=0,min, max,N;
	for ( cout << "N=", cin >>N; N != 0; cout<<"N=", cin >>N)
		//В цикле вводится элемент последовательности N.
		if ( prostoe (N) ) //N — простое число,
		{
			kp++; //счётчик простых чисел.
			if ( kp==1) min=N; //Предполагаем, что первое простое число минимально,
			else if (N<min ) min=N; //если найдётся меньшее число, сохраняем его.
		}
		else //N — простым не является,
		{
			knp++; //счётчик чисел не являющихся простыми.
			if ( knp==1) max=N; //Предполагаем, что первое не простое число максимально,
			else if (N>max) max=N; //если найдётся большее число, сохраняем его.
		}
		if ( kp>0) //Если счётчик простых чисел больше нуля,
			cout <<" min = "<<min<<"\t"; //выводим значение минимального простого числа,
		else //в противном случае —
			cout <<"Нет простых чисел"; //сообщение об отсутствии простых чисел.
		if ( knp>0) //Если счётчик чисел не являющихся простыми больше нуля,
			cout <<" max ="<<max<<endl; //выводим значение максимального числа,
		else //в противном случае —
			cout <<"Нет составных чисел"; //сообщение об отсутствии чисел
			//не являющихся простыми.
	return 0;
}
		
Сергей Радыгин
Сергей Радыгин

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

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

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

 

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

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