Разработка сервисных программ для обслуживания администрации деканата, учебной части вуза, коменданта общежития, разных сфер быта
Разработка сервисных программ для обслуживания администрации деканата, учебной части вуза, коменданта общежития, разных сфер быта
1 МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ ХАРЬКОВСКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ РАДИОЭЛЕКТРОНИКИ Кафедра Информатики КУРСОВАЯ РАБОТА Тема: “Разработка сервисных программ для обслуживания администрации деканата, учебной части вуза, коменданта общежития, разных сфер быта” По дисциплине “Программирование” ПОЯСНИТЕЛЬНАЯ ЗАПИСКА Руководитель xxxxxx. Студент гр. xxxxxx xxxxxxx. Харьков 2008 СОДЕРЖАНИЕ Введение 1. Постановка задания и сфера ее использования 2. Теоретическая часть 3. Особенности работы в среде VisualC++ 4. Программная реализация 4.1. Описание алгоритма и структуры программы 4.2. Описание использованных программных средств 4.3. Описание разработанных функций 5. Инструкция пользователя Выводы Список использованной литературы Приложение А Текст программы РЕФЕРАТ Записка пояснительная к курсовой работе: 41 с., 9 рис,5 разделов, 1 приложение, 4 источника. Объект исследования- использования структур и строк в разработке баз данных. Цель работы - разработка программы для обслуживания деканата. Метод исследования - изучение литературы, составление и отладка программы на компьютере. Структуры и строки можно использовать для создания баз данных. В данном случае разработана программа для обслуживания деканата, представляющая собой базу данных и перечень запросов для обработки информации, содержащейся в этой базе. Наиболее удобным применением структур и строк является их применение в базах данных. Разработана программа, показывающая на практике возможности применения структур и строк. Программа написана на языке С++ в среде Visual C++. Основная цель данной курсовой работы- разработка сервисной программы для обслуживания деканата. Программа позволяет создать базу данных выбранного количества студентов и обращаться к базе по различным запросам, например, сортировка студентов по успеваемости, вывод на экран полной информации о студенте. СТРОКА, СТРУКТУРА, МАССИВ, ФУНКЦИЯ, ПАРАМЕТР, ОПЕРЕТОР,ТИП. ВВЕДЕНИЕ Компьютер -- это прибор, способный производить вычисления и принимать логические решения в миллионы или даже миллиарды раз быстрее человека. Например, многие из современных персональных компьютеров могут выполнять десятки миллионов операций сложения в секунду. Человеку, работающему с настольным калькулятором, потребовались бы десятилетия для того, чтобы завершить тот же самый объем вычислений, который мощный персональный компьютер выполняет за одну секунду. Сегодняшние самые быстрые суперкомпьютеры могут выполнять сотни миллиардов операций сложения в секунду -- это примерно столько же, сколько сотни тысяч людей могут выполнить за год. А в исследовательских лабораториях уже функционируют компьютеры с быстродействием в триллионы операций в секунду. Компьютеры обрабатывают данные под управлением наборов команд, называемых компьютерными программами. Эти компьютерные программы направляют действия компьютера посредством упорядоченных наборов действий, описанных людьми, называемыми компьютерными программистами. Разнообразные устройства (такие как клавиатура, экран, диски, память и процессорные блоки), входящие в состав компьютерной системы, называются аппаратными средствами. Компьютерные программы, исполняемые компьютером, называются программным обеспечением. Стоимость аппаратных средств в последние годы существенно снизилась и достигла уровня, когда персональные компьютеры превратились в предмет массового потребления. К сожалению, стоимость разработки программного обеспечения неуклонно росла, так как программисты создавали все более мощные и сложные прикладные программы, не имея средств улучшить технологию их разработки. В этой книге вы изучите апробированные методы создания программного обеспечения, которые могут снизить его стоимость -- структурное программирование, нисходящую пошаговую детализацию, функционализацию и объектно-ориентированное программирование. 1 ПОСТАНОВКА ЗАДАНИЯ Разработка сервисных программ, которые позволяют обрабатывать разнообразную информацию, например , для обслуживания администрации деканата, учебной части вуза, коменданта общежития, разных сфер быта. 2 ТЕОРЕТИЧЕСКАЯ ЧАСТЬ Структуры -- это составные типы данных, построенные с использованием других типов. Рассмотрим следующее определение структуры: struct Time { int hour; // 0-23 int minute; // 0-59 int second; // 0-59 }; Ключевое слово struct начинает определение структуры. Идентификатор Time -- тег (обозначение, имя-этикетка) структуры. Тэг структуры используется при объявлении переменных структур данного типа. В этом примере имя нового типа -- Time. Имена, объявленные в фигурных скобках описания структуры -- это элементы структуры. Элементы одной и той же структуры должны иметь уникальные имена, но две разные структуры могут содержать не конфликтующие элементы с одинаковыми именами. Каждое определение структуры должно заканчиваться точкой с запятой. Приведенное объяснение, как мы вскоре увидим, верно и для классов. Определение Time содержит три элемента типа int -- hour, minute и second (часы, минуты и секунды). Элементы структуры могут быть любого типа и одна структура может содержать элементы многих разных типов. Структура не может, однако, содержать экземпляры самой себя. Например, элемент типа Time не может быть объявлен в определении структуры Time. Однако, может быть включен указатель на другую структуру Time. Структура, содержащая элемент, который является указателем на такой же структурный тип, называ¬ется структурой с самоадресацией. Структуры с самоадресацией полезны для формирования связных структур данных (см. главу 15). Предыдущее определение структуры данных не резервирует никакого пространства в памяти; определение только создает новый тип данных, ко¬торый используется для объявления переменных. Переменные структуры объ¬являются так же, как переменные других типов. Объявление Time timeObject, timeArray[10], *timePtr; объявляет timeObject переменной типа Time, timeArray -- массивом с 10 элементами типа Time, a timePtr -- указателем на объект типа Time. Доступ к элементам структуры Для доступа к элементам структуры (или класса) используются операции доступа к элементам -- операция точка (.) и операция стрелка (->). Операция точка обращается к элементу структуры (или класса) по имени переменной объекта или по ссылке на объект. Например, чтобы напечатать элемент hour структуры timeObject используется оператор cout « timeObject.hour; Операция стрелка, состоящая из знака минус (-) и знака больше (>), записанных без пробела, обеспечивает доступ к элементу структуры (или класса) через указатель на объект. Допустим, что указатель timePtr был уже объявлен как указывающий на объект типа Time и что адрес структуры timeObject был уже присвоен timePtr. Тогда, чтобы напечатать элемент hour структуры timeObject с указателем timePtr, можно использовать оператор cout « timePtr->hour; Выражение timePtr->hour; эквивалентно (*timePtr).hour, которое разы¬меновывает указатель и делает доступным элемент hour через операцию точка. Скобки нужны здесь потому, что операция точка имеет более высокий приоритет, чем операция разыменования указателя (*). Операции стрелка и точка наряду с круглыми и квадратными скобками имеют второй наивысший приоритет (после операции разрешения области действия, введенной в главе 3) и ассоциативность слева направо.2 Использование определенного пользователем типа Time с помощью Struct Программа на рис. 6.1 создает определенный пользователем тип структуры Time с тремя целыми элементами: hour, minute и second. Программа опреде¬ляет единственную структуру типа Time, названную dinnerTime, и использует операцию точка для присвоения элементам структуры начальных значений 18 для hour, 30 для minute и О для second. Затем программа печатает время в военном (24-часовом) и стандартном (12-часовом) форматах. Заметим, что функции печати принимают ссылки на постоянные структуры типа Time. Это является причиной того, что структуры Time передаются печатающим функ¬циям по ссылке -- этим исключаются накладные расходы на копирование, связанные с передачей структур функциям по значению, а использование const предотвращает изменение структуры типа Time функциями печати. В главе 7 мы обсудим объекты const и функции-элементы const. Существуют препятствия созданию новых типов данных указанным спо¬собом с помощью структур. Поскольку инициализация структур специально не требуется, можно иметь данные без начальных значений и вытекающие отсюда проблемы. Даже если данные получили начальные значения, воз¬можно, это было сделано неверно. Неправильные значения могут быть при¬своены элементам структуры (как мы сделали на рис. 6.1), потому что про¬грамма имеет прямой доступ к данным. Программа присвоила плохие значения всем трем элементам объекта dinnerTime типа Time. Если реали¬зация struct изменится (например, время теперь будет представляется какчисло секунд после полуночи), то все программы, которые используют struct, нужно будет изменить. Не существует никакого «интерфейса», гарантирую¬щего, что программист правильно использует тип данных и что данные яв¬ляются непротиворечивыми. // FIG6_1.CPP // Создание структуры, задание и печать ее элементов. #include <iostream.h> struct Time { int hour; int minute; int second; //определение структуры // 0-23 // 0-59 // 0-59 void printMilitary(const Time &); void printStandard(const Time S) ; // прототип // прототип main () { Time _олее_нный; // переменная нового типа Time // задание элементам правильных значения _олее_нный.hour = 18; _олее_нный.minute = 30; _олее_нный.second = 0; cout « “Обед состоится в “; printMilitary(_олее_нный) ; cout « « по военному времени,» « endl « «что соответствует «; printStandard(dinnerTime); cout « « по стандартному времени.» « endl; // задание элементам неправильных значений dinnerTime.hour = 29; dinnerTime.minute = 73; dinnerTime.second = 103; cout « endl « «Время с неправильными значениями: «; printMilitary (_олее_нный); cout « endl; return 0; Существуют и другие проблемы, связанные со структурами в стиле С. В С структуры не могут быть напечатаны как единое целое, только по одному элементу с соответствующим форматированием каждого. Для печати элементов структуры в каком-либо подходящем формате должна быть написана функция. Глава 8, «Перегрузка операций» покажет, как перегрузить операцию «, чтобы предоставить возможность простой печати объектов типа структура (C++ расширяет понятие структуры) или типа класс. В С структуры нельзя сравнивать в целом; их нужно сравнивать элемент за элементом. Глава 8 покажет, как перегрузить операции проверки равенства и отношения, чтобы можно было в Си++ сравнивать объекты типов структура и класс. В следующем разделе мы вновь использует нашу структуру Time, но уже как класс, и продемонстрируем некоторые преимущества создания таких так называемых абстрактных типов данных, как классы. Мы увидим, что классы и структуры в C++ можно использовать почти одинаково. Различие между ними состоит в доступности по умолчанию элементов каждого из этих типов. Это будет более детально объяснено позже. 2.1 Работа со строками в С++Очень часто, на практике, приходится сталкиваться с задачами, которые сводятся к работе над строками. Вы уже знаете, что язык С++ не поддерживает отдельный строковый тип данных. Строка в С++ - это массив символов, оканчивающийся нулевым символом ('\0'). Таким образом, можно определить строки двумя способами: как массив символов или как указатель на первый символ строки, например: char str1[10] = «string1»; // объявление строки с помощью массива символов Итак, теперь подробнее. Вы уже знаете, что массив - это набор однородных значений. Так вот строка есть не что иное, как набор символов, и, соответственно, для хранения строк можно использовать символьные массивы. Например, строка «QWERTY» _олее тип char[7], а пустая строка «» имеет тип char[1]. Почему char[1]? Именно потому, что любая строка завершается так называемым нулевым символом, то есть символом, код которого в ASCII-таблице равен 0 (этот символ также является escape-символом и его символьный эквивалент представляется как '\0'). Благодаря этому свойству Вы всегда можете определить конец строки, если у Вас строка занимает меньшее количество символов, чем то количество, которое было указано в квадратных скобках при оъявлении массива, т.е. определить фактическую длину строки, хранящейся в массиве. Одна из замечательных особенностей при работе со строками - это возможность упрощенной начальной инициализации. Например, Объявление char str[] = «ABCDE»; присваивает переменной-строке начальное значение «ABCDE». А точнее, создает массив из 6 символов: 'A','B','C','D','E' и символа '\0'. Как видите начальная инициализация символьного массива действительно отличается от инициализации какого-либо другого массива - можно просто присвоить необходимую строку имени массива с пустыми квадратными скобками. С++ сам подсчитает длину строки и выделит соответствующий объем памяти под массив для размещения в нем требуемой строки. Сразу необходимо отметить, что С++ сам автоматически сделает последний элемент массива нулевым символом (а Вы уже помните, что любая строка обязательно заканчивается нулевым символом), то есть, хотя в данном случае Вы массиву str присваиваете строку «ABCDE», длина которой составляет 5 символов, C++ выделяет память под 6 символов, записывает туда строку и затем в последний (пятый при счете от 0) записывает нулевой символ. Следует также отметить, что при начальной инициализации символьного массива (как и любого другого) можно указывать в квадратных скобках его размер с целью дальнейшего использования массива еще для каких-либо целей (например, для хранения другой какой-либо строки): Объявление char str[10] = «ABCDE»; создает массив из 10 символов и первые пять элементов этого массива принимают значения 'A','B','C','D' и 'E' соответственно, остальные символы будут ноль-символы. В данном случае в первые 5 элементов массива записывается строка «ABCDE», а всем остальным элементам присваиваются нули. Для начальной инициализации символьного массива можно использовать правила инициализации произвольного массива, то есть используя фигурные скобки, только в данном случае придется явно указывать нулевой символ, которым заканчивается строка. Давайте рассмотрим предшествующий пример с использованием общих правил начальной инициализации массива. Char str[]={`A','B','C','D','E','\0'}; Как видите ******** вариант начальной инициализации строкового массива значительно проще и удобнее, но еще раз отметим, что его можно использовать только для символьных массивов. Типичная ошибка программирования. Не выделяется достаточно места в массиве символов для хранения нулевого символа, завершающего строку. Типичная ошибка программирования. Создание или использование «строки», которая не содержит завершающего нулевого символа. Типичная ошибка программирования. Путают символьные и строковые константы. Символьная константа - это один символ, заключенный в апострофы, например: 'A' или '\n'. Строковая константа - это последовательность символов, заключенная в двойные кавычки. В числе символов строки могут находится любые символьные константы, например, «Visual C++\n» состоит из следующих символов: 'V', 'i', 's', 'u', 'a', 'l', ' ', 'C', '+', '+', '\n', '\0'. Таким образом, «A» - это строковая константа и состоит из двух символов: 'A' и '\0'. Соседние строковые константы транслятором «склеиваются», например: «АБВ» «ГДЕ» означает то же, что «АБВГДЕ». Рассмотрим небольшой пример: //Задана строка, скопировать ее в символьный массив. #include<iostream.h> void main() { char str1 [ ] = «1234567890», /* объявляем символьный массив str1 и инициализируем его */ str2[11]; // объявляем символьный массив без инициализации /* в цикле пока не встретится конец строки присваиваем текущему элементу массива str2 символ из массива str1 */ for(int I = 0; str1[i] != `\0'; i++) str2[i] = str1[i]; // копируем ноль-символ в str2. Str2 [i] = '\0'; cout << str2 << '\n'; // вывод строки на экран } Обратите внимание, выход из цикла происходит, когда str1[i] равно ноль-символу, т.е. ноль-символ не копируется в str2, следовательно это нужно сделать за циклом. Еще одна особенность работы с символьными массивами - если элементы произвольного массива можно вводить с клавиатура и выводить на экран только по одному элементу в цикле, то в символьный массив можно ввести сразу всю строку, используя оператор ввода cin >> Имя_массива; и, аналогичным образом, вывести сразу всю строку на экран, используя оператор вывода cout << Имя_массива; Следует сразу отметить, что при вводе с клавиатуры строки оператор cin автоматически добавляет в конец строки нулевой символ, так что Вы должны учитывать этот факт при указании количества элементов при объявлении массива. Например, #include <iostream.h> void main() { char str[31]; // объявление символьного массива cout<<”Enter a string (max 30 symbols):”; cin>>str; // ввод строки cout<<”\nYou enter string:”<<str; // вывод строки } Как видите в данном примере выделяется память под 31 символ, но пользователю в приглашении указывается, что он может ввести строку с размером максимум 30 символов, учитывая тот факт, что оператор cin добавит еще один нулевой символ в конец строки автоматически, и под него также необходимо предусмотреть выделение памяти. Далее после приглашения вводим сразу всю строку с клавиатуры в массив и затем с соответствующим сообщением выводим всю строку на экран монитора. Второй способ определения строки - это использование указателя на символ. Объявление char *b; задает переменную b, которая может содержать адрес некоторого объекта. Однако в данном случае компилятор не резервирует место для хранения символов и не инициализирует переменную b конкретным значением. Сделать это можно, например, присвоив b указатель на уже существующий символьный массив, или динамически выделить память под новый массив. Например, #include<iostream.h> void main() { char str[] = «Здравствуй, мир!»; // объявляем символьный массив char *b; // объявляем указатель на символ b = &str[12]; // теперь b указывает на 12-ый символ str *b = 'M'; // присваиваем первому элементу b символ 'М' cout << b; // выводим строку b на экран (Мир!) } 3. ОСОБЕННОСТИ РАБОТЫ В Visual C++ Visual C++-- это инструмент профессионального программирования в среде Windows. Основная сила пакета - исспользование библиотеки классов. Специальные программы -мастера пишут за пользователя значительную часть проекта - программы. Интегрированая среда Visual C++ дает возможность писать и выполнять сложные программы . Программа в этой среде -- это проект, который состоит из набора файлов, расположенных в рабочих областях. В среде можно также реализовать обычные ( без исспользования стандартных классов) программы на языке С++ . Для этого исспользуется консольный режим. 4 ПРОГРАММНАЯ РЕАЛИЗАЦИЯ 4.1 Описание алгоритма и структуры программы В данной программе были использованы структуры и строки, а также функции из библиотеки обработки строк. Также был использован алгоритм сортировки ( в данном случае сортировка по успеваемости). Программа создает два массива, где каждый элемент массива является структурой с информацией о студенте. В первом массиве, где каждый элемент является структурой с названием «predmety» содержится название предметов по которым студент получил оценки (названия предметов вводятся с клавиатуры). Каждый элемент массива содержит отдельную структуру типа «predmety» Во втором массиве содержится информация о студенте: фамилия, имя , отчество, год, месяц, день рождения, бюджет или контракт, номер телефона, адрес проживания, и массив чисел с оценками по предметам. Программа может выполнять 8 различных действий с данными. 4.2 Описание использованных программных средств Функции работы со строками из библиотеки обработки строкВ этом разделе мы познакомимся с некоторыми типичными функциями стандартной библиотеки string.h. Это библиотека обработки строк, которая обеспечивает много полезных функций для работы со строковыми данными, например, сравнение строк, поиск в строках символов и других подстрок, разметку строк (разделение строк на логические куски) и определение длины строки. 1. Функция int strlen (const char* s); - определяет длину строки s. Возвращает количество символов, предшествующих завершающему нулевому символу. Обратите внимание, завершающий ноль-символ в длину не включается. Например, 2. cout << strlen(«Hello!»); // на экране будет 6 3. 4. char *str = «one»; 5. cout << strlen(str); // на экране будет 3 6. Функция char *strcpy(char *s1, const char *s2); - копирует строку s2 в массив символов s1. Возвращает значение s1. Массив символов s1 должен быть достаточно большим, чтобы хранить строку и ее завершающий нулевой символ, который также копируется. Например, 7. char str[25]; // объявляем символьный массив из 25 элементов 8. char *ps = new char [25]; /* объявляем указатель на символ и 9. динамически выделяем память под 25 символов */ 10. 11. strcpy(str, «ABCDE»); // копируем в str строковыю константу «ABCDE» 12. cout << str; // выводим str на экран. На экране будет ABCDE 13. 14. strcpy(ps, «QWERTY»); // копируем в ps строковыю константу «QWERTY» 15. cout << ps; // выводим ps на экран. На экране будет QWERTY 16. 17. delete[] ps; // освобождаем память Обратите внимание, если Вы хотите, чтобы одна строка содержала другую, Вы должны скопировать ее содержимое, а не присвоить! Так, например, в данном случае инструкция ps = «QWERTY» была бы ошибочна. Компилятор, встречая такую инструкцию, создают строку «QWERTY», за которой следует нулевой символ и присваивает значение начального адреса этой строки (адреса символа Q) переменной ps. Таким образом, теряется исходное значение ps, а значит невозможно корректно освободить память под ps. 18. Функция int *strcmp(const char *s1, const char *s2); - сравнивает строки s1 и s2 (по ASCII-кодам). Функция возвращает значение 0, если строки s1 и s2 равны, значение меньше ноля, если строка s1 меньше s2, и значение больше ноля, если s1 больше s2. Обратите внимание, строки сравниваются не по длине, а посимвольно, по ASCII-кодам ( т.е. «g» больше «ff»). Например, 19. cout << strcmp(«compare», «string»); /* на экране будет -1, поскольку 20. «compare» меньше «string» */ 21. 22. cout << strcmp(«abcde», «abc»); /* на экране будет 1, поскольку 23. «abcde» больше «abc» */ 24. cout << strcmp(«one», «one»); /* на экране будет 0, поскольку 25. строки равны */ 26. Функция char *strcat(char *s1, const char *s2); - добавляет строку s2 к строке s1. Первый символ строки s2 записывается поверх ноль-символа строки s1. Возвращает s1. Под s1 должно быть выделено памяти не меньше чем (strlen(s1)+strlen(s2)+1). Например, 27. char st1[25] = «День»; cout << strcat(st1, « добрый!»); // на экране будет День добрый! 28. Функция char *strncpy(char *s1, const char *s2, int n); - копирует не _олее n символов строки s2 в массив символов s1. Возвращает s1. 29. Функция char *strncmp(char *s1, const char *s2, int n); - сравнивает до n символов строки s1 со строкой s2. Возвращает 0, меньше, чем 0 или больше, чем 0, если s1 соответственно равн, меньше или больше s2. 30. Функция char *strncat(char *s1, const char *s2, int n); - присоединяет первые n символов строки s2 в строку s1. Возвращает s1. 31. Функция char *strchr(const char *s, int c); - проверяет строку s на содержание символа хранящегося в c. Результатом функции является адрес первого вхождения символа c в строку s. Если символ не найден, возващается NULL. Например, 32. char str[20] = «ABCDEXYZ»; cout << strchr(str, 'X'); // на экране будет XYZ или char str[20] = «ABCDEXYZ»; if (strchr(str, 'q') == NULL) cout << «Нет такого символа!»; 33. Функция char *strstr(const char *s1, const char *s2); - проверяет строку s1 на содержание подстроки s2. Результатом функции является адрес первого вхождения подстроки s2 в строку s1. Если подстрока не найдена, возващается NULL. Например, 34. char str[20] = «ABCDEXYZ»; 35. char *ps = strstr(str, “DEX”); 36. if (ps != NULL) 37. cout << ps; 38. else 39. cout << «Нет такой подстроки!»; 40. // На экране будет DEXYZ 41. Функция char *strlwr(char *s); - конвертирует строку к нижнему регистру (т.е. переводит строку в строчные символы). Например, 42. char str[30] = “ABCDE_123_ijk_XYZ”; 43. cout << strlwr(str); 44. // на экране будет abcde_123_ijk_xyz 45. Функция char *strupr(char *s); - конвертирует строку к верхнему регистру (т.е. переводит строку в прописные символы). 46. Функция char *strset(char *s, int ch); - заменяет ВСЕ символы в строке s на символ ch. Например, 47. char str[30] = «ABCDE»; cout << strset(str, 'x'); // на экране будет xxxxx 48. Функция char *strnset(char *s, int ch, int n); - заменяет первые n символов в строке s на символ ch. 49. Функция char *strrev(char *s); - меняет порядок следования символов в строке на противоположный (меняет первый символ с последним, второй символ с предпоследним и т.д.). Например, 50. char str[30] = «12345»; cout << strrev(str); // на экране будет 54321 4.1.3 Описание разработанных функций Сортировка студентов по успеваемости. Алгоритм Из элемента массива типа student котрый содержит в себе массив с оценками ball с помощью функции sortirovka находится средний балл (сумма балов по предметам делится на количество предметов). Затем этот балл в зависимости от балла пишется список студентов имеющих разные средние баллы. void one (student student1[100])//функция первого пункта меню { for (i=0;i<kolvo_student;i++) { if ((base[i].srednyi_ball>=0)&&(base[i].srednyi_ball<=60)) { cout<<"\n ---------------------------------------------------------------"; cout<<"\n studenty imeyshie sredniy ball nizhe 60:"; cout<<"\n ---------------------------------------------------------------"; cout<<endl; cout<<student1[i].familia<<" "; cout<<student1[i].imya<<" "; cout<<student1[i].otchestvo<<" "; cout<<"srednyi ball:"<<base[i].srednyi_ball<<endl; cout<<"\n ---------------------------------------------------------------"; } if ((base[i].srednyi_ball>=60)&&(base[i].srednyi_ball<=75)) { cout<<"\n ---------------------------------------------------------------"; cout<<"\n studenty imeyshie sredniy ball bolshe 60 i nizhe 75:"; cout<<"\n ---------------------------------------------------------------"; cout<<endl; cout<<student1[i].familia<<endl; cout<<student1[i].imya<<endl; cout<<student1[i].otchestvo<<endl; cout<<"srednyi ball:"<<base[i].srednyi_ball<<endl; cout<<"\n ---------------------------------------------------------------"; } if ((base[i].srednyi_ball>=75)&&(base[i].srednyi_ball<=90)) { cout<<"\n ---------------------------------------------------------------"; cout<<"\n studenty imeyshie sredniy ball bolshe 75 i nizhe 90:"; cout<<"\n ---------------------------------------------------------------"; cout<<endl; cout<<student1[i].familia<<endl; cout<<student1[i].imya<<endl; cout<<student1[i].otchestvo<<endl; cout<<"srednyi ball:"<<base[i].srednyi_ball<<endl; cout<<"\n ---------------------------------------------------------------"; } if ((base[i].srednyi_ball>=90)&&(base[i].srednyi_ball<=100)) { cout<<"\n ---------------------------------------------------------------"; cout<<"\n studenty imeyshie sredniy ball bolshe 90 nizhe 100:"; cout<<"\n ---------------------------------------------------------------"; cout<<endl; cout<<student1[i].familia<<endl; cout<<student1[i].imya<<endl; cout<<student1[i].otchestvo<<endl; cout<<"srednyi ball:"<<base[i].srednyi_ball<<endl; cout<<"\n ---------------------------------------------------------------"; } } k++; } Вот функция для нахождения среднего балла float sortirovka(int ball[100], int kolvo_predmetov) { float sum=0; for (int i=0;i<kolvo_predmetov;i++) { sum+=ball[i];//Сумма баллов по предметам } return sum/kolvo_predmetov;//Возврат среднего балла } Рисунок 1 - работа 1 пункта меню 4.1.2 Вывод таблицы успеваемости студента по предметам Алгоритм Для выполнения данного пункта меня было создано три строки. В эти строки пользователь вносит данные о студенте таблицу успеваемости которого он хочет получить char familia[30]; char imya[30]; char otchestvo[30]; Далее эти строки с помощью функции strcmp сравнивает введенные данные с уже существующими. Если во всех 3 случаях функция возвращает 0, то выводится таблица успеваемости студента. void two(student student1[100],predmety predmety1[100]) { char familia[30]; char imya[30]; char otchestvo[30]; cout<<"\n vvedite familiy stydenta :"; cin>>familia; cout<<"\n vvedite imya studenta:"; cin>>imya; cout<<"\n vvedite otchestvo studenta:"; cin>>otchestvo; for (i=0;i<kolvo_student;i++) { if ((strcmp(familia,student1[i].familia)==NULL)&&(strcmp(imya,student1[i].imya)==NULL)&&(strcmp(otchestvo,student1[i].otchestvo)==NULL)) { cout<<"\n Ocenki studenta:"<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo; cout<<endl; for (j=0;j<kolvo_predmetov;j++) for (k=0;k<kolvo_predmetov;k++) { cout<<predmety1[j].nazvanie_predmeta; cout<<" ocenka:"<<student1[i].ball[k]; cout<<endl; j++; } } } } Рисунок 2- работа 2 пункта меню 4.1.3 Вывод списка иногородних студентов . Алгоритм Вводится название города, где находится институт. Затем с помощью функции strcmp программа сравнивает поле char gorod[30]; каждого элемента массива типа student с введенным названием города если функция возвращает не 0, то выводится имя, фамилия, отчество иногородних студентов и результат счетчика их количества. void three(student student1[100]) { int inogorodnie=0; char gorod[20]; cout<<"\n vvedite nazvani goroda gde naxoditsya instityt:"; cin>>gorod; cout<<"\n inogorodnie studenty:"; for (i=0;i<kolvo_student;i++) { if (strcmp(gorod,student1[i].gorod)!=0) { cout<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo<<endl; inogorodnie++; } } cout<<"\n colichestvo inogorodnyx stydentov:"<<inogorodnie; } Рисунок 3-работа 3 пункта меню 4.1.4 Вывод списка городских студентов Алгоритм Вводится название города, где находится институт. Затем с помощью функции strcmp программа сравнивает поле char gorod[30]; каждого элемента массива типа student с введенным названием города если функция возвращает 0, то выводится имя, фамилия, отчество городских студентов и результат счетчика их количества. void four(student student1[100]) { int gorodskie=0; char gorod[20]; cout<<"\n vvedite nazvani goroda gde naxoditsya instityt:"; cin>>gorod; cout<<"\n inogorodnie studenty:"; for (i=0;i<kolvo_student;i++) { if (strcmp(gorod,student1[i].gorod)==0) { cout<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo<<endl; gorodskie++; } } cout<<"\n colichestvo gorodskix stydentov:"<<gorodskie; } Рисунок 4-работа 4 пункта меню 4.1.5 Вывод количества бюджетников. Алгоритм При вводе информации о студентах программа требовала ввести 0, если контрактник и 1- если бюджетник. В данном пункте меню если элемент массива student с полем int budzhet_ili_contract; содержит 1 , то на экран выводится имя, фамилия, отчество студентов бюджетников,а также их количество. void five(student student1[100]) { cout<<"\n budzhetniki:"<<endl; int budzhet=0; for (i=0;i<kolvo_student;i++) { if(student1[i].budzhet_ili_contract==1) { cout<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo<<endl; budzhet++;} } cout<<"\n colichestvo budzhetnicow:"<<budzhet; } Рисунок 5-работа 5 пункта меню 4.1.6 Вывод количества контрактников Алгоритм При вводе информации о студентах программа требовала ввести 0, если контрактник и 1- если бюджетник. В данном пункте меню если элемент массива student с полем int budzhet_ili_contract; содержит 0 , то на экран выводится имя, фамилия, отчество студентов бюджетников,а также их количество. void six(student student1[100]) { cout<<"\n kontraktnici:"<<endl; int contract=0; for (i=0;i<kolvo_student;i++) { if(student1[i].budzhet_ili_contract==0) { cout<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo<<endl; contract++; } } cout<<"\n colichestvo kontraktnikow:"<<contract; } Рисунок 6-работа 6 пункта меню 4.1.7 Вывод студентов одного года рождения Алгоритм Программа в данном пункте меню сравнивает поле int god_rozhdenia ; каждого элемента массива student с таким же полем следующего элемента меню. Если они равны, то выводится их фамилии имена и отчества. void seven(student student1[100]) { cout<<"\n spisok studentov odnogo goda rozhdenia:"; for (i=0;i<kolvo_student;i++) { if (student1[i].god_rozhdenia==student1[i+1].god_rozhdenia) { cout<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo<<endl; cout<<student1[i+1].familia<<" "<<student1[i+1].imya<<" "<<student1[i+1].otchestvo; cout<<endl; } } } Рисунок 7-работа 7 пункта меню 4.1.8 Поиск студента в базе и вывод полной информации о нем. Алгоритм Для работы данного пункта необходимо ввести фамилию, имя, отчество искомого студента. Для этого предназначены строки char familia1[30]; char imya1[30]; char otchestvo1[30]; Далее программа сравнивает эти строки с помощью функции strcmp с элементами массива student . Если во всех трех случаях функция возвращает 0, то выводится полностью элемент массива, которым является структура с данными об одном студенте. Иначе программа выводит сообщение об отсутствии такого студента. void eight(student student1[100],predmety predmety1[100]) { char familia1[30]; char imya1[30]; char otchestvo1[30]; cout<<"\n vvedite familiy stydenta :"; cin>>familia1; cout<<"\n vvedite imya studenta:"; cin>>imya1; cout<<"\n vvedite otchestvo studenta:"; cin>>otchestvo1; for (i=0;i<kolvo_student;i++) { if ((strcmp(familia1,student1[i].familia)==0)&&(strcmp(imya1,student1[i].imya)==0)&&(strcmp(otchestvo1,student1[i].otchestvo)==0)) { cout<<"\n familia: "; cout<<student1[i].familia; cout<<"\n imya:"; cout<<student1[i].imya; cout<<"\n otchestvo:"; cout<<student1[i].otchestvo; cout<<"\n god_rozhdenia:"; cout<<student1[i].god_rozhdenia; cout<<"\n mesyac_rozhdenia:"; cout<<student1[i].mesyac_rozhdenia; cout<<"\n den_roshdenia:"; cout<<student1[i].den_roshdenia; cout<<"\n budzhet_ili_contract:"; if (student1[i].budzhet_ili_contract==1) { cout<<"\n budzhetnic"; } else if (student1[i].budzhet_ili_contract==0) {cout<<"\n contractnic"; } cout<<"\n nomer_telefona:"; cout<<student1[i].nomer_telefona; cout<<"\n strana:"; cout<<student1[i].strana; cout<<"\n gorod:"; cout<<student1[i].gorod; cout<<"\n ylica:"; cout<<student1[i].ylica; cout<<"\n dom(chislom):"; cout<<student1[i].dom; cout<<"\n nomer_kvartiry:"; cout<<student1[i].nomer_kvartiry; cout<<"\n Ocenki studenta:"<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo; cout<<endl; for (j=0;j<kolvo_predmetov;j++) for (k=0;k<kolvo_predmetov;k++) { cout<<predmety1[j].nazvanie_predmeta; cout<<" ocenka:"<<student1[i].ball[k]; cout<<endl; j++; } } else { cout<<endl<<"\n takogo stydenta net v baze"; }} } Рисунок 8-работа 8 пункта меню 5 ИНСТРУКЦИЯ ПОЛЬЗОВАТЕЛЯ Данная программа предназначена для создания базы данных с информацией о студентах. Программа состоит из одного файла с названием base.exe. Требования к ресурсам : CPU 1.00 GHz Оперативная память: 256 МБ Операционная система: Windows 95 выше Вывод Программа полностью выполняет все пункты меню Рисунок 1 -работа программы СПИСОК ИССПОЛЬЗОВАНОЙ ЛИТЕРАТУРЫ 1. Страуструп Б. Язык программирования С++. Часть 1. -- Киев: "ДиаСофт", 1993. -- 264 с. 2. Страуструп Б. Язык программирования С++. Часть 2. -- Киев: "ДиаСофт", 1993. -- 296 с. 3. Х.М.Дейтел, П.Дж. Дейтел Как программировать на С++.- М.:ЗАО «Издательство БИНОМ», 2000 г. -- 1024 с. 4. Глушаков С.В. и др. Язык программирования С++. --Харьков: Фолио, 2002. -- 500 с. ПРИЛОЖЕНИЕ А ТЕКСТ ПРОГРАММЫ #include <iostream.h> #include <conio.h> #include <string.h> int punkt; int i,j,k; int budzhet=0; int contract=0; int kolvo_predmetov; int kolvo_student; struct predmety { char nazvanie_predmeta[50]; }; struct student { char familia [30]; char imya [30]; char otchestvo [30]; int god_rozhdenia ; int mesyac_rozhdenia ; int den_roshdenia; int budzhet_ili_contract; int nomer_telefona; char strana[40]; char gorod[30]; char ylica[40]; int ball[100]; int dom; int nomer_kvartiry; int srednyi_ball; }; student base[100]; student *student1=base; predmety ocenki[100]; predmety *predmety1=ocenki; float sortirovka(int ball[100], int kolvo_predmetov) { float sum=0; for (int i=0;i<kolvo_predmetov;i++) { sum+=ball[i]; } return sum/kolvo_predmetov; } void one (student student1[100]) { for (i=0;i<kolvo_student;i++) { if ((base[i].srednyi_ball>=0)&&(base[i].srednyi_ball<=60)) { cout<<"\n ---------------------------------------------------------------"; cout<<"\n studenty imeyshie sredniy ball nizhe 60:"; cout<<"\n ---------------------------------------------------------------"; cout<<endl; cout<<student1[i].familia<<" "; cout<<student1[i].imya<<" "; cout<<student1[i].otchestvo<<" "; cout<<"srednyi ball:"<<base[i].srednyi_ball<<endl; cout<<"\n ---------------------------------------------------------------"; } if ((base[i].srednyi_ball>=60)&&(base[i].srednyi_ball<=75)) { cout<<"\n ---------------------------------------------------------------"; cout<<"\n studenty imeyshie sredniy ball bolshe 60 i nizhe 75:"; cout<<"\n ---------------------------------------------------------------"; cout<<endl; cout<<student1[i].familia<<endl; cout<<student1[i].imya<<endl; cout<<student1[i].otchestvo<<endl; cout<<"srednyi ball:"<<base[i].srednyi_ball<<endl; cout<<"\n ---------------------------------------------------------------"; } if ((base[i].srednyi_ball>=75)&&(base[i].srednyi_ball<=90)) { cout<<"\n ---------------------------------------------------------------"; cout<<"\n studenty imeyshie sredniy ball bolshe 75 i nizhe 90:"; cout<<"\n ---------------------------------------------------------------"; cout<<endl; cout<<student1[i].familia<<endl; cout<<student1[i].imya<<endl; cout<<student1[i].otchestvo<<endl; cout<<"srednyi ball:"<<base[i].srednyi_ball<<endl; cout<<"\n ---------------------------------------------------------------"; } if ((base[i].srednyi_ball>=90)&&(base[i].srednyi_ball<=100)) { cout<<"\n ---------------------------------------------------------------"; cout<<"\n studenty imeyshie sredniy ball bolshe 90 nizhe 100:"; cout<<"\n ---------------------------------------------------------------"; cout<<endl; cout<<student1[i].familia<<endl; cout<<student1[i].imya<<endl; cout<<student1[i].otchestvo<<endl; cout<<"srednyi ball:"<<base[i].srednyi_ball<<endl; cout<<"\n ---------------------------------------------------------------"; } } k++; } void two(student student1[100],predmety predmety1[100]) { char familia[30]; char imya[30]; char otchestvo[30]; cout<<"\n vvedite familiy stydenta :"; cin>>familia; cout<<"\n vvedite imya studenta:"; cin>>imya; cout<<"\n vvedite otchestvo studenta:"; cin>>otchestvo; for (i=0;i<kolvo_student;i++) { if ((strcmp(familia,student1[i].familia)==NULL)&&(strcmp(imya,student1[i].imya)==NULL)&&(strcmp(otchestvo,student1[i].otchestvo)==NULL)) { cout<<"\n Ocenki studenta:"<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo; cout<<endl; for (j=0;j<kolvo_predmetov;j++) for (k=0;k<kolvo_predmetov;k++) { cout<<predmety1[j].nazvanie_predmeta; cout<<" ocenka:"<<student1[i].ball[k]; cout<<endl; j++; } } } } void three(student student1[100]) { int inogorodnie=0; char gorod[20]; cout<<"\n vvedite nazvani goroda gde naxoditsya instityt:"; cin>>gorod; cout<<"\n inogorodnie studenty:"; for (i=0;i<kolvo_student;i++) { if (strcmp(gorod,student1[i].gorod)!=0) { cout<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo<<endl; inogorodnie++; } } cout<<"\n colichestvo inogorodnyx stydentov:"<<inogorodnie; } void four(student student1[100]) { int gorodskie=0; char gorod[20]; cout<<"\n vvedite nazvani goroda gde naxoditsya instityt:"; cin>>gorod; cout<<"\n inogorodnie studenty:"; for (i=0;i<kolvo_student;i++) { if (strcmp(gorod,student1[i].gorod)==0) { cout<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo<<endl; gorodskie++; } } cout<<"\n colichestvo gorodskix stydentov:"<<gorodskie; } void five(student student1[100]) { cout<<"\n budzhetniki:"<<endl; int budzhet=0; for (i=0;i<kolvo_student;i++) { if(student1[i].budzhet_ili_contract==1) { cout<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo<<endl; budzhet++;} } cout<<"\n colichestvo budzhetnicow:"<<budzhet; } void six(student student1[100]) { cout<<"\n kontraktnici:"<<endl; int contract=0; for (i=0;i<kolvo_student;i++) { if(student1[i].budzhet_ili_contract==0) { cout<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo<<endl; contract++; } } cout<<"\n colichestvo kontraktnikow:"<<contract; } void seven(student student1[100]) { cout<<"\n spisok studentov odnogo goda rozhdenia:"; for (i=0;i<kolvo_student;i++) { if (student1[i].god_rozhdenia==student1[i+1].god_rozhdenia) { cout<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo<<endl; cout<<student1[i+1].familia<<" "<<student1[i+1].imya<<" "<<student1[i+1].otchestvo; cout<<endl; } } } void eight(student student1[100],predmety predmety1[100]) { char familia1[30]; char imya1[30]; char otchestvo1[30]; cout<<"\n vvedite familiy stydenta :"; cin>>familia1; cout<<"\n vvedite imya studenta:"; cin>>imya1; cout<<"\n vvedite otchestvo studenta:"; cin>>otchestvo1; for (i=0;i<kolvo_student;i++) { if ((strcmp(familia1,student1[i].familia)==0)&&(strcmp(imya1,student1[i].imya)==0)&&(strcmp(otchestvo1,student1[i].otchestvo)==0)) { cout<<"\n familia: "; cout<<student1[i].familia; cout<<"\n imya:"; cout<<student1[i].imya; cout<<"\n otchestvo:"; cout<<student1[i].otchestvo; cout<<"\n god_rozhdenia:"; cout<<student1[i].god_rozhdenia; cout<<"\n mesyac_rozhdenia:"; cout<<student1[i].mesyac_rozhdenia; cout<<"\n den_roshdenia:"; cout<<student1[i].den_roshdenia; cout<<"\n budzhet_ili_contract:"; if (student1[i].budzhet_ili_contract==1) { cout<<"\n budzhetnic"; } else if (student1[i].budzhet_ili_contract==0) {cout<<"\n contractnic"; } cout<<"\n nomer_telefona:"; cout<<student1[i].nomer_telefona; cout<<"\n strana:"; cout<<student1[i].strana; cout<<"\n gorod:"; cout<<student1[i].gorod; cout<<"\n ylica:"; cout<<student1[i].ylica; cout<<"\n dom(chislom):"; cout<<student1[i].dom; cout<<"\n nomer_kvartiry:"; cout<<student1[i].nomer_kvartiry; cout<<"\n Ocenki studenta:"<<student1[i].familia<<" "<<student1[i].imya<<" "<<student1[i].otchestvo; cout<<endl; for (j=0;j<kolvo_predmetov;j++) for (k=0;k<kolvo_predmetov;k++) { cout<<predmety1[j].nazvanie_predmeta; cout<<" ocenka:"<<student1[i].ball[k]; cout<<endl; j++; } } else { cout<<endl<<"\n takogo stydenta net v baze"; }} } void main() { cout<<"\n ---------------------------------------------------------------"<<endl; cout<<"\n vvedite kolichestvo stydentov:"; cin>>kolvo_student; cout<<"\n ---------------------------------------------------------------"<<endl; cout<<"\n ---------------------------------------------------------------"<<endl; cout<<"\n vvedite kolichestvo predmetov:"; cin>>kolvo_predmetov; cout<<"\n ---------------------------------------------------------------"<<endl; cout<<"\n vvedite nazvanie predmetov:"; for (j=0;j<kolvo_predmetov;j++) { cout<<"\n "<<j+1<<")"; cin>>ocenki[j].nazvanie_predmeta; } cout<<"\n ---------------------------------------------------------------"<<endl; cout<<"\n vvedite dannye o studentax:"; cout<<"\n ---------------------------------------------------------------"<<endl; for (i=0;i<kolvo_student;i++) { cout<<"\n STUDENT"<<i+1; cout<<"\n ---------------------------------------------------------------"<<endl; cout<<"\n familia: "; cin>>base[i].familia; cout<<"\n imya:"; cin>>base[i].imya; cout<<"\n otchestvo:"; cin>>base[i].otchestvo; cout<<"\n god_rozhdenia(chislom):"; cin>>base[i].god_rozhdenia; cout<<"\n mesyac_rozhdenia(chislom):"; cin>>base[i].mesyac_rozhdenia; cout<<"\n den_roshdenia(chislom):"; cin>>base[i].den_roshdenia; cout<<"\n budzhet_ili_contract:"; cout<<"\n esli budzhet vvedite 1 , esli kontrakt to vvedite 0"; cout<<endl; cin>>base[i].budzhet_ili_contract; if ((base[i].budzhet_ili_contract!=1)&&(base[i].budzhet_ili_contract!=0)) { cout<<"\n esli budzhet vvedite 1 , esli kontrakt to vvedite 0!!!!!"; } if (base[i].budzhet_ili_contract==1) { budzhet++; } else if (base[i].budzhet_ili_contract==0) {contract++; } cout<<"\n nomer_telefona(chislom):"; cin>>base[i].nomer_telefona; cout<<"\n strana:"; cin>>base[i].strana; cout<<"\n gorod:"; cin>>base[i].gorod; cout<<"\n ylica:"; cin>>base[i].ylica; cout<<"\n dom(chislom):"; cin>>base[i].dom; cout<<"\n nomer_kvartiry(chislom):"; cin>>base[i].nomer_kvartiry; for (j=0;j<kolvo_predmetov;j++) for (k=0;k<kolvo_predmetov;k++) { cout<<"\n vvedite ocenky studenta po predmety:"<<ocenki[j].nazvanie_predmeta<<":"; cin>>base[i].ball[k]; if ((base[i].ball[k]<0)||(base[i].ball[k]<0)>100) { cout<<"\n ocenka ot 0 do 100 !!!"; cin>>base[i].ball[k]; } j++; } } for (i=0;i<kolvo_student;i++) { base[i].srednyi_ball=sortirovka(base[i].ball,kolvo_predmetov); } METKA: cout<<"\n ---------------------------------------------------------------"; cout<<"\n vyberite punkt:"; cout<<"\n ---------------------------------------------------------------"; cout<<"\n 1:| sdelat sortirovky stydentov po yspevaimosty"; cout<<"\n 2:| vyvesti tablicy yspevaimosti stydenta po predmetam"; cout<<"\n 3:| vyvesti col-vo inogorodnyx studentov(spisok)"; cout<<"\n 4:| vyvesti col-vo gorodskih studentov(spisok)"; cout<<"\n 5:| vyvesti col-vo budzetnikow"; cout<<"\n 6:| vyvesti col-vo kontraktnikow"; cout<<"\n 7:| vyvesti spisok stydentov odnogo goda rozhdenya"; cout<<"\n 8:| naiti studenta v base i vyvesti vsy informaciy (1-6 pynkt)"; cout<<"\n ---------------------------------------------------------------"; cout<<"\n vvedite punkt:"; cin>>punkt; if (punkt==1) { one(base); } if (punkt==2) { two (student1,ocenki); } if (punkt==3) { three(base); } if (punkt==4) { four(base); } if (punkt==5) { five(base); } if (punkt==6) { six(base); } if (punkt==7) { seven(base); } if (punkt==8) { eight(student1,ocenki); }goto METKA; getch(); }
|