Методические указания ЛР10(примеры)_2014 (1079944), страница 3
Текст из файла (страница 3)
char Comand[40];
// Снятие защиты с файла - отключение Readonly
strcpy (Comand , "attrib -R ");
strcat (Comand , FileName);
system( Comand );
int pFBin = _open( FileName , _O_RDWR |_O_BINARY | _O_CREAT | _O_TRUNC);
if ( pFBin == -1 ) return;
// цикл записи в файл
for ( int i = 0 ; i < Razm ; i++ )
{
_write (pFBin , pMas + i , sizeof(Student));
};
_close( pFBin );
//
};
…
//////// ПРОТОТИП
// МУ п.13
void StudMasToFile( const char * FileName , Student * pMas , int Razm);
…
////////
// МУ п.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);
////////
…
Результат работы программы (распечатка):
Пункт МУ 13:
После редактирования массива и запоминания в файле
Запись: Имя = Запись 1 Номер = 1 Стипендия = 1000.00
Запись: Имя = Изменение 2-й Номер = 5 Стипендия = 5000.00
Запись: Имя = Запись 3 Номер = 3 Стипендия = 3000.00
Запись: Имя = Запись 4 Номер = 4 Стипендия = 4000.00
Результат работы программы файла - BDStud.bin нужно посмотреть также в любом файл менеджере.
14. Разработать отдельную функцию распечатки файла с записями своих структурных переменных. Проверить работу этой функции.
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// МУ п.14
///////////////////////
// Печать файла БД Студентов
void StudPrintFile( const char * FileName )
{
long posF;
int pFBin = _open( FileName, _S_IREAD |_O_BINARY );
if ( pFBin != -1 )
{
posF = _lseek( pFBin, 0, SEEK_END ); // Установить новую текущую позицию
int Razm = posF / sizeof(Student);
if ( Razm == 0 ) { _close( pFBin ); printf( "Записей в файле нет! \n") ; return;};
posF = _lseek( pFBin, 0, SEEK_SET ); // На начало
// Буфер для чтения
Student SBuf;
for (int i = 0 ; i < Razm ; i++ )
{
int nByte = _read( pFBin , &SBuf , sizeof(Student));
if ( nByte == NULL) break;
// вывод записи
printf( "%d - ", i + 1);
PrintStudent(&SBuf);
};
// Закрытие файла
_close( pFBin );
};
};
…
//////// ПРОТОТИП
// МУ п.14
void StudPrintFile( const char * FileName );
…
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.14
////////
printf ("Пункт МУ 14:\n");
printf ("После редактирования массива и запоминания - распечатка из файла функцией:\n");
// Распечатка файла записей
StudPrintFile( "BDStud.bin" );
…
Результат работы программы:
Пункт МУ 13:
1 - Запись: Имя = Нов. Запись 1 Номер = 2 Стипендия = 1000.00
2 - Запись: Имя = Нов. Запись 2 Номер = 2 Стипендия = 2000.00
3 - Запись: Имя = Нов. Запись 3 Номер = 2 Стипендия = 3000.00
4 - Запись: Имя = Нов. Запись 4 Номер = 2 Стипендия = 4000.00
15. Разработать функцию определения числа записей в файле. Проверить ее работу на своем файле.
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// Получить число записей в БД
// МУ п.15
int StudFileCount( const char * FileName , int * pRazm)
{
long posF;
int pFBin = _open( FileName, _S_IREAD |_O_BINARY );
if ( pFBin == -1 ) { *pRazm = NULL; return NULL;};
posF = _lseek( pFBin, 0, SEEK_END ); // Установить новую текущую позицию
*pRazm = posF / sizeof(Student);
_close( pFBin );
return *pRazm;
};
…
//////// ПРОТОТИП
// МУ п.15
int StudFileCount( const char * FileName , int * pRazm);
…
//////// ГЛАВНАЯ ПРОГРАММА
// Число записей в БД
////////
// МУ п.15
////////
printf ("Пункт МУ 15:\n");
/////////////////////////////////////////////////////
printf( "Число записей в БД = %d \n",StudFileCount( "BDStud.bin" , &StudCount ));
…
Результат работы программы:
Пункт МУ 15:
Число записей в БД = 4
16. Разработать функцию очистки файла. Проверить ее работу совместно с функцией распечатки файла записей – ничего не должно напечататься. Кроме этого проверить размер файла в файл-менеджере (Far, TotalComander и др.), этот размер должен быть равен нулю.
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
/////////////////////////
// Очистка файла студентов
// МУ п.16
/////////////////////////
void StudClearFile(const char * FileName)
{
char Comand[40];
// Временное снятие защиты с файла - отключение Readonly
strcpy (Comand , "attrib -R ");
strcat (Comand , FileName);
system( Comand );
int pFBin = _open( FileName , _O_RDWR |_O_BINARY | _O_CREAT | _O_TRUNC);
if ( pFBin == -1 ) return;
_close( pFBin );
};
…
//////// ПРОТОТИП
// МУ п.16
void StudClearFile(const char * FileName);
…
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.16
////////
StudPrintFile( "BDStud.bin" );
printf ("Пункт МУ 16:\n");
StudClearFile("BDStud.bin"); //Очистка файла БД
StudPrintFile( "BDStud.bin" );
…
Печать до очистки:
1 - Запись: Имя = Иванов Номер = 3 Стипендия = 7000.00
2 - Запись: Имя = Петров Номер = 2 Стипендия = 2000.00
3 - Запись: Имя = Сидоров Номер = 1 Стипендия = 3000.00
4 - Запись: Имя = Печкин Номер = 4 Стипендия = 4000.00
Результат работы программы после очистки:
Пункт МУ 16:
Записей в файле нет!
17. Проверить использование функций удаления файла и снятия атрибута защиты файла, взяв ее из проекта примера. Заполним снова и распечатаем.
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
//////////////////////////////////
// Сброс флага файла
// МУ п.17
//////////////////////////////////
void ClearReadonlyFile(const char * FileName)
{
char Comand[40];
// Снятие защиты с файла - отключение Readonly
strcpy (Comand , "attrib -R ");
strcat (Comand , FileName);
system( Comand );
};
//////////////////////////////////
// МУ п.17
//////////////////////////////////
void StudRemoveFile(const char * FileName)
{
char Comand[40];
// Снятие защиты с файла - отключение Readonly
strcpy (Comand , "attrib -R ");
strcat (Comand , FileName);
system( Comand );
strcpy (Comand , "attrib -A ");
strcat (Comand , FileName);
system( Comand );
// Удаление файла все дискрипторы файла должны быть закрыты
strcpy (Comand , "del ");
strcat (Comand , FileName);
system( Comand );
};
…
//////// ПРОТОТИП
// МУ п.17
void ClearReadonlyFile(const char * FileName);
void StudRemoveFile(const char * FileName);
…
//////// ГЛАВНАЯ ПРОГРАММА
///////
// МУ п.17
////////
//
printf ("Пункт МУ 17:\n");
// StudRemoveFile("BDStud.bin"); // Временно за комментировано
ClearReadonlyFile("BDStud.bin");
StudClearFile("BDStud.bin");
StudPrintFile( "BDStud.bin" );
////////
18. Разработать функцию Swap двух структурных переменных (по адресу элемента) структурных переменных. Продемонстрировать и проверить работу этой функции на отдельных переменных и элементах массива.
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
/ МУ п.18
//////////////////////////////////
// обмен на основе копирования структурных переменных (возможен только без динамики!!)
void SwapStudent ( Student * pA , Student * pB )
{
Student Temp;
memcpy( &Temp , pA, sizeof(Student) );
memcpy( pA , pB, sizeof(Student) );
memcpy( pB , &Temp, sizeof(Student) ); };
…
//////// ПРОТОТИП
// МУ п.18
void SwapStudent ( Student * pA , Student * pB );
…
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.18
////////
printf ("Пункт МУ 17 снова добавим записи из массива:\n");
StudMasToFile( "BDStud.bin" , pStMas , StudCount );
StudPrintFile( "BDStud.bin" );
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);
…
Результат работы программы:
Пункт МУ 18 (Sawp - до):
Запись: Имя = Лаптева Номер = 1 Стипендия = 1000.00
Запись: Имя = Иванова Номер = 2 Стипендия = 2000.00
Пункт МУ 18 (Sawp - после):
Запись: Имя = Иванова Номер = 2 Стипендия = 2000.00
Запись: Имя = Лаптева Номер = 1 Стипендия = 1000.00
Пункт МУ 18 (Sawp - pStMas - до):
Запись: Имя = Запись № - 1 Номер = 7 Стипендия = 3889.89
Запись: Имя = Новая Номер = 3 Стипендия = 9363.99
Запись: Имя = Запись № - 3 Номер = 2 Стипендия = 7457.20
Запись: Имя = Запись № - 4 Номер = 6 Стипендия = 7769.71
Пункт МУ 18 (Sawp - pStMas - после):
Запись: Имя = Запись № - 3 Номер = 2 Стипендия = 7457.20
Запись: Имя = Новая Номер = 3 Стипендия = 9363.99
Запись: Имя = Запись № - 1 Номер = 7 Стипендия = 3889.89
Запись: Имя = Запись № - 4 Номер = 6 Стипендия = 7769.71
19. На основе этой функции (Swap) выполнить сортировку массива структурных переменных по одному числовому значению, используя метод пузырьковой сортировки. Оптимизацию алгоритма сортировки не проводить. Распечатать массив до и после сортировки.
//////// ГЛАВНАЯ ПРОГРАММА
// Сортировка массива по одному полю записи
////////
// МУ п.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);
////////
Результат работы программы:
Пункт МУ 19 (SORT - pStMas - до):
Запись: Имя = Запись № - 3 Номер = 6 Стипендия = 4278.08
Запись: Имя = Новая Номер = 2 Стипендия = 7449.57
Запись: Имя = Запись № - 1 Номер = 7 Стипендия = 9168.37
Запись: Имя = Запись № - 4 Номер = 0 Стипендия = 4886.93
Пункт МУ 19 (SORT - pStMas - после Oklad):
Запись: Имя = Запись № - 3 Номер = 6 Стипендия = 4278.08
Запись: Имя = Запись № - 4 Номер = 0 Стипендия = 4886.93
Запись: Имя = Новая Номер = 2 Стипендия = 7449.57
Запись: Имя = Запись № - 1 Номер = 7 Стипендия = 9168.37














