Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа Web, Матвиенко. Вариант 0033.doc
Скачиваний:
25
Добавлен:
30.05.2020
Размер:
856.06 Кб
Скачать

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;

}

}

//*********************************************************************************