Добавлен: 04.12.2023
Просмотров: 108
Скачиваний: 5
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
52
<<
arr_of_students
[i].surname
<<
" "
<<
arr_of_students
[i].age
<<
endl;
} void writeFileStudents(
Student
*
arr_of_students
, int number_of_students
)
{ ofstream fout(FILE_OF_DATA, ios
::out);
// Открыли файл для записи for
(
int i = 0; i<
number_of_students
; i++)
{ fout
<<
arr_of_students
[i].name
<<
" "
<<
arr_of_students
[i].surname
<<
" "
<<
arr_of_students
[i].age; if
(i<
number_of_students
- 1)
{ fout
<<
endl;
}
} fout.close();
} void writeEndFileStudents(
Student new_student
)
{ ofstream fadd(FILE_OF_DATA, ios
::app);
// Открыли файл для дозаписи fadd
<<
endl; fadd
<<
new_student
.name
<<
" "
<<
new_student
.surname
<<
" "
<<
new_student
.age; fadd.close();
} void readFileStudents(
Student
*
arr_of_students
, int
&
number_of_students
)
{ ifstream fin(FILE_OF_DATA, ios
::in);
// Открыли файл для чтения if
(!fin.is_open()) cout
<<
"Указанный файл не существует!"
<<
endl; else
{ int i = 0; while
(!fin.eof())
{ if
(i < RESERVE_SIZE)
53
{ fin
>>
arr_of_students
[i].name
>>
arr_of_students
[i].surname
>>
arr_of_students
[i].age; i++;
} else
{ cout
<<
"Недостаточно памяти для чтения всех данных!"
<<
endl; break
;
}
} number_of_students
= i;
} fin.close();
//Закрыли файл
}
При работе с динамически создаваемыми массивами целесообразно запраши- вать память в процессе выполнения программы, соответствующую количеству структур, записанных в файле. Для этого ниже приведена функция определения количества структур, записанных в текстовый файл (что соответствует количеству строчек в файле) – getCountOfStucturesInFile(
string file_path
).
// Определение количества структур в файле (при необходимости)
int getCountOfStucturesInFile(
string file_path
)
{ ifstream file(
file_path
, ios
::in);
// Открыли текстовый файл для чтения int number_of_strings = 0; if
(file.is_open())
{ string buffer; while
(getline(file, buffer)) number_of_strings++;
} file.close(); return number_of_strings;
}
Второй пример: работа с файлом выполняется в бинарном режиме. Сна- чала приведем ряд пояснений по особенностям чтения и записи в файл в бинарном режиме.
54
При записи единичной структуры в бинарный файл записываем всю структу- ру целиком и сразу: ofstream fadd(FILE_OF_DATA, ios
::binary | ios
::app); fadd.write((
char
*)&
new_student
, sizeof
(
new_student
));
/* Записываем структуру new_student в открытый нами файл; для этого узнаем адрес структуры new_student и приводим указатель на new_student к однобайтовому типу; указываем, что в структуре new_student находится sizeof(
new_student)
байт */ fadd.close();
Из файла можно прочитать всю структуру целиком и сразу: ifstream fin(FILE_OF_DATA, ios
::binary | ios
::in); if
(!fin.is_open()) cout
<<
"Указанный файл не существует!"
<<
endl; else
{ fin.read((
char
*)
&
temp_student
, sizeof
(
temp_student
));
} fin.close();
При записи массива структур в бинарный файл записываем весь массив цели- ком и сразу: ofstream fout(FILE_OF_DATA, ios
::binary | ios
::out); fout.write((
char
*)&
arr_of_students
[0], sizeof
(
Student
)*
number_of_students
); fout.close();
Из файла целесообразно читать весь массив структур целиком и сразу, однако для этого необходимо знать количество структур в бинарном файле: int getCountOfStucturesInFile(
string file_path
)
{
//Открываем файл и перемещаем указатель в конец файла ifstream file(FILE_OF_DATA, ios
::ate | ios
::binary);
/* file.tellg() возвращает значение типа int, которое показывает, сколько ука- зателем пройдено в байтах от начала файла до текущей позиции */
int number_of_strings = file.tellg() / sizeof
(
Student
); file.close();
55 return number_of_strings;
}
Тогда собственно чтение в массив структур из файла программно реализуется следующим образом: ifstream fin(FILE_OF_DATA, ios
::binary | ios
::in); if
(!fin.is_open()) cout
<<
"Указанный файл не существует!"
<<
endl; else
{ fin.read((
char
*)&
arr_of_students
[0], sizeof
(
Student
)* getCountOfStucturesInFile(FILE_OF_DATA));
} fin.close();
Когда приходится записывать структуру или объект в файл, то внутри струк- туры может быть очень много информационных полей и при записи структуры в файл в текстовом режиме придется записывать каждый элемент структуры, а это отнимет много времени. В этом отношении данный вариант работы с файлом име- ет преимущество по скорости. Но заполненный таким способом файл при откры- тии в текстовом режиме нечитабельный, а попытка вручную записать информа- цию, чтобы считать ее программно, не приведет к желаемому результату.
Далее приведен пример работы с файлом в бинарном режиме. В качестве строковых полей структуры используем строковые массивы, структуры объединя- ем в статически создаваемые локальные массивы.
Приведенный ниже пример ориентирован на статически создаваемые масси- вы, а именно, включает целый ряд проверок выхода за пределы зарезервированной под статический массив памяти.
#include
#include
#include
using namespace std; const int
SIZE_CHAR = 20; const int
RESERVE_SIZE = 100; const string
FILE_OF_DATA =
"MyFile.txt"
;
//Путь к файлу
56 struct
Student
{ char name[SIZE_CHAR]; char surname[SIZE_CHAR]; int age;
};
// Запись в файл (если что-то было в файле, то исходные данные будут удалены):
void writeFileStudents(
Student
*
arr_of_students
, int number_of_students
);
// Добавление в конец файла одной строки:
void writeEndFileStudents(
Student new_student
);
// Чтение из файла в массив:
void readFileStudents(
Student
*
arr_of_students
, int
&
number_of_students
);
// Определение количества структур в файле (при необходимости)
int getCountOfStucturesInFile(
string file_path
);
//0 Заполнение массива студентов void generateStudentArray(
Student
*
arr_of_students
, int
&
number_of_students
);
// Добавление студента в массив void addStudentInArray(
Student
*
arr_of_students
, int
&
number_of_students
);
// Удаление студента из массива void delStudentFromArray(
Student
*
arr_of_students
, int
&
number_of_students
);
// Вывод содержимого массива на экран void showStudentArray(
Student
*
arr_of_students
, int number_of_students
); void main()
{ setlocale(
LC_ALL
,
"rus"
);
Student arr_of_students[RESERVE_SIZE]; int number_of_students = 0; generateStudentArray(arr_of_students, number_of_students); writeFileStudents(arr_of_students, number_of_students); addStudentInArray(arr_of_students, number_of_students); showStudentArray(arr_of_students, number_of_students); delStudentFromArray(arr_of_students, number_of_students); showStudentArray(arr_of_students, number_of_students);
57
Student arr_new_of_students[RESERVE_SIZE];
/* Создаем новый массив ис- ключительно для того, чтобы продемонстрировать корректность чтения данных из файла */
int new_number_of_students = 0; readFileStudents(arr_new_of_students, new_number_of_students); showStudentArray(arr_new_of_students, new_number_of_students); system(
"pause"
);
} void generateStudentArray(
Student
*
arr_of_students
, int
&
number_of_students
)
{ number_of_students
= 2; strcpy_s(
arr_of_students
[0].name,
"Alex"
); strcpy_s(
arr_of_students
[0].surname,
"Black"
); arr_of_students
[0].age = 20; strcpy_s(
arr_of_students
[1].name,
"Alex1"
); strcpy_s(
arr_of_students
[1].surname,
"Black1"
); arr_of_students
[1].age = 27;
} void addStudentInArray(
Student
*
arr_of_students
, int
&
number_of_students
)
{
//добавление студента, если не происходит выход за пределы массива if
(
number_of_students
+ 1 <= RESERVE_SIZE)
{ number_of_students
++; cout
<<
"Введите имя студента: "
; cin
>>
arr_of_students
[
number_of_students
- 1].name; cout
<<
"Введите фамилию студента: "
; cin
>>
arr_of_students
[
number_of_students
- 1].surname; cout
<<
"Введите возраст студента: "
; cin
>>
arr_of_students
[
number_of_students
- 1].age; writeEndFileStudents(
arr_of_students
[
number_of_students
- 1]);
}
58 else cout
<<
"Недостаточно памяти для добавления нового элемента!"
<<
endl;
} void delStudentFromArray(
Student
*
arr_of_students
, int
&
number_of_students
)
{ int number_of_deleted_item; cout
<<
"Введите номер удаляемой записи: "
; cin
>>
number_of_deleted_item;
// пользователь мыслит с 1, но индексы нумеруются с 0:
number_of_deleted_item--; if
(number_of_deleted_item >= 0 && number_of_deleted_item < number_of_students
)
{ for
(
int i = number_of_deleted_item; i < number_of_students
- 1; i++) arr_of_students
[i]
=
arr_of_students
[i + 1]; number_of_students
--; writeFileStudents(
arr_of_students
, number_of_students
);
} else cout
<<
"Введен некорректный номер удалемой записи!"
<<
endl;
} void showStudentArray(
Student
*
arr_of_students
, int number_of_students
)
{ for
(
int i = 0; i < number_of_students
; i++) cout
<<
arr_of_students
[i].name
<<
" "
<<
arr_of_students
[i].surname
<<
" "
<<
arr_of_students
[i].age
<<
endl;
} void writeFileStudents(
Student
*
arr_of_students
, int number_of_students
)
{
//Открываем файл для записи:
ofstream fout(FILE_OF_DATA, ios
::binary | ios
::out); fout.write((
char
*)&
arr_of_students
[0], sizeof
(
Student
)*
number_of_students
); fout.close();
} void writeEndFileStudents(
Student new_student
)
59
{
//Открываем файл для дозаписи:
ofstream fadd(FILE_OF_DATA, ios
::binary | ios
::app); fadd.write((
char
*)&
new_student
, sizeof
(
new_student
));
//Записали структуру fadd.close();
} void readFileStudents(
Student
*
arr_of_students
, int
&
number_of_students
)
{ ifstream fin(FILE_OF_DATA, ios
::binary | ios
::in); if
(!fin.is_open()) cout
<<
"Указанный файл не существует!"
<<
endl; else
{
// определяем количество строк в файле int sizeOfFileWithStudents = getCountOfStucturesInFile(FILE_OF_DATA);
/* если выделенная память под статический массив вмещает все строч- ки в файле */
if
(sizeOfFileWithStudents <= RESERVE_SIZE)
{
// будем считывать все строчки number_of_students
= sizeOfFileWithStudents;
} else
{
// иначе считаем ровно столько, насколько хватает места в массиве number_of_students
= RESERVE_SIZE; cout
<<
"There is not enough memory for read all data!"
<<
endl;
}
/* читаем сразу number_of_students-строчек из файла и сохраняем их в массиве */
fin.read((
char
*)&
arr_of_students
[0], sizeof
(
Student
)*
number_of_students
);
} fin.close();
} int getCountOfStucturesInFile(
string file_path
)
{
//Открываем файл и перемещаем указатель в конец файла ifstream file(FILE_OF_DATA, ios
::ate | ios
::binary);
60
/*file.tellg() возвращает значение типа int, которое показывает, сколько ука- зателем пройдено в байтах от начала файла до текущей позиции */
int number_of_strings = file.tellg() / sizeof
(
Student
); file.close(); return number_of_strings;
}
1 2 3 4 5 6
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. Разработка программы учета выплат заработной платы сотрудникам
предприятия
Информация о сотрудниках предприятия содержит: ФИО сотрудника, назва- ние отдела, должность, размер заработной платы за месяц.
Индивидуальное задание: вычислить общую сумму выплат за месяц по каж- дому отделу, а также среднемесячный заработок сотрудников по каждому отделу.
Вывести список сотрудников, у которых зарплата ниже введенной с клавиатуры.
72
Общее для всех вариантов задание: реализовать авторизацию для входа в си- стему, функционал администратора и функционал пользователя (см. более по- дробно в функциональных требованиях к курсовой работе, подраздел 1.2).
1 2 3 4 5 6