МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ ФГБОУВПО БРЯНСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра «Информатика и программное обеспечение» ЗАДАНИЕ На курсовую работу по дисциплине ПРОГРАММИРОВАНИЕ Студенту гр. 11-ПрИ Тема «Контактная книга» Содержание работы Программа должна загружать из файла список с контактами, и предоставлять пользователю возможность добавления новых контактов, их сортировки, сохранения в файл .csv. Рекомендации ________________________________________________ Замечания ___________________________________________________ Дата получения ______________________ Дата сдачи ______________________ Студент ______________________ Руководитель ______________________ Брянск 2012 Оглавление 1 Постановка задачи ................................................................................... 3 2 Этап анализа. Техническое задание ...................................................... 4 2.1 Наименование и назначение программы ..................................... 4 2.2 Требования к программе ............................................................... 4 3 Этап проектирования .............................................................................. 5 4 Этап программирования ......................................................................... 6 5 Описание интерфейса программы ......................................................... 8 6 Написание кода программы ................................................................. 10 7 Тестирование.......................................................................................... 14 8 Пример работы программы .................................................................. 18 Список используемой литературы ............................................................ 19 2 1 ПОСТАНОВКА ЗАДАЧИ Задача состоит в том, чтобы написать программу которая будет отображать пользователю список с контактами. Пользователь так же должен иметь возможность сортировать контакты, добавлять новые, сохранять их и экспортировать список в файл CSV. Список загружается из текстового файла, который можно дополнять новыми контактами вручную. Программа должна быть написана на языке C++ и иметь графический интерфейс. Для выполнения задачи был использован компилятор QT Creator. 3 2 ЭТАП АНАЛИЗА. ТЕХНИЧЕСКОЕ ЗАДАНИЕ На основе выданной темы для курсовой работы было составлено техническое задание. Основные пункты представлены ниже. 2.1 НАИМЕНОВАНИЕ И НАЗНАЧЕНИЕ ПРОГРАММЫ Программа называется: «Контактная книга». Программа предназначена для отображения, сортировки и добавления новых контактов. Список содержит следующие данные: 1. Имя и фамилию контакта 2. Город его проживания 3. Его контактный номер 2.2 ТРЕБОВАНИЯ К ПРОГРАММЕ Программа должна работать под управлением операционной системы Windows и обеспечивать возможность выполнения перечисленных ниже функций: 1. Добавление контактов: 1.1. Имя и Фамилия 1.2. Номер контакта 1.3. Город, где проживает контакт 2. Выполнение сортировки по именам и фамилиям (как по возрастанию, так и по убыванию) 3. При нажатии кнопки 'Добавить контакт' должно появиться отдельное окно для ввода информмации 4. Изменение шрифта, цвета шрифта и фона в новом диалоге. 5. ИМПОРТИРОВАНИЕ В ФАЙЛ csv. 4 3 ЭТАП ПРОЕКТИРОВАНИЯ В ходе этапа проектирования была определена внутренняя структура программы. Основной задачей была реализация считывания списка контактов из файла, сортировка контактов пользователем, сохранения в файл и экспортирование его в csv. Суть использования сортировки: 1. Выбор интересующего вида сортировки. 2. Программа сравнивает данные вектора методом qSort. 3. Отобразить пользователю отсортированный список. 5 4 ЭТАП ПРОГРАММИРОВАНИЯ Для создания приложения открываем среду разработки QT Creator, перед нами появляется стартовая страница, выбираем вкладку Файл->Новый файл или проект->Проект QT widget->GUI приложение QT. После этого, размещаем на форме нужные нам элементы, для решения задачи и создания приложения. В результате мы получили форму следующего вида (См. Рис.4.1 ) Рис.4.1. Форма приложения Нам понадобится ещё два диалоговых окна для настройки цвета фона и добавления нового контакта. Для их добавления необходимо нажать правой клавишей мыши на корневую папку проекта, далее выбрать добавить новый>QT->Класс формы QT Designer. Выбираем нужный нам шаблон, имя формы и располагаем на нем нужные элементы, после чего, форма имеет вид (См. Рис.4.2 ) 6 Рис.4.2. Форма настроек Подробный разбор всех элементов формы описан в главе «Описание интерфейса программы». 7 5 ОПИСАНИЕ ИНТЕРФЕЙСА ПРОГРАММЫ Ниже представлен интерфейс работы написанной программы (См. рис.5.1) Рис.5.1. Пример работы программы Интерфейс программы состоит из следующих компонентов: QComboBox - выпадающий список, который отвечает за сортировку контактов определенным методом. QPushButton – 4 кнопки, выполняющая функцию открытия диалогового окна с настройкой интерфейса, добавления нового контакта, удаления контакта и заполнения главного окна контактами. QLineEdit - 2 заголовка, поясняющие пользователю, где находятся нужные ему поля программы. 8 QListWidget – Элемент интерфейса, в котором выводятся все контакты с содержанием имени, города и номера. QPlainTextEdit – В нем отображается подробная информация о выбранном контакте. Если пользователь захочет изменить тип шрифта или цвет фона, то должен будет нажать на кнопку настроек, и появится следующее диалоговое окно (См. Рис.5.2) Рис.5.2. Интерфейс настроек программы В соответствующем QComboBox пользователь выбирает тот тип шрифта, который он захочет, и при нажатии на кнопку выбора цвета фона появляется диалог выбора нужного цвета. 9 6 НАПИСАНИЕ КОДА ПРОГРАММЫ В следующем фрагменте кода, описывается, каким способом загружается список контактов из файла, и как они отображаются на экран монитора. void MainWindow::on_fill_clicked() { FILE *f = fopen ("Data.txt","rt"); if (f==NULL) return; int ContCount; fscanf (f, "%d", &ContCount); char Buffer[100]; fgets(Buffer, 100, f); for (int i=0; i<ContCount; i++) { TCont Cont; fgets(Buffer, 100, f); Cont.Name = QString(Buffer).trimmed(); fgets(Buffer, 100, f); Cont.City = QString(Buffer).trimmed(); fgets(Buffer, 100, f); Cont.Number = QString(Buffer).trimmed(); ContVector.push_back(Cont); } fclose (f); ShowList(); } Листинг 1. Загрузка списка контактов из файла Код вывода на экран списка блюд: void MainWindow::ShowList() { ui->mylist->clear(); int Size = ContVector.size(); for(int i=0; i<Size; i++) { ui->mylist->addItem(ContVector[i].Name + ContVector[i].City + ContVector[i].Number); } } Листинг 2. Вывод на экран списка контактов 10 Код вывода информации о блюде, при его выборе: void MainWindow::on_mylist_currentRowChanged(int currentRow) { ui->PList->clear(); if(currentRow==-1) { return; } ui->PList->appendPlainText("Имя контакта: " + ContVector[currentRow].Name + "Город: +ContVector[currentRow].City + "Номер телефона: " + ContVector[currentRow].Number); } Листинг 3. Вывод информации о контакте 11 Код экспортирования данных в файл csv: void MainWindow::on_action_csv_activated(int arg1) { FILE *f = fopen ("Data.csv","wt"); if (f==NULL) return; int ContCount=ContVector.size(); fprintf(f, "Количество контактов в списке: %d\n", ContCount); fprintf(f, "Имя контакта;"); fprintf(f, "Город проживания;"); fprintf(f, "Номер телефона контакта;\n"); for (int i=0; i<ContCount; i++) { fprintf(f, "%s" , ContVector[i].Name.toAscii().data()); fprintf(f, "%s" , ";"); fprintf(f, "%s" , ContVector[i].City.toAscii().data()); fprintf(f, "%s" , ";"); fprintf(f, "%s\n" , ContVector[i].Number.toAscii().data()); } fclose (f); } Листинг 4. Экспортирование контактов в файл csv Код осуществления сортировки данных: bool SortByNameDown(const TCont &s1, const TCont &s2) { return s1.Name > s2.Name; } bool SortByNameUp(const TCont &s1, const TCont &s2) { return s1.Name < s2.Name; } bool SortByCityUp(const TCont &s1, const TCont &s2) { return s1.City > s2.City; } bool SortByCityDown(const TCont &s1, const TCont &s2) { return s1.City < s2.City; } 12 bool SortByNumberUp(const TCont &s1, const TCont &s2) { return s1.Number > s2.Number; } bool SortByNumberDown(const TCont &s1, const TCont &s2) { return s1.Number < s2.Number; } void MainWindow::SortList() { int a=ui->SortBox->currentIndex(); if(a==0) { qSort(ContVector.begin(),ContVector.end(),SortByNameDown); } else if(a==1) { qSort(ContVector.begin(),ContVector.end(),SortByNameUp); } else if(a==2) { qSort(ContVector.begin(),ContVector.end(),SortByCityUp); } else if(a==3) { qSort(ContVector.begin(),ContVector.end(),SortByCityDown); } else if(a==4) { qSort(ContVector.begin(),ContVector.end(),SortByNumberUp); } else if(a==5) { qSort(ContVector.begin(),ContVector.end(),SortByNumberDown); } } void MainWindow::on_SortBox_currentIndexChanged(int index) { SortList(); ShowList(); } Листинг 5. Осуществление сортировок 13 Код сохранения изменений в списке контактов void MainWindow::on_action_2_activated(int arg1) { FILE *f = fopen ("Data.txt","wt"); if (f==NULL) return; int ContCount=ContVector.size(); fprintf(f, "%d\n", ContCount); for (int i=0; i<ContCount; i++) { fprintf(f, "%s\n" , ContVector[i].Name.toAscii().data()); fprintf(f, "%s\n" , ContVector[i].City.toAscii().data()); fprintf(f, "%s\n" , ContVector[i].Number.toAscii().data()); } fclose (f); } Листинг 6. Сохранение в файл 14 7 ТЕСТИРОВАНИЕ По окончанию написания программы, было проведено её тестирование на работоспособность, которое не выявило критических ошибок. Тестирование черного ящика показало следующие проблемы в программе. Таблица 7.1 Тестирование черного ящика Номер теста Описание теста 1 Ввод только имени Ожидаемый ответ Полученный ответ Контакт не добавится Контакт не или города при добавился добавлении контакта 2 После выбора Информация Информация сортировки корректна отображается в той проверить последовательности, корректное, в которой была соответствующее загружена отображение информации о контакте 3 При открытии Ничего не Изменился цвет фона палитры для выбора произойдет на черный При добавлении Верное добавление Верное добавление контакта, контакт контакта контакта фона нажать «закрыть», а потом еще раз «закрыть» 4 должен добавляться, 15 соответствуя выбранному типу сортировки 5 При Корректное Корректное экспортировании отображение отображение файла в формате csv, экспортируемых экспортируемых экспортируемые данных данных При удалении контакта информации в поле «Информация о контакте» пропадает После загрузки Информация Информация перестает перестает отображаться отображаться Корректное Информация информации, выбора сохранение осталась неизменной сортировки и информации данные должны быть разделены ячейками 6 7 последующем сохранении, информация сохраняется, соответствуя типу сортировки 8 Ввод в поле «Номер Обработка данных не Программа добавила контакта» символов, происходит данные в список отличных от цифр При условии, что пользователь корректно заполняет файл, из которого загружается список с контактами, все остальные недочеты были исправлены. Далее были проведены тесты белого ящика, той части кода, которая считывает контакты из файла. Критических ошибок, которые могут серьезно повлиять на работу программы выявлено не было. 16 17 8 ПРИМЕР РАБОТЫ ПРОГРАММЫ При запуске программы появляется незаполненное поле для контактов. При нажатии на кнопку «Отобразить контакты» программа считывает данные из файла и одновременно отображает их на экран. Пользователь может настроить в программе шрифт и цвет фона, в соответствующем меню настроек. При выборе какого-либо конкретного контакта по щелчку мыши, внизу выводится его подробная информация – имя контакта, город проживания и номер телефона. Далее, если это необходимо, можно выбрать необходимый тип сортировки, например, имя по возрастанию. При необходимости пользователь может экспортировать данные в файл csv, который потом можно открыть при помощи программы Excel. Для того чтобы выйти из программы, необходимо просто закрыть окно. 18 СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ 1. Саммерфилд Марк. Qt. Профессиональное программирование. Разработка кроссплатформенных приложений на С++ / Пер. с англ. - «Символ-Плюс», 2011. - 560с. 2. Шлее Макс. Qt 4: Профессиональное программирование на C++. - СПб.: «БХВ-Петербург», 2007. - 880с. 3. Бланшет Жасмин, Саммерфилд Марк. Qt 4: Программирование GUI на C++ / Пер. с англ. 2-е дополненное издание. - М.: «КудицПресс», 2008. - 736с. 4. Сергей Бобровский. Технологии C++ Builder, 2007г – 560с. 19