Методические указания ЛР10(примеры)_2014 (1079944), страница 2
Текст из файла (страница 2)
struct Student { // Описание студунта - структура
char Name[20]; // Фамилия студента
int Num; // Номер студента
double Oklad; // Размер стипендии
int Kurs; // Резерв пока в примере нет
char Date[10]; // Резерв пока в примере нет
};
…
3. Описать и заполнить одну свою простую структурную переменную с помощью инициализации при ее описании.
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.3
////////
Student Stud1 ={ "Лаптева" , 1 , 1000.0}; // Инициализация трех полей
…
4. Описать и заполнить еще одну свою структурную переменную вручную (с помощью операторов присваивания – числовые данные и функции копирования – строчные данные). Распечатать значения ее полей двух структурных переменных (Функция - printf).
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.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. Разработать функцию распечатки одной данной структурной переменной, передавая в качестве параметра ее адрес, и проверить ее на описанных ранее структурных переменных.
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// МУ п.5
// Распечатка отдельной структурной переменной студента
////////
void PrintStudent(Student * pS)
{
printf( "Запись: Имя = %-15s Номер = %2d Стипендия = %8.2lf \n",
pS->Name , pS->Num, pS->Oklad );
};
…
//////// ПРОТОТИП
// МУ п.5
void PrintStudent(Student * pS);
…
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.5
////////
printf ("Пункт МУ 5:\n");
PrintStudent(&Stud1) ;
PrintStudent(&Stud2) ;
…
Результат работы программы:
Пункт МУ 5:
Запись: Имя = Лаптева Номер = 1 Стипендия = 1000.00
Запись: Имя = Аксенова Номер = 2 Стипендия = 2000.00
6. Создать динамическую структурную (функция – malloc, библиотека - <malloc.h>) заполнить ее динамически и распечатать значение через указатель и с помощью специальной функции печати. Удалить созданную динамическую переменную.
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.6
////////
Student * pStud = (Student *) malloc (sizeof(Student));
pStud->Num = 3;
pStud->Oklad = 3000.00;
strcpy(pStud->Name , "Большаков");
printf ("Пункт МУ 6:\n");
PrintStudent( pStud ) ;
free( pStud );
pStud= NULL;
…
Результат работы программы:
Пункт МУ 6:
Запись: Имя = Большаков Номер = 3 Стипендия = 3000.00
7. Описать и проинициализировать массив структурных переменных не менее 4-х. Распечатать этот массив с помощью функции п.5.
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.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] ) ;
…
Результат работы программы:
Пункт МУ 7:
Запись: Имя = Первый Номер = 1 Стипендия = 1000.00
Запись: Имя = Второй Номер = 2 Стипендия = 2000.00
Запись: Имя = Третий Номер = 3 Стипендия = 3000.00
Запись: Имя = Четвертый Номер = 4 Стипендия = 4000.00
8. Разработать функцию распечатки массива с записями структурных переменных.
Формальные параметры этой функции: указатель на массив структурных переменных и его размер. Использовать свою функцию печати одной структурной переменной. Проверить работу этой функции.
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// МУ п.8
//////////////////////////
void StudPrintMas( Student * pMas , int Razm)
{
for (int i = 0 ; i < Razm ; i++ )
{
PrintStudent(pMas + i); // Используется готовая функция
};
};
…
//////// ПРОТОТИП
// МУ п.8
void StudPrintMas( Student * pMas , int Razm);
…
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.8
////////
printf ("Пункт МУ 8:\n");
StudPrintMas( SMas , RazmS);
…
Результат работы программы:
Пункт МУ 8:
Запись: Имя = Первый Номер = 1 Стипендия = 1000.00
Запись: Имя = Второй Номер = 2 Стипендия = 2000.00
Запись: Имя = Третий Номер = 3 Стипендия = 3000.00
Запись: Имя = Четвертый Номер = 4 Стипендия = 4000.00
9. Создать цикл для заполнения нового динамического массива записей полями со случайными значениями параметров (размер 5-6 элементов). Предусмотреть случайное заполнение одного числового значения (использовать функцию - rand) и одного символьного значения (использовать функции: rand и atoi вместе с функциями копирования/слияния текстов - strcat, strcpy). Распечатать созданный массив в этом же цикле.
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.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 - 9
pPotok[i].Oklad = 1000.0 * 10.0 * rand() / RAND_MAX ;// диапазон 0 - 10000.0
int n = (rand()*30)/ RAND_MAX ;// диапазон 0 - 30
strcat(Buf , itoa (n + 1 ,Num, 10 ));
strcpy( pPotok[i].Name , Buf);
};
StudPrintMas( pPotok , 6);
…
Результат работы программы:
Пункт МУ 9:
Запись: Имя = Stud № - 8 Номер = 8 Стипендия = 2244.33
Запись: Имя = Stud № - 14 Номер = 5 Стипендия = 5401.47
Запись: Имя = Stud № - 23 Номер = 8 Стипендия = 1216.16
Запись: Имя = Stud № - 22 Номер = 6 Стипендия = 9750.05
Запись: Имя = Stud № - 5 Номер = 5 Стипендия = 8779.26
Запись: Имя = Stud № - 30 Номер = 7 Стипендия = 5598.01
10. Придумать название двоичному файлу для выполнения задания (в нашем примере -"BDStud.bin", например "BDBook.bin" – для книг ).
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.10 "BDStud.bin" – мой файл для работы с записями структурных переменных
////////
11. Создать цикл для заполнения файла записями (запись в файл) с разными значениями числовых параметров изменяемых в цикле (номер в журнале группы) или основанных на начальной инициализации своего массива структур.
///////
// МУ п.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;
_write (pFBin , &ZMas[i] , sizeof(Student));
};
_close( pFBin );
};
StudPrintMas( ZMas , RazmZ);
system("attrib -R BDStud.bin ");
…
Результат работы программы:
Пункт МУ 11(синий):
Запись: Имя = Запись 1 Номер = 1 Стипендия = 1000.00
Запись: Имя = Запись 2 Номер = 2 Стипендия = 2000.00
Запись: Имя = Запись 3 Номер = 3 Стипендия = 3000.00
Запись: Имя = Запись 4 Номер = 4 Стипендия = 4000.00
11. Создать цикл чтения и распечатки сформированного двоичного файла. Данные из файла ввести в статический массив структур, задав его максимальный размер равным 100.
////////
// МУ п.11 Рас
Student MASStud[100];
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 , &MASStud[i] , sizeof(Student));
PrintStudent( &MASStud[i] );
RazmZ = i;
}
_close( pFBin );
};
printf ("Пункт МУ 11(Печать всего массива):\n");
StudPrintMas( MASStud , RazmZ + 1 );
…
Результат работы программы:
Пункт МУ 11(Печать всего массива):
Запись: Имя = Запись 1 Номер = 1 Стипендия = 1000.00
Запись: Имя = Запись 2 Номер = 2 Стипендия = 2000.00
Запись: Имя = Запись 3 Номер = 3 Стипендия = 3000.00
Запись: Имя = Запись 4 Номер = 4 Стипендия = 4000.00
11. Создать цикл для заполнения файла записей полями со случайными значениями параметров. Предусмотреть случайное заполнение одного числового значения (использовать функцию - rand) и одного символьного значения (использовать функции: rand и atoi вместе с с функциями копирования/слияния текстов - strcat, strcpy). Распечатать созданный файл в цикле заполнения.
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.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 ");
};
…
Результат работы программы:
Пункт МУ 11:
Запись: Имя = Запись № - 1 Номер = 5 Стипендия = 4647.97
Запись: Имя = Запись № - 2 Номер = 3 Стипендия = 2787.56
Запись: Имя = Запись № - 3 Номер = 6 Стипендия = 6024.05
Запись: Имя = Запись № - 4 Номер = 4 Стипендия = 9525.74
12. Разработать функцию заполнения динамического массива структурных переменных на основе двоичного файла с записями структурных переменных. Проверить ее работу. Массив распечатать специальной функцией (см. выше).
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
/////////////////////////////
// Выборка из файла в динамический массив
// МУ п.12
/////////////////////////////
void StudFileToMas( const char * FileName , Student ** pMas , int * pRazm)
{
long posF;
int pFBin = _open( FileName, _S_IREAD |_O_BINARY );
if ( pFBin == -1 ) { *pRazm = NULL; return;};
posF = _lseek( pFBin, 0, SEEK_END ); // Установить новую текущую позицию
*pRazm = posF / sizeof(Student);
*pMas = (Student *) calloc( *pRazm , sizeof(Student) );
posF = _lseek( pFBin, 0, SEEK_SET ); // На начало
// Буфер для чтения
Student SBuf;
for (int i = 0 ; i < *pRazm ; i++ )
{
int nByte = _read( pFBin , &SBuf , sizeof(Student));
if ( nByte == NULL) break;
memcpy( *pMas + i , &SBuf , sizeof(Student));
};
// Закрытие файла
_close( pFBin );
};
…
//////// ПРОТОТИП
// МУ п.12
void StudFileToMas( const char * FileName , Student * pMas , int * pRazm);
…
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.12
////////
Student * pStMas;
int StudCount;
// Файл в массив
printf ("Пункт МУ 12:\n");
StudFileToMas( "BDStud.bin" , &pStMas , &StudCount );
StudPrintMas( pStMas , StudCount);
…
Результат работы программы:
Пункт МУ 12:
Запись: Имя = Запись № - 1 Номер = 5 Стипендия = 4647.97
Запись: Имя = Запись № - 2 Номер = 3 Стипендия = 2787.56
Запись: Имя = Запись № - 3 Номер = 6 Стипендия = 6024.05
Запись: Имя = Запись № - 4 Номер = 4 Стипендия = 9525.74
13. Разработать функцию заполнения двоичного файла на основе массива структурных переменных (описанных и проинициализированных выше). В функцию должны передаваться: имя заполняемого файла, адрес исходного массива, размер массива. Изменить некоторые значения записей в массиве структур перед использованием. Для этого в самом массиве, заполненном выше, сделать изменения (например, имя 2-й записи: имя и номер), используя фиксированное значение индекса элемента структурного массива. Проверить работу этой функции. Заполнение файла проверить в файл менеджере (far или total commander), с помощью операции просмотра файла в шестнадцатеричном формате.
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
//Перезапись массива структур в файл (Файл очищается!)
// МУ п.13
///////////////////////////
void StudMasToFile( const char * FileName , Student * pMas , int Razm)
{














