Також, підводячи підсумки, можна сказати, що Сі є гнучкою алгоритмічною мовою програмування, яка може бути корисна як недосвідченому користувачу, щоб вивчити ази програмування, так і може стати корисною для досвідченого програміста. Широкий набір різних корисних підпрограм, процедур та функцій дозволяє створити за невеликий відрізок часу дійсно якісний програмний продукт, який в подальшому може навіть потрапити в комерційну індустрію та дати змогу заробляти собі на життя.
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);
}
//*********************************************************************************