Тема: «Ипользование вспомогательных функций и вывод нескольких чисел c помощью одного элемента управления»
Пример 1: программа, которая находит заданное количество совершенных чисел, и выводит их на экран с помощью элемента textEdit
Совершенными называются числа, которые равны сумме всех своих делителей, не включая само число, например: 6 = 1+2+3.
Для решения задачи будем проверять все натуральные числа, начиная с 1 (но 1 не считается совершенным числом). Совершенных чисел совсем не много, поэтому, чтобы не ждать слишком долго окончания выполнения программы, ограничим поиск числом 10 4.
Создайте проект на базе класса QDialog.
Спроектируйте окно программы как показано на рисунке. В качестве элемента для вывода результата используем элемент textEdit.
Для проверки одного числа добавим в класс, описывающий окно программы, объявление функции IsPerfect(). Передите в режим редактирования программы (Edit) и откройте файл dialog.h. Вставьте в класс Dialog объявление функции:
bool IsPerfect(int);
Откройте файл dialog.cpp и напишите определение функции. Файл должен выглядеть так, как показано ниже.
|
|
#include "dialog.h"
#include "ui_dialog.h"
#include <QTextCodec>
Dialog::Dialog(QWidget *parent):
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
adjustSize();
}
Dialog::~Dialog()
{
delete ui;
}
bool Dialog::IsPerfect(int n)
{
int sum = 0;
// проверяем все возможные делители:
for (int del = 1; del <= n/2; ++del)
if (n % del == 0) sum += del;
// если проверяемое число делится на очередной делитель, добавляем его к сумме
if (n == sum) return true;
return false;
}
Добавьте слот для кнопки «Найти» и напишите код, показанный ниже.
void Dialog::on_pushButton_clicked()
{
QTextCodec* codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForCStrings(codec);
int kol = ui->lineEdit->text().toInt(); // считали нужное количество
int counter = 0; // количество уже найденных чисел
int m = 1; // проверяемое число
QString text= "Совершенные числа:\n";
while (counter < kol) // пока не найдено нужное количество чисел
{
if (IsPerfect(m)) // если очередное число - совершенное
{
text += QString::number(m)+'\n';
/* выполняем преобразование числа в строку и добавляем к тексту (и символ
перехода на новую строку) */
counter++; // увеличиваем счетчик
}
m++; // берем следующее число
if (m > 1e4) // если число стало слишком большим
{
text += "Поиск закончен";
break;
}
}
ui->textEdit->setText(text); // выводим текст в окно
}