Самая длинная фамилия
Министерство образования и науки РФ
Федеральное государственное бюджетное
образовательное учреждение высшего профессионального образования
Тверской государственный университет
Факультет прикладной математики и
кибернетики
Кафедра информационных технологий
Направление:010300.62 -
Фундаментальная информатика и информационные технологии
ОТЧЕТ ПО УЧЕБНО-ВЫЧИСЛИТЕЛЬНОЙ
ПРАКТИКЕ
Тема: «Самая длинная фамилия»
Выполнил:студент 16ой
группы
Агададашев Агакерим Асланович
Проверил: К.
ф.-м.н., доцент
Сорокин Сергей Владимирович
Тверь - 2013
Содержание
Постановка
задачи
Условие
задачи
Среда
разработки
Приложение
Руководство
пользователя
Словесный
алгоритм
Описание
функций
Код программы
Постановка задачи
Условие задачи
Нужно написать программу, работающую со списком группы. Список хранится в
текстовом файле, каждый студент описывается одной строчкой следующего формата:
Фамилия Имя Отчество; пол; год рождения
Где: пол - буквы М или Ж, год рождения - число.
Основная задача
Написать программу, которая определяет самую длинную фамилию среди
студентов группы.
Среда разработки:
Qt Creator 5.1.
ПРИЛОЖЕНИЕ
Руководство пользователя
Приложение запускается из Qt Creator 5.1, после нажатия на или при
нажатии клавиш.
Первоначально на экране появится главное окно (QDialog) (Рис. 1).
) Ввод данных в таблицу осуществляется последовательно. Передвигаться по
ячейкам таблицы можно клавишами .
2) После нажатия на кнопку, программа сохраняет данные в файл “students_list.txt”.
3) Чтобы получить результат (т.е. самая длинная фамилия) достаточно
нажать на кнопку, как наша программа, в специальном окне (QMessageBox) выдаст результат(рис. 2).
4) Кнопка открывает файл “students_list.txt”, считывает ранее сохраненные*2) данные и
выводит их в таблице.
5) Выйти из программы можно нажав на или на соответствующую кнопку Exit.
Замечание: Не выполнив пункт (1) не следует выполнять-(2). Выполнив
(1)-(2) или (4) - если данные, ранее, уже добавлены, можно выполнить (3). (4)
доступен в любом случае.
Рис. 2
Словесный алгоритм
При запуске программы появиться окно, с базовым классом QDialog.
Внутри окна расположены объекты. В нашем случае таблица (TableWidget) и кнопки для сохранения (Save), считывания ранее сохраненных
данных(Open) и вывода(Result).
При нажатии на [Exit]
приложение выполняет действие - «Закрытие Главного окна» или просто close(), т.е. фактически выходит из
приложения.
После ввода данных в таблицу и при нажатии [Save], приложение сохраняет данные в файл.
Кнопка [Open] загружает данные из текстового
файла в таблицу, если она заполнена, заменяет (очищает и заполняет).
При нажатии на кнопку [Result]
появится модальное окно (QMessageBox) с результатом (Рис. 2, выделена красной рамкой).
Как мы уже знаем, модальное окно блокирует родительское. Для его закрытия
необходимо нажать на [OK]
или.
Описание функций
Опишем строение главного окна:
students::students(QWidget *parent) :(parent), //Тип окна:
QDialog(new Ui::students)
{>setupUi(this);
//Таблица с размерностью 5x5, т.е.:>tableWidget->setRowCount(5);
//количество строк равна 5(ячейкам)>tableWidget->setColumnCount(5);
//количество столбцов равна
(ячейкам)
//Связка слотов и сигналов для open, save, exit
connect (ui->open, SIGNAL(clicked()), SLOT (Open()));//При
поступлении сигнала от open обращайся к ф-и Open()
connect (ui->save, SIGNAL(clicked()), SLOT (Save()));//При поступлении
сигнала от save обращайся к ф-и Save()
connect (ui->exit, SIGNAL(clicked()), SLOT (close()));//При поступлении
сигнала от exit обращайся к ф-и close()
}
::~students() //...Деструктор
}
. . .
Разберем теперь каждую функцию по отдельности:
Для работы с файлами подключаем необходимые библиотеки:
. . .
#include <QFile>
#include <QTextStream>
. . .
Функция сохранения данных(Save):
/***Сохранение данных в файл***/
void students::Save() {file("students list.txt");
//
file.open(QIODevice::WriteOnly); //Открываем файл только для чтения
//последовательно сохраняем:...
QTextStream out (&file); // QTextStream-класс для чтения и записи
out << ui->tableWidget->rowCount() <<
"\n"; //...строки, пока не
встретится конец строки(int
i = 0; i < ui->tableWidget->rowCount(); ++i)(int j = 0; j<5;
++j)<< ui->tableWidget->item(i, j)->text() << (j == 4 ? "\n" : " ");// и
т.д.
пока все строки добавляя разделитель" ".close();//Закрываем
файл
}
Данная функция использует класс для чтения и записи - QTextStream.
Функция открывает файл и добавляет в него последовательно, сначала слова
первой строки а затем, после того как увидел конец строки, переходит к
обработке 2 строки и т.д.
Функция считывания данных(Open):
void students::Open() {
QFile file("students list.txt");//(1).open(QIODevice::ReadOnly);
//Открываем файл (1) только для
чтения
ok; //задаем логич. переменную ok
QTextStream in (&file); // QTextStream-класс для чтения и записи>tableWidget->setRowCount((in.readLine()).toInt(&ok));
//
программа список длинный фамилия
добавляем, ранее добавленные слова обратно в строку. Определить конец
строки и не путать с отдельными словами помогает readline (которая возвращает)
пустое
QString):*item;str;(int i = 0; i < ui->tableWidget->rowCount(); ++i)
{= in.readLine();(int j = 0; j<5; ++j) {= new QTableWidgetItem
(str.section(' ', j, j), ::SectionSkipEmpty);>tableWidget->setItem(i, j,
item);
}
}.close();
}
Данная функция считывает данные из файла, определяя конец строки и
отдельно слова, последовательно добавляет их в ячейки нашей таблицы, начиная от
нулевой(0,0). После добавления всей первой строки аналогично поступает со
второй и с последующими.
Функция вывода сообщения (Result):
void students::on_result_clicked()
//при поступлении сигнала от result,
делай:
{c = -1;longest;
//сравнивает последовательно слова наход-ся в 1 столбце:
for (int i = 0; i < ui->tableWidget->rowCount();
++i)(ui->tableWidget->item(i,0)->text().length() > c) {=
ui->tableWidget->item(i,0)->text().length();
//longest - переменная, в котором самое длинное слов:
longest = ui->tableWidget->item(i,0)->text();
}
//Вывод в виде сообщения найденного слова, а точнее значение longest:
QMessageBox::information(this,tr("Результат"),tr("Самая длинная
фамилия - %1").arg(longest));
}
Функция, при получении сигнала от нажатия на result, считывает данные 1 столбца (i,0) каждой строки последовательно сравнивая их, запоминает
максимальное по длине слово. А после окончания сравнения, выводит в форме
QMessageBox, с заголовком «Результат», фразу «Самая длинная фамилия - » +
<то (слово) что в longest
>.
Код программы
students.h( ):
#ifndef STUDENTS_H
#define STUDENTS_H
#include <QDialog>
#include <QPointer>Ui {students;
}QTextEdit;students : public QDialog
{_OBJECT<QPointer<QTextEdit> >
listBirth;<QPointer<QTextEdit> > listGender;:students(QWidget
*parent = 0);
~students();slots:Open();Save();Result();doIt();slots:on_result_clicked();
void on_exit_clicked();:::students *ui;
};
#endif // STUDENTS_H
main.cpp( ):
#include "students.h"
#include <QApplication>main(int argc, char *argv[])
{a(argc, argv);w;.show();a.exec();
}
students.cpp( ):
#include "students.h"
#include "ui_students.h"
#include <QFileDialog>
#include <QLabel>
#include <QMessageBox>::students(QWidget *parent)
:(parent), //Тип окна: QDialog(new Ui::students)
{>setupUi(this);
//Таблица с размерностью 5x5, т.е.:>tableWidget->setRowCount(5);
//количество строк равна 5(ячейкам)>tableWidget->setColumnCount(5);
//количество столбцов равна
(ячейкам)
//Связка слотов и сигналов для open, save, exit
connect (ui->open, SIGNAL(clicked()), SLOT (Open()));//При
поступлении сигнала от open обращайся к ф-и Open()
connect (ui->save, SIGNAL(clicked()), SLOT (Save()));//При поступлении
сигнала от save обращайся к ф-и Save()
connect (ui->exit, SIGNAL(clicked()), SLOT (close()));//При поступлении
сигнала от exit обращайся к ф-и close()
}::~students() //...Деструктор
{ui;
}
//Подключаем библиотеки для работы с файлами:
#include <QFile>
#include <QTextStream>
/***Считывание данных
из файла***/students::Result() {
}students::Open() {file("students
list.txt");//(1).open(QIODevice::ReadOnly); //Открываем файл (1) только для
чтенияok; //задаем логич. переменную ok
QTextStream in
(&file);>tableWidget->setRowCount((in.readLine()).toInt(&ok));*item;str;(int
i = 0; i < ui->tableWidget->rowCount(); ++i) {= in.readLine();(int j =
0; j<5; ++j) {= new QTableWidgetItem (str.section('', j, j),
::SectionSkipEmpty);>tableWidget->setItem(i, j, item);
}
}.close();
}
/***Сохранение данных в файл***/
void students::Save() {file("students list.txt");
//(1).open(QIODevice::WriteOnly); //Открываем файл (1) только для
чтения
//последовательно сохраняем:...out (&file);
out << ui->tableWidget->rowCount() <<
"\n"; //...строки, пока не
встретится конец строки(int
i = 0; i < ui->tableWidget->rowCount(); ++i)(int j = 0; j<5;
++j)<< ui->tableWidget->item(i, j)->text() << (j == 4 ? "\n" : " ");// и
т.д.
все строки добавляя разделитель" ".close();//Закрываем файл
}
void students::on_result_clicked()
//при поступлении сигнала от result,
делай:
{c = -1;longest;
//сравнивает последовательно слова наход-ся в 1 столбце:
for (int i = 0; i < ui->tableWidget->rowCount();
++i)(ui->tableWidget->item(i,0)->text().length() > c) {=
ui->tableWidget->item(i,0)->text().length();
//longest - переменная, в котором самое длинное слов:
longest = ui->tableWidget->item(i,0)->text();
}
//Вывод в виде сообщения найденного слова, а точнее значение longest:
QMessageBox::information(this,tr("Результат"),tr("Самая длинная
фамилия
- %1").arg(longest));}