Самая длинная фамилия
Кнопка загружает данные из текстового файла в таблицу, если она заполнена, заменяет (очищает и заполняет). Ввод данных в таблицу осуществляется последовательно. Передвигаться по ячейкам таблицы можно клавишами. При нажатии на кнопку появится модальное окно (QMessageBox) с результатом (Рис. 2, выделена красной рамкой). Как мы уже знаем, модальное окно блокирует родительское. Для его закрытия… Читать ещё >
Самая длинная фамилия (реферат, курсовая, диплом, контрольная)
Министерство образования и науки РФ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Тверской государственный университет Факультет прикладной математики и кибернетики Кафедра информационных технологий Направление:10 300.62 — Фундаментальная информатика и информационные технологии
ОТЧЕТ ПО УЧЕБНО-ВЫЧИСЛИТЕЛЬНОЙ ПРАКТИКЕ
Тема: «Самая длинная фамилия»
Выполнил:студент 16ой группы
Агададашев Агакерим Асланович
Проверил: К. ф.-м.н., доцент
Сорокин Сергей Владимирович
Тверь — 2013
Постановка задачи
Условие задачи
Среда разработки
Приложение
Руководство пользователя
Словесный алгоритм
Описание функций
Код программы
Постановка задачи
Условие задачи
Нужно написать программу, работающую со списком группы. Список хранится в текстовом файле, каждый студент описывается одной строчкой следующего формата:
Фамилия Имя Отчество; пол; год рождения
Где: пол — буквы М или Ж, год рождения — число.
Основная задача
Написать программу, которая определяет самую длинную фамилию среди студентов группы.
Среда разработки:
Qt Creator 5.1.
ПРИЛОЖЕНИЕ
Руководство пользователя
Приложение запускается из Qt Creator 5.1, после нажатия на или при нажатии клавиш.
Первоначально на экране появится главное окно (QDialog) (Рис. 1).
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) :
QDialog (parent), //Тип окна: QDialog
ui (new Ui: students)
{
ui->setupUi (this);
//Таблица с размерностью 5×5, т. е.:
ui->tableWidget->setRowCount (5); //количество строк равна 5(ячейкам)
ui->tableWidget->setColumnCount (5); //количество столбцов равна
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:~students () //…Деструктор
{
delete ui;
}
.. .
Разберем теперь каждую функцию по отдельности:
Для работы с файлами подключаем необходимые библиотеки:
.. .
#include
#include
.. .
Функция сохранения данных (Save):
/***Сохранение данных в файл***/
void students: Save () {
QFile file («students list. txt»); //
file.open (QIODevice:WriteOnly); //Открываем файл только для чтения
//последовательно сохраняем:…
QTextStream out (&file); // QTextStream-класс для чтения и записи
out << ui->tableWidget->rowCount () << «n»; //…строки, пока не
встретится конец строки
for (int i = 0; i < ui->tableWidget->rowCount (); ++i)
for (int j = 0; j<5; ++j)
out << ui->tableWidget->item (i, j)->text () << (j == 4? «n»: ««);// и т. д.
пока все строки добавляя разделитель" «
file.close ();//Закрываем файл
}
Данная функция использует класс для чтения и записи — QTextStream.
Функция открывает файл и добавляет в него последовательно, сначала слова первой строки, а затем, после того как увидел конец строки, переходит к обработке 2 строки и т. д.
Функция считывания данных (Open):
void students: Open () {
QFile file («students list. txt»);//(1)
file.open (QIODevice:ReadOnly); //Открываем файл (1) только для
чтения
bool ok; //задаем логич. переменную ok
QTextStream in (&file); // QTextStream-класс для чтения и записи
ui->tableWidget->setRowCount ((in.readLine ()).toInt (&ok)); //
программа список длинный фамилия добавляем, ранее добавленные слова обратно в строку. Определить конец строки и не путать с отдельными словами помогает readline (которая возвращает) пустое QString):
QTableWidgetItem *item;
QString str;
for (int i = 0; i < ui->tableWidget->rowCount (); ++i) {
str = in. readLine ();
for (int j = 0; j<5; ++j) {
item = new QTableWidgetItem (str.section (' ', j, j),
QString:SectionSkipEmpty);
ui->tableWidget->setItem (i, j, item);
}
}
file.close ();
}
Данная функция считывает данные из файла, определяя конец строки и отдельно слова, последовательно добавляет их в ячейки нашей таблицы, начиная от нулевой (0,0). После добавления всей первой строки аналогично поступает со второй и с последующими.
Функция вывода сообщения (Result):
void students: on_result_clicked () //при поступлении сигнала от result,
делай:
{
int c = -1;
QString longest;
//сравнивает последовательно слова наход-ся в 1 столбце:
for (int i = 0; i < ui->tableWidget->rowCount (); ++i)
if (ui->tableWidget->item (i, 0)->text ().length () > c) {
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
#include
namespace Ui {
class students;
}
class QTextEdit;
class students: public QDialog
{
Q_OBJECT
QList > listBirth;
QList > listGender;
public:
explicit students (QWidget *parent = 0);
~students ();
public slots:
void Open ();
void Save ();
void Result ();
void doIt ();
private slots:
void on_result_clicked ();
void on_exit_clicked ();
private:
Ui:students *ui;
};
#endif // STUDENTS_H
main.cpp ():
#include «students.h»
#include
int main (int argc, char *argv[])
{
QApplication a (argc, argv);
students w;
w.show ();
return a. exec ();
}
students.cpp ():
#include «students.h»
#include «ui_students.h»
#include
#include
#include
#include
students:students (QWidget *parent) :
QDialog (parent), //Тип окна: QDialog
ui (new Ui: students)
{
ui->setupUi (this);
//Таблица с размерностью 5×5, т. е.:
ui->tableWidget->setRowCount (5); //количество строк равна 5(ячейкам)
ui->tableWidget->setColumnCount (5); //количество столбцов равна
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:~students () //…Деструктор
{
delete ui;
}
//Подключаем библиотеки для работы с файлами:
#include
#include
/***Считывание данных из файла***/
void students: Result () {
}
void students: Open () {
QFile file («students list. txt»);//(1)
file.open (QIODevice:ReadOnly); //Открываем файл (1) только для
чтения
bool ok; //задаем логич. переменную ok
QTextStream in (&file);
ui->tableWidget->setRowCount ((in.readLine ()).toInt (&ok));
QTableWidgetItem *item;
QString str;
for (int i = 0; i < ui->tableWidget->rowCount (); ++i) {
str = in. readLine ();
for (int j = 0; j<5; ++j) {
item = new QTableWidgetItem (str.section ('', j, j),
QString:SectionSkipEmpty);
ui->tableWidget->setItem (i, j, item);
}
}
file.close ();
}
/***Сохранение данных в файл***/
void students: Save () {
QFile file («students list. txt»); //(1)
file.open (QIODevice:WriteOnly); //Открываем файл (1) только для
чтения
//последовательно сохраняем:…
QTextStream out (&file);
out << ui->tableWidget->rowCount () << «n»; //…строки, пока не
встретится конец строки
for (int i = 0; i < ui->tableWidget->rowCount (); ++i)
for (int j = 0; j<5; ++j)
out << ui->tableWidget->item (i, j)->text () << (j == 4? «n»: ««);// и т. д.
все строки добавляя разделитель" «
file.close ();//Закрываем файл
}
void students: on_result_clicked () //при поступлении сигнала от result,
делай:
{
int c = -1;
QString longest;
//сравнивает последовательно слова наход-ся в 1 столбце:
for (int i = 0; i < ui->tableWidget->rowCount (); ++i)
if (ui->tableWidget->item (i, 0)->text ().length () > c) {
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));}