Методические указания к выполнению курсовой работы по дисциплине «Основы конструирования программ». 1_Меженная_ОКП_Курсовое_проектирование_Пособие. Курсовое проектирование
Скачать 2.04 Mb.
|
6.3 Перевыделение памяти с целью увеличения размера динамически созданного массива При работе с динамически создаваемыми массивами может возникнуть необ- ходимость увеличения размера памяти, требуемой для хранения информации (например, для добавления в последующем новых данных). Для решения такой задачи целесообразно выполнить перевыделение памяти под массив. Далее приведен пример программы, выполняющей динамическое создание массива, его заполнение случайными числами из отрезка [a; b], вывод результата заполнения на консоль, перевыделение памяти с целью увеличения размера мас- сива на один элемент, добавление нового элементы и повторный вывод содержи- мого массива на консоль. #include #include #include using namespace std; void generateElementsOfArray( int * arr , int n ); void showArray( int * arr , int n ); int * getRememberForArray( int * arr , int & n , int m ); int inputNumber(); void main() { setlocale( LC_ALL , "RUS" ); int n; cout << "Введите размер массива n: " ; cin >> n; 61 int *arr = new int [n]; generateElementsOfArray(arr, n); cout << "Массив arr (исходный):" << endl; showArray(arr, n); arr = getRememberForArray(arr, n, n+1); arr[n-1] = inputNumber(); cout << "Новый массив arr:" << endl; showArray(arr, n); delete[] arr; system( "pause" ); } void generateElementsOfArray( int * arr , int n ) { srand(time( NULL )); int a, b; cout << "Введите a: " ; cin >> a; cout << "Введите b: " ; cin >> b; for ( int i = 0; i < n ; i++) { arr [i] = rand() % (b - a + 1) + a; } } void showArray( int * arr , int n ) { for ( int i = 0; i< n ; i++) { cout << arr [i] << " " ; } cout << endl; } int inputNumber() { int new_element; cout << "Введите новый элемент массива: " ; 62 cin >> new_element; return new_element; } int * getRememberForArray( int * arr , int & n , int m ) { int *arr_new; if ( n < m ) { arr_new = new int [ m ]; for ( int i = 0; i < n ; i++) { arr_new[i] = arr [i]; } for ( int i = n ; i < m ; i++) // дополняем массив нулевыми значениями { arr_new[i] = 0; } delete[] arr ; arr = arr_new; n = m ; } return arr ; } 6.4 Проверка корректности вводимых данных При программировании логики курсовой работы необходимо предусмотреть обработку целого ряда исключительных ситуаций. Наиболее часто встречающиеся исключительные ситуации связаны с ошибками пользователя на этапе ввода дан- ных, а именно: введенные пользователем данные не соответствуют формату поля (например, символы в числовом поле); введенные пользователем данные нелогич- ны (например, отрицательная цена товара). Так как пользователи могут ошибаться и изменить этот факт невозможно, то необходимо корректно обработать возможные ошибки ввода. Далее приведен пример программы, реализующей ввод пользователем возраста с проверкой на принадлежность целым числам из интервала (0; 100). Результат работы програм- мы отражен на рисунке 6.5. 63 Пояснения к используемым в коде библиотечным методам по работе с пото- ковым вводом/выводом на консоль: 1. cin.get() – возвращает последний символ из потока. Если все символы были цифрами (допустимо использование в качестве первого символа знака минус при необходимости ввода отрицательных чисел), то последним символом потока будет переход на новую строку, т. е. \n. В противном случае можно сделать заключение о нецифровом вводе. 2. cin.clear() – сбрасывает флаги ошибок, в противном случае повторный вы- зов cin не сработает. 3. cin.ignore(numeric_limits Если в проекте подключена библиотека windows.h, то возникнет конфликтная ситуация с методом max(). Тогда вместо cin.ignore(numeric_limits В качестве 256 можно указать и другое число. Важно понимать: это то мак- симально возможное количество символов, которое будет удалено из потока. Рисунок 6.5 – Результат работы программы, запрашивающей возраст пользователя #include using namespace std; const int LEFT_RANGE_OF_AGE = 0; const int RIGHT_RANGE_OF_AGE = 100; int inputNumber( int left_range , int right_range ); bool isNumberNumeric(); bool isNumberRangeCorrect( int number , int left_range , int right_range ); 64 void main() { setlocale( LC_ALL , "rus" ); cout << "Введите ваш возраст: " ; int age = inputNumber(LEFT_RANGE_OF_AGE, RIGHT_RANGE_OF_AGE); cout << age << endl; system( "pause" ); } int inputNumber( int left_range , int right_range ) { int number; while ( true ) { cin >> number; if (isNumberNumeric() && isNumberRangeCorrect(number, left_range , right_range )) return number; else cout << "Некорректный ввод! Повторите попытку: " ; } } bool isNumberNumeric() { if (cin.get() == '\n' ) return true ; else { cin.clear(); cin.ignore(std:: numeric_limits < streamsize >::max(), '\n' ); return false ; } } bool isNumberRangeCorrect( int number , int left_range , int right_range ) { if (( number > left_range ) && ( number < right_range )) return true ; else return false ; } 65 6.5 Определение текущей даты и времени В курсовой работе может возникнуть необходимость работы с текущей датой и/или текущим временем. Например, для вывода на консоль всех товаров, храня- щихся более x месяцев (x вводится с клавиатуры), необходимо знать текущий ме- сяц. Для вывода на консоль списка сотрудников пенсионного возраста требуется знать текущую календарную дату. Часто для проверки вводимых данных на кор- ректность (например, даты рождения) необходимо программно запрашивать те- кущий год и проверять, чтобы вводимый пользователем год рождения по крайней мере не превышал текущий календарный год. Рассмотрим две программы для определения календарной даты и текущего времени, в результате которых осуществляется вывод на консоль системной даты в формате ДД.ММ.ГГГГ и системного времени в формате Часы:Минуты:Секунды. Первая программа, приведенная ниже, работает со структурой struct tm (таб- лица 6.1), в которой посредством функции localtime_s библиотеки time.h сохраня- ется системная дата и время (с учетом часового пояса). Для удобства последую- щей работы с параметрами даты и времени в программе введены новые пользова- тельские типы данных – Date и Time с полями, характеризующими дату и время соответственно посредством полей типа int. Таблица 6.1 – Параметры структуры struct tm из библиотеки time.h Поле структуры tm Тип Значение Диапазон tm_sec int Количество секунд 0-59 tm_min int Количество минут 0-59 tm_hour int Количество часов 0-23 tm_mday int День месяца 1-31 tm_mon int Количество месяцев с января 0-11 tm_year int Количество лет, прошедших с 1900 года #include #include using namespace std; struct Date { int day; int month; int year; 66 }; struct Time { int hour; int minute; int second; }; Date getCurrentDate(); Time getCurrentTime(); void showDate( Date date ); void showTime( Time time ); void main() { showDate(getCurrentDate()); showTime(getCurrentTime()); system( "pause" ); } Date getCurrentDate() { struct tm localtime; time_t now = time( NULL ); localtime_s(&localtime, &now); Date currentDate; currentDate.day = localtime.tm_mday; currentDate.month = 1 + localtime.tm_mon; // tm_mon: months in range [0-11] currentDate.year = 1900 + localtime.tm_year; // tm_year: years since 1900 return currentDate; } Time getCurrentTime() { struct tm localtime; time_t now = time( NULL ); localtime_s(&localtime, &now); Time currentTime; currentTime.hour = localtime.tm_hour; currentTime.minute = localtime.tm_min; currentTime.second = localtime.tm_sec; 67 return currentTime; } void showDate( Date date ) { cout << date .day << "." << date .month << "." << date .year << endl; } void showTime( Time time ) { cout << time .hour << ":" << time .minute << ":" << time .second << endl; } Вторая программа, приведенная ниже, работает со структурой SYSTEMTIME tm, в которой посредством функции GetLocalTime библиотеки windows.h сохраня- ется системная дата и время (с учетом часового пояса). Для удобства последую- щей работы с параметрами даты и времени в программе введены новые пользова- тельские типы данных – Date и Time с полями, характеризующими дату и время соответственно посредством полей типа string. #include #include #include #include using namespace std; struct Date { string day; string month; string year; }; struct Time { string hour; string minute; string second; }; Date getCurrentDate(); Time getCurrentTime(); 68 void showDate( Date date ); void showTime( Time time ); void main() { showDate(getCurrentDate()); showTime(getCurrentTime()); system( "pause" ); } Date getCurrentDate() { SYSTEMTIME tm; GetLocalTime(&tm); Date currentDate; currentDate.day = to_string(tm.wDay); currentDate.month = to_string(tm.wMonth); currentDate.year = to_string(tm.wYear); return currentDate; } Time getCurrentTime() { SYSTEMTIME tm; GetLocalTime(&tm); Time currentTime; currentTime.hour = to_string(tm.wHour); currentTime.minute = to_string(tm.wMinute); currentTime.second = to_string(tm.wSecond); return currentTime; } void showDate( Date date ) { cout << date .day << "." << date .month << "." << date .year << endl; } void showTime( Time time ) { cout << time .hour << ":" << time .minute << ":" << time .second << endl; } 69 Приложение А (обязательное ) Задания для курсовой работы 1. Разработка программы учета товаров на складе Программа предоставляет сведения о товарах, имеющихся на складе: наиме- нование товара, количество единиц товара, цена единицы товара, дата поступле- ния товара на склад, ФИО зарегистрировавшего товар. Индивидуальное задание: вывести в алфавитном порядке список товаров, хранящихся более x месяцев, стоимость которых превышает y рублей (x, y вводят- ся с клавиатуры). Общее для всех вариантов задание: реализовать авторизацию для входа в си- стему, функционал администратора и функционал пользователя (см. более по- дробно в функциональных требованиях к курсовой работе, подраздел 1.2). 2. Разработка программы распределения мест в общежитии Для получения места в общежитии формируется список студентов, который включает: ФИО студента, номер группы (шесть цифр), средний балл, участие в общественной деятельности, доход на одного члена семьи. Общежитие в первую очередь предоставляется тем студентам, чьи доходы на члена семьи меньше двух минимальных зарплат, затем остальным в порядке уменьшения среднего балла (при равных баллах приоритет отдается тем, кто участвовал в общественной дея- тельности). Индивидуальное задание: вывести список очередности предоставления места в общежитии при условии, что размер минимальной зарплаты вводится с клавиатуры. Общее для всех вариантов задание: реализовать авторизацию для входа в си- стему, функционал администратора и функционал пользователя (см. более по- дробно в функциональных требованиях к курсовой работе, подраздел 1.2). 3. Разработка программы расписания движения автобусов В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны: номер рейса, тип автобуса, пункт назначения, время от- правления, время прибытия на конечный пункт. Индивидуальное задание: вывести информацию о всех рейсах, которыми мож- но воспользоваться для прибытия в пункт назначения не позднее чем за 12 часов до заданного времени (интересующее время прибытия вводится с клавиатуры). Общее для всех вариантов задание: реализовать авторизацию для входа в си- стему, функционал администратора и функционал пользователя (см. более по- дробно в функциональных требованиях к курсовой работе, подраздел 1.2). 70 4. Разработка программы продажи автобусных билетов Автовокзал осуществляет продажу билетов на пригородные рейсы. Для каж- дого рейса указаны: номер рейса, тип автобуса, пункт назначения, дату отправле- ния, время отправления, время прибытия на конечный пункт, стоимость одного билета, количество оставшихся для продажи билетов, количество проданных би- летов. Индивидуальное задание: обеспечить функциональную возможность покупки билетов на конкретный рейс в требуемом количестве (при этом количество остав- шихся для продажи билетов и количество проданных билетов обновляется). Общее для всех вариантов задание: реализовать авторизацию для входа в си- стему, функционал администратора и функционал пользователя (см. более по- дробно в функциональных требованиях к курсовой работе, подраздел 1.2). 5. Разработка программы учета переговоров абонентов сотовой связи Оператор сотовой связи хранит информацию о разговорах своих абонентов: номер абонента, ФИО абонента, указание принадлежности вызова к исходящему или входящему, номер исходящего или входящего вызова, дата звонка, время звонка, продолжительность разговора, тариф одной минуты. Индивидуальное задание: вывести по каждому абоненту за требуемый период времени: перечень входящих и исходящих вызовов, общее время входящих вызо- вов, общее время исходящих вызовов, общую сумму на исходящие вызовы (тре- буемый период времени вводится с клавиатуры). Общее для всех вариантов задание: реализовать авторизацию для входа в си- стему, функционал администратора и функционал пользователя (см. более по- дробно в функциональных требованиях к курсовой работе, подраздел 1.2). 6. Разработка программы расчета заработной платы сотрудников предприятия Сведения о сотрудниках предприятия содержат: Ф.И.О. сотрудника, табель- ный номер, год, месяц, количество проработанных часов за месяц, почасовой та- риф. Рабочее время свыше 144 часов считается сверхурочным и оплачивается в двойном размере. Индивидуальное задание: рассчитать размер заработной платы каждого со- трудника за вычетом подоходного налога, который составляет 12 % от суммы за- работной платы. Определить объем выплат конкретному сотруднику за требуемый период времени (требуемый период времени вводится с клавиатуры). Общее для всех вариантов задание: реализовать авторизацию для входа в си- стему, функционал администратора и функционал пользователя (см. более по- дробно в функциональных требованиях к курсовой работе, подраздел 1.2). 71 7. Разработка программы учета книг в библиотеке Для книг, хранящихся в библиотеке, задаются: регистрационный номер кни- ги, автор, название, год издания, издательство, количество страниц, номер чита- тельского билета (шесть цифр) последнего читателя, отметка о нахождении книги у читателя или в библиотеке в текущий момент. Индивидуальное задание: вывести список книг с фамилиями авторов в алфа- витном порядке, изданных после заданного года (год вводится с клавиатуры). Вы- вести список книг, находящихся в текущий момент у читателей. Общее для всех вариантов задание: реализовать авторизацию для входа в си- стему, функционал администратора и функционал пользователя (см. более по- дробно в функциональных требованиях к курсовой работе, подраздел 1.2). 8. Разработка программы учета выпускаемой предприятием продукции Сведения о выпущенной продукции включают: дату, номер цеха, наименова- ние продукции, количество выпущенных единиц, ФИО ответственного по цеху в данный день. Индивидуальное задание: для заданного цеха необходимо вывести количе- ство выпущенных изделий по каждому наименованию за требуемый период вре- мени (требуемый период времени вводится с клавиатуры). Общее для всех вариантов задание: реализовать авторизацию для входа в си- стему, функционал администратора и функционал пользователя (см. более по- дробно в функциональных требованиях к курсовой работе, подраздел 1.2). 9. Разработка программы учета стажа сотрудников предприятия Информация о сотрудниках предприятия содержит: ФИО сотрудника, дату рождения, название отдела, должность, дату начала работы. Индивидуальное задание: вывести список сотрудников пенсионного возраста. Вывести список сотрудников в порядке убывания стажа. Общее для всех вариантов задание: реализовать авторизацию для входа в си- стему, функционал администратора и функционал пользователя (см. более по- дробно в функциональных требованиях к курсовой работе, подраздел 1.2). 10. Разработка программы учета выплат заработной платы сотрудникам предприятия Информация о сотрудниках предприятия содержит: ФИО сотрудника, назва- ние отдела, должность, размер заработной платы за месяц. Индивидуальное задание: вычислить общую сумму выплат за месяц по каж- дому отделу, а также среднемесячный заработок сотрудников по каждому отделу. Вывести список сотрудников, у которых зарплата ниже введенной с клавиатуры. |