Министерство образования и науки РФ
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
Тверской государственный университет
Факультет прикладной математики и кибернетики
Кафедра информационных технологий
Направление: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() //...Деструктор
{ui;
}
. . .
Разберем теперь каждую функцию по отдельности:
Для работы с файлами подключаем необходимые библиотеки:
. . .
#include
#include
. . .
Функция сохранения данных(Save):
/***Сохранение данных в файл***/
void students::Save() {file("students list.txt"); //
file.open(QIODevice::WriteOnly); //Открываем файл только для чтения
//последовательно сохраняем:...
QTextStream out (&file); // QTextStream-класс для чтения и записи
out tableWidget->rowCount()
встретится конец строки(int i = 0; i tableWidget->rowCount(); ++i)(int j = 0; jtableWidget->item(i, j)->text()
пока все строки добавляя разделитель" ".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 tableWidget->rowCount(); ++i) {= in.readLine();(int j = 0; jtableWidget->setItem(i, j, item);
}
}.close();
}
Данная функция считывает данные из файла, определяя конец строки и отдельно слова, последовательно добавляет их в ячейки нашей таблицы, начиная от нулевой(0,0). После добавления всей первой строки аналогично поступает со второй и с последующими.
Функция вывода сообщения (Result):
void students::on_result_clicked() //при поступлении сигнала от result,
делай:
{c = -1;longest;
//сравнивает последовательно слова наход-ся в 1 столбце:
for (int i = 0; i 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, с заголовком «Результат», фразу «Самая длинная фамилия - » + .
Код программы
students.h( ):
#ifndef STUDENTS_H
#define STUDENTS_H
#include
#include Ui {students;
}QTextEdit;students : public QDialog
{_OBJECT > listBirth; > 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 main(int argc, char *argv[])
{a(argc, argv);w;.show();a.exec();
}
students.cpp( ):
#include "students.h"
#include "ui_students.h"
#include
#include
#include
#include ::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
#include
/***Считывание данных из файла***/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 tableWidget->rowCount(); ++i) {= in.readLine();(int j = 0; jtableWidget->setItem(i, j, item);
}
}.close();
}
/***Сохранение данных в файл***/
void students::Save() {file("students list.txt"); //(1).open(QIODevice::WriteOnly); //Открываем файл (1) только для
чтения
//последовательно сохраняем:...out (&file);
out tableWidget->rowCount()
встретится конец строки(int i = 0; i tableWidget->rowCount(); ++i)(int j = 0; jtableWidget->item(i, j)->text()
все строки добавляя разделитель" ".close();//Закрываем файл
}
void students::on_result_clicked() //при поступлении сигнала от result,
делай:
{c = -1;longest;
//сравнивает последовательно слова наход-ся в 1 столбце:
for (int i = 0; i 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));}