Методические указания ЛР10(примеры)_2014 (1079944), страница 5
Текст из файла (страница 5)
////////
// Добавить запись ( начало )
printf ("Добавление (начало):\n");
Student SFirst = {"Первый" , 22 , 3400.00};
StudAdd("BDStud.bin", SFirst , First );
StudPrintFile( "BDStud.bin" );
…
//////// ПРОТОТИП
// МУ п.23.1/2
void StudAdd(const char * FileName , Student S , TypeAddDel TAD );
…
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// МУ п.23.1/2
///////////////////////////
void StudAdd(const char * FileName , Student S , TypeAddDel TAD = Default ){
//
if ( TAD == Last)
{
ClearReadonlyFile(FileName);
int pFBin = _open( FileName, _O_RDWR |_O_BINARY | _O_APPEND );
long posF = _lseek( pFBin, 0, SEEK_END ); // Установить новую текущую позицию
_write (pFBin , &S, sizeof(Student));
// Закрытие файла
_close( pFBin );
return;};
if( TAD == First )
{
Student * pStudMas;
int Razm;
StudFileToMas( FileName , &pStudMas , &Razm );
Student * pTemp = (Student *) new Student [ Razm + 1];
memcpy( pTemp , &S, sizeof(Student) );
for ( int i = 1 ; i <=Razm ; i++)
memcpy( pTemp + i , pStudMas + (i - 1), sizeof(Student) );
//
StudMasToFile( FileName , pTemp , Razm + 1 );
delete [] pTemp;
delete [] pStudMas;
return;};
return;
};
…
23.2 Добавления записи в файл БД (в конец).
//////// ГЛАВНАЯ ПРОГРАММА
////////
// МУ п.23.2
////////
// - Добавить запись ( конец)
printf ("Добавление (конец):\n");
Student SLast = {"Последний" , 22 , 3400.00};
StudAdd("BDStud.bin", SLast );
StudPrintFile( "BDStud.bin" );
…
//////// ПРОТОТИП
// МУ п.23.1/2
void StudAdd(const char * FileName , Student S , TypeAddDel TAD );
…
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
(см. выше п.23.1)
…
23.3 Добавления записи в файл БД (по номеру записи).
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.23.3
////////
// Добавить запись (номер)
/////////////////////////////////////////////////////
printf ("Добавление (номер):\n");
Student SNumb = {"По номеру - 2" , 33 , 5500.00};
StudAddNum("BDStud.bin", SNumb, 3);
StudPrintFile( "BDStud.bin" );
…
//////// ПРОТОТИП
// МУ п.23.3
void StudAddNum(const char * FileName , Student S , int Numb );
…
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// Добавления по номеру в файл
// МУ п.23.3
///////////////////////
void StudAddNum(const char * FileName , Student S , int Numb )
{
Student * pStudMas;
int Razm;
if ( Numb < 0) return;
// Формирование массива
StudFileToMas( FileName , &pStudMas , &Razm );
if (Numb >= Razm )
{
StudAdd(FileName, S , Last );
delete [] pStudMas;
return;
};
//
Student * pTemp = (Student *) new Student [ Razm + 1];
for ( int i = 0 , k=0 ; i <= Razm ; i++, k++)
{
if ( ( i - 1) == Numb)
{
memcpy( pTemp + i , &S, sizeof(Student) );
k--;
}
else
{
memcpy( pTemp + i , pStudMas + k, sizeof(Student) );
};
};
// Запоминание в файл нового
StudMasToFile( FileName , pTemp , Razm + 1 );
delete [] pTemp;
delete [] pStudMas;
};
…
23.4 Удаления записи в файл БД (в начало).
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.23.4
////////printf ("Удаление (Начало):\n");
StudDel("BDStud.bin", First );
StudPrintFile( "BDStud.bin" );
…
//////// ПРОТОТИП
// МУ п.23.4/5
void StudDel(const char * FileName , TypeAddDel TAD );
…
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// Удаление первого или последнего из файла
// МУ п.23.4/5
/////////////////////////////////////////////
void StudDel(const char * FileName , TypeAddDel TAD = Last )
{
Student * pStudMas;
int Razm;
if ( TAD == Last)
{
StudFileToMas( FileName , &pStudMas , &Razm );
StudMasToFile( FileName , pStudMas , Razm - 1 );
delete [] pStudMas;
return;
};
if ( TAD == First )
{
StudFileToMas( FileName , &pStudMas , &Razm );
StudMasToFile( FileName , pStudMas + 1 , Razm - 1 );
delete [] pStudMas;
}
};
…
23.5 Удаления записи в файл БД (в конец).
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.23.5
////////
printf ("Удаление (конец):\n");
StudDel("BDStud.bin", Last );
//StudDel("BDStud.bin" );
StudPrintFile( "BDStud.bin" );
…
//////// ПРОТОТИП
// МУ п.23.4/5
void StudDel(const char * FileName , TypeAddDel TAD );
…
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
(см. выше п.23.4)
…
23.6 Удаления записи в файл БД (по номеру записи).
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.23.6
////////
printf ("Удаление (номер):\n");
StudDelNum("BDStud.bin", 4 );
StudPrintFile( "BDStud.bin" );
…
//////// ПРОТОТИП
// МУ п.23.6
void StudDelNum(const char * FileName , int Numb );
…
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// Удаление по номеру из файла
// МУ п.23.6
///////////////////////////////////////////
void StudDelNum(const char * FileName , int Numb )
{
Student * pStudMas;
int Razm;
StudFileToMas( FileName , &pStudMas , &Razm );
if ( Numb < 0 || Numb > Razm ) return;
if ( Numb == 0) {
StudDel( FileName , First );
delete [] pStudMas;
return;};
if ( Numb == Razm -1) {
StudDel( FileName , Last );
delete [] pStudMas;
return;
};
// Удаление из середины
Student * pTemp = (Student *) new Student [ Razm - 1];
for (int i =0, k =0 ; i < Razm ; i++ , k++)
{
if ( i == Numb )
k--;
else
memcpy( pTemp + k , pStudMas + i, sizeof(Student) );
};
StudMasToFile( FileName , pTemp , Razm - 1 );
delete [] pTemp;
delete [] pStudMas;
};
…
23.7 Поиска и чтения записи из файла БД (по номеру записи).
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.23.7
////////
///// - Прочитать запись по номеру
printf ("Чтение (номер):\n");
Student * pFind = new Student;
FindStudNum( "BDStud.bin" , pFind , 2);
PrintStudent( pFind );
…
//////// ПРОТОТИП
// МУ п.23.7
void FindStudNum( const char * FileName , Student * pS , int Numb);
…
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// Поиск и выборка одной записи по номеру
// МУ п.23.7
///////////////////////////////////////////
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;
};
…
23.8 Замены записи в файле БД по номеру (вместо одной другая)
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.23.8
////////
printf ("Изменение записи (номер):\n");
Student SChang ={"Замена" , 11, 111.00};
ChangeStudNum( "BDStud.bin" , SChang , 2);
StudPrintFile( "BDStud.bin" );
…
//////// ПРОТОТИП
// МУ п.23.8
void ChangeStudNum( const char * FileName , Student pS , int Numb);
…
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// МУ п.23.8
///////////////////////////////////////////
void ChangeStudNum( const char * FileName , Student pS , int Numb){
Student * pStudMas;
int Razm;
StudFileToMas( FileName , &pStudMas , &Razm );
if ( Numb < 0 || Numb >= Razm )
{
delete [] pStudMas;
return;
}
else
memcpy( pStudMas + Numb , &pS, sizeof(Student) );
StudMasToFile( FileName , pStudMas , Razm );
delete [] pStudMas;
};
…
23.9 Поиска и выборки по конкретному значению поля имени.. – Возврат номера!!!
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.23.9
////////
int n;
printf ("Поиск по имени:\n");
if ( ( n =FindStudName( "BDStud.bin" , pFind , "Замена" )) != -1)
{ printf ("Найдена по номеру = %d \n", n );
printf ("Найдена запись: ");
PrintStudent( pFind );
}
else
printf ("Не найдена запись! ");
…
//////// ПРОТОТИП
// МУ п.23.9
int FindStudName( const char * FileName , Student * pS , const char * FindName );
…
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// Поиск по имени содержимого записей в файле в файле (первая запись)
// МУ п.23.9
///////////////////////////////////////////
int FindStudName( const char * FileName , Student * pS , const char * FindName )
{
Student * pStudMas;
int Razm;
int i ;
StudFileToMas( FileName , &pStudMas , &Razm );
for ( i = 0 ; i < Razm ; i++)
if ( strcmp ( (pStudMas + i)->Name , FindName ) == 0) break;
if ( i == Razm )
{
// Не найдено
pS->Name[0] = '\0';
pS->Num = NULL;
pS->Oklad = NULL;
delete [] pStudMas;
return -1 ;
}
// Найдено
else
memcpy( pS , pStudMas + i , sizeof(Student) );
delete [] pStudMas;
return i ;
};
…
23.10 Взаимного обмена (swap!) записей по двум номерам в файле БД.
//////// ГЛАВНАЯ ПРОГРАММА
// МУ п.23.10
////////
// Swap замена записей в файле БД
printf ("Замена SWAP в файле по номеру: 1<->3\n");
SwapStudFile( "BDStud.bin" , 1 ,3 );
StudPrintFile( "BDStud.bin" );
…
//////// ПРОТОТИП
// МУ п.23.10
void SwapStudFile( const char * FileName , int NumA ,int NumB);
…
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
///////////////////////////////////////////////
// Замена по номерам записей в файле
///////////////////////////////////////////
// МУ п.23.10
///////////////////////////////////////////
void SwapStudFile( const char * FileName , int NumA ,int NumB)
{
Student * pStudMas;
int Razm;
int i ;
StudFileToMas( FileName , &pStudMas , &Razm );
if ( NumA < 0 || NumA >= Razm || NumB < 0 || NumB >= Razm )
{ }
else
{SwapStudent ( pStudMas + NumA , pStudMas + NumB );
StudMasToFile( FileName , pStudMas , Razm );};
//
delete [] pStudMas;
};
…
23.11 Удаления файла БД.
//////// ГЛАВНАЯ ПРОГРАММА
//////////////
StudRemoveFile ("BDStud.bin"); // Тестирование БД
////////
…
//////// ПРОТОТИП
void StudRemoveFile(const char * FileName);
…
//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ
//////// РЕАЛИЗАЦИЯ ФУНКЦИИ
// МУ п.17/23.11
//////////////////////////////////
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 );
};
…
Для всех функций и операций выполнить качественную проверку ее работы: отладку и тестирование во всех режимах. Для самых продвинутых студентов предлагается вариант замены массива на двунаправленные списки во всех пунктах задания ЛР.
8 Требование к отчету по ЛР
Требования к отчету по 10 ЛР соответствуют требованиям к другим ЛР по дисциплине ОП. См. Документ на сайте.
9 Контрольные вопросы к ДЗ/КЛР
-
Для чего нужны проекты и в чем их преимущество (три)?
-
Дайте определение понятия программа.
-
Что такое сборка программы и как ее сделать?
-
Какие составляющие циклов вы знаете?
-
В чем преимущество возможности ветвления в программах?
-
Какие элементы блок схем вы знаете?
-
Что такое динамические массивы?
-
Какие новые операции для указателей вы знаете?
-
Как вычислить размер массива при выполнении программы?
-
Как определить длину строки?
-
Как сравнить две строки?
-
Что такое Null Terminated String?
-
Как преобразовать число в строку и наоборот?
-
Что такое вызов функции, фактические параметры?
-
Что такое прототип функции, его составляющие и для чего он используется?
-
Какие параметры можно задать для функции main?
-
Как лучше задавать название функции?
-
Что такое определение функции, его составляющие?
-
В чем массивы и структуры отличаются?
-
Как выполнить инициализацию структуры при ее описании?
-
Как работать с полями структуры через указатель?
-
Для каких случаев можно использовать динамические структуры?
-
Как можно передать структурную переменную в функцию? Массив структур?
-
Могут ли в структуре использованные другие структурные переменные?
-
Дайте определение понятия файл.
-
Какие основные типы файлов вы знаете?
-
Зачем используются операции открытия и закрытия файлов?
-
Какие уровни работы с файлами вы знаете?
-
Какие функции используются для чтения файлов?
-
Какие библиотеки нужно подключить для низкоуровневого ввода и вывода?
-
Что такое список как структура данных? Дайте определение.
-
Что такое элемент списка? Какие структуры элемента списка вы знаете?
-
Какие особенности списков вы знаете по сравнению с массивами?
-
Что такое однонаправленные и двунаправленные списки? Их преимущества?
-
Как используется структура типа список? Что такое хвост и голова списка
10 Литература.
Основная литература
-
Список литературы, доступные книги и необходимые пособия для ЛР ОП размещены на сайте www.sergebolshakov.ru на страничке “2-й к СУЦ”. Пароль для доступа можно взять у преподавателя или старосты группы.
-
Керниган Б., Ритчи Д. К36 Язык программирования Си.\Пер. с англ., 3-е изд., испр. - СПб.: "Невский Диалект", 2001. - 352 с.: ил.
-
Касюк, С.Т. Курс программирования на языке Си: конспект лекций/С.Т. Касюк. — Челябинск: Издательский центр ЮУрГУ, 2010. — 175 с.
-
MSDN Library for Visual Studio 2005 (Vicrosoft Document Explorer – входить в состав дистрибутива VS. Нужно обязательно развернуть при установке VS VS или настроить доступ через Интернет.)
Дополнительная литература
-
Общее методическое пособие по курсу для выполнения ЛР и ДЗ (см. на сайте 1-й курс www.sergebolshakov.ru) – см. кнопку в конце каждого раздела сайта!!!
-
Другие методические материалы по дисциплине с сайта www.sergebolshakov.ru.
-
Конспекты лекций по дисциплине “Основы программирования”.
-
Подбельский В.В. Язык Си++: Учебное пособие. – М.: Финансы и статистика, 2003.
-
5. Подбельский В.В. Стандартный СИ++: Учебное пособие. – М.: Финансы и статистика, 2008.
-
Г. Шилдт “С++ Базовый курс”: Пер. с англ.- М., Издательский дом “Вильямс”, 2011 г. – 672с
-
Фридланд А.Я. Информатика и компьютерные технологии. Основные термины: толковый слов. : 3-е изд. Испр. и доп./ А.Я. Фридланд, Л.С. Хааамирова, И.А. Фридланд. – М.:ООО «Издательство Астрель»: ООО «Издательство АСТ». 2003 – 272с.
-
Г. Шилдт “С++ Руководство для начинающих” : Пер. с англ. - М., Издательский дом “Вильямс”, 2005 г. – 672с
-
Г. Шилдт “Полный справочник по С++”: Пер. с англ.- М., Издательский дом “Вильямс”, 2006 г. – 800с
-
Бьерн Страуструп "Язык программирования С++"- М., Бином, 2010 г.
11 Приложения
12 Главный модуль File_P3.cpp
File_P3.cpp – ГЛАВНЫЙ МОДУЛЬ
// Комплексния лабораторгная работа
#include "stdafx.h"
#include "FILE_P3.h"
#include <fcntl.h>















