Методические указания ЛР10(примеры)_2014 (1079944), страница 4
Текст из файла (страница 4)
Пункт МУ 19 (SORT - pStMas - после Name):
Запись: Имя = Запись № - 1 Номер = 7 Стипендия = 9168.37
Запись: Имя = Запись № - 3 Номер = 6 Стипендия = 4278.08
Запись: Имя = Запись № - 4 Номер = 0 Стипендия = 4886.93
Запись: Имя = Новая Номер = 2 Стипендия = 7449.57
Пункт МУ 19 (SORT - pStMas - после Num):
Запись: Имя = Запись № - 4 Номер = 0 Стипендия = 4886.93
Запись: Имя = Новая Номер = 2 Стипендия = 7449.57
Запись: Имя = Запись № - 3 Номер = 6 Стипендия = 4278.08
Запись: Имя = Запись № - 1 Номер = 7 Стипендия = 9168.37
20. Разработать функцию сортировки массива структурных переменных по числовому значению. Проверить ее работу. Распечатать массив до и после сортировки.
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// МУ п.20
//////////////////////////////////
void StudSortMasNum( Student * pStMas , int 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 );
};
…
//////// ПРОТОТИП
// МУ п.20
void StudSortMasNum( Student * pMas , int Razm );
…
//////// ГЛАВНАЯ ПРОГРАММА
////////
// МУ п.20
////////
printf ("Пункт МУ 20 (SORT - функция - до):\n");
StudPrintMas( pStMas , StudCount);
StudSortMasNum( pStMas , StudCount );
printf ("Пункт МУ 20 (SORT - функция - после):\n");
StudPrintMas( pStMas , StudCount);
//
…
Результат работы программы:
Пункт МУ 20 (SORT - функция - до):
Запись: Имя = Запись № - 3 Номер = 6 Стипендия = 4278.08
Запись: Имя = Новая Номер = 2 Стипендия = 7449.57
Запись: Имя = Запись № - 1 Номер = 7 Стипендия = 9168.37
Запись: Имя = Запись № - 4 Номер = 0 Стипендия = 4886.93
Пункт МУ 20 (SORT - функция - после):
Запись: Имя = Запись № - 4 Номер = 0 Стипендия = 4886.93
Запись: Имя = Новая Номер = 2 Стипендия = 7449.57
Запись: Имя = Запись № - 3 Номер = 6 Стипендия = 4278.08
Запись: Имя = Запись № - 1 Номер = 7 Стипендия = 9168.37
21. Разработать функцию сортировки файла структурных переменных (записей). Алгоритм функции включает три шага: (1) чтение двоичного файла в массив – уже есть готовая функция; (2) пузырьковая сортировка массива структурных переменных– уже есть готовая функция и (3) перезапись массива в двоичный файл – уже есть готовая функция. Проверить сортировку файлов со структурными переменными.
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// Сортировка массива по окладу по убыванию
// МУ п.21
/////////////////////////////
void StudSortOklad(const char * FileName )
{
// Чтение из файла в массив
Student * pStudMas;
int Razm;
StudFileToMas( FileName , &pStudMas , &Razm );
// Сортировка массива по окладу по убыванию
for (int i = 0 ; i < Razm - 1 ; i++ )
for (int k = 0 ; k < Razm - 1 ; k++ )
// Сортировка разные режимы!!!!!!!!!!!!!!!!!!!!!!!!!!!
if ( ((Student *)(pStudMas + k))->Oklad > ((Student *)(pStudMas + k +1))->Oklad ) // Убывание курс
{ SwapStudent ( pStudMas + k , pStudMas + k+1 ); };
//
StudMasToFile( FileName , pStudMas , Razm );
};
///////////////////////////////////////
// Сортировка по имени (дополнительные примеры) МУ п.21
//////////////////////////////////////
void StudSortName(const char * FileName )
{
// Чтение из файла в массив
Student * pStudMas;
int Razm;
StudFileToMas( FileName , &pStudMas , &Razm );
//
/////////////////////////////
for (int i = 0 ; i < Razm - 1 ; i++ )
for (int k = 0 ; k < Razm - 1 ; k++ )
// Сортировка по имени
if ( strcmp(((Student *)(pStudMas + k))->Name , ((Student *)(pStudMas + k +1))->Name) > 0 ) // Убывание имя
{ SwapStudent ( pStudMas + k , pStudMas + k+1 ); };
//
StudMasToFile( FileName , pStudMas , Razm );
};
//////////////////////////////////////
// Сортировка по номеру (дополнительные примеры) МУ п.21
//////////////////////////////////////
void StudSortNum(const char * FileName )
{
// Чтение из файла в массив
Student * pStudMas;
int Razm;
StudFileToMas( FileName , &pStudMas , &Razm );
StudSortMasNum( pStudMas , Razm ); // Использование сортировки в массиве!!!
StudMasToFile( FileName , pStudMas , Razm );
};
/////////////////////////////////////////////////////////
…
//////// ПРОТОТИП
// МУ п.21
void StudSortOklad(const char * FileName );
void StudSortName(const char * FileName );
void StudSortNum(const char * FileName );
…
//////// ГЛАВНАЯ ПРОГРАММА
////////
// МУ п.21
////////
// Сортировка файла (!!!) по одному полю записи
/////////////////////////////////////////////////////
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" );
/////////////////////////////////////////////////////
…
Результат работы программы:
Пункт МУ 21 (SORT - c разными функциями):
СОРТИРОВКА: Работа с функциями Name:
1 - Запись: Имя = Запись № - 1 Номер = 0 Стипендия = 2746.36
2 - Запись: Имя = Запись № - 3 Номер = 5 Стипендия = 873.44
3 - Запись: Имя = Запись № - 4 Номер = 3 Стипендия = 1478.01
4 - Запись: Имя = Новая Номер = 4 Стипендия = 6173.89
СОРТИРОВКА: Работа с функциями Num (убывание):
1 - Запись: Имя = Запись № - 1 Номер = 0 Стипендия = 2746.36
2 - Запись: Имя = Запись № - 4 Номер = 3 Стипендия = 1478.01
3 - Запись: Имя = Новая Номер = 4 Стипендия = 6173.89
4 - Запись: Имя = Запись № - 3 Номер = 5 Стипендия = 873.44
СОРТИРОВКА: Работа с функциями Oklad(возрастание ):
1 - Запись: Имя = Запись № - 3 Номер = 5 Стипендия = 873.44
2 - Запись: Имя = Запись № - 4 Номер = 3 Стипендия = 1478.01
3 - Запись: Имя = Запись № - 1 Номер = 0 Стипендия = 2746.36
4 - Запись: Имя = Новая Номер = 4 Стипендия = 6173.89
22. Прочитать 2-ю запись из сформированного файла структурных переменных и ее распечатать с помощью собственной функции.
/////////////////////////////////////////////////////
////////
// МУ п.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 );
//
…
Результат работы программы:
1 - Запись: Имя = Новая Номер = 5 Стипендия = 2106.08
2 - Запись: Имя = Запись № - 1 Номер = 5 Стипендия = 5002.90
3 - Запись: Имя = Запись № - 3 Номер = 7 Стипендия = 5799.43
4 - Запись: Имя = Запись № - 4 Номер = 8 Стипендия = 7895.75
Пункт МУ 22:
Чтение из программы (номер = 3):
Запись: Имя = Запись № - 3 Номер = 7 Стипендия = 5799.43
22. Создать функцию для чтения записи из сформированного файла структурных переменных по номеру и ее распечатать с помощью собственной функции.
//////////////////////////
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
////////////////////////////////////////////////
// Поиск и выборка одной записи по номеру
// МУ п.22.1
///////////////////////////////////////////
void FindStudNum( const char * FileName , Student * pS , int Numb){
Student * pStudMas;
int Razm;
StudFileToMas( FileName , &pStudMas , &Razm );
if ( Numb < 0 || Numb >= Razm )
{
pS->Name[0] = '\0';
pS->Num = NULL;
pS->Oklad = NULL;
}
else
memcpy( pS , pStudMas + Numb , sizeof(Student) );
delete [] pStudMas;
};
…
//////// ПРОТОТИП
// МУ п.22.1
void FindStudNum( const char * FileName , Student * pS , int Numb);
…
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.22.1 чтение из функции
////////
///// - Прочитать запись по номеру
printf ("Чтение из функции (номер = 1):\n");
// Student SFind ;
FindStudNum( "BDStud.bin" , &SFind , 1);
PrintStudent( &SFind );
…
Результат работы программы:
Чтение из функции (номер = 1):
Запись: Имя = Запись № - 1 Номер = 5 Стипендия = 5002.90
22. Разработать и фрагмент программы для интегральных вычислений в БД (см. варианты в таблице). Интегральные вычисления для вашего файла структурных переменных заключаются в последовательном чтении всех записей файла. Из каждой из полученных записей для отдельного параметра выполняется суммирование, подсчет, сравнение и т.д. Шаги выполнения этой задачи могут быть такими: чтение файла в массив, вычисления по массиву в цикле (например, числа пятерок), обработка результата (например, получение среднего числа пятерок у студента) и распечатка результата. Можно в цикле по шагам читать последовательно все записи и вычислять интегральные характеристики.
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.22
////////
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++ )
{
int nByte = _read( pFBin , &SIntg , sizeof(Student));
SumStip = SumStip + SIntg.Oklad;
}
_close( pFBin );
};
printf ( "Фонд зарплаты в цикле = %8.2lf \n" , SumStip );
Результат работы программы:
Пункт МУ 22.2(Интегральные расчеты):
Фонд зарплаты в цикле = 13479.72
22. Оформить в виде функции фрагмент программы для вычисления интегральной характеристики по вашему варианту (см. предыдущее задание).
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
//////////////////////////
// МУ п.22
//////////////////////////
double StudSumm( const char * FileName , double * Sum)
{
Student * pStudMas;
int Razm;
*Sum = 0.0;
StudFileToMas( FileName , &pStudMas , &Razm );
for ( int i = 0 ; i < Razm ; i++)
*Sum+= (pStudMas + i)->Oklad;
delete [] pStudMas;
return *Sum;
};
…
//////// ПРОТОТИП
// МУ п.23
double StudSumm( const char * FileName , double * Sum);
…
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.23
////////
double SumOklad;
printf ( "Фонд зарплаты из функции= %8.2lf \n" , StudSumm( "BDStud.bin" , &SumOklad));
///////////////////////////////////////////////////////
…
Результат работы программы:
Пункт МУ 22.2(Интегральные расчеты):
…
Фонд зарплаты из функции = 13479.72
7 Дополнительные требования для сильных студентов (Уровень С):
Варианты заданий и примеры рассмотрены для случая использования контейнера типа массив для хранения записей в программе. Студентам, которые хотят освоить программирование на самом высоком уровне предлагается также самостоятельно решить комплекс заданий, перечисленных ниже для контейнера типа список, сделанных на базе ЛР № 7 и 8.
23. Разработать специальные функции для нашей структуры и файла БД, содержащего записи структурных переменных, для следующих операций:
23.1 Добавления записи в файл БД (в начало).
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.23
///////////////////////////////////////
////////
// МУ п.23.1















