Методические указания ЛР10_примеры__2014 (1079950), страница 6
Текст из файла (страница 6)
Для самых продвинутых студентовпредлагается вариант замены массива на двунаправленные списки во всех пунктахзадания ЛР.8. Требование к отчету по ЛРТребования к отчету по 10 ЛР соответствуют требованиям к другим ЛР подисциплине ОП. См. Документ на сайте.9. Контрольные вопросы к ДЗ/КЛР1.2.3.4.5.6.7.8.Для чего нужны проекты и в чем их преимущество (три)?Дайте определение понятия программа.Что такое сборка программы и как ее сделать?Какие составляющие циклов вы знаете?В чем преимущество возможности ветвления в программах?Какие элементы блок схем вы знаете?Что такое динамические массивы?Какие новые операции для указателей вы знаете?309.
Как вычислить размер массива при выполнении программы?10. Как определить длину строки?11. Как сравнить две строки?12. Что такое Null Terminated String?13. Как преобразовать число в строку и наоборот?14. Что такое вызов функции, фактические параметры?15. Что такое прототип функции, его составляющие и для чего он используется?16. Какие параметры можно задать для функции main?17. Как лучше задавать название функции?18. Что такое определение функции, его составляющие?19.
В чем массивы и структуры отличаются?20. Как выполнить инициализацию структуры при ее описании?21. Как работать с полями структуры через указатель?22. Для каких случаев можно использовать динамические структуры?23. Как можно передать структурную переменную в функцию? Массив структур?24. Могут ли в структуре использованные другие структурные переменные?25. Дайте определение понятия файл.26.
Какие основные типы файлов вы знаете?27. Зачем используются операции открытия и закрытия файлов?28. Какие уровни работы с файлами вы знаете?29. Какие функции используются для чтения файлов?30. Какие библиотеки нужно подключить для низкоуровневого ввода и вывода?31. Что такое список как структура данных? Дайте определение.32. Что такое элемент списка? Какие структуры элемента списка вы знаете?33. Какие особенности списков вы знаете по сравнению с массивами?34.
Что такое однонаправленные и двунаправленные списки? Их преимущества?35. Как используется структура типа список? Что такое хвост и голова списка10. Литература.1.2.3.4.Основная литератураСписок литературы, доступные книги и необходимые пособия для ЛР ОПразмещены на сайте www.sergebolshakov.ru на страничке “2-й к СУЦ”. Пароль длядоступа можно взять у преподавателя или старосты группы.Керниган Б., Ритчи Д. К36 Язык программирования Си.\Пер.
с англ., 3-е изд., испр. СПб.: "Невский Диалект", 2001. - 352 с.: ил.Касюк, С.Т. Курс программирования на языке Си: конспект лекций/С.Т. Касюк. —Челябинск: Издательский центр ЮУрГУ, 2010. — 175 с.MSDN Library for Visual Studio 2005 (Vicrosoft Document Explorer – входить в составдистрибутива VS. Нужно обязательно развернуть при установке VS VS илинастроить доступ через Интернет.)Дополнительная литература5.
Общее методическое пособие по курсу для выполнения ЛР и ДЗ (см. на сайте 1-йкурс www.sergebolshakov.ru) – см. кнопку в конце каждого раздела сайта!!!6. Другие методические материалы по дисциплине с сайта www.sergebolshakov.ru.7. Конспекты лекций по дисциплине “Основы программирования”.8. Подбельский В.В. Язык Си++: Учебное пособие. – М.: Финансы и статистика, 2003.9. 5. Подбельский В.В.
Стандартный СИ++: Учебное пособие. – М.: Финансы истатистика, 2008.10. Г. Шилдт “С++ Базовый курс”: Пер. с англ.- М., Издательский дом “Вильямс”, 2011г. – 672с11. Фридланд А.Я. Информатика и компьютерные технологии. Основные термины:толковый слов. : 3-е изд. Испр. и доп./ А.Я. Фридланд, Л.С. Хааамирова, И.А.31Фридланд. – М.:ООО «Издательство Астрель»: ООО «Издательство АСТ».
2003 –272с.12. Г. Шилдт “С++ Руководство для начинающих” : Пер. с англ. - М., Издательский дом“Вильямс”, 2005 г. – 672с13. Г. Шилдт “Полный справочник по С++”: Пер. с англ.- М., Издательский дом“Вильямс”, 2006 г. – 800с14. Бьерн Страуструп "Язык программирования С++"- М., Бином, 2010 г.3211. Приложения11.1. Главный модуль File_P3.cppFile_P3.cpp – ГЛАВНЫЙ МОДУЛЬ// Комплексния лабораторгная работа#include "stdafx.h"#include "FILE_P3.h"#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <io.h>//#include <afx.h>#include <stdio.h>//#include <iostream>#include <conio.h>#include <string>#include <string.h>#include <memory.h>//#include <errno.h>//using namespace std;//////////////////////////////////////////// Задание для работы с файлами (уровнь А)//////////////////////////////////////// Прототипы функций работы с файлами// МУ п.5void PrintStudent(Student * pS);// МУ п.8void StudPrintMas( Student * pMas , int Razm);// МУ п.12void StudFileToMas( const char * FileName , Student * pMas , int * pRazm);// МУ п.13void StudMasToFile( const char * FileName , Student * pMas , int Razm);// МУ п.14void StudPrintFile( const char * FileName );// МУ п.15int StudFileCount( const char * FileName , int * pRazm);// МУ п.16void StudClearFile(const char * FileName);// МУ п.17void ClearReadonlyFile(const char * FileName);// МУ п.18void SwapStudent ( Student * pA , Student * pB );// МУ п.20void StudSortMasNum( Student * pMas , int Razm );// МУ п.21void StudSortOklad(const char * FileName );// МУ п.22double StudSumm( const char * FileName , double * Sum);///////////////////////////////////////// Задание для работы с файлами (уровнь В и С)//////////////////////////////////////// МУ п.2133void StudSortName(const char * FileName );// МУ п.21void StudSortNum(const char * FileName );// МУ п.23.1/2void StudAdd(const char * FileName , Student S , TypeAddDel TAD );// МУ п.23.4/5void StudDel(const char * FileName , TypeAddDel TAD );// МУ п.23.3void StudAddNum(const char * FileName , Student S , int Numb );// МУ п.23.6void StudDelNum(const char * FileName , int Numb );// МУ п.23.7void FindStudNum( const char * FileName , Student * pS , int Numb);// МУ п.23.8void ChangeStudNum( const char * FileName , Student pS , int Numb);// МУ п.23.9int FindStudName( const char * FileName , Student * pS , const char * FindName );// МУ п.23.10void SwapStudFile( const char * FileName , int NumA ,int NumB);// МУ п.17/23ю11void StudRemoveFile(const char * FileName);/////////////////////////////////void main(void){system(" chcp 1251 > nul");//////////////////////////////////// СИ началоint pFBin = 0;/////////////////////////////////////////////////////////////////////StudRemoveFile("BDStud.bin"); // Тестирование БД////////// МУ п.3////////Student Stud1 ={ "Лаптева" , 1 , 1000.0};////////// МУ п.4////////Student Stud2;Stud2.Num = 2;Stud2.Oklad = 2000.00;strcpy(Stud2.Name , "Аксенова");printf ("Пункт МУ 4:\n");printf( "Stud2: Имя = %-15s Номер = %2d Стипендия = %8.2lf \n\n",Stud2.Name , Stud2.Num, Stud2.Oklad );////////// МУ п.5////////printf ("Пункт МУ 5:\n");PrintStudent(&Stud1) ;PrintStudent(&Stud2) ;////////// МУ п.6////////// Student * pStud = new Student;Student * pStud = (Student *) malloc (sizeof(Student));pStud->Num = 3;pStud->Oklad = 3000.00;strcpy(pStud->Name , "Большаков");printf ("Пункт МУ 6:\n");34PrintStudent( pStud ) ;// delete pStud;free( pStud );pStud= NULL;////////// МУ п.7////////Student SMas[] ={{"Первый" , 1 , 1000.0}, {"Второй" , 2 , 2000.0}, {"Третий" , 3 , 3000.0},{"Четвертый" , 4 , 4000.0}};int RazmS = sizeof(SMas)/ sizeof(Student); // Вычисление размерности массиваprintf ("Пункт МУ 7:\n");for (int i = 0 ; i < RazmS ; i++ )PrintStudent( &SMas[i] ) ;////////// МУ п.8////////printf ("Пункт МУ 8:\n");StudPrintMas( SMas , RazmS);////////// МУ п.9////////printf ("Пункт МУ 9:\n");const int Rzm = 6;Student * pPotok = new Student[Rzm];// Заполнениеsrand( (unsigned)time( NULL ) ); // Настройка датчика случайных чиселrand(); // первое числоfor (int i=0 ; i < Rzm ; i++ ){char Buf[20];char Num[10];strcpy(Buf , "Stud № - ");pPotok[i].Num = (rand()*9)/ RAND_MAX ; // диапазон 0 - 9pPotok[i].Oklad = 1000.0 * 10.0 * rand() / RAND_MAX ;// диапазон 0 - 10000.0int n = (rand()*30)/ RAND_MAX ;// диапазон 0 - 30strcat(Buf , itoa (n + 1 ,Num, 10 ));strcpy( pPotok[i].Name , Buf);//PrintStudent( &pPotok[i] );};StudPrintMas( pPotok , 6);////////// МУ п.10 BDStud.bin///////////////// МУ п.11 Синий////////Student ZMas[] ={{"Запись 1" , 0 , 1000.0}, {"Запись 2" , 0 , 2000.0}, {"Запись 3" , 0 , 3000.0},{"Запись 4" , 0 , 4000.0}};int RazmZ = sizeof(ZMas)/ sizeof(Student); // Вычисление размерности массиваprintf ("Пункт МУ 11(синий):\n");system ( "attrib -R BDStud.bin "); // Снятие атрибута защиты записи, нужно после первого созданияpFBin = _open( "BDStud.bin", _O_RDWR |_O_BINARY | _O_CREAT | _O_TRUNC);system("attrib -R BDStud.bin ");if ( pFBin != -1 ){for ( int i = 0 ; i < RazmZ ; i++ ){ZMas[i].Num = i + 1;35};_write (pFBin , &ZMas[i] , sizeof(Student));};_close( pFBin );StudPrintMas( ZMas , RazmZ);system("attrib -R BDStud.bin ");////////// МУ п.11 РасStudent MASStud[100];Student SRBuf;printf ("Пункт МУ 11(Печать файла):\n");pFBin = _open( "BDStud.bin", _O_RDWR |_O_BINARY );if ( pFBin != -1 ){for ( int i = 0 ; _eof(pFBin) == NULL ; i++ ){/* int nByte = _read( pFBin , &SRBuf , sizeof(Student));PrintStudent( &SRBuf ); */int nByte = _read( pFBin , &MASStud[i] , sizeof(Student));PrintStudent( &MASStud[i] );RazmZ = i;}_close( pFBin );};printf ("Пункт МУ 11(Печать всего массива):\n");StudPrintMas( MASStud , RazmZ + 1 );////////// МУ п.11 Зеленый////////printf ("Пункт МУ 11:\n");system ( "attrib -R BDStud.bin "); // Снятие атрибута защиты записи, нужно после первогосозданияpFBin = _open( "BDStud.bin", _O_RDWR |_O_BINARY | _O_CREAT | _O_TRUNC);system("attrib -R BDStud.bin ");{if ( pFBin != -1 )for ( int i = 0 ; i < 4 ; i++ ){Student StudFile;char Buf[20];char Num[10];strcpy(Buf , "Запись № - ");StudFile.Num = (rand()*9)/ RAND_MAX ;StudFile.Oklad = 1000.0 * 10.0 * rand() / RAND_MAX ;strcat(Buf , itoa (i + 1 ,Num, 10 ));strcpy( StudFile.Name , Buf);////_write (pFBin , &StudFile , sizeof(Student));PrintStudent( &StudFile );};_close( pFBin );system("attrib -R BDStud.bin ");};36// Специальные функции:// - из файла в массив ( имя файла , указатель на массив структурных переменных)/////////////////////////////////////////////////////////////// МУ п.12////////Student * pStMas;int StudCount;//printf ("Пункт МУ 12:\n");//printf ("Работа с функциями:\n");StudFileToMas( "BDStud.bin" , &pStMas , &StudCount );StudPrintMas( pStMas , StudCount);// - из массива в файл ( имя файла , указатель на массив структурных переменных)strcpy( (char *)((pStMas + 1)->Name) , "Новая");/////////////////////////////////////////////////////////////// МУ п.13////////Student NZMas[] ={{"Запись 1" , 1 , 1000.0}, {"Запись 2" , 2 , 5000.0}, {"Запись 3" , 3 , 3000.0},{"Запись 4" , 4 , 4000.0}};RazmZ = sizeof(NZMas)/ sizeof(Student); // Вычисление размерности массива// Изменение второй (индекс = 1) записиNZMas[1].Num =5;strcpy( NZMas[1].Name , "Изменение 2-й");printf ("Пункт МУ 13:\n");StudMasToFile( "BDStud.bin" , NZMas , RazmZ );printf ("После редактирования массива и запоминания в файле\n");StudPrintMas( NZMas , StudCount);////////// МУ п.14////////printf ("Пункт МУ 14:\n");printf ("После редактирования массива и запоминания - распечатка из файла функцией:\n");// Распечатка файла записейStudPrintFile( "BDStud.bin" );// Число записей в БД////////// МУ п.15////////printf ("Пункт МУ 15:\n");/////////////////////////////////////////////////////printf( "Число записей в БД = %d \n",StudFileCount( "BDStud.bin" , &StudCount ));// Заполнение файла на основе массива////////// МУ п.13 (второй вариант на основе инициализированного массива)////////printf ("Пункт МУ 13:\n");Student StudMas[] ={{"Иванов" , 3 , 7000.0}, {"Петров" , 2 , 2000.0}, {"Сидоров" , 1 , 3000.0},{"Печкин" , 4 , 4000.0}};StudMasToFile( "BDStud.bin" , StudMas , StudCount );// Распечатка файла записейStudPrintFile( "BDStud.bin" );//////////// МУ п.16////////printf ("Пункт МУ 16:\n");StudClearFile("BDStud.bin");StudPrintFile( "BDStud.bin" );37////////// МУ п.17//////////printf ("Пункт МУ 17:\n");// StudRemoveFile("BDStud.bin"); // Временно за комментированоClearReadonlyFile("BDStud.bin");StudClearFile("BDStud.bin");StudPrintFile( "BDStud.bin" );//printf ("Пункт МУ 17 снова добавим записи из массива:\n");StudMasToFile( "BDStud.bin" , pStMas , StudCount );StudPrintFile( "BDStud.bin" );////////// МУ п.18////////printf ("Пункт МУ 18 (Sawp - до):\n");Student StudA ={ "Лаптева" , 1 , 1000.0};Student StudB ={ "Иванова" , 2 , 2000.0};PrintStudent(&StudA) ;PrintStudent(&StudB) ;printf ("Пункт МУ 18 (Sawp - после):\n");SwapStudent( &StudA , &StudB); // Обмен двух отдельныз записейPrintStudent(&StudA) ;PrintStudent(&StudB) ;// В массивеprintf ("Пункт МУ 18 (Sawp - pStMas - до):\n");StudPrintMas( pStMas , StudCount);printf ("Пункт МУ 18 (Sawp - pStMas - после):\n");SwapStudent( &pStMas[0] , &pStMas[2]); // Обмен двух элементов массиваStudPrintMas( pStMas , StudCount);// Сортировка массива по одному полю записи////////// МУ п.19////////printf ("Пункт МУ 19 (SORT - pStMas - до):\n");StudPrintMas( pStMas , StudCount);// Сортировка по окладуfor( int k =0 ; k< StudCount - 1 ; k++)for ( int i =0 ; i< StudCount - 1 ; i++ )if ( (pStMas + i)->Oklad > (pStMas + i + 1)->Oklad ) // ВозрастаниеSwapStudent( pStMas + i , pStMas + i + 1 );printf ("Пункт МУ 19 (SORT - pStMas - после Oklad):\n");StudPrintMas( pStMas , StudCount);// Сортировка по имениfor( int k =0 ; k< StudCount - 1 ; k++)for ( int i =0 ; i< StudCount - 1 ; i++ )if ( strcmp((pStMas + i)->Name , (pStMas + i + 1)->Name ) > 0 ) //ВозрастаниеSwapStudent( pStMas + i , pStMas + i + 1 );printf ("Пункт МУ 19 (SORT - pStMas - после Name):\n");StudPrintMas( pStMas , StudCount);// Сортировка по номеруfor( int k =0 ; k< StudCount - 1 ; k++)for ( int i =0 ; i< StudCount - 1 ; i++ )if ( (pStMas + i)->Num > (pStMas + i + 1)->Num ) // ВозрастаниеSwapStudent( pStMas + i , pStMas + i + 1 );printf ("Пункт МУ 19 (SORT - pStMas - после Num):\n");StudPrintMas( pStMas , StudCount);////////// МУ п.2038////////printf ("Пункт МУ 20 (SORT - функция - до):\n");StudPrintMas( pStMas , StudCount);StudSortMasNum( pStMas , StudCount );printf ("Пункт МУ 20 (SORT - функция - после):\n");StudPrintMas( pStMas , StudCount);//////////// МУ п.21////////// Сортировка файла (!!!) по одному полю записи/////////////////////////////////////////////////////printf ("Пункт МУ 21 (SORT - c разными функциями):\n");printf ("СОРТИРОВКА: Работа с функциями Name:\n");StudSortName("BDStud.bin" );StudPrintFile( "BDStud.bin" );/////////////////////////////////////////////////////printf ("СОРТИРОВКА: Работа с функциями Num (убывание):\n");StudSortNum("BDStud.bin");StudPrintFile( "BDStud.bin" );/////////////////////////////////////////////////////printf ("СОРТИРОВКА: Работа с функциями Oklad(возрастание ):\n");StudSortOklad("BDStud.bin" );StudPrintFile( "BDStud.bin" );/////////////////////////////////////////////////////////////// МУ п.22 чтение одной записи 3-й (0 - 4 )////////Student SFind ;pFBin = _open( "BDStud.bin" , _S_IREAD |_O_BINARY );if ( pFBin != -1 ){long posF = _lseek( pFBin, sizeof(Student) * 2, SEEK_SET ); // Установить новую текущую позициюint nByte = _read( pFBin , &SFind , sizeof(Student));};printf ("Пункт МУ 22:\n");printf ("Чтение из программы (номер = 3):\n");PrintStudent( &SFind );// Закрытие файла_close( pFBin );//////////// МУ п.22.1 чтение из функции///////////// - Прочитать запись по номеруprintf ("Чтение из функции (номер = 1):\n");// Student SFind ;FindStudNum( "BDStud.bin" , &SFind , 1);PrintStudent( &SFind );////////// МУ п.22.2 интегрированные расчеты в программе////////double SumStip = 0;Student SIntg;printf ("Пункт МУ 22.2(Интегральные расчеты):\n");pFBin = _open( "BDStud.bin" , _S_IREAD |_O_BINARY );if ( pFBin != -1 ){for ( int i = 0 ; _eof(pFBin) == NULL ; i++ ){39int nByte = _read( pFBin , &SIntg , sizeof(Student));SumStip = SumStip + SIntg.Oklad;}_close( pFBin );};printf ( "Фонд зарплаты в цикле = %8.2lf \n" , SumStip );////////// МУ п.22////////double SumOklad;printf ( "Фонд зарплаты из функции = %8.2lf \n" , StudSumm( "BDStud.bin" , &SumOklad));////////////////////////////////////////////////////////////////////////////////////////////////////////////// Очистка файла и его удалениеClearReadonlyFile("BDStud.bin");// StudClearFile("BDStud.bin");// StudRemoveFile("BDStud.bin");///// УРОВЕНЬ С///////////////////////////////////////// МУ п.23///////////////////////////////////////////////// МУ п.23.1////////// Добавить запись ( начало )printf ("Добавление (начало):\n");Student SFirst = {"Первый" , 22 , 3400.00};StudAdd("BDStud.bin", SFirst , First );StudPrintFile( "BDStud.bin" );////////// МУ п.23.2////////// - Добавить запись ( конец)printf ("Добавление (конец):\n");Student SLast = {"Последний" , 22 , 3400.00};StudAdd("BDStud.bin", SLast );StudPrintFile( "BDStud.bin" );/////////////////////////////////////////////////////////////// МУ п.23.3////////// Добавить запись (номер)/////////////////////////////////////////////////////printf ("Добавление (номер):\n");Student SNumb = {"По номеру - 2" , 33 , 5500.00};StudAddNum("BDStud.bin", SNumb, 3);StudPrintFile( "BDStud.bin" );///// - Удалить запись по номеру (? другие режимы)/////////////////////////////////////////////////////////////// МУ п.23.4////////printf ("Удаление (Начало):\n");StudDel("BDStud.bin", First );StudPrintFile( "BDStud.bin" );/////////////////////////////////////////////////////////////// МУ п.23.5////////printf ("Удаление (конец):\n");StudDel("BDStud.bin", Last );40//StudDel("BDStud.bin" );StudPrintFile( "BDStud.bin" );/////////////////////////////////////////////////////////////// МУ п.23.6////////printf ("Удаление (номер):\n");StudDelNum("BDStud.bin", 4 );StudPrintFile( "BDStud.bin" );/////////////////////////////////////////////////////////////// МУ п.23.7///////////// - Прочитать запись по номеруprintf ("Чтение (номер):\n");Student * pFind = new Student;FindStudNum( "BDStud.bin" , pFind , 2);PrintStudent( pFind );/////////////////////////////////////////////////////// - Изменить запись по номеру////////// МУ п.23.8////////printf ("Изменение записи (номер):\n");Student SChang ={"Замена" , 11, 111.00};ChangeStudNum( "BDStud.bin" , SChang , 2);StudPrintFile( "BDStud.bin" );/////////////////////////////////////////////////////// - Найти запись по признаку раверства поля (имени - первую в файле) по любому полю////////// МУ п.23.9////////int n;printf ("Поиск по имени:\n");if ( ( n =FindStudName( "BDStud.bin" , pFind , "Замена" )) != -1){ printf ("Найдена по номеру = %d \n", n );printf ("Найдена запись: ");PrintStudent( pFind );}elseprintf ("Не найдена запись! ");/////////////////////////////////////////////////////////////// МУ п.23.10////////// Swap замена записей в файле БДprintf ("Замена SWAP в файле по номеру: 1<->3\n");SwapStudFile( "BDStud.bin" , 1 ,3 );StudPrintFile( "BDStud.bin" );///////////////////////////////////////////////////////delete [] pStMas;/////////////////////////////////////////////////////system("PAUSE");/////////////////////////////////////////////////////}4111.2.














