Разработка программы обработки массива структур средствами языка Си++

Изучение основ программирования на языке Си++, посредством создания программы обрабатывающей данные, хранимые в массиве структур. Создание структурного шаблона, содержащего фамилию, имя, пол, рост, дату рождения. Организация интерфейса пользователя.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.