Разработка программы обработки массива структур средствами языка Си++
Изучение основ программирования на языке Си++, посредством создания программы обрабатывающей данные, хранимые в массиве структур. Создание структурного шаблона, содержащего фамилию, имя, пол, рост, дату рождения. Организация интерфейса пользователя.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 19.01.2013 |
Размер файла | 190,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ГОУ ВПО «Благовещенский государственный педагогический университет»
Физико-математический факультет
Кафедра информатики и методики преподавания информатики
Курсовая работа
по дисциплине: Технология программирования
на тему: Разработка программы обработки массива структур средствами языка Си++
Исполнитель
студент группы 3 ИС
М.А. Шевчук
Руководитель Е.М. Коландария
Благовещенск 2011
ЗАДАНИЕ НА ВЫПОЛНЕНИЕ РАБОТЫ
Создать структурный шаблон содержащий: фамилию, имя, пол, рост, дату рождения человека. По запросу пользователя предусмотреть вывод:
• всех данных,
• средний рост мужчин,
• фамилии и имени самой молодой женщины, из тех, чей рост превосходит средний рост мужчин.
Для организации хранения и обработки данных использовать массив структур. В программе организовать интерфейс пользователя на основе меню, обязательными пунктами которого будут: ввод данных, вывод всей информации, выход из программы. Остальные пункты меню согласно заданию варианта.
Меню организовать с использованием циклического вывода его пунктов меню и оператора switch. (или конструкции if е1se). Все выводимые данные должны быть отформатированы и размещены в удобном для восприятия пользователя виде. Организовать возможность сохранения информации в файл, чтение из файла.
СОДЕРЖАНИЕ
Введение
1. Техническое задание
1.1 Назначение программы
1.2 Требования к программе
2. Обзор
2.1 Ограничения, накладываемые на реализацию
2.2 Форматы
2.3 Системные требования
2.4 Описание функций и тестирование
2.5 Алгоритм работы
Заключение
Библиографический список
Приложение
ВВЕДЕНИЕ
Язык Си++ - компилируемый статически типизированный язык программирования общего назначения. Он был разработан Бьярном Страуструпом в начале 80-х годов. В его основе лежит язык программирования Си. Он является надмножеством языка Си, поэтому программы написанные на Си, могут быть обработаны компиляторами Си++.
Основное отличие от языка Си -- поддержка объектно-ориентированного и обобщённого программирования. Си++ поддерживает различные парадигмы программирования и сочетает свойства как высокоуровневых, так и низкоуровневых языков.
Являясь одним из самых популярных языков программирования, Си++ широко используется в разработке программного обеспечения. Его применяют при создании операционных систем, прикладных программ, драйверов устройств, встраиваемых систем, высоконагруженных серверов и т.п.
Язык Си++ оказывает огромное влияние на все отрасли современного программирования. Его синтаксис, стиль и основные принципы стали стандартом при разработки новых языков программирования. Благодаря своей универсальности, он часто используется при описании алгоритмов и технологий программирования. Современный программист не имеет права игнорировать такой важный инструментарий своей работы.
Основная цель программы -- обработка данных. Данные различных типов хранятся и обрабатываются по-разному. Типы данных в Си++ можно разделить на основные и составные. С помощью шести основных типов, можно представить целые, вещественные, символьные и логические величины.
Но, используя эти основные типы, программист может вводить описание новых, составных типов данных. В частности такими составными типам являются массивы и структуры.
Целью моей работы является изучение основ программирования на языке Си++, посредством создания программы обрабатывающей данные, хранимые в массиве структур.
1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ
1.1 Назначение программы
Программа предназначена для создания и обработки массива структур данных с информацией о людях (Ф.И.О, дата рождения, пол, рост). Программа позволяет сохранять введённую информацию в текстовый файл, добавлять новые записи, а так-же получать отчёты в соответствии с заданием:
1. вывод всех данных;
2. средний рост мужчин;
3. фамилии и имени самой молодой женщины, из тех, чей рост превосходит средний рост мужчин.
1.2 Требования к программе
Программа должна предоставлять следующие возможности:
• вывод меню выбора функций обработки на экран;
• выбор пункта меню;
• сохранение информации в файл, чтение из файла;
• контроль правильности вводимых данных;
• вывод сообщения, об отсутствии информации по заданному признаку.
2. ОБЗОР
2.1 Ограничения, накладываемые на реализацию
На пользователя программы возложен контроль над правильностью и однообразием ввода информации (фамилия, имя, отчество). Ввод роста ограничен множеством натуральных чисел. Определение пола допустимо вводом букв w для женщин, и m для мужчин. Программой принимаются года рождения с 1901 по 2010, производится проверка допустимости количества дней в месяце и месяцев в году, в том числе учитывается нюанс високосных лет.
2.2 Форматы
Информация о людях из массива структур может быть сохранена в текстовом файле с произвольным именем, размером до пятидесяти символов. Структура Card имеет следующий вид:
struct date{
int year; //год
int month; //месяц
int day; //день
};
struct Card{
string surname; //фамилия
string name; //имя
char sex; //пол
int height; //рост
date bd; //дата рождения
};
Card human[n];
В программе объявлены константы:
const int dayinmonthnv[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //массив количества дней в месяцах не високосного года
const int dayinmonthv[12] = {31,29,31,30,31,30,31,31,30,31,30,31}; //массив количества дней в месяцах високосного года
const int n=100; //Размерность массива структур
2.3 Системные требования
программирование интерфейс пользователь массив
Разработка и тестирование программы велось на персональном компьютере с процессором Intel Atom N450, объём ОЗУ 2Гб. Использовалась операционная система Ubuntu 11.04 GNU\Linux. Среда разработки Code::Blocks 10.05. Компилятор gcc 4.5.2. В других системах работоспособность программы не проверялась.
2.4 Описание функций и тестирование
В разделе тестирование представлены, используемые в программе функции, описание функций и примеры их работы.
Функция main() - отображает главное меню, ожидает выбора пункта, производит навигацию по меню, принимает данные для обработки, выводит результаты запросов и запускает прочие функции в соответствии с выбранным пунктом.
Рисунок 1. Главное меню
Выбор пункта осуществляется по средствам бесконечного цикла while(1) оператора ветвления switch. Для выбора требуемого пункта, необходимо ввести с клавиатуры его номер и нажать клавишу «Enter». После этого запускается функция int getnumber(char str[64]). Она служит для проверки вводимых данных, и выводит сообщение об ошибке, если была введена не цифра, а другой символ. Эта функция используется в дальнейшем в программе при аналогичных задачах. Возвращает число преобразованное из строки.
Рисунок 2. Ошибка при вводе данных, не являющихся натуральным числом
Пункт меню № 1 предназначен для считывания данных из файла и заполнения ими массива структур Card human. При этом используется оператор открытия входного потока ifstream библиотеки fstream.
Рисунок 3. Пункт меню загрузки данных из файла
Здесь используется вспомогательная функция void errorF(char *ss), возвращающая сообщение об ошибке и завершающая программу, если файл открыть не удалось.
Рисунок 4. Ошибка открытия файла
Пункт меню № 2 предназначен для ввода данных в структурный массив.
Рисунок 5. Ввод данных
Здесь также используются функции. В частности, при вводе половой принадлежности, функция char getchar(const char* string) требует от пользователя введения значений w либо m. И возвращает эти значения.
При проверке правильности ввода даты рождения, функция int truedate(const char* string, const int min, const int max) проверяет попадание введённых чисел в заданные рамки. Функция int trueday(const int day, const int month, const int vg) проверяет наличие указанной даты в месяце (учитываются високосные года).
Рисунок 6. Ошибки при вводе данных
Третий пункт предназначен для вывода данных и обработке запросов. Этот пункт имеет четыре подпункта, навигация по которым производится c помощью бесконечного цикла while(1) и операторов ветвления if(), else if(), else.
Первый подпункт выводит на экран все данные хранимые в массиве структур human[i], с использованием цикла for() и оператора cout.
Рисунок 7. Отображение данных из массива структур
Для расчёта показателя среднего роста среди лиц мужского пола предназначен подпункт 2. Значение этого показателя возвращает функция float avgh(const Card *mas, const int n).
Рисунок 8. Вычисление среднего роста мужчин
Функция поиска самой молодой женщины, из тех, чей рост превышает средний рост мужчин объявлена как int YoungWoman(const Card *mas, const int n, const int h) и расположена в третьем подпункте третьего пункта меню. Функция возвращает индекс массива структур, удовлетворяющий заданным требованиям.
Рисунок 9. Результаты поиска молодой, высокой девушки
Выбор последнего, четвёртого подпункта, позволяет вернуться в главное меню путём завершения цикла через оператор break.
Через четвертый пункт основного меню реализована возможность сохранения введённых данных в текстовый файл. При этом используется оператор открытия выходного потока ofstream библиотеки fstream.
Рисунок 10. Сохранение данных в файл
Завершение работы программы производится после выбора пятого пункта меню, через вызов оператора exit(0).
2.5 Алгоритм работы
Рисунок 11. Блок-схема.
ЗАКЛЮЧЕНИЕ
В курсовой работе спланирована и реализована возможность хранения и обработки данных в массиве структур. Программа решает все поставленные задачи:
• создание массива структур;
• вывод всех данных;
• вывод среднего роста мужчин;
• вывод фамилии и имени самой молодой женщины, из тех, чей рост превосходит средний рост мужчин,
и соответствует предъявленным требованиям:
• вывод меню выбора функций обработки на экран;
• выбор пункта меню;
• сохранение информации в файл, чтение из файла;
• контроль правильности вводимых данных;
• вывод сообщения, об отсутствии информации по заданному признаку.
Функциональные возможности программы могут быть расширены.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Подбельский В.В., Язык Си++: учеб. пособие,5-е изд., Москва, Финансы и статистика, 2008, 560 с.
2. Павловская Т.А., С/С++ Программирование на языке высокого уровня, СПб, Питер, 2003, 461 с.
3. Шилдт Герберт, Полный справочник по С++, 4-е издание, пер. с англ., Москва, Вильямс, 2006, 800 с.
ПРИЛОЖЕНИЕ
Исходный текст программы:
#include <stdlib.h> //Для проверки и преобразования значений переменных
#include <iostream> //Для вывода данных на экран
#include <fstream> //Для работы с файлами
using namespace std;
//Структура для храниея даты
struct date{
int year;
int month;
int day;
};
//Структура для хранения данных о человеке
struct Card{
string surname;
string name;
char sex;
int height;
date bd;
};
//Функция для получения числа из введённой строки, проверка допустимости значений
int getnumber(char str[64])
{
int number;
number = atoi(str); //Проверяем, является ли строка числом.
while(number == 0)
{
cout << "\nНедопустимое значение!\n\nПовторите ввод: ";
cin >> str;
number = atoi(str);
}
return number;
}
//Функция для проверки правильность ввода пола человека
char getchar(const char* string)
{
char str[64];
char sex;
while(1)
{
cout << string;
cin >> str;
sex = str[0];
if (sex == 'm' || sex == 'w') return sex;
else
{
cout << "\nНедопустимое значение!"<<endl;
continue;
}
}
}
//Функция для проверки правильность ввода даты как числа
int truedate(const char* string, const int min, const int max)
{
int number;
char str[64];
while(1)
{
cout << string;
cin >> str;
number = getnumber(str);
if (number < min || number > max)
{
cout << "\nНедопустимое значение!"<<endl;
continue;
}
else
{
return number;
}
}
}
//Функция для проверки наличия дня в указанном месяце
int trueday(const int day, const int month, const int vg)
{
const int dayinmonthnv[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //массив количества дней в месяцах не високосного года
const int dayinmonthv[12] = {31,29,31,30,31,30,31,31,30,31,30,31}; //массив количества дней в месяцах високосного года
int m=month-1;
if (vg == 0)
{
if (day > dayinmonthnv[m]) return 0;
else return 1;
}
else
{
if (day > dayinmonthv[m]) return 0;
else return 1;
}
}
//Функция высчитывающая средний рост мужчин
float avgh(const Card *mas, const int n)
{
int j,countmen=0;
float hmen=0;
for (j=0; j<n; j++)
{
if (mas[j].sex == 'm')
{
hmen += mas[j].height;
countmen++;
}
}
if (countmen != 0) return hmen/countmen;
else return 0;
};
//Функция находящая номер карточки самой молодой женщины, чей рост превышает средний рост мужчин
int YoungWoman(const Card *mas, const int n, const int h)
{
unsigned long int minage;
int j,t=0,minn,i=n;
unsigned long int age[100];
for (j=0; j<100; j++) age[j]=0; //Заполняем массив возрастов нулями
for (j=0; j<n; j++) //Цикл заполняющий массив возрастов женщин чей рост превышает средний рост мужчин, значениями дат переведёнными в целые числа
{
if (mas[j].sex == 'm') continue; //Мужчин пропускаем
if (mas[j].height > h)
{
age[t]=mas[j].bd.year*10000+mas[j].bd.month*100+mas[j].bd.day; //Переводим дату рождения в целое число
t++;
}
}
if (age[0]!=0) //Если есть хоть одно выбранное значение, находим минимальное
{
minage=age[0];
minn = 0;
for (j=1; j<t; j++)
{
if (age[j]>minage)
{
minage = age[j];
minn = j;
}
}
}
else return i++; //Если подходящих женщин нет, выходим из функции возвращая значение подходящие для ошибки.
for (j=0; j<n; j++) //Повторное прохождение цикла с поиском номера карточки с минимальной датой рождения.
{
if (mas[j].sex == 'm') continue;
if (mas[j].height > h)
{
if (mas[j].bd.year*10000+mas[j].bd.month*100+mas[j].bd.day == minage) return j;
}
}
}
void errorF(char *ss) //Вспомогательная функция для ошибок
{cerr << "\nОшибка при открытии файла" << ' ' << ss << '\n';
exit(1);
}
int main()
{
const int n=100; //Размерность массива структур
int number,i=0,j=0,vg; //Счётчики, временные переменные
float h; //Переменная для роста
char str[64],answer;
Card human[n];//Массив структур
const int lenName = 50; //Массив имени файла
char fileName[lenName];
up: ; //Метка для выхода из цикла
while(1) //Бесконечный цикл
{
cout<<endl<<"=== МЕНЮ ПРОГРАММЫ ==="<<endl<<endl;
cout<<"1 - Загрузить данные из файла"<<endl;
cout<<"2 - Ввести данные"<<endl;
cout<<"3 - Анализ и вывод данных"<<endl;
cout<<"4 - Сохранить данные в файл"<<endl;
cout<<"5 - Выход из программы"<<endl;
cout <<endl<<"Введите номер пункта меню: ";
cin >> str;
switch (getnumber(str)) //Получение числа через функцию
{
case 1: { //Пункт меню №1. Чтение данных из файла
cout << "\nВведите имя файла: ";
cin >> fileName;
ifstream inFile (fileName); //Открытие потока для чтения файла
if (!inFile) errorF(fileName); //Сообщение об ошибке в случае невозможности открытия файла
j=i;
while(!inFile.eof()) //Заполнения массива через цикл, путём построкого чтения файла.
{
inFile >> human[j].surname >> human[j].name >> human[j].sex >> human[j].height >> human[j].bd.day >> human[j].bd.month >> human[j].bd.year;
j++;
}
system("clear"); //Очистка экрана через системную функцию
i=j-1; //Присваивание текущего индекса
break;
}
case 2: { do //Пункт меню №2, ввод данных
{
cout << "\nФамилия: ";
cin >> human[i].surname;
cout << "\nИмя: ";
cin >> human[i].name;
human[i].sex = getchar("\nПол (m - муж./w - жен.): ");
cout << "\nРост (в сантиметрах): ";
cin >> str;
human[i].height = getnumber(str);
while(1) //Бесконечный цикл да проверки правильности ввода даты
{
human[i].bd.day = truedate("\nДень рождения (дд): ", 1, 31);
human[i].bd.month = truedate("\nМесяц рождения (мм): ", 1, 12);
human[i].bd.year = truedate("\nГод рождения (гггг): ", 1901, 2010);
if(human[i].bd.year%4 != 0) //Остаток от деления на 4 для високосного года в указаном диапазоне должен равнятся 0, это достаточное условие
vg = 0;
else vg = 1;
if (trueday(human[i].bd.day, human[i].bd.month, vg) == 1) break;
else
{
cout << "\nДата введена не верно! Повторите ввод: "<<endl;
continue;
}
}
cout << "\nХотите продолжить? (y/n) ";
cin >> answer;
i++;
} while (answer != 'n' );
system("clear");
break;
}
case 3: { while(1) //Пункт меню №3, обработка запросов
{
if (i == 0) //Проверка ввода данных
{
cout << "\n*** Вы ещё не вводили данные! ***"<<endl;
goto up; //Переход к метке up.
}
else
cout << "\n+++ Выберите действие +++"; //Подменю пункта №2
cout << "\n\n 1 - Показать все данные";
cout << "\n 2 - Вычислить средний рост мужчин";
cout << "\n 3 - Найти самую молодой женщину, из тех, чей рост превосходит средний рост мужчин";
cout << "\n 4 - Вернуться в предыдущее меню";
cout << "\n\nВведите номер пункта меню: ";
cin >> str;
if (getnumber(str) == 1) //Вывод массива структур
{
for (j=0; j<i; j++)
{
cout << "\nФамилия: ";
cout << human[j].surname;
cout << "\nИмя: ";
cout << human[j].name;
cout << "\nПол: ";
if (human[j].sex == 'm') cout << "Мужской"; else cout << "Женский";
cout << "\nРост: ";
cout << human[j].height << " см";
cout << "\nДата рождения: ";
cout << human[j].bd.day;
cout << "."<<human[j].bd.month;
cout << "."<<human[j].bd.year<<endl;
}
}
else if (getnumber(str) == 2) //Подсчёт и вывод среднего роста мужчин
{
h = avgh(human, i);
if (h != 0) cout <<endl<< "Средний рост мужчин = "<<h<<endl;
else cout <<endl<< "*** Мужиков нет ***"<<endl;
}
else if (getnumber(str) == 3) //Поиск фамилии и имени самой молодой женщины, из тех, чей рост превосходит средний рост мужчин
{
for (j=0; j<i; j++) //Проверка наличия девушек
{
if (human[j].sex == 'm') number = 0;
else
{
number = 1;
break;
}
}
if (number == 0)
{
cout << "\nДевушек вообще нет :-(";
}
else //Если девушки есть, находим через функцию самую молодую из высоких
{
number = YoungWoman(human, i, avgh(human, i));
if (number != i) cout << "\nВысокая и молодая особа: "<<human[number].surname<<" "<<human[number].name<<endl;
else cout << "\nДевушка с заданными параметрами, не найдена"<<endl;
}
}
else if (getnumber(str) == 4) break; //Выход в родительское меню
else cout << "\nТакой пункт отсутствует";
}
system("clear");
break;
}
case 4: { //Пункт меню №4, сохранение в файл
cout << "\nВведите имя файла: ";
cin >> fileName;
ofstream outFile (fileName);
if (!outFile) errorF(fileName);
for (j=0; j<i; j++)
{
outFile << human[j].surname << ' ' << human[j].name << ' ' << human[j].sex << ' ' << human[j].height << ' ' << human[j].bd.day << ' ' << human[j].bd.month << ' ' << human[j].bd.year << '\n';
}
system("clear");
break;
}
case 5: cout << "\nВыход из программы"<<endl; exit(0); //Завершение программы
default: cout << "\nТакой пункт отсутствует"<<endl;
}
}
}
Размещено на Allbest.ru
Подобные документы
Описание структурного шаблона с именем ZNAK, содержащего элементы NAME, ZODIAC, BDAY. Операции со структурами в языке Си. Подключение графической библиотеки программы. Указатель как переменная, содержащая адрес некоторого объекта в памяти компьютера.
контрольная работа [342,9 K], добавлен 10.01.2012Исследование теоретических аспектов разработки программы посредством использования Visual Basic. Анализ достоинств и недостатков данного языка программирования. Изучение особенностей создания интерфейса приложения. Основные этапы реализации программы.
практическая работа [460,6 K], добавлен 22.01.2013Разработка блок-схемы и программы обработки одномерного массива с доступом к элементам с помощью индексов и с помощью указателей. Словесное описание алгоритма и пользовательского интерфейса, листинг программы обработки матрицы и результат её выполнения.
курсовая работа [391,1 K], добавлен 30.09.2013Создание программы визуализации методов сортировки массива, особенности и направления ее практического применения. Выбор и обоснование среды программирования. Разработка руководства пользователя. Листинг программы и оценка эффективности ее использования.
дипломная работа [1,0 M], добавлен 15.06.2014Разработка приложения "Ведомость начисления заработной платы" в среде программирования C++Builder. Алгоритм и сценарий работы программы. Проектирование интерфейса пользователя. Написание программных модулей и результаты тестирования данной программы.
курсовая работа [597,4 K], добавлен 31.01.2016Изучение особенностей растровых и векторных графических редакторов. Создание графического редактора: выбор языка программирования, разработка структуры программы и алгоритма работы. Описание интерфейса программы. Руководство программиста и пользователя.
курсовая работа [1,3 M], добавлен 28.07.2013Создание программы на языке программирования С#, которая проверяет наличие в матрице хотя бы одного столбца, содержащего положительный элемент, поиск его номера. Упорядочивание его элементов по возрастанию. Листинг программы и инструкция по работе с ней.
курсовая работа [1,9 M], добавлен 28.05.2014Разработка программы проверки знаний для тестирования студентов по программированию с кодом на языке Delphi. Проектирование визуального интерфейса и словесный алгоритм работы программы. Алгоритмы разработанных процедур и функций, инструкция пользователя.
курсовая работа [506,5 K], добавлен 21.02.2011Интерфейсные средства СУБД MS Access 2003. Проектирование схемы данных. Создание составного отчёта, содержащего диаграмму. Группировка и сортировка в отчётах. Использование языка программирования VBА, создание макросов. Разработка программы и функций.
курсовая работа [5,2 M], добавлен 20.06.2010Методика и технологический прием структурного программирования; построение алгоритма программы логической задачи в виде блок-схемы из структур "следование, ветвление, цикл"; кодирование текста программы, языки структурного программирования Паскаль и Си.
реферат [623,5 K], добавлен 25.03.2012