КР по ОАиП для заочников. Основы алгоритмизации и программирования
![]()
|
, const char * управляющая_строка ); читает форматированные данные из файла. Строка форматирования строится аналогично функции fprintf Функция void rewind (FILE * указатель_на _файл ); устанавливает указатель текущей позиции выделенного файла в начало файла. Функция int ferror (FILE * указатель_на _файл ); определяет, произошла ли ошибка во время работы с файлом. Функция size_t fwrite (const void * записываемое_данное , size_t размер_элемента , size_t число_элементов , FILE * указатель_на _файл ); записывает в файл заданное число данных определенного размера. Размер дан- ных задается в байтах. Тип size_t определяется как целое значение без знака. Функция size_t fread (void * считываемое_данное , size_t размер_элемента , size_t число_элементов , FILE * указатель_на _файл ); считывает из файла указанное число данных заданного размера. Размер задает- ся в байтах. Функция возвращает число прочитанных элементов. Если число прочитанных элементов не равно заданному, то при чтении возникла ошибка или встретился конец файла. Функция 44 int fileno (FILE * указатель_на _файл ); возвращает значение дескриптора (логический номер файла для заданного по- тока) указанного файла. Функция long filelength (int дескриптор ); возвращает длину файла с соответствующим дескриптором в байтах. Функция int fseek (FILE * указатель_на _файл , long int число_байт , int точка_отсчета ); устанавливает указатель в заданную позицию. Заданное количество байт отсчи- тывается от позиции, которая задаѐтся следующими макросами: SEEK_SET или 0 – начало файла, SEEK_CUR или 1 – текущая позиция, SEEK_END или 2 – конец файла. 6.4. Пример выполнения задания Написать программу формирования файла, содержащего экзаменацион- ную ведомость студентов: фамилию и оценки по математике и программиро- ванию. Предусмотреть возможность чтения из файла. Вывести список сту- дентов, сдавших экзамен по программированию с оценкой 9, и записать эту информацию в текстовой файл. #include #include #include #include #include FILE *fl; typedef struct { char fio[30]; unsigned char matem; unsigned char oaip; } TStudent; TStudent stud[30]; // Массив структур char name[20]; // Имя файла int nst = 0; // Число введенных структур int Menu(); // Создание меню void Nnf(); // Ввод имени файла void Newf(); // Создание нового файла void Spisok(); // Формирование файла void Opf(); // Открытие файла void Resc(); // Вывод результата на экран void Resf(); // Вывод результата в файл 45 int main() { while (true) { switch (Menu()) { case 1: Nnf(); break; case 2: Newf(); break; case 3: Spisok(); break; case 4: Opf(); break; case 5: Resc(); break; case 6: Resf(); break; case 7: return 0; default: puts("Viberite pravilno!"); } puts ("Press any key to continue"); getch (); // Ожидание нажатия любой клавиши system ("cls"); // Очистка экрана } } int Menu() // Меню { cout << "VIBERITE:" << endl; cout << "1. Vvod file name" << endl; cout << "2. New file" << endl; cout << "3. Vvesti spisok" << endl; cout << "4. Open file" << endl; cout << "5. Vivesti result" << endl; cout << "6. Vivesti v fail" << endl; cout << "7. Exit" << endl; int i; cin >> i; // Ввод выбранного пункта меню return i; } void Nnf() // Ввод имени файла { cout << "Vvedite file name" << endl; cin >> name; } void Newf() // Создание нового файла { 46 if ((fl = fopen(name,"wb")) == NULL) { cout << "Oshibka pri sozdanii" << endl; exit(1); } cout << "OK" << endl; fclose(fl); } void Spisok() // Ввод данных в файла { if ((fl = fopen(name,"rb+")) == NULL) { cout << "Oshibka pri sozdanii" << endl; exit(1); } cout << "Vvedite chislo studentov" << endl; cin >> nst; for (int i=0; i cout << "Vvedite imya: "; cin >> stud[i].fio; cout << "Vvedite otcenku po matematike: "; cin >> stud[i].matem; cout << "Vvedite otcenku po OAiP: "; cin >> stud[i].oaip; fwrite (&stud[i], sizeof(TStudent), 1, fl); } fclose (fl); } void Opf() // Открытие бинарного файла { if ((fl = fopen (name,"rb")) == NULL) { cout << "Oshibka pri otkritii" << endl; exit(1); } nst = 0; TStudent std; while (true) { 47 int nwrt = fread (&std, sizeof(TStudent), 1, fl); if (nwrt != 1) break; stud[nst] = std; cout << stud[nst].fio << " " << stud[nst].matem << " " << stud[nst].oaip << endl; nst++; } fclose(fl); } void Resc() // Вывод результата на экран { for (int i=0; i cout << stud[i].fio << endl; } void Resf() // Вывод результата в текстовый файл { char namet[30]; FILE *ft; cout << "Vvedite imya faila" << endl; cin >> namet; if ((ft = fopen (namet,"w")) == NULL) { cout << "Oshibka pri sozdanii" << endl; exit(1); } char s[80]; for (int i=0; i { strcpy (s, stud[i].fio); strcat (s, "\n"); // Добавление разделителя строк fputs (s, ft); } fclose(ft); } 6.5. Индивидуальные задания Составить программу формирования файла, содержащего данные со- гласно варианту индивидуального задания. В программе предусмотреть сохра- 48 нение вводимых данных в файле и возможность чтения из ранее сохраненного файла. Вывести результаты на экран и в текстовой файл. 1. Список товаров, имеющихся на складе, включает в себя наименование товара, количество единиц товара, цену единицы товара. Вывести список това- ров, стоимость которых превышает 1 000 000 рублей. 2. Для получения места в общежитии формируется список студентов, ко- торый включает ФИО студента, группу, средний балл, доход на члена семьи. Вывести информацию о студентах, у которых доход на члена семьи менее двух минимальных зарплат. 3. В справочной автовокзала имеется расписание движения автобусов. Для каждого рейса указаны его номер, пункт назначения, время отправления и при- бытия. Вывести информацию о рейсах, которыми можно воспользоваться для прибытия в пункт назначения раньше заданного времени. 4. Информация о сотрудниках фирмы включает ФИО, количество прора- ботанных часов за месяц, почасовой тариф. Вывести размер заработной платы каждого сотрудника фирмы. 5. Информация об участниках спортивных соревнований содержит назва- ние команды, ФИО игрока, возраст. Вывести информацию о спортсменах, воз- раст которых не достиг 18 лет. 6. Для книг, хранящихся в библиотеке, указаны автор, название, год изда- ния, количество страниц. Вывести список книг, изданных после заданного года. 7. На заводе производится несколько наименований деталей. Сведения о деталях, выпущенных за последний месяц, включают номер цеха, наименова- ние детали, количество выпущенных деталей. Вывести информацию о про- дукции, выпущенной заданным цехом. 8. Информация о сотрудниках предприятия содержит ФИО, номер отдела, должность, дату начала работы. Вывести список сотрудников, проработавших на предприятии более 20 лет. 9. Ведомость абитуриентов содержит ФИО, город проживания, суммарный балл. Вывести информацию об абитуриентах, проживающих в городе Минске и имеющих балл больше 220. 10. В справочной аэропорта имеется расписание вылета самолетов на сле- дующие сутки. Для каждого рейса указаны номер рейса, пункт назначения, время вылета. Вывести для заданного пункта назначения номера рейсов и время вылета самолетов. 11. У администратора железнодорожных касс хранится информация о сво- бодных местах в поездах. Информация представлена в следующем виде: номер поезда, пункт назначения, время отправления, число свободных мест. Вывести информацию о поездах, в которых имеются свободные места до заданного пункта назначения. 12. Ведомость студентов, сдававших сессию, содержит ФИО и оценки по четырем предметам. Вывести список студентов, сдавших сессию со средним баллом больше 7. 49 13. В радиоателье хранятся квитанции о сданных в ремонт телевизорах. Каждая квитанция содержит марку телевизора, дату приемки в ремонт, состоя- ние готовности заказа (выполнен, не выполнен). Вывести информацию о невы- полненных на текущий момент заказах. 14. На АТС информация о разговорах содержит номер телефона абонента, время разговора и тариф. Вывести для заданного абонента сумму оплаты за раз- говоры. 15. В магазине составлен список людей, которым выдана карта постоянно- го покупателя. Каждая запись этого списка содержит номер карточки, ФИО, предоставляемую скидку. Вывести информацию о покупателях, имеющих 10 %-ную скидку в магазине. 50 ПРИЛОЖЕНИЕ 1 БЛОК-СХЕМА АЛГОРИТМА Благодаря своей наглядности данный способ записи алгоритмов получил наибольшее распространение. При построении блок-схемы алгоритм изобража- ется геометрическими фигурами (блоками), связанными линиями (направление потока информации) со стрелками. Внутри блоков записывается последова- тельность действий. В таблице 1 приведены виды и назначение основных блоков, применяе- мых при составлении блок-схемы алгоритма. Таблица 1. Виды и назначение основных блоков Наименование блока 0бозначение блока Функции блока процесс выполнение действий, изменяющих значение, форму представления или расположение данных ввод-вывод ввод или вывод данных условие выбор направления выполнения алго- ритма в зависимости от заданного в блоке условия предопределен- ный процесс вызов подпрограммы пуск-останов начало или конец описания алгоритма цикл с параметром цикл с параметром; внутри блока ука- зывается изменение параметра (пере- менной цикла), например, i=1,10 внутристранич- ный соединитель переход между блоками в пределах данной страницы межстраничный соединитель переход между блоками, расположен- ными на разных листах 51 Наименование блока 0бозначение блока Функции блока комментарий пояснение действий, указанных в бло- ке Правила оформления блок-схем: в пределах одной схемы блоки изображают одинаковых размеров; все блоки нумеруются (номер ставится в верхнем левом углу блока с разрывом линии); линии, соединяющие блоки и указывающие последовательность свя- зей между ними, проводятся параллельно линиям рамки; стрелка в конце линии не ставится, если линия направлена слева на- право или сверху вниз; из блока «условие» могут выходить две линии, из других блоков — только одна линия; если схема занимает более одного листа, то в случае разрыва линии используется межстраничный соединитель; внутри каждого соединителя указывается номер блока (откуда или ку- да направлена соединительная линия). Внутри межстраничного соединителя в первой строке указывается номер листа, во второй —номер блока куда или от- куда передается управление. В зависимости от поставленной задачи выделяют три основных вида ал- горитмов: линейный; разветвляющийся; циклический. Линейным называется алгоритм, в котором все действия, указанные в блоках, выполняются по порядку их следования. Пример блок-схемы алгоритма вычисления площадей прямоугольника и квадрата (рис. 7). Рис. 7 - Блок-схема линейного алгоритма 52 Разветвляющимся называют алгоритм, в котором в зависимости от зна- чения условия (выполняется или не выполняется) изменяется последователь- ность выполнения действий алгоритма. Пример блок-схемы алгоритма определения принадлежности точки с ко- ординатами (x, y) номеру сектора (рис. 8). Рис. 8 - Блок-схема разветвляющегося алгоритма Циклическим называется алгоритм, в котором некоторая последователь- ность действий повторяется определенное количество раз. Тело цикла – действия, выполняемые в цикле. Циклические алгоритмы могут быть: с предусловием – условие, при котором выполняется тело цикла, зада- ется в начале цикла (рис. 9); с постусловием – условие, при котором выполняется тело цикла, за- дается в конце цикла (рис. 10); с параметром — в начале цикла задается правило изменения его па- раметра (рис. 11). 53 Рис. 10 - Цикл с Рис. 11 - Цикл с Рис. 9 - Цикл постусловием параметром с предусловием Пример блок-схемы циклического алгоритма нахождения НОД (наи- большего общего делителя) двух значений a и b. Правило нахождения НОД (a, b) формулируется следующим образом: 1. определяется наибольшее из значений a и b — max (a, b); 2. из наибольшего значения вычитается оставшееся значение; 3. п.п. 1 и 2 повторяются до тех пор, пока значения a и b не станут равными. Полученное значение будет НОД (a, b). Решение: Предположим, что a=20 и b=15. Тогда: max (a, b) = max (20, 15) = 20 → a=20-15=5 b=15 max (a, b) = max (5, 15) = 15 → a=5 b=15-5=10 max (a, b) = max (5, 10) = 10 → a=5 b=10-5=5 a = b => НОД (a, b) =5 Составим блок-схему алгоритма нахождения НОД (a, b) (рис. 12): 54 Рис. 12 Блок-схема алгоритма нахождения НОД (a, b). Для реализации алгоритма на компьютере необходимо описать его на языке программирования. 55 ПРИЛОЖЕНИЕ 2 ПРИМЕР ОФОРМЛЕНИЯ Задание 1 Составить программу вычисления линейного арифметического выраже- ния 2 1 3 e 10 ln( ) 1 tg y y x h x z x y z При x = 2,45; y = – 0,423·10 -2 ; z = 1,232·10 3 ответ: h = 6,9465. Блок-схема алгоритма Код программы #include #include { double x, y, z, h; cout << "Vvedite x: "; cin >> x; 56 cout << "Vvedite y: "; cin >> y; cout << "Vvedite z: "; cin >> z; h = pow(x, 2*y) + exp(y-1); h / = 1+x * fabs(y - tan(z)); h + = 10 * pow(x, 1/3.) - log(z); cout << "Result h= " << h << endl; return 0; } Результаты выполнения программы 57 ЛИТЕРАТУРА 1. Основы алгоритмизации и программирования. Язык Си: учеб. пособие // М. П. Батура [и др.] / – Минск: БГУИР, 2007. 2. Основы алгоритмизации и программирования: конспект лекций для студ. всех спец. и всех форм обуч. БГУИР / В. Л. Бусько [и др.] /. – Минск: БГУИР, 2004. 3. Вирт, Н. Алгоритмы и структуры данных/ Н. Вирт– СПб.: Невский диа- лект, 2005. 4. Кнут, Д. Искусство программирования: В 3 т. Т. 3/ Д. Кнут Сортировка и поиск / – М.: Вильямс, 2000. 5. Хопкрофт, Дж. Структуры данных и алгоритмы / Дж. Хопкрофт, Дж.Ульман, А. Ахо– М.: Вильямс, 2003. 6. Павловская, Т. А. С/С++. Программирование на языке высокого уровня / Павловская Т. А. – СПб.: Питер, 2004. 7. Павловская Т. А. С++. Объектно-ориентированное программирование: практикум / Т. А.Павловская, Ю. А. Щупак – СПб.: Питер, 2004. 8. Керниган Б. Язык программирования Си / Б. Керниган, Д. Ритчи – М.: Финансы и статистика, 1992. 9. Демидович Е. М. Основы алгоритмизации и программирования. Язык СИ / Е. М. Демидович – Минск: Бестпринт, 2001. 10. Страуструп Б. Язык программирования С++ / Б. Страуструп – СПб.: БИНОМ, 1999. |