Содержание
Постановка задания
Задание для всех вариантов звучит так (или, возможно, немного изменено, так как могут быть разные издания учебного пособия):
Сформировать бинарный файл из элементов, тип которых указан в работе 9, распечатать его содержимое, удалить и добавить элементы в файл в соответствии со своим вариантом, используя для поиска удаляемых или добавляемых элементов функцию. Формирование, печать, добавление и удаление элементов оформить в виде функции с аргументами.
В главной функции должна вводиться вся необходимая информация: имя файла, номера удаляемых или добавляемых структур, названия полей структур и т.д. Предусмотреть сообщения об ошибках при открытии файла и выполнении операций ввода/вывода.
Для записи в файл можно использовать функцию, формирующую одну структуру указанного в варианте типа. Значения элементов структуры вводятся с клавиатуры.
При вводе структур для начального формирования файла можно реализовать один из следующих вариантов:
- ввод заранее выбранного количества структур;
- ввод до появления структуры с заданным количеством признаков;
- диалог с пользователем о необходимости продолжать ввод.
После создания бинарного файла следует выполнить корректировку созданного файла в соответствии с вариантом задания 9. Задачу решить созданием файла проекта.
Варианты заданий
Вариант | Задание |
1. | Задан список абитуриентов университета: фамилия, будущая специальность, три оценки на экзаменах, средний балл аттестата. Удалить абитуриентов с заданной фамилией и добавить абитуриента после абитуриента с указанным номером. |
2. | Задан перечень книг в библиотеке: автор, название, издательство, год издания, тираж. Добавить в начало массива две книги, удалить все книги заданного автора. |
3. | Задан список сотрудников фирмы: фамилия и инициалы, должность, год рождения, заработная плата. Удалить сотрудников с заданной должностью, добавить элемент после элемента с указанной фамилией. |
4. | Задан список спортсменов: фамилия, вид спорта, разряд, количество набранных очков. Удалить из списка всех спортсменов с заданным видом спорта и добавить двух спортсменов в начало списка. |
5. | Задан список научно-исследовательских лабораторий: наименование, номер лаборатории, количество научных сотрудников, количество компьютеров, количество тем исследования, сумма выполненного объема научных исследований. Удалить все лаборатории с минимальным количеством тем и добавить новую лабораторию перед лабораторией заданного наименования. |
6. | Задан список автобусов: тип автобуса, завод-производитель, число мест, мощность двигателя, номер маршрута, название маршрута. Удалить из списка все автобусы заданного типа и добавить новый автобус перед вторым заданным номером маршрута. |
7. | Задан список автозаводов: наименование завода, номер завода, марка выпускаемого автомобиля, количество автомобилей, прибыль. Удалить из списка заводы, выпускающие автомобиль заданной марки, и добавить два новых автозавода в начало списка. |
8. | Задан список студентов: фамилия, специальность, группа, три экзаменационные оценки. Удалить из списка всех студентов-отличников и добавить одного студента после студента с заданной фамилией. |
9. | Задан список компьютеров: марка компьютера, фирма-производитель, тип процессора, год выпуска, стоимость. Удалить все компьютеры заданной фирмы-производителя и добавить в начало списка два компьютера новой марки. |
10. | Задан список поездов: номер поезда, начальный пункт, конечный пункт, время отправления, время в пути, число мест. Удалить из списка все поезда, отправляющиеся из заданного начального пункта. Добавить новый поезд перед поездом с заданным номером. |
11. | Задан список предприятий: наименование, руководитель, адрес, количество работников, годовая прибыль. Удалить из списка все предприятия заданного наименования и добавить предприятие перед предприятием с заданной фамилией руководителя. |
12. | Задан список автомобилей: марка, страна, мощность двигателя, количество мест, расход топлива на $100$ км. Добавить два автомобиля одной марки в начало списка и удалить автомобили заданной страны. |
13. | Задан список школ: номер, фамилия директора, район города, количество классов, количество учеников. Добавить школу перед школой с заданным номером и удалить школы заданного района. |
14. | Задан список часов: марка, завод-производитель, страна, год выпуска, цена. Удалить из списка часы последнего года выпуска и добавить часы после часов заданной марки и заданной страны. |
15. | Задан список стран: название, столица, численность населения, занимаемая площадь суши, протяженность границ. Удалить из списка страны с численностью меньше заданной и добавить в начало списка две страны. |
16. | Задан список картин: название, художник, год написания, страна, цена. Удалить из списка все картины заданного художника и добавить две картины перед картиной с заданным названием. |
17. | Задан список телевизоров: марка, фирма-производитель, страна-производитель, размер экрана, цена. Добавить два новых телевизора после первого телевизора с заданной фирмой-производителем и удалить телевизор заданной марки. |
18. | Задан список носителей информации: название носителя, тип, фирма-производитель, объем информации, цена. Удалить последний элемент с заданным типом носителя, добавить элемент перед элементом с указанным номером. |
19. | Задан список владельцев автомобилей: фамилия, номер прав, номер автомобиля, телефон номер технического паспорта. Удалить из списка элемент с заданным номером, добавить два элемента перед элементом с заданным номером автомобиля. |
20. | Задан список компакт-дисков: название, фирма-производитель, год выпуска, объем информации, цена. Удалить последний компакт-диск с заданным названием, добавить два элемента перед компакт-диском с заданным номером. |
21. | Задан список товаров: название, страна, фирма-производитель, год выпуска, количество, стоимость. Удалить все товары заданной страны, добавить два товара после первого товара с указанной фирмой-производителем. |
22. | Задан список больных: фамилия, домашний адрес, номер медицинской карты, диагноз, номер страхового полиса. Удалить больного с заданным номером медицинской карты, добавить двух больных в начало массива. |
23. | Задан список домов в районе: улица, номер дома, тип дома, количество квартир, суммарная площадь. Удалить все дома заданного типа и добавить дом перед домом, для которого задан адрес. |
24. | Задан список мобильных телефонов: тип, фирма-производитель, страна, масса, фамилия владельца. Удалить все телефоны для заданной фамилии владельца и добавить телефон после второго мобильного телефона заданного типа. |
25. | Задан список товаров на радиорынке: наименование, тип, фирма-производитель, количество, цена. Удалить все товары заданного наименования и добавить товар после товара с минимальным количеством. |
Лабораторная работа $№11$ предполагает написание программы на языке Си. При заказе работы своего варианта вы получите качественно написанную и хорошо прокомментированную программу.
Дополнительно заказав алгоритм решения вашей задачи (мы крайне рекомендуем это сделать), получите аккуратно оформленный отчет-алгоритм, поясняющий все тонкости решения поставленной задачи.
Образец выполнения (вариант №13)
Условие задания
Задан список школ: номер, фамилия директора, район города, количество классов, количество учеников. Добавить школу перед школой с заданным номером и удалить школы заданного района.
💡 Настоятельно рекомендуем вам познакомиться с задачей из лабораторной работы №$9$, если вы еще этого пока не сделали. Так как весь дальнейший разбор будет базироваться на анализе, проведенном в работе №$9$.
Необходимые программные функции для кодирования
Ниже представлен список необходимых функций, требующихся для успешного решения поставленной задачи (самое главное — помнить о том, что функция должна строго решать какую-то конкретную одну задачу).
№ | Название функции | Назначение функции |
1 | main | Главная функция программы (точка входа). В рамках этой функции будет реализован вызов почти всех остальных функций. |
2 | InputCountSchools | Эта функция запрашивает количество школ для обработки. |
3 | AddSchool | Эта функция принимает на вход имя бинарного файла, количество школ, хранящихся в бинарном файле, а также номер школы, перед которой планируется добавить новую школу. |
4 | CreateBinaryFile | Эта функция принимает на вход имя бинарного файла и количество школ. Происходит заполнение информации о школах вводом с клавиатуры с последующим запоминанием в бинарном файле. |
5 | PrintSchools | Эта функция принимает на вход бинарный файл с информацией о школах и их количество. Происходит вывод информации о школах на экран в табличном виде. |
6 | DeleteSchoolByRegion | Эта функция принимает на вход имя бинарного файла с данными о школах, количество школ, хранящихся в бинарном файле и название региона, школы, принадлежащие которому, следует удалить. |
7 | CreateSchool | Эта функция не имеет формальных параметров. Происходит ввод информации о конкретной школе вводом с клавиатуры. |
Это минимальный набор функций, который нужен для успешной реализации поставленной задачи.
➡ При желании количество функций можно увеличить минимум вдвое.
Реализация задачи на языке Си
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 | #include <stdio.h> // для ввода, вывода (scanf, printf) #include <conio.h> // для задержки программы (getch) #include <string.h> // для работы со строковыми функциями #define MAX_LENGHT_STRING 100 // максимальная длина строковых данных #define MAX_COUNT_SCHOOL 20 // максимальное кол-во школ для обработки //------------------------------------------------------------------------- // структура, описывающая школу //------------------------------------------------------------------------- typedef struct { int number; // номер школы char surnameDirector[MAX_LENGHT_STRING]; // фамилия директора char regionCity[MAX_LENGHT_STRING]; // район города int countClasses; // количество классов int countPupils; // количество учеников } TSchool; //------------------------------------------------------------------------- // ввод количества школ для обработки //------------------------------------------------------------------------- int InputCountSchools(void) { int count; printf("\n"); do { printf("Введите количество школ для обработки из отрезка [1 .. %d]: ", MAX_COUNT_SCHOOL); scanf("%d", &count); } while((count < 1) || (count > MAX_COUNT_SCHOOL)); return count; } //------------------------------------------------------------------------- // создание одной новой школы //------------------------------------------------------------------------- TSchool CreateSchool(void) { TSchool add; printf("\n\t- введите номер добавляемой школы: "); scanf("%d", &add.number); printf("\t- введите фамилию директора добавляемой школы: "); scanf("%s", add.surnameDirector); printf("\t- введите район города добавляемой школы: "); scanf("%s", add.regionCity); printf("\t- введите количество классов добавляемой школы: "); scanf("%d", &add.countClasses); printf("\t- введите количество учеников добавляемой школы: "); scanf("%d", &add.countPupils); return add; } //------------------------------------------------------------------------- // добавление новой школы перед школой с заданным номером // pnameBinaryFile - имя бинарного файла с данными о школах // pcount - количество школ, хранящихся в бинарном файле // pnumberSchool - номер школы, перед которой планируется добавить новую школу //------------------------------------------------------------------------- void AddSchool(const char pnameBinaryFile[], int* pcount, int pnumberSchool) { int insert; int i; FILE* f; TSchool tmp; // открываем существующий бинарный файл в режиме чтения-записи f = fopen(pnameBinaryFile, "rb+"); for(insert = 1; insert <= *pcount; insert++) { fread(&tmp, sizeof(TSchool), 1, f); if(tmp.number == pnumberSchool) break; } if(insert > *pcount) { printf("Школы с введенным номером не существует! Добавление новой школы невозможно!\n"); fclose(f); return; } else { for(i = (*pcount - 1); i >= (insert - 1); i--) { fseek(f, sizeof(TSchool) * i, SEEK_SET); fread(&tmp, sizeof(TSchool), 1, f); fseek(f, sizeof(TSchool) * (i + 1), SEEK_SET); fwrite(&tmp, sizeof(TSchool), 1, f); } tmp = CreateSchool(); fseek(f, sizeof(TSchool) * (insert - 1), SEEK_SET); fwrite(&tmp, sizeof(TSchool), 1, f); (*pcount)++; printf("Новая школа успешно добавлена перед школой №%d!\n", pnumberSchool); } fclose(f); } //------------------------------------------------------------------------- // создание бинарного файла с данными о школах // pnameBinaryFile - имя бинарного файла с данными о школах // pcount - кол-во школ, хранящихся в бинарном файле //------------------------------------------------------------------------- void CreateBinaryFile(const char pnameBinaryFile[], const int pcount) { int i; FILE* f; f = fopen(pnameBinaryFile, "wb"); { printf("\nВозникла непредвиденная ошибка при работе с бинарным файлом! Программа закрывается..."); getch(); exit(0); } printf("\nВам предстоит ввести с клавиатуры информации о %d шк.\n", pcount); for(i = 1; i <= pcount; i++) { TSchool add = CreateSchool(); fwrite(&add, sizeof(TSchool), 1, f); } printf("Информация о школах успешно записана в бинарный файл '\%s\'!\n", pnameBinaryFile); fclose(f); } //------------------------------------------------------------------------- // вывод информации о школах из бинарного файла на экран в табличном виде // pnameBinaryFile - имя бинарного файла с данными о школах // pcount - кол-во школ, хранящихся в бинарном файле //------------------------------------------------------------------------- void PrintSchools(const char pnameBinaryFile[], const int pcount) { FILE* f; int i; if(pcount == 0) { printf("\nНет ни одной школы! Печать информации о школах невозможна.\n"); return; } f = fopen(pnameBinaryFile, "rb"); // ╚╔ ╩ ╦ ╠ ═ ╬ ╣ ║ ╗ ╝ символы псевдографики для построения красивого каркаса таблицы при выводе printf("\nИнформация о %d шк. имеет вид:\n", pcount); printf("\t╔═════════╦═══════════════════╦══════════════╦════════════════════╦═════════════════════╗\n"); printf("\t║ № школы ║ Фамилия директора ║ Район города ║ Количество классов ║ Количество учеников ║\n"); printf("\t╠═════════╬═══════════════════╬══════════════╬════════════════════╬═════════════════════╣\n"); for(i = 1; i <= pcount; i++) { TSchool tmp; fread(&tmp, sizeof(TSchool), 1, f); printf("\t║ %7d ║ %-17s ║ %-12s ║ %18d ║ %19d ║\n", tmp.number, tmp.surnameDirector, tmp.regionCity, tmp.countClasses, tmp.countPupils); } printf("\t╚═════════╩═══════════════════╩══════════════╩════════════════════╩═════════════════════╝\n\n"); fclose(f); } //------------------------------------------------------------------------- // удаление всех школ заданного региона // pnameBinaryFile - имя бинарного файла с данными о школах // pcount - кол-во школ, хранящихся в бинарном файле // pdeletedRegion - название региона, школы которого следует удалить из файла //------------------------------------------------------------------------- void DeleteSchoolByRegion(const char pnameBinaryFile[], int* pcount, const char pdeletedRegion[]) { FILE* f; int i, j; int countDeletedSchool = 0; TSchool tmp; f = fopen(pnameBinaryFile, "rb+"); for(i = (*pcount - 1); i >= 0; i--) { fseek(f, sizeof(TSchool) * i, SEEK_SET); fread(&tmp, sizeof(TSchool), 1, f); if(strcmp(tmp.regionCity, pdeletedRegion) == 0) { countDeletedSchool++; for(j = i + 1; j < *pcount; j++) { fseek(f, sizeof(TSchool) * j, SEEK_SET); fread(&tmp, sizeof(TSchool), 1, f); fseek(f, sizeof(TSchool) * (j - 1), SEEK_SET); fwrite(&tmp, sizeof(TSchool), 1, f); } } } *pcount = *pcount - countDeletedSchool; printf("Все школы заданного района успешно удалены!\n"); fclose(f); } //------------------------------------------------------------------------- // главная функция программы (точка входа) //------------------------------------------------------------------------- int main(void) { int countSchool; // активное количество школ // имя бинарного файла с данными char nameBinaryFile[MAX_LENGHT_STRING]; // номер школы, перед которой планируется добавить новую школу int numberSchool; // название региона для удаления всех школ char deletedRegion[MAX_LENGHT_STRING]; // запрашиваем вводом с клавиатуры имя бинарного файла printf("Введите имя бинарного файла для хранения данных о школах: "); gets(nameBinaryFile); // вводим кол-во школ countSchool = InputCountSchools(); // заполняем информацию о школах вводом с клавиатуры и записываем в "бинарник" CreateBinaryFile(nameBinaryFile, countSchool); PrintSchools(nameBinaryFile, countSchool); // добавляем новую школу перед заданной и выводим на экран результат printf("\nВведите № школы, перед которой планируется добавить новую школу: "); scanf("%d", &numberSchool); AddSchool(nameBinaryFile, &countSchool, numberSchool); PrintSchools(nameBinaryFile, countSchool); // удаляем все школы заданного региона и выводим на экран результат DeleteSchoolByRegion(nameBinaryFile, &countSchool, deletedRegion); PrintSchools(nameBinaryFile, countSchool); // удаляем бинарный файл с жесткого диска remove(nameBinaryFile); printf("\nДля завершения работы программы нажмите клавишу ENTER..."); getch(); // задержка работы программы, чтобы просмотреть результат return 0; // завершение работы программы и передача управления в ОС } //------------------------------------------------------------------------- |
Результаты работы программы
Стоимость заказа работы
➡ Стоимость программы из любого варианта составляет $350$ рублей.
➡ Стоимость детального алгоритма из любого варианта составляет $400$ рублей (заказывается опционально на ваше усмотрение, чтобы детально разобраться с решением лабораторной работы, например, не прибегая к консультации репетитора).
Также дополнительно вы можете заказать у нас:
- Построение аккуратной ГОСТовой блок-схемы. Ориентировочная стоимость $350$ рублей.
- Отчет о проделанной работе (иногда в вузах есть требование — предоставить отчет к лабораторной работе). Ориентировочная стоимость $250$ рублей.
Для оформления заказа пишите на почту: proglabs@mail.ru.
Время нашего ответа обычно составляет не более $10$ минут.
Добавить комментарий