- •З предмету _______“Web-технології та Web-дизайн”___________
- •Завдання на курсову роботу студента
- •1 Постановка задачі
- •2 Вступ
- •3 Теоретичні відомості
- •3.1. “Голова” документа
- •3.2. "Тіло" документа
- •3.3. Таблиці
- •3.4. Абзаци
- •3.5. Розмір шрифту
- •3.6. З'єднання з іншими документами
- •3.7. Фрейми
- •4. Карта сайту
- •5 Приклад тестування та результату роботи програми
- •Висновок
- •Література
- •Додаток а (Обов’язковий) Лістинг основної програми
4. Карта сайту
-
Головна сторінка
-
Програма
-
Семінар
-
Практичні
-
Тестування
-
Словник
-
Тести
-
Контакти
5 Приклад тестування та результату роботи програми
На початку роботи з програмою виводиться таке вікно:
Після натиснення клавіші Enter виводиться основне меню, яке має такий вигляд:
Перший пункт меню має такий вигляд:
Другий пункт має такий вигляд:
Третій пункт меню виглядає так:
Четвертий пункт меню відображається так:
Таким чином п’ятий пункт буде виглядати так:
Для шостого пункту та останніх пунктів буде виводитися база даних, яку я створив сам з більшою кількістю розмірів бази даних (за для комфорту перегляду курсового проекту). Отже шостий пункт виглядає так:
Сьомий пункт такий:
Восьмий пункт меню виглядає так:
Передостанній, дев’ятий пункт меню виглядає так:
Останній пункт меню виглядає так:
Висновок
Коли я виконував курсовий проект, я придбав багато навичок роботи в середовищі Сі. Хоча мову Сі було розроблено для написання системного програмного забезпечення, наразі вона досить часто використовується для написання прикладного програмного забезпечення. Я ознайомився з багатьма елементами цієї мови.
Сі – мінімалістична мова програмування. Її основними можливостями є – прямолінійна реалізації компіляції, використовуючи відносно простий компілятор, забезпечення низькорівневого доступ до оперативної пам'яті, формування лише декількох інструкцій машинної мови для кожного елементу мови.
Також, підводячи підсумки, можна сказати, що Сі є гнучкою алгоритмічною мовою програмування, яка може бути корисна як недосвідченому користувачу, щоб вивчити ази програмування, так і може стати корисною для досвідченого програміста. Широкий набір різних корисних підпрограм, процедур та функцій дозволяє створити за невеликий відрізок часу дійсно якісний програмний продукт, який в подальшому може навіть потрапити в комерційну індустрію та дати змогу заробляти собі на життя.
Література
1. Андрей Богатырев. Руководство по программированию на языке С.
2. Герберт Шілдт. C для початківців. Пер. з англ. – М.: ЕКОМ Паблішерз, 2007.
3. Герберт Шілдт. Повний довідник по C. – 4-е видання. Пер. з англ. – М.: видавничий дім «Вільямс», 2010.
4. Громов Ю.Ю. Татаренко С.И. Программирование на языке Си: Учебное пособие. – Тамбов, 1995. – 169 с.
5. К. Поляков. Программирование на языке Си.
6. Керниган, Ричи. Язык C. Пер. з англ. – М.: ЕКОМ Паблішерз, 2003.
7. M. Уэйт, С. Прата, Д. Мартин. Язык Си. Руководство для начинающих.
8. С. Саммит. Язык С в вопросах и ответах. Перевод с английского.
9. Филипп Н. Хислей. Генерация высококачественного кода для программ, написанных на Си.
10. Язык программирования Си. М.: 1988.
Додаток а (Обов’язковий) Лістинг основної програми
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<windows.h>
#include<graphics.h>
#include<stdlib.h>
//*********************************************************************************
// Объявление глобальной переменной (База данных) и глобального указателя файла
// Создаю структуру, соответствующую одной строчке в базе данных
struct Zapis // Имя структуры "Запись" потому, что она соответствует одной записи в базе
{
char Rabotodatel[28]; // ФИО работодателя
char Professiya[28]; // Профессия
int KolRabMest; // Количество рабочих мест
float Zarplata; // Средняя заработная плата
};
Zapis Strochka; // Объявляю глобальную переменную "Строчка" для работы только с одной записью (когда не нужна вся база)
Zapis Baza[100]; // Объявляю глобальную переменную "База", рассчитанную на 100 записей (в задании – "не меньше 10")
FILE *fp; // указатель файла (файл будет указан в подпрограммах)
//*********************************************************************************
// Объявление подпрограмм
// Объявляю основные подпрограммы (те, которые будут вызываться из основной программы)
// Тексты подпрограмм стоят после основной программы
void Nachalo(); // Заставка в начале выполнения программы
void Menu1(); // Меню 1: Создание и заполнение новой базы данных.
void Menu2(); // Меню 2: Добавление записи в существующую базу данных.
void Menu3(); // Меню 3: Изменение записи в базе данных.
void Menu4(); // Меню 4: Удаление записи из базы данных.
void Menu5(); // Меню 5: Вывод базы данных на экран.
void Menu6(); // Меню 6: Вывод списка работодателей и средней зарплаты по профессии.
void Menu7(); // Меню 7: Вывод списка профессий в порядке возрастания рабочих мест.
void Menu8(); // Меню 8: Вывод списка работодателей и количества рабочих мест по специальностям.
void Menu9(); // Меню 9: Вывод предложений о трудоустройстве по заработной плате.
void Vihod(); // Заставка при окончании работы программы
// Объявляю вспомогательные подпрограммы (те, которые будут вызываться основными подпрограммами)
// Тексты подпрограмм стоят после основной программы
void VvodStrockiSEkrana(); // Заполнение с экрана глобальной переменной Strochka
int ChtenieMassivaIzFayla(); // Чтение массива из файла и определение количества структур
void ZapisMassivaVFayl(int Kolichestvo); // Запись массива в файл, передается количество структур в массиве
void Sortirovka(int Pole, int Kolichestvo); // Сортировка массива по заданному полю
//*********************************************************************************
// Начало основной программы
main()
{
// Увеличение размеров экрана в текстовом режиме (чтобы помещалась таблица базы данных)
COORD crd = {250, 500};
SMALL_RECT src = {0, 0, crd.X, crd.Y};
SetConsoleScreenBufferSize (GetStdHandle (STD_OUTPUT_HANDLE), crd);
SetConsoleWindowInfo (GetStdHandle (STD_OUTPUT_HANDLE), TRUE, &src);
// Объявляю переменную для номера выбранного пункта меню
char NomerMenu[2];
Nachalo(); // Вызов подпрограммы графической заставки
while(1)
{
// Вывожу на экран меню
printf ("\n\t\tЦентр занятости\n\n");
printf (" 1. Создание и заполнение новой базы данных.\n");
printf (" 2. Добавление записи в существующую базу данных.\n");
printf (" 3. Изменение записи в базе данных.\n");
printf (" 4. Удаление записи из базы данных.\n");
printf (" 5. Вывод базы данных на экран.\n");
printf (" 6. Вывод списка работодателей и средней зарплаты по профессии.\n");
printf (" 7. Вывод списка профессий в порядке возрастания рабочих мест.\n");
printf (" 8. Вывод списка работодателей и количества рабочих мест по специальностям.\n");
printf (" 9. Вывод предложений о трудоустройстве по заработной плате.\n");
printf (" 0. Конец работы с программой.\n\n");
// Ввожу номер выбранного пункта с проверкой
do
{
printf ("Выберите номер пункта меню: ", NomerMenu);
scanf ("%s", &NomerMenu);
}
while (strlen(NomerMenu) >1 || isdigit(NomerMenu[0]) == 0);
// Запускаю подпрограмму выполнения выбранного пункта
switch ( NomerMenu[0] )
{
case '1': Menu1(); break;
case '2': Menu2(); break;
case '3': Menu3(); break;
case '4': Menu4(); break;
case '5': Menu5(); break;
case '6': Menu6(); break;
case '7': Menu7(); break;
case '8': Menu8(); break;
case '9': Menu9(); break;
case '0': Vihod(); return 0;
default: break;
}
}
}
// Конец основной программы
//*********************************************************************************
//*********************************************************************************
// Основные подпрограммы (9 пунктов меню + графические начало и конец)
//*********************************************************************************
// 1. Создание и заполнение новой базы данных.
void Menu1()
{
printf ("\n\n\tСоздание новой базы данных");
// i – нумерация вводимых записей
// konec – признак конца создания базы (конец по нажатию ESC)
int i = 0, konec;
// Для очистки буфера от оставшегося лишнего символа
char bufer[4];
// Создаю файл базы данных baza.dat
fp=fopen("baza.dat","w");
// Проверка создания файла
if ( fp == NULL )
{
printf("\n\nПроизошла ошибка. Создание базы данных невозможно. \nНажмите любую клавишу для возврата в меню");
_getch();
}
else
{
gets(bufer);
while (1)
{
// Вывожу на экран форму для заполнения строчки в базе
i=i+1;
printf ("\n\n\t№%d",i);
VvodStrockiSEkrana();
// Записываю введенные данные из структуры "Строчка" в открытый файл (каждый пункт на отдельной строке)
fprintf (fp, "%s\n%s\n%d\n%.2f\n", Strochka.Rabotodatel, Strochka.Professiya, Strochka.KolRabMest, Strochka.Zarplata);
// Даю возможность закончить заполнения базы по нажатию ESC
printf("Для продолжения нажмите любую клавишу, для окончания нажмите Ecs");
konec = _getch();
if (konec == 27) break;
}
// Закрываю файл базы данных
fclose(fp);
}
// Отступаю место перед выводом меню
printf ("\n\n\n\n\n\n\n\n");
}
//*********************************************************************************
// 2. Добавление записи в существующую базу данных.
void Menu2()
{
printf ("\n\n\tДобавление записей в базу данных");
// Целые локальные переменные:
// NovNomer – номер вводимой записи, считая с начала добавления
// StarNomer – номер вводимой записи по сплошной нумерации (считая с начала файла базы данных)
// konec – код нажатой клавиши (чтобы закончить по нажатию ESC)
int NovNomer = 0, StarNomer = 0, konec, i;
// temp – используется для считывания данных из файла (чтобы посчитать их)
char temp[28], bufer[4];
// Открываю файл базы данных baza.dat для чтения
fp=fopen("baza.dat","r");
// Проверяю, открылся ли файл
if ( fp == NULL )
{
// Если файл не открылся, то сообщаю об этом и заканчиваю
printf("\n\nПроизошла ошибка. Редактирование базы данных невозможно. \nНажмите любую клавишу для возврата в меню");
_getch();
}
else
{
// Если файл открылся хорошо, то работаю с ним
// Читаю данные из файла, пока они не закончатся, одновременно считая их количество
// Делю на 4 (ФИО, профессия, кол. рабочих мест, зарплата), получаю количество записей в файле (чтобы выводить на экран общую нумерацию)
// Закрываю файл
while (1)
{
if (fgets (temp, 28, fp) != 0)
StarNomer = StarNomer + 1;
else break;
}
StarNomer=(StarNomer/4);
fclose (fp);
// Открываю файл базы данных для дописывания в конец
fp=fopen("baza.dat","a");
// Очистка буфера от мусора
gets(bufer);
// Произвожу дописывание
i=0;
while (1)
{
// Вывожу на экран форму для заполнения строчки в базе
i = i+1;
NovNomer = NovNomer+1;
StarNomer = StarNomer+1;
printf ("\n\n\t№%d (%d)", NovNomer, StarNomer);
VvodStrockiSEkrana();
// Записываю введенные данные из структуры "Строчка" в открытый файл (каждый пункт на отдельной строке)
fprintf (fp, "%s\n%s\n%d\n%.2f\n", Strochka.Rabotodatel, Strochka.Professiya, Strochka.KolRabMest, Strochka.Zarplata);
// Даю возможность закончить по нажатию ESC
printf("Для продолжения нажмите любую клавишу, для окончания нажмите Ecs");
konec = _getch();
if (konec == 27) break;
}
// Закрываю файл базы данных
fclose(fp);
}
// Отступаю место перед выводом меню
printf ("\n\n\n\n\n\n\n\n");
}
//*********************************************************************************
// Изменение записи в базе данных
void Menu3()
{
// Nomer – номер обрабатываемой структуры
// Kolichestvo – количество структур в базе данных
int Nomer, Kolichestvo;
// bufer – временная переменная для ввода данных в текстовом формате
// (очистка буфера от мусора, ввод числа в тексте для проверки на "чисельность"
// otvet – ответ на вопрос, нужно ли показывать таблицу, чтобы посмотреть, какую запись менять
// konec – признак конца изменения записей в базе
char bufer[4], otvet, konec;
// Базу данных из файла копирую в массив в памяти компьютера, узнаю количество структур
Kolichestvo=ChtenieMassivaIzFayla();
// Очистка буфера от мусора
gets(bufer);
// Вывод таблицы по желанию пользователя (посмотреть какие данные нужно изменить)
printf("Показать базу данных перед изменением? (д/н) – ");
scanf("%c",&otvet);
switch ( otvet )
{
case 'д':
case 'Д':Menu5();
case 'н':
case 'Н':break;
default: printf("Это не похоже на \'да\', значит, засчитываем как \'нет\'.\n"); break;
}
// Очистка буфера от мусора
gets(bufer);
// Цикл изменения записей в массиве
while (1)
{
while(1)
{
printf("\n\nКакую строку нужно изменить (введите номер от 1 до %d)? ", Kolichestvo);
gets(bufer);
// Проверка:
// 1) введеные символы должны быть цифрами
// 2) номер строки не должен выходить за границы базы
if ( (isdigit(bufer[0])!=0 && isdigit(bufer[1])!=0 ) || (isdigit(bufer[0])!=0 ) )
{
Nomer=atoi(bufer);
if (Nomer>Kolichestvo || Nomer==0)
printf("Данная строка не существует. Повторите ввод.");
else break;
}
else
{
printf("\nВведены неверные данные. Повторите ввод.");
}
}
printf("\nВведите данные для изменения:\n");
// Подпрограмма вводит новые данные в глобальную структуру Строчка (с проверкой ввода)
VvodStrockiSEkrana();
// Перекладываю из структуры в нужное место массива
Baza[Nomer]=Strochka;
// Даю возможность закончить заполнения базы по нажатию ESC
printf("Для продолжения нажмите любую клавишу, для окончания нажмите Ecs");
konec = _getch();
if (konec == 27) { printf("\n\n\n\n\n\n\n"); break; };
}
// Записываю обновлённый массив в файл
ZapisMassivaVFayl(Kolichestvo);
}
//*********************************************************************************
// Удаление записи из базы данных
void Menu4()
{
// Nomer – номер обрабатываемой структуры
// Kolichestvo – количество структур в базе данных
int i, Nomer, Kolichestvo;
// bufer – временная переменная для ввода данных в текстовом формате
// (очистка буфера от мусора, ввод числа в тексте для проверки на "чисельность"
// otvet – ответ на вопрос, нужно ли показывать таблицу, чтобы посмотреть, какую запись менять
// konec – признак конца изменения записей в базе
char bufer[4], otvet, konec;
// Базу данных из файла копирую в массив в памяти компьютера, узнаю количество структур
Kolichestvo=ChtenieMassivaIzFayla();
// Очистка буфера от мусора
gets(bufer);
// Вывод таблицы по желанию пользователя (посмотреть какие данные нужно удалить)
printf("Показать базу данных перед удалением? (д/н) – ");
scanf("%c",&otvet);
switch ( otvet )
{
case 'д':
case 'Д':Menu5();
case 'н':
case 'Н':break;
default: printf("Это не похоже на \'да\', значит, засчитываем как \'нет\'.\n"); break;
}
// Очистка буфера от мусора
gets(bufer);
// Цикл изменения записей в массиве
while (1)
{
// Проверка на пустоту базы (что-то же надо удалять...)
if (Kolichestvo==0)
{
printf("\nБаза полностью удалена. ");
system("pause");
break;
};
while(1)
{
printf("\n\nКакую строку нужно удалить (введите номер от 1 до %d)? ", Kolichestvo);
gets(bufer);
// Проверка:
// 1) введеные символы должны быть цифрами
// 2) номер строки не должен выходить за границы базы
if ( (isdigit(bufer[0])!=0 && isdigit(bufer[1])!=0 ) || (isdigit(bufer[0])!=0 ) )
{
Nomer=atoi(bufer);
if (Nomer>Kolichestvo || Nomer==0)
printf("Данная строка не существует. Повторите ввод.");
else break;
}
else
{
printf("\nВведены неверные данные. Повторите ввод.");
};
};
for (i=Nomer; i<Kolichestvo; i++)
{
Baza[i]=Baza[i+1];
};
// Последняя структура осталась, но мы на нее не будем смотреть при заполнении файла
Kolichestvo=Kolichestvo-1;
// Даю возможность закончить заполнения базы по нажатию ESC
printf("Для продолжения нажмите любую клавишу, для окончания нажмите Ecs");
konec = _getch();
if (konec == 27) { printf("\n\n\n\n\n\n\n"); break; };
}
// Записываю обновлённый массив в файл
ZapisMassivaVFayl(Kolichestvo);
}
//*********************************************************************************
// Вывод базы данных на экран
void Menu5()
{
printf ("\n\n\t\t\t\t\t\tБаза данных\n");
printf ("_______________________________________________________________________________________________________\n");
printf (" | | | | |");
printf ("\n № |\t ФИО работодателя\t |\t Профессия\t | Вакансий\t| Зарплата\t\t |\n");
printf ("____|________________________________|_____________________________|____________|_____________________|");
// K – количество структур в базе данных
// i – порядковый номер выводимой структуры
int K,i;
K=ChtenieMassivaIzFayla();
for (i=1; i<=K; i++)
{
printf ("\n | | | | |");
printf ("\n%3d |\t %-28s|\t %-26s|\t %-7d|\t%4.2f\t |", i, Baza[i].Rabotodatel, Baza[i].Professiya, Baza[i].KolRabMest, Baza[i].Zarplata);
printf ("\n____|________________________________|_____________________________|____________|_____________________|");
}
printf("\n\n\t\t\t\tДля продолжения нажмите любую клавишу");
_getch();
// Отступаю место перед выводом меню
printf ("\n\n\n\n\n\n\n\n");
}
//*********************************************************************************
// Вывод списка работодателей и средней зарплаты по профессии
void Menu6()
{
// Kolichestvo – количество структур в базе данных
// i,j – счетчики цикла
// NomProf – номер профессии (для вывода на экран)
// konec – признак конца подпрограммы
int Kolichestvo,K,i,j,NomProf=1,konec;
char Professiya[28], bufer[4];
// Spisok – список профессий с указанием количества рабочих мест (размер пока равен размеру основной базы)
// bufer – временная структура для перекладки при сортировке
Zapis Spisok[100];
Kolichestvo = ChtenieMassivaIzFayla();
gets(bufer);
while(1)
{
printf("\nВведите профессию: ");
gets(Professiya);
for (i=1, j=0; i<=Kolichestvo; i++)
if ( strcmp(Professiya,Baza[i].Professiya) == 0)
{
j++;
printf ("\n%2d |\t %-26s |\t%4.2f\t|",j, Baza[i].Rabotodatel, Baza[i].Zarplata);
}
if (j==0) printf ("\nК сожалению, данная профессия отсутствует в базе.");
// Даю возможность закончить заполнения базы по нажатию ESC
printf("\nДля продолжения нажмите любую клавишу, для окончания нажмите Ecs\n");
konec = _getch();
if (konec == 27) { printf("\n\n\n\n\n\n\n"); break; };
}
}
//*********************************************************************************
// Вывод списка профессий в порядке возрастания рабочих мест
void Menu7()
{
// Kolichestvo – количество структур в основной базе Baza
// K – количество структур во вспомогательной базе Spisok
// i,j – счетчики цикла
int Kolichestvo,K,i,j;
Kolichestvo = ChtenieMassivaIzFayla();
// Spisok – список профессий с указанием количества рабочих мест (размер пока равен размеру основной базы)
// bufer – временная структура для перекладки при сортировке
Zapis Spisok[100],bufer;
// Сортирую базу по профессиям
Sortirovka(2, Kolichestvo);
// Заполняю вспомогательную базу Spisok профессиями и количеством рабочих мест (профессии не повторяются, раб. места суммарные)
Spisok[1]=Baza[1];
for (i=2, K=1; i<=Kolichestvo; i++)
{
if ( strcmp(Baza[i].Professiya,Baza[i-1].Professiya) == 0)
Spisok[K].KolRabMest=Spisok[K].KolRabMest+Baza[i].KolRabMest;
else
{
K++;
Spisok[K]=Baza[i];
}
}
// Сортировка вспомогательной базы Spisok по количеству рабочих мест
for (i=1; i<=K; i++)
for (j=K; j>1; j--)
if ( Spisok[j].KolRabMest < Spisok[j-1].KolRabMest )
{
bufer=Spisok[j];
Spisok[j]=Spisok[j-1];
Spisok[j-1]=bufer;
};
printf ("\n\n\t\t База данных\n");
printf ("________________________________________________\n");
printf (" | | |");
printf ("\n № |\t Профессия\t | Вакансий\t|\n");
printf ("____|________________________________|__________|");
for (i=1; i<=K; i++)
{
printf ("\n | | |");
printf ("\n%3d |\t %-26s |\t %-7d|", i, Spisok[i].Professiya, Spisok[i].KolRabMest);
printf ("\n____|________________________________|__________|");
}
printf("\n\n Для продолжения нажмите любую клавишу");
_getch();
// Отступаю место перед выводом меню
printf ("\n\n\n\n\n\n\n\n");
}
//*********************************************************************************
// Вывод списка работодателей и количества рабочих мест по специальностям
void Menu8()
{
// Kolichestvo – количество структур в базе данных
// i,j – счетчики цикла
// NomProf – номер профессии (для вывода на экран)
int Kolichestvo,K,i,j,NomProf=1;
Kolichestvo = ChtenieMassivaIzFayla();
// Сортирую базу по профессиям
Sortirovka(2, Kolichestvo);
printf ("\n\n\tСписок работодателей и количества рабочих мест по специальносям\n");
printf ("________________________________________________________________________________");
printf ("\n | | | |");
printf ("\n № |\t Профессия\t |\t ФИО работодателя\t | Вакансии |");
printf ("\n____|________________________________|_______________________________|__________|");
printf ("\n | | | |");
printf ("\n%3d |\t %-26s |\t %-28s|\t%-7d\t|",NomProf, Baza[1].Professiya, Baza[1].Rabotodatel, Baza[1].KolRabMest);
printf ("\n____|________________________________|_______________________________|__________|");
for (i=2; i<=Kolichestvo; i++)
{
printf ("\n | | | |");
// Условное затирание повторяющейся профессии
if ( strcmp(Baza[i].Professiya,Baza[i-1].Professiya) == 0)
{printf ("\n |\t %-26s |\t %-28s|\t%-7d\t|", Baza[0].Professiya, Baza[i].Rabotodatel, Baza[i].KolRabMest);}
else {NomProf++; printf ("\n%3d |\t %-26s |\t %-28s|\t%-7d\t|", NomProf, Baza[i].Professiya, Baza[i].Rabotodatel, Baza[i].KolRabMest);};
printf ("\n____|________________________________|_______________________________|__________|");
}
printf("\n\n\t\t Для продолжения нажмите любую клавишу");
_getch();
// Отступаю место перед выводом меню
printf ("\n\n\n\n\n\n\n\n");
}
//*********************************************************************************
// Вывод предложений о трудоустройстве по заработной плате
void Menu9()
{
// K – количество структур в базе данных
// i – порядковый номер выводимой структуры
int Kolichestvo, i;
Kolichestvo = ChtenieMassivaIzFayla();
Sortirovka(4, Kolichestvo);
printf ("\n\n\t\t\t\t\t\tБаза данных\n");
printf ("_______________________________________________________________________________________________________\n");
printf (" | | | | |");
printf ("\n № |\t ФИО работодателя\t |\t Профессия\t | Вакансий\t| Зарплата\t\t |\n");
printf ("____|________________________________|_____________________________|____________|_____________________|");
for (i=1; i<=Kolichestvo; i++)
{
printf ("\n | | | | |");
printf ("\n%3d |\t %-28s|\t %-26s|\t %-7d|\t%4.2f\t |", i, Baza[i].Rabotodatel, Baza[i].Professiya, Baza[i].KolRabMest, Baza[i].Zarplata);
printf ("\n____|________________________________|_____________________________|____________|_____________________|");
}
printf("\n\n\t\t\t\tДля продолжения нажмите любую клавишу");
_getch();
// Отступаю место перед выводом меню
printf ("\n\n\n\n\n\n\n\n");
}
//*********************************************************************************
void Nachalo()
{
initwindow (600, 350);
setcolor(15);
floodfill (0, 0, 2);
setbkcolor (15);
setcolor (3);
settextstyle(BOLD_FONT,0,4);
outtextxy (140, 80, "Matvienko Bogdan”);
settextstyle(BOLD_FONT,0,3);
outtextxy (220, 140, "Variant: 0018”);
setcolor (8);
settextstyle(SIMPLEX_FONT,0,1);
outtextxy (60, 250, "Dlya nachala raboti s programmoi najmite Enter...”);
getch();
closegraph();
}
//*********************************************************************************
void Vihod()
{
initwindow (600, 350);
setcolor(15);
floodfill (0, 0, 2);
setbkcolor (15);
setcolor (3);
settextstyle(SIMPLEX_FONT,0,1);
outtextxy (150, 150, "Konec raboti s programmoi...");
getch();
closegraph();
}
//*********************************************************************************
//*********************************************************************************
// Вспомогательные подпрограммы (обслуживаю основные подпрограммы)
//*********************************************************************************
// Заполнение с экрана глобальной переменной Strochka
void VvodStrockiSEkrana()
{
// bufer[29] – переменная для начального ввода всех значений (до проверки их корректности)
// dengi[6] – зарплата в текстовом формате без точки
char bufer[29], dengi[6];
// i – счётчик цикла
// kolichestvo – количество прошедших проверку символов (используется при проверке чисел)
int i, kolichestvo;
// Ввод работодателя с проверкой
while (1)
{
printf("\nРаботодатель \t\t\t- \t");
gets(bufer);
if (strlen(bufer)==0)
{
printf("Вы ничего не ввели. Повторите ввод.");
}
else
{
if (strlen(bufer)>28)
{ printf("Слишком большой текст. Сформулируйте короче.\n"); }
else
{
for (i=0; i<strlen(bufer); i++)
{
Strochka.Rabotodatel[i]=bufer[i];
}
if (strlen(bufer)<28) Strochka.Rabotodatel[strlen(bufer)]='\0';
break;
}
};
}
// Ввод профессии с проверкой
while (1)
{
printf("Профессия \t\t\t- \t");
gets(bufer);
if (strlen(bufer)==0)
{
printf("Вы ничего не ввели. Повторите ввод.\n");
}
else
{
if (strlen(bufer)>28)
{ printf("Слишком большой текст. Сформулируйте короче.\n"); }
else
{
for (i=0; i<strlen(bufer); i++)
{
Strochka.Professiya[i]=bufer[i];
}
if (strlen(bufer)<28) Strochka.Professiya[strlen(bufer)]='\0';
break;
}
};
}
// Ввод количества рабочих мест с проверкой
while (1)
{
printf("Кол-во рабочих мест \t\t- \t");
gets(bufer);
kolichestvo=0;
for (i=0; i<strlen(bufer); i++)
{
if ( isdigit(bufer[i]) == 0 )
{
printf("Вы ввели не число. Такого количества рабоих мест быть не может. Повторите ввод.\n");
break;
}
else
{ kolichestvo = kolichestvo+1; }
}
if ( strlen(bufer) > 3 && kolichestvo==strlen(bufer) )
{
printf("В стране безработица. Среди работодателей Украины нет Рокфеллера. Введите реальное число.\n");
}
if ( strlen(bufer) <= 3 && kolichestvo==strlen(bufer) )
{
if (strlen(bufer)>0)
break;
else printf("Вы ничего не ввели. Повторите ввод.\n");
}
}
Strochka.KolRabMest=atoi(bufer);
// Ввод зарплаты с проверкой
/* Идея:
Ввод числа в текстовом формате
Условие1 (количество знаков)
Да1 (не хватает цифр, их меньше чем РублиТочкаКопКоп) – сброс цикла на переввод
Нет1 (хватает цифр)
1) Цикл с условием2 (проверка рублей)
Да2 (не все рубли цифры) – сброс цикла на переввод
Нет2 (все рубли цифры) – проверенная цифра сбрасывается в переменную Деньги
2) Условие3 (проверка выхода из предыдущего цикла по завершению всех цифр, а не по break)
Да3 (количество прошедших проверку цифр равно количеству рублей)
Условие4 (проверка точки)
Да4 (на 3-м с конца месте не точка) – сбос цикла на переввод
Нет4 (на 3-м с конца месте точка)
1)) Цикл с условием5 (проверка копеек)
Да5 (не все копейки цифры) – сброс цикла на переввод
Нет5 (все копейки цифры) – проверенная цифра сбрасывается в переменную Деньги
2)) Условие6 (проверка выхода из предыдущего цикла по завершению всех цифр, а не по break)
Да6 (количество прошедших проверку цифр равно количеству копеек)
Условие7 (проверка реальности)
Да7 (слишком большая зарплата) – сброс цикла на переввод
Нет7 (пройдены все проверки)
1))) превращение текстовых денег в числовые
2))) выход из цикла while
*/
while (1)
{
printf("Зарплата (формат: руб.коп) \t- \t");
gets(bufer);
for (i=0; i<6; i++)
dengi[i]='\0';
// Проверка, хватает ли цифр (минимум 4 – Р.КК)
if (strlen(bufer)<=3)
{
printf("Проверьте формат вводимых данных (руб.коп).\n");
continue;
}
else
{
// Начальное количество правильных знаков (цифры и точка на своих местах)
kolichestvo=0;
// Проверка цифр рублей (с 0-го символа до точки)
for (i=0; i<strlen(bufer)-3; i++)
{
if ( isdigit(bufer[i]) == 0 )
{
printf("Проверьте формат вводимых данных (руб.коп).\n");
break;
}
else
{
dengi[i]=bufer[i];
kolichestvo = kolichestvo+1;
} // "иначе" 2-го условия
}
// Проверка выхода из предыдущего цикла по завершению всех цифр, а не по break
if ( kolichestvo==strlen(bufer)-3 )
{
// Проверка точки между рублями и копейками
if (bufer[kolichestvo]!='.')
{
printf("Проверьте формат вводимых данных (руб.коп).\n");
}
else
{
kolichestvo = kolichestvo+1;
// Проверка цифр копеек (после точки 2 символа)
for (i=1; i<=2; i++)
{
if ( isdigit(bufer[kolichestvo]) == 0 )
{
printf("Проверьте формат вводимых данных (руб.коп).\n");
break;
}
else
{ dengi[kolichestvo-1]=bufer[kolichestvo];
kolichestvo = kolichestvo+1;
} // конец 5-го условия
} // конец for
// Проверка соответствия реальности
if ( kolichestvo==strlen(bufer) )
{
if ( (strlen(bufer)-3) > 4 )
{
printf("Профессии с такой зарплатой в центр занятости не попадают. Введите реальную зарплату.\n");
}
else
{
// Превращение введенной текстом зарплаты в числовую
Strochka.Zarplata=atof(dengi)*0.01;
break;
} // иначе 5-го условия
}
}; // "иначе" 4-го условия
}; // "иначе" 3-го условия
} //"иначе" 1-го условия
}
}
//*********************************************************************************
int ChtenieMassivaIzFayla()
{
// Nomer – номер выводимой записи
int i;
char temp[2], *ukazatel;
// Открываю файл базы данных baza.dat для чтения
fp = fopen("baza.dat","r");
i=1;
// Проверяю, открылся ли файл
if ( fp == NULL )
{
// Если файл не открылся, то сообщаю об этом и заканчиваю
printf("\n\nПроизошла ошибка. База данных недоступна. \nНажмите любую клавишу для продолжения работы");
_getch();
return i;
}
else
{
// Если файл открылся хорошо, то работаю с ним
while ( fgets (Baza[i].Rabotodatel, 28, fp) != NULL)
{
ukazatel = strrchr (Baza[i].Rabotodatel, '\n');
if (ukazatel != NULL)
*ukazatel = '\0';
fgets (Baza[i].Professiya, 28, fp);
ukazatel = strrchr (Baza[i].Professiya, '\n');
if (ukazatel != NULL)
*ukazatel = '\0';
fscanf (fp, "%d", &Baza[i].KolRabMest);
fscanf (fp, "%f", &Baza[i].Zarplata);
fgets (temp, 2, fp);
// Считываю переход на новую строку
i = i + 1;
}
return i-1;
// Закрываю файл базы данных
fclose(fp);
}
}
//*********************************************************************************
// Запись массива в файл
void ZapisMassivaVFayl(int N)
{
// N – количество записей в массиве (передается из места вызова, здесь не описывается)
// i – счетчик цикла
int i;
// Создаю наново файл базы данных baza.dat
fp = fopen("baza.dat","w");
for (i=1; i<=N; i++)
{
fprintf (fp, "%s\n%s\n%d\n%.2f\n", Baza[i].Rabotodatel, Baza[i].Professiya, Baza[i].KolRabMest, Baza[i].Zarplata);
}
// Закрываю файл базы данных
fclose(fp);
}
//*********************************************************************************
void Sortirovka(int Nomer, int Kolich)
{
// Nomer – номер поля, по которому нужно сортировать (передается, здесь не описывается)
// Kolich – количество структур в базе (передается, здесь не описывается)
// i – счетчик цикла
int i,j;
// bufer – временная переменная для перекладки
Zapis bufer;
switch ( Nomer )
{
// Сортировка по работодателям
case 1:
for (i=0; i<=Kolich; i++)
for (j=Kolich; j>1; j--)
if ( strcmp(Baza[j].Rabotodatel,Baza[j-1].Rabotodatel) < 0 )
{bufer=Baza[j]; Baza[j]=Baza[j-1]; Baza[j-1]=bufer;};
break;
// Сортировка по профессиям
case 2:
for (i=0; i<=Kolich; i++)
for (j=Kolich; j>1; j--)
if ( strcmp(Baza[j].Professiya,Baza[j-1].Professiya) < 0 )
{bufer=Baza[j]; Baza[j]=Baza[j-1]; Baza[j-1]=bufer;};
break;
// Сортировка по количеству рабочих мест
case 3:
for (i=0; i<=Kolich; i++)
for (j=Kolich; j>1; j--)
if ( Baza[j].KolRabMest < Baza[j-1].KolRabMest )
{bufer=Baza[j]; Baza[j]=Baza[j-1]; Baza[j-1]=bufer;};
break;
// Сортировка по средней зарплате
case 4:
for (i=0; i<=Kolich; i++)
for (j=Kolich; j>1; j--)
if ( Baza[j].Zarplata > Baza[j-1].Zarplata )
{bufer=Baza[j]; Baza[j]=Baza[j-1]; Baza[j-1]=bufer;};
break;
default: break;
}
}
//*********************************************************************************