Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие2013_09_28.doc
Скачиваний:
24
Добавлен:
20.05.2015
Размер:
2.72 Mб
Скачать

1 Вариант) содержит только буквы исходной строки

2 Вариант) перевернута по отношению к исходной

#include "stdafx.h"

#include<conio.h>

#include<stdio.h>

#include <iostream>

using namespace std;

// к записи fputs добавляет два символа-\r и \n

// Чтение текстового файла порциями до 255 символов

// Когда fgets встречает символ \n, она его сохранит в строке,

// и вставит после него \0

// или прочтёт size-1 символов или достигнет EOF - она

// добавит '\0'-символ, чтобы сформировать строку

const int SIZE=256;

void main( )

{

FILE *out, *in; char ch, zap1[SIZE],zap2[SIZE];

int i,k;

//char namein[15],nameout[15];

system("chcp 1251");

//printf("Введите имя входного файла,например,D:\\eddy.doc\n");

//gets(namein);

in=fopen("D:\\eddy.doc","r");

if(in==NULL)

{puts("Входной файл не открыт"); exit(1);}

//printf("Введите имя выходного файла,например, dima.txt\n");

// gets(nameout);

out=fopen("D:\\dima.TXT","w");

if(out==NULL)

{puts("Выходной файл не открыт"); exit(2);}

// 1 вариант) содержит только буквы исходной строки

/*

while(fgets(zap1,SIZE,in)!=NULL)

{ i=0; k=0;

while (ch=zap1[i])

{ if ( ch>='А' && ch<='Я'||

ch>='а' && ch<='п'||

ch>='р' && ch<='я'||

ch>='a' && ch<='z'||

ch>='A' && ch<='Z'||

ch== ' '|| ch=='\n' ) // обыграть. Сперва без '\n'

zap2[k++]=ch;

i++;

}

zap2[k]=0;

fputs (zap2, out );

}

*/

//2 вариант) переслать строки из файла в файл с переворотом

while(fgets(zap1,SIZE,in)!=NULL)

{ i=0;

while (zap1[i])

i++;

k=0;

while (--i >=0)

{ zap2[k++]=zap1[i];}

zap2[k]=0;

fputs (zap2, out );

}

puts("Файл скопирован");

fclose(out); fclose(in);

}

Двоичные (бинарные) файлы. Блочно-ориентированный ввод-вывод.

Важнейшими функциями блочно-ориентированного ввода-вывода являются fread() и fwrite(), которые обеспечивают соответственно чтение из файла и запись в файл заданного количества блоков данных фиксированной длины. Блок (запись) –группа подряд расположенных байтов, не имеющая никаких специальных разделителей. За одно обращение к таким функциям переносится n блоков длиной size байтов каждый. Никакого преобразования данных при этом не происходит. Такие файлы следует открывать в двоичном режиме для подавления преобразования символа перехода на следующую строку.

Пример:

FILE *fp; fp=fopen(namein, "rb");

Чтение данных из файла осуществляет функция fread().

Прототип:

int fread(void *_ptr, unsigned size, int n, FILE *_fp);

Описание:

Функция fread() считывает n элементов данных, каждый длиной size байтов, из потока _fp . Считанные данные помещаются в область памяти, на которую ссылается указатель _ptr. Общее число вводимых байт равно n * size.

Возвращаемое значение:

При успешном завершении функция возвращает количество реально прочитанных блоков данных (не байт).В случае достижения конца файла или возникновения ошибки функция fread() возвращает EOF.

Запись данных в файл осуществляет функция fwrite().

Прототип:

int fwrite (void *_ptr, unsigned size, int n, FILE *_fp);

Описание:

Функция fwrite()добавляет в открытый поток, связанный с файловой переменной _fp, n блоков данных размером size байтов каждый. Данные записываются изобласти памяти, определяемой указателем_ptr.Общее число выведенных байт равноn*size.

Возвращаемое значение:

При успешном завершении fwrite() возвращает число выведенных блоков (не байт). При ошибке она возвращает меньшее число.

Задача 166. Программа создает на диске файл – каталог книг вашей библиотеки. Каждая запись файла содержит поля:

- инвентарный номер;

- автор;

- название книги;

- издательство;

- год издания

// ktlg_gut_2013.cpp : Для Visual Studio.NET 2010 26 апр. 2013

// Создание файла-каталога книг Вашей библиотеки исп fread fwrite

#include "stdafx.h"

#include <stdio.h>

#include <conio.h>

#include <iostream>

using namespace std;

#define LIM 50 // макс число книг

int main()

{ struct book

{ int inv_nom; //инв. номер

char avtor[15]; //автор

char title[20]; //название

char izdat[15]; //издательство

int year; //год издания

};

book zap; int k=0; char ch; FILE *inout;

int size=sizeof(struct book); //размер структуры

system("chcp 1251"); //переключаем консоль в кодировку win1251

// ОБЯЗАТЕЛЬНО ПЕРЕКЛЮЧИТЬ ШРИФТЫ С ТОЧЕЧНЫХ НА Lucida console

// после запуска программы щелчком мыши в левом

// верхнем углу программы -> Свойства

// создание файла или добавление записей в существующий файл

system("cls"); system("color 1E");

cout<<"\n\tСоздание файла-каталога книг Вашей библиотеки\n\n";

inout=fopen("D:\\catalog.str", "a+b");

if(inout==NULL)

{

puts(" Не могу открыть вводной/выводной файл... ");

_getch();exit(1);

}

/*

do

{

cout<<"\nВведи "<<k+1<<" -ю запись :\n";

cout<<"Фамилия автора - "; gets(zap.avtor);

cout<<"название книги - "; gets(zap.title);

cout<<"издательство - "; gets(zap.izdat);

cout<<"год издания - "; cin>>zap.year;

k++;

fflush(stdin); //очистить входной поток

//************************************

fwrite(&zap,size,1,inout);

//************************************

cout<<" \n\n\n Будем продолжать (Y/N)? ";

ch=_getch();

}

while(ch=='Y'||ch=='y'||ch=='Н'||ch=='н');

*/

//Более изящный ввод структур против предыдущего

cout<< "\nВведи до "<<LIM<<" книг"<<'\n';

cout<< "Для прекращения - Enter в начале строки"<<'\n';

// новые записи добавляются в конец файла

cout<< "Фамилия "<<k+1<<" -го автора - ";

while((gets(zap.avtor)!=NULL)&&

(zap.avtor[0])!='\0' && k<LIM )

{

cout<< "название книги - "; gets(zap.title);

cout<< "издательство - "; gets(zap.izdat);

cout<< "год издания - "; cin>>zap.year;

k++;

//************************************

fwrite(&zap,size,1,inout);

//************************************

if(k<LIM)

cout<< "Фамилия "<<k+1<<" -го автора - "; fflush(stdin);

}

cout<< "\n\n\n\tКаталог книг моей библиотеки\n\n";

rewind(inout); // в начало файла

// за 1 раз считываем 1 структуру

while(fread(&zap, sizeof(book), 1, inout)==1 )

{

printf("\n%-15s %-20s %-15s %10d \n",

zap.avtor, zap.title, zap.izdat, zap.year );

}

fclose(inout); puts("\n\nКонец"); _getch();

return 0;

}

Задача 167. Программа выполняет поиск записи с заданным полем avtor в ранее созданном бинарном файле, содержащем сведения о книгах домашней библиотеки. Реализована обработка неудачного поиска.

// find_fio_2013.cpp : Программа отлажена в Visual Studio 2010

// Выделение подфамилии - функция strstr()

#include "stdafx.h"

#include <stdio.h>

#include <conio.h>

#include <iostream>

using namespace std;

#define LIM 50 // макс число книг

struct book //book - имя нового типа!

{ int inv_nom; //инв. номер

char avtor[15]; //автор

char title[20]; //название

char izdat[15]; //издательство

int year; //год издания

};

FILE *inout;

int main()

{

char ch, fio[20]; char namein[20]="D:\\catalog.str";

//переключаем консоль в кодировку win1251

system("chcp 1251");

if((inout=fopen(namein, "r+b"))==NULL)

{

cout<<" Не могу открыть файл ... ";

getch();exit(1);

}

struct book zap; // структура типа book

//int size=sizeof(struct book);

do

{ rewind(inout);

// за 1 раз считываем 1 структуру

int k=0, flag=0;

cout<<"\nВведи фамилию для поиска ==>";

gets(fio);

while(fread(&zap, sizeof(book), 1, inout)==1 )

{

if(strstr(zap.avtor,fio))

if(zap.avtor[strlen(fio)]==' ') //fio завершается пробелом?

{

cout<<"\nНайдена запись "<<++k;

printf("\n%-15s %-20s %-15s %10d \n",

zap.avtor, zap.title, zap.izdat, zap.year );

flag=1;

}

} //конец while

if(flag==0)

cout<<"\nЗапись с фамилией "<<fio<<" не найдена...";

cout<<"\n Продолжать (Y/N)? ";

ch = getch();

}

while(ch=='Y'||ch=='y'||ch=='Н'||ch=='н');

wcout<<"\nПока...Жми Enter";

fclose(inout);

_getch();return 0;

}

Произвольный доступ к файлам.

То место в файле, куда записываются данные или откуда они извлекаются, определяется значением указателя записи-чтения файла (текущим указателем файла). При последовательном доступе к файлу этот указатель позиционируется автоматически при любой операции чтения и записи.

Для прямого управления положением указателя записи-чтения наиболее часто используются функции rewind() и fseek(). Передвинув с их помощью указатель в нужное место, можно читать информацию из файла или записывать её в файл в произвольном порядке.

Функция rewind().

Прототип:

void rewind(FILE *_stream);

Описание:

Помещает текущий указатель позиции файла на начало файла и сбрасывает индикаторы ошибок и конца файла. Функция rewind(stream) эквивалентна fseek(stream, 0L, SEEK_SET) (см. далее), за исключением того, что rewind() обнуляет признаки конца файла и ошибки, в то время как fseek() обнуляет только признак конца файла.

Функция fseek().

Прототип:

int fseek(FILE *_fp, long _offset, int _from);

Описание:

Функция fseek() устанавливает текущий указатель файла, соответствующий потоку _fp, в новую позицию, которая расположена по смещению _offset относительно места в файле, определяемого параметром _from.

Параметр _from может иметь одно из трех значений 0, 1 или 2, которые представлены тремя символическими константами:

#define SEEK_CUR 1

#define SEEK_END 2

#define SEEK_SET 0

Эти константы могут быть переданы функции fseek() для запроса позиционирования текущего указателя относительно текущей позиции в файле либо конца или начала файла соответственно. Очевидно, что при использовании SEEK_END (2) значение _offset должно быть меньшн нуля. В этом случае будет выполняться сдвиг указателя от конца к началу файла.

Функция fseek() используется с операциями ввода/вывода в поток. После этой операции можно производить как ввод, так и вывод в поток.

Возвращаемое значение:

Функция fseek() возвращает значение 0, если указатель файла успешно перемещен, и ненулевое значение в случае неудачного завершения.

Пример:

fseek(fp, 100L, SEEK_SET );

Для определения текущей позиции указателя в файле служит функция ftell().

Прототип:

long ftell(FILE *_fp);

Описание:

Функция ftell() возвращает положение указателя текущей позиции файла, связанного с потоком _fp. Значение выдается в виде смещения в байтах относительно начала файла.

Значение, возвращаемое ftell(), можно в дальнейшем использовать при вызове функции fseek().

Возвращаемое значение:

Функция ftell() возвращает положение указателя текущей позиции при успешном завершении. При ошибке возвращает -1L, и присваивает переменной errno положительное значение.

Пример:

fseek(fp, 0L, 2); //в конец файла

long k = ftell(fp); //длина файла в байтах

Задача 168. Программа печатает произвольный текстовый файл в прямом, а затем в обратном порядке, трактуя его как бинарный файл.

// f_revrs2.cpp печать файла в обратном порядке

// произвольный доступ бинарные файлы

#include "stdafx.h"

#include <conio.h>

#include <iostream>

using namespace std;

#define CTRL_Z '\32'

FILE *in;

int main()

{

char namein[15], ch; long count,last;

system("chcp 1251");

printf("Введите путь и имя файла,например,D:\\eddy.txt\n");

gets(namein);

if((in = fopen(namein, "rb"))==NULL) //двоичный для чтения

{ puts("Не могу открыть файл ...!");

_getch(); exit(0);

}

fseek(in,0L,SEEK_END); //переход к концу файла

last=ftell(in); //размер файла

//печать файла в прямом порядке

for(count=0L;count<last;count++)

{

fseek(in,count,SEEK_SET); ///движение вперед

ch=getc(in);

if(ch !=CTRL_Z && ch != '\r')

putchar(ch);

}

//печать файла в обратном порядке

for(count=1L;count<=last;count++)

{

fseek(in,-count,SEEK_END); ///движение назад

ch=getc(in);

if(ch !=CTRL_Z && ch != '\r')//в двоичном коде Ctrl+z

//-обычный символ, а реальный конец файла следует за ним

//\r-аналогично - их не печатать

putchar(ch);

}

fclose (in);_getch();

return 0;

}

Задача 169. Программа создает файл–телефонный справочник некоторой телефонной станции Одессы(например, АТС-765).Каждая запись содержит поля:

-номер телефона;

-Фамилия абонента;

-адрес абонента.

В записях создаваемого файла заполнено только первое поле, остальные 2 поля содержат строку “pusto” .

// atc_765rus.cpp :ПРоверено в VS 2010 01.06.2013

// Файл создается из отдельных записей

// вывод в файл осуществляется SIZE раз

//

#include "stdafx.h"

#include<conio.h>

#include<stdio.h>

#include <iostream>

using namespace std;

const int SIZE=10000;

void main()

{

int i;

struct telephon

{ long ntel;

char fio[20];

char adr[26];

};

telephon abon;//,rab;

FILE *fp;

system("chcp 1251"); //переключаем консоль в кодировку win1251

if((fp=fopen("D:\\atc765", "wb"))==NULL)

{

puts(" Выходной файл не открыт... ");

exit(1);

}

//сформировать массив структур-"пустышку"

for(i=0;i<SIZE;i++)

{ abon.ntel=i+7650000;

strcpy(abon.fio,"pusto");

strcpy(abon.adr,"pusto");

//записать в файл структуру-"пустышку"

fwrite(&abon,sizeof(telephon),1,fp); //&-адрес

}

fclose(fp); puts("файл создан пока");

}

Задача 170.Программа в файле, созданном предыдущей программой (см. Задачу 169), осуществляет поиск заданного номера телефона и назначение его определенному абоненту (если телефон свободен). Реализован прямой доступ к бинарному файлу.

// atc_r765.cpp Программа осуществляет поиск заданного номера телефона

// и назначение его определенному абоненту(если телефон свободен)

// с помощью fseek(fp,0L,2) найти конец файла

// и через last=ftell(in) найти длину файла

// тогда n=last/sizeof(telefon) - количество записей

#include "stdafx.h"

#include<conio.h>

#include<stdio.h>

#include <iostream>

using namespace std;

void main()

{

int SIZE; long nt,pos,nz;

struct telephon

{ long ntel;

char fio[20];

char adr[26];

};

telephon rab; FILE *fp;

system("chcp 1251"); //переключаем консоль в кодировку win1251

if((fp=fopen("D:\\atc765", "r+b"))==NULL) //и для чтения и для записи

{

puts(" файл для произвольного доступа не открыт... ");

exit(1);

}

// Вычисляем длину файла в байтах

fseek(fp,0L,2) ;

SIZE=ftell(fp)/sizeof (telephon);

puts("Какой телефон найти(напр, 7650012?"); cin>>nt;

nz=nt-7650000; // это номер записи

while(nz>0 && nz<SIZE)

{

pos=nz*sizeof(telephon); //находим смещение

int k=fseek(fp,pos,SEEK_SET); //переход к нужной записи

if(k != 0){puts("Запись не найдена ");exit(3);}

fread(&rab,sizeof(telephon),1,fp);

//if(strncmp(rab.fio,"pusto",strlen("pusto"))==0)

if(strcmp(rab.fio,"pusto")==0)

{

puts("Кому отдать этот телефон?"); fflush(stdin);

gets(rab.fio);

puts("Его адрес?");

gets(rab.adr);

fseek(fp,pos,SEEK_SET); //переход к нужной записи

fwrite(&rab,sizeof(telephon),1,fp);

}

else

{ puts("Извините, телефон занят");

printf("%ld %s %s\n",rab.ntel,rab.fio,rab.adr);

}

printf("следующий номер(или 0 для выхода)\n");

cin>>nt; nz=nt-7650000;

}

fclose(fp); puts("пока");

}

Задача 171.Программа в файле, обработанном предыдущей программой (см. Задачу 170), осуществляет поиск и печать занятых номеров телефонов и их владельцев. Реализован последовательный доступ к бинарному файлу.

// ats_print_765.cpp 2013г.

// Поиск занятых телефонов

#include "stdafx.h"

#include<conio.h>

#include<stdio.h>

#include <iostream>

using namespace std;

const int SIZE=10000;

void main()

{

int i;

struct telephon

{ long ntel;

char fio[20];

char adr[26];

};

telephon abon;

FILE *fp;

system("chcp 1251"); //переключаем консоль в кодировку win1251

if((fp=fopen("D:\\atc765", "r+b"))==NULL)

{

puts(" Входной файл не открыт... ");

exit(1);

}

for(i=0;i<SIZE;i++)

{

fread(&abon,sizeof(telephon),1,fp);

if(strcmp(abon.fio,"pusto")!=0)

printf("%ld %s %s\n",abon.ntel,abon.fio,abon.adr);

}

fclose(fp); puts("пока");

}

Задача 172.На некотором материальном складе ведётся учёт хранящихся там товаров.

Каждая запись о товаре содержит сведения:

-артикул (код) товара;

-наименование товара;

-цена за единицу товара;

-количество единиц товара.

Требуется создать комплекс программ, который обеспечивает:

-создание файла информационной базы;

-добавление записей в базу;

-распечатку базы данных;

-поиск нужной записи по некоторому ключевому полю ;

-корректировку записи с заданным ключевым полем;

-удаление ненужной записи;

-сортировку записей по некоторому ключевому полю;

-создание файла стоимостей всех товаров по видам.

Предлагаемый комплекс программ обеспечивает создание и ведение информационной базы материального склада. Головной модуль этого проекта, выполненный в виде оконного меню, выступает в качестве связующего звена и обеспечивает корректные вызовы заранее запрограммированных функций, которые и реализуют перечисленные выше процедуры обработки данных.

Для модификации записей в файле и удаления ненужных записей соответствующие функции осуществляют последовательный поиск.

Для удобства слежения за состоянием информационной базы предусмотрены процедуры вывода данных на экран. Организована постраничная (поэкранно) выдача информации, которая не проявляется, если в базе недостаточно информации и совершенно необходима, если в базе свыше 25 записей.

При добавлении новых записей в информационную базу ключевые поля (код товара, артикул и др.), однозначно идентифицирующие запись, не должны дублироваться. Для этого в соответствующей программе создан массив ключевых полей, и каждое вводимое ключевое поле новой записи проверяется на наличие его в этом массиве (см. функции add_skl(), make_skl()).

Если записи с повторяющимися ключевыми полями всё-таки попали в базу (например, при первичном создании информационной базы, где такой контроль отсутствует), то их легко удалить с помощью функции del_skl(), предварительно просмотрев базу данных вызовом функции put_skl().

// sklad_2012.cpp : 10.03.2012г CopyRight by V. Makogon

// Программа отлажена в Visual Studio 2010

#include "stdafx.h"

#include <io.h>

#include <conio.h>

#include <stdio.h>

#include <windows.h>

#include<iostream>

using namespace std;

// Структура записей:

struct tovar //tovar - имя нового типа!

{ int kod; //код товара

char name[25]; //наименование товара

float price; //цена за единицу

unsigned quant; //количество

};

FILE *inout; FILE *in, *out;

// функция устанавливает цвет текста и подложки в консоли (локальное)

void SetColor(int text, int background)

{

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));

}

// функция позиционирует курсрор в точку (х, у)

void goto_xy (int x, int y)

{

COORD cd;// координаты курсора

HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);

cd.X=x;

cd.Y=y;

SetConsoleCursorPosition(hd,cd);

}

// ПРОТОТИПЫ ОСНОВНЫХ ФУНКЦИЙ:

long size_bas(FILE *inout); //размер базы в байтах и число записей

void make_skl(); //создание новой базы данных

void put_skl(char *name); //печать содержимого базы данных

int lpoisk(int *x,int n,int Q); // последовательный поиск в массиве.

void add_skl(char* name); // добавление новых записей в базу данных.

void del_skl(char *namein); //удаление записи с заданным ключевым полем.

void obra_skl(char *namein); //стоимость каждой партии товара

void updt_skl(char *namein); //Обновление записи с заданным ключевым полем

void sort_skl(char *namein); //Сортировка файла информационной базы

void poisk_skl(char *namein);//Поиск товара с заданным названием

/////////////////////ОСНОВНАЯ ПРОГРАММА начало////////////////////////

// sklad_2012.cpp 27.02.2012 CopyRight by V. Makogon

// ОСНОВНАЯ ПРОГРАММА создает главное меню, проверяет наличие

// файла базы данных, обеспечивает выбор необходимой функции обработки

// Структура записей:

/*struct tovar //tovar - имя нового типа!

{ int kod; //код товара

char name[25]; //наименование товара

float price; //цена за единицу

unsigned quant; //количество

};

*/

#define cfone system("color 17");// синий фон. серые буквы глобальное

const int m= 9,L=83; // размеры главного меню

void colorputs(int cfon,int cl,int y) ; // прототип функции формирования меню

char ch,str[m][L]=

{" Создание файла информационной базы ",

" Распечатка информационной базы ",

" Обработка информационной базы ",

" Добавление записей в базу данных ",

" Удаление ненужных записей из базы ",

" Изменение записи с заданным ключевым полем ",

" Сортировка файла информационной базы ",

" Поиск товара с заданным названием ",

" Окончание работы " } ;

int main()

{

int y=0,j; char namein[15];

//setlocale(NULL, ".1251"); //ввод на русском не обеспечен

system("chcp 1251"); //ВЫВОД и ввод на русском обеспечены !!!

system("title БАЗА ДАННЫХ '\"СКЛАД'\" "); //заголовок окна

m5:cfone; SetColor(14,1); // textcolor(YELLOW);

system("cls"); // очистка экрана clrscr();

goto_xy(20,24);

SetColor(12,1); //textcolor(LIGHTRED);

printf("\030 Выбери пункт меню и жми Enter \031");

for (j=0;j<m;j++)

colorputs(8,14,j);

m6:

colorputs(12,14,y);

m7:

switch(_getch())

{

case 224 : // СМЕНИЛ 27.02.2012 НА 224 (0xE0)

switch(_getch())

{

case 72 : colorputs(8,14,y);

y--;

if (y<0) y=m-1;

goto m6;

case 80 : colorputs(8,14,y);

y++;

if (y>m-1) y=0;

goto m6;

}

goto m7;

case 13 :

{ if(y==m-1) {cfone; system("cls"); exit(0);}

if(y!=0) // Файл должен существовать!

{

m1:

system("cls"); cfone;

goto_xy(10,10);

SetColor(14,1);

printf("Введите путь и имя файла базы данных,например, D:\\sklad\n");

goto_xy(20,12);

SetColor(12,1); //textcolor(LIGHTRED);

printf("=================== ");

goto_xy(20,12); gets_s(namein); //cin >> namein;

if(_access(namein,00)) //проверка наличия файла

{

SetColor(10,1); // зеленым выделить

printf("\nТакой файл отсутствует. Вы можете: \r\n ");

printf("1. Повторить попытку \r\n ");

printf("2. Завершить работу \r\n ");

printf(" Ваш выбор ==> ");

ch=_getch();

switch (ch)

{

case '1': goto m1;

case '2': goto m5; //return;

}

}

}

}

switch(y)

{

case 0 : SetColor(12,1);/*textcolor(LIGHTRED);*/ cfone;

make_skl();

goto m5;

case 1 : SetColor(12,1);/*textcolor(LIGHTRED);*/ cfone;

put_skl(namein);

goto m5;

case 2 : SetColor(12,1);/*textcolor(LIGHTRED);*/ cfone;

obra_skl(namein);

goto m5;

case 3 : SetColor(12,1);/*textcolor(LIGHTRED);*/ cfone;

add_skl(namein);

goto m5;

case 4 : SetColor(12,1);/*textcolor(LIGHTRED);*/ cfone;

del_skl(namein);

goto m5;

case 5 : SetColor(12,1);/*textcolor(LIGHTRED);*/ cfone;

updt_skl(namein);

goto m5;

case 6 : SetColor(12,1);/*textcolor(LIGHTRED);*/ cfone;

sort_skl(namein);

goto m5;

case 7 : SetColor(12,1);/*textcolor(LIGHTRED);*/ cfone;

poisk_skl(namein);

goto m5;

case 8 : cfone; system("cls"); exit(0);

}

}

goto m7;

}

/////////////////////ОСНОВНАЯ ПРОГРАММА конец////////////////////

/////////// функция формирования меню /////////////////////////

void colorputs(int cfon,int cl,int y)

{

//textcolor(cl);textbackground(cfon);

SetColor(cl, cfon);

goto_xy(17,2+y*2);

printf("%s",str[y]);

}

////////////////////////////////////////////////////////////////

//////////////// size_bas.cpp начало //////////////////////////

long size_bas(FILE *inout)

{

// Определим размер базы в байтах и число записей

fseek(inout, 0L,SEEK_END); //В конец файла

system("cls"); SetColor(10,1); //textcolor(4);

long last=ftell(inout);

goto_xy(30,10); printf("Размер базы - %ld байт",last);

int n=last/sizeof(tovar);

goto_xy(30,11); printf("В базе %d записей\n",n);

SetColor(13,1);

goto_xy(10,24);printf("\r\nДля продолжения жми Enter");

_getch(); system("cls"); rewind(inout);return n;

}

//////////////////size_bas.cpp конец//////////////////////////

//////////////////make_skl.cpp начало//////////////////////////

// make_skl.cpp обновлена 3 марта 2012г.

// Предназначена для создания новой базы данных

// Осуществляет тщательный контроль наличия файла с заданным

// именем в текущем каталоге, используя функцию access()

// При наличии файла возможно добавление записей в конец

// Структура записей:

/* struct tovar //tovar - имя нового типа!

{ int kod; //код товара

char name[25]; //наименование

float price; //цена

unsigned quant;//количество

};

*/

#define LIM 50 // макс число записей

void make_skl()

{ char name[25], ch; int k=0;

struct tovar zap ;

system("cls"); goto_xy(10,10); SetColor(14,1);

printf("Введите путь и имя файла базы данных,например,\n \

D:\\sklad\n");

goto_xy(20,12); SetColor(12,1);

printf("\1\1\1\2\2\2\2\3\3 ");

goto_xy(20,12); gets_s(name);

//варианты: cin >> name;

//cin.getline(name, 25); //fgets(name, 25,stdin);

//Проверка наличия файла на МД

if(!_access(name,00))

{

SetColor(13,1); // сделать сообщение цветным

printf("\n\n\nТакой файл существует... Вы можете: \r\n\n ");

SetColor(14,1);

printf(" 1. Удалить его содержимое навсегда \r\n ");

printf(" 2. Выполнить дозапись в конец файла \r\n ");

printf(" 3. Завершить работу \r\n ");

printf(" Ваш выбор ==> ");

ch=_getch();

switch (ch)

{

case '1':

break;

case '2':

// добавление новых записей в существующую базу

add_skl(name);

case '3': return;

}

}

inout=fopen(name, "wb");

if(inout==NULL)

{

puts(" Не могу открыть выводной файл... ");

_getch();return;//exit(2);

}

SetColor(14,1); system("cls");

cout<<"\nВведи до "; SetColor(12,1);

printf("%d",LIM); SetColor(14,1); cout<<" записей"<<'\n';

cout<<"Для прекращения - Enter в начале строки"<<'\n';

SetColor(10,1);

printf("Название %d вида товара - ",k+1);

while((gets_s(zap.name)!=NULL) &&

(zap.name[0])!='\0' && k<LIM )

{

printf("код товара - "); cin>>zap.kod;

printf("цена за единиу - "); cin>>zap.price;

printf("количество - "); cin>>zap.quant;

k++;

//********* запись структуры в файл ****

fwrite(&zap,sizeof(tovar),1,inout);

//**************************************

fflush(stdin); // очистка стандартного входного потока

if(k<LIM)

printf("Название %d вида товара - ",k+1);

//cout<<"Название "<<k+1<<" вида товара - ";

}

SetColor(13,1); printf("\r\n\n\n\nПока...Жми Enter");

fclose(inout); _getch();

}

//////////////////make_skl.cpp конец///////////////////////////

//////////////////put_skl.cpp начало//////////////////////////

// Программа выводит на экран (при необходимости - постранично)

// содержимое базы данных "Товары на складе"

// Структура записей:

/* struct tovar

{ int kod; //код товара

char name[25]; //наименование товара

float price; //цена за единицу

unsigned quant;//количество

};

*/

void put_skl(char *name)

{

inout=fopen(name, "rb");

if(inout==NULL)

{

puts(" Не могу открыть файл базы данных ... ");

_getch(); return; //exit(2);

}

struct tovar zap;

int k=0;

int size=sizeof(struct tovar);

int page=1;

//*************статистика базы*************

size_bas(inout);

//*****************************************

SetColor(14,1); system("cls");

// за 1 раз считываем 1 структуру

while(fread(&zap,size,1,inout)==1)

{ SetColor(14,1);

if(k==0)

{ goto_xy(10,1); SetColor(10,1);

printf("\nТекущее состояние базы данных:");

goto_xy(70,1); printf("Лист %d\n",page);

k=3; SetColor(14,1);

}

printf("\r\n%5d %-25s %10.2f %5u",zap.kod,

zap.name, zap.price, zap.quant );

k++;

//постраничная печать

if(k%23==0)

{ goto_xy(2,25); SetColor(13,1); printf("Жми Enter"); _getch();

SetColor(14,1); system("cls");

goto_xy(70,1);SetColor(13,1); printf("Лист %d",++page);

k++;

}

}

goto_xy(2,25); SetColor(13,1); printf("Жми Enter");

fclose(inout); _getch();

}

//////////////////put_skl.cpp конец//////////////////////////

/////////////////lpoisk.cpp начало//////////////////////////

//функция осуществляет последовательный поиск

//элемента Q в целочисленном массиве

int lpoisk(int *x,int n,int Q)

{ int i=0;

while (x[i]!=Q && i<n)

i++;

if (i==n) return -777; //Ключ отсутствует!!!

else return i;

}

/////////////////lpoisk.cpp конец//////////////////////////

/////////////////add_skl.cpp начало//////////////////////////

// add_skl.cpp 4 марта 2012

// Программа предназначена для добавления новых

// записей в базу данных. Структура записей:

/* struct tovar

{ int kod;

char name[25]; //наименование товара

float price; //цена за единицу

unsigned quant;//количество

};

*/

#define LIM 50 // макс число записей в одном сеансе

void add_skl(char* name)

{ char ch; int k=0;

struct tovar zap ; SetColor(14,1); system("cls");

inout=fopen(name, "a+b");

if(inout==NULL)

{

puts(" Не могу открыть базу данных... ");

_getch();return;

}

/* Определим размер базы в байтах и число записей

fseek(inout, 0L,SEEK_END); //В конец файла

long last=ftell(inout);printf("Размер базы - %ld байт\n",last);

int n=last/sizeof(tovar); printf("В базе %d записей\n",n);

rewind(inout);

*/

long n=size_bas(inout);

//Чтобы исключить попадание в базу данных записей с повторяющимся

// ключевым полем (kod), перешлем коды всех записей в массив mas_kod[],

// который откроем в динамической области памяти. При попытке дублиро

// вания ключевого поля выдать сообщение (см ниже)

int *mas_kod=(int*)malloc(n*sizeof(int));

rewind(inout);

int i=0;

while(fread(&zap,sizeof(tovar),1,inout)==1)

{ mas_kod[i] = zap.kod;

i++;

}

SetColor(14,1); system("cls");

cout<<"\nВведи до ";SetColor(12,1); printf("%d",LIM);

SetColor(14,1);cout<<" записей"<<'\n';

m2:

cout<<"\nДля прекращения - Enter в начале строки"<<"\n\n";

SetColor(10,1);

printf("Название %d вида товара - ",k+1);

while((gets_s(zap.name)!=NULL) &&

(zap.name[0])!='\0' && k<LIM )

{

printf("код товара - "); cin>>zap.kod;

if(lpoisk(mas_kod,n,zap.kod)>=0)

{ SetColor(13,1);

//

printf("\r\nЗапись с кодом %d есть в базе данных ",zap.kod);

printf("\r\nт.к это недопустимо, \n ");

SetColor(14,1);

fputs("\n Вы можете: \n ",stderr);

fputs("1. Повторить попытку \n ",stderr);

fputs("2. Завершить работу \n ",stderr);

fputs(" Ваш выбор ==> ",stderr);

SetColor(14,1);

ch=_getch();

switch (ch)

{

case '1': fflush(stdin);goto m2;

case '2': fclose(inout); return;

}

}

printf("цена за единиу - "); cin>>zap.price;

printf("количество - "); cin>>zap.quant;

k++;

//*********запись структуры в файл ****

fwrite(&zap,sizeof(tovar),1,inout);

//**************************************

fflush(stdin); // очистка стандартного входного потока

if(k<LIM)

printf("Название %d вида товара - ",k+1);

}

SetColor(13,1);

//gotoxy(10,24);

printf("\r\n\n\n\nПока...Жми Enter");

fclose(inout); _getch();

}

//////////////////add_skl.cpp конец//////////////////////////

//////////////////del_skl.cpp начало//////////////////////////

// del_skl.cpp

// Программа выполняет удаление из ранее созданного бинарного

// файла, содержащего сведения о товарах на складе, записи с

// заданным ключевым полем. Структура записей:

/* struct tovar

{ int kod; //код товара

char name[25]; //наименование товара

float price; //цена за единицу

unsigned quant;//количество

};

*/

// На базе исходного файла создается временный файл temp, куда

// переносятся записи базы данных, кроме записей с заданным ключевым

// полем. Затем исходный файл удаляется, а файлу temp присваивается

// имя исходного файла

//

void del_skl(char *namein)

{

int kod; //код товара

char ch, nameout[15]="temp";

m2: if((in=fopen(namein, "rb"))==NULL)

{

puts(" Не могу открыть файл базы данных ... ");

_getch();return;

}

if((out=fopen(nameout, "wb"))==NULL)

{

puts(" Не могу открыть выводной файл... ");

_getch();return;

}

struct tovar zap; // структура типа tovar

int k=0;

int size=sizeof(struct tovar);//размер структуры

int found=0;

size_bas(in);//Размер базы и число записей в ней

//rewind(in); // в начало файла

// за 1 раз считываем 1 структуру

cfone; SetColor(14,1); system("cls");

printf("Какую запись удалять? \r\nВведи код записи или 0 ");

SetColor(10,1); printf("==>");

scanf_s("%d",&kod); //cin>>kod; //???

while(fread(&zap,size,1,in)==1)

{

if(zap.kod!=kod)

{

// перезапись в файл temp

fwrite(&zap,size,1,out);

}

else

{ goto_xy(2,20); SetColor(10,1);

printf("Найдена запись %d :\r\n",++k);

found=1;goto_xy(2,20); SetColor(14,1);

printf("\n%5d %-25s %10.2f %5u ",zap.kod,

zap.name, zap.price, zap.quant );

goto_xy(2,23); SetColor(13,1);

printf("Именно эту удалять(y/n)?");

ch=_getch();

switch (ch)

{ case 'y': case 'Y':case 'н':case 'Н':

goto_xy(2,23); SetColor(13,1);

printf("\nЗапись с кодом %d будет удалена...Жми Enter",kod);

_getch();break;

default: fwrite(&zap,size,1,out); // перезапись в файл temp

}

SetColor(14,1); system("cls");

}

}

fclose(in);fclose(out);//обязательно для удаления/переименования

if(!found)

{ //****** если запись не найдена *****//

SetColor(13,1);

printf("\nЗапись с кодом %d не найдена",kod);

SetColor(14,1);

printf("\n Вы можете: \r\n ");

printf("1. Повторить попытку \r\n ");

printf("2. Завершить работу \r\n ");

printf(" Ваш выбор ==> ");

ch=_getch();

switch (ch)

{

case '1': goto m2;

case '2': remove(nameout);

// return;//удалить файл temp

goto m3;

}

}

else

{ remove(namein); //удалить исходный файл

rename("temp",namein); //переименовать temp-файл

}

SetColor(10,1); system("cls");

printf("\nЗачистка завершена...\r\n");

cout<<"Продолжить процедуру удаления(y/n)? ";

ch=_getch();

switch (ch)

{ case 'y': case 'Y':case 'н':case 'Н': goto m2;

default: goto m3;

}

m3: goto_xy(2,25); SetColor(13,1); printf("Жми Enter");

fflush(stdin);

_getch();

}

//////////////////del_skl.cpp конец//////////////////////////

//////////////////obra_skl.cpp начало////////////////////////

// Программа выполняет чтение записей ранее созданного бинарного

// файла, содержащего сведения о товарах на складе и их обработку

// Структура записей:

/* struct tovar

{ int kod;

char name[25]; //наименование товара

float price; //цена за единицу

unsigned quant;//количество

};

*/

// На базе исходного файла создается новый файл, содержащий в каждой

// записи дополнительное поле stoim (стоимость всей партии товара):

// stoim = price * quant

// Программа подсчитывает также общую стоимость всех товаров

void obra_skl(char *namein)

{

struct tovar1 //новая запись

{ int kod; //код товара

char name[25]; //наименование товара

float price; //цена за единицу

unsigned quant;//количество

double stoim; //стоимость партии

};

char nameout[15];

char *pnameout=nameout,*pnamein=namein;

system("cls");

if((in=fopen(namein, "rb"))==NULL)

{

puts(" Не могу открыть файл базы данных ... ");

_getch();return; //exit(2);

}

// Статистика базы данных

size_bas(in);

// формировать имя выводного файла

while(*pnamein != '.'&& *pnamein != '\0')

*pnameout++=*pnamein++;

*pnameout='\0';

strcat_s(nameout,".out");

SetColor(14,1);

printf("\nВыводной файл будет сохранен под именем %s\n",nameout);

printf("Не поленитесь, запишите это имя, созданное программно \n \

и нажмите Enter\n");

_getch();

if((out=fopen(nameout, "wb"))==NULL)

{

puts(" Не могу открыть выводной файл... ");

_getch();return; //exit(2);

}

struct tovar zap; // структура типа tovar

struct tovar1 zap1; // структура типа tovar1

int k;

system("cls");

int size=sizeof(struct tovar);

int size1=sizeof(struct tovar1);

double total=0;

int page=1; SetColor(13,1); goto_xy(10,1);

printf("\n\t Результаты ревизии товаров на складе\n\n");

goto_xy(70,1); printf("Лист %d\n",page);

k=3;

SetColor(14,1);

rewind(in); // в начало файла

// за 1 раз считываем 1 структуру

while(fread(&zap,size,1,in)==1)

{

zap1.kod=zap.kod;

strcpy_s(zap1.name,zap.name);

zap1.price=zap.price;

zap1.quant= zap.quant;

zap1.stoim= zap1.price*zap1.quant;

total+= zap1.stoim ;

printf("\n%5d %-25s %10.2f %5u %10.2lf ",zap1.kod,

zap1.name, zap1.price, zap1.quant, zap1.stoim);

// запись в файл

fwrite(&zap1,size1,1,out);

k++;

// постраничная печать

if(k%23==0)

{

goto_xy(2,25); SetColor(13,1); printf("Жми Enter"); _getch();

system("cls");

goto_xy(70,1); SetColor(13,1); printf("Лист %d",++page);

k++; SetColor(14,1);

}

}

SetColor(10,1);; printf("\n\n");

printf(" Общая стоимость всех товаров \t\t%.2lf", total);

//k - кол-во прочитанных структур

goto_xy(2,25); SetColor(13,1); printf("Жми Enter");

fclose(in);fclose(out); _getch();

}

//////////////////obra_skl.cpp конец//////////////////////////

//////////////////updt_skl.cpp начало////////////////////////

// Программа выполняет модификацию записи с

// заданным ключевым полем в ранее созданном бинарном

// файле, содержащем сведения о товарах на складе.

// Структура записей:

/* struct tovar

{ int kod; //код товара

char name[25]; //наименование товара

float price; //цена за единицу

unsigned quant;//количество

};

*/

// Воспользуемся тем, что записи исходного файла имеют строго фиксированную

// длину -sizeof(struct tovar); запись с заданным ключевым полем после модификации

// возвращается на свое место в базе данных. Это достигается функцией fseek()

//

void updt_skl(char *namein)

{

char tmpname[25]; char ch; int kod; //код товара

float cena; unsigned kolic;

SetColor(14,1); system("cls");

if((inout=fopen(namein, "r+b"))==NULL)

{

puts(" Не могу открыть файл базы данных ... ");

_getch();return;

}

struct tovar zap; // структура типа tovar

int size=sizeof(struct tovar); //размер базы

long offst=size;

// Статистика базы данных

size_bas(inout);

m2: rewind(inout); // в начало файла

// за 1 раз считываем 1 структуру

SetColor(14,1); system("cls");

printf("Какую запись искать? \r\nВведи код записи или 0");

SetColor(13,1); printf("==>");

cin>>kod; fflush(stdin); //очистка stdin

SetColor(14,1);

while(fread(&zap,size,1,inout)==1 && zap.kod!=kod)

;

if(zap.kod!=kod)

{ SetColor(13,1); //textcolor(5);

printf("\nЗапись с кодом %d не найдена",kod);

fputs("\n Вы можете: \n ",stderr);

fputs("1. Повторить попытку \n ",stderr);

fputs("2. Завершить работу \n ",stderr);

fputs(" Ваш выбор ==> ",stderr);

SetColor(14,1); //textcolor(14);

ch=_getch();

switch (ch)

{

case '1': goto m2;

case '2': fclose(inout); return;

}

}

else

{ goto_xy(2,20); SetColor(14,1);

printf("Найдена запись :\r\n");

printf("\n%5d %-25s %10.2f %5u ",zap.kod,

zap.name, zap.price, zap.quant );

goto_xy(2,23); SetColor(13,1); //textcolor(5);

printf("\nИменно эту изменять(y/n)?"); ch=_getch();

SetColor(14,1); system("cls");

fflush(stdin);

switch (ch)

{ case 'т': case 'Т':case 'n':case 'N': goto m2; //break;

default:

{ puts("Чтобы сохранить старое название, нажать Enter");

puts("Чтобы сохранить числовые данные, набрать 0 и нажать Enter ");

SetColor(10,1); goto_xy(1,3); //textcolor(2);

printf("Название вида товара - ");

goto_xy(25,3); SetColor(7,1); //textcolor(7);

printf("%s",zap.name);

strcpy_s(tmpname, ""); // getch();

goto_xy(25,3); SetColor(13,1); gets_s(tmpname); //fgets(tmpname,20,stdin);

if(tmpname[0]!='\0')

{strncpy_s(zap.name,tmpname,strlen(tmpname));

zap.name[strlen(tmpname)] = '\0';

}

SetColor(10,1); //textcolor(2);

printf(" код товара - ");

goto_xy(25,4); SetColor(7,1); printf("%d",zap.kod);

SetColor(13,1); //textcolor(4);

_getch(); goto_xy(25,4);

printf("%s"," ");

goto_xy(25,4); cin>>kod;

if(kod!=0) zap.kod=kod;

SetColor(10,1); //textcolor(2);

printf(" цена за единиу - ");

goto_xy(25,5); SetColor(7,1); //textcolor(7);

printf("%.2f",zap.price);

SetColor(13,1); _getch(); goto_xy(25,5);

printf("%s"," ");

goto_xy(25,5); cin>>cena;

if(cena!=0) zap.price=cena;

SetColor(10,1); //textcolor(2);

printf(" количество - "); //cin>>zap.quant;

goto_xy(25,6); SetColor(7,1); //textcolor(7);

printf("%d",zap.quant);

SetColor(13,1); _getch();goto_xy(25,6);

printf("%s", " ");

goto_xy(25,6); cin>>kolic;

if(kolic!=0) zap.quant=kolic;

//т к указатель установлен на следующую

// запись, надо вернуться на 1 запись назад

fseek(inout, -offst, 1);

//*********запись структуры в файл ****

fwrite(&zap,sizeof(tovar),1,inout);

//**************************************

SetColor(13,1); //textcolor(5);

printf("\n\nОбновленная запись отправлена в базу ");

printf("\r\nПродолжать(y/n)? ");ch=_getch();

switch (ch)

{

case 'y': case 'Y':case 'н':case 'Н': goto m2;

default: goto m3; //fclose(inout); return;

}

}

}

}

m3: fflush(stdin);goto_xy(2,25); SetColor(13,1); printf("Жми Enter");

_getch(); fclose(inout);

}

//////////////////updt_skl.cpp конец//////////////////////////

//////////////////sort_skl.cpp начало////////////////////////

// Программа выполняет чтение записей ранее созданного бинарного

// файла, содержащего сведения о товарах на складе, перезаписывает

// их в другой файл и сортирует последний по возрастанию ключевого поля

// Структура записей:

/* struct tovar

{ int kod;

char name[25]; //наименование товара

float price; //цена за единицу

unsigned quant;//количество

};

*/

// in, out, inout - глобальные имена

void sort_skl(char *namein)

{

char nameout[15];

char *pnameout=nameout,*pnamein=namein;

SetColor(14,1); system("cls");

if((in=fopen(namein, "rb"))==NULL)

{

puts(" Не могу открыть файл базы данных ... ");

_getch();return; //exit(2);

}

// Статистика базы данных (см. далее)

// size_bas(in);

// формировать имя выводного файла

while(*pnamein != '.'&& *pnamein != '\0')

*pnameout++=*pnamein++;

*pnameout='\0';

strcat_s(nameout,".sor");SetColor(14,1);

printf("Выводной файл будет сохранен под именем %s\n",nameout);

printf("Не поленитесь, запишите это имя, созданное программно \n \

и нажмите Enter\n");

_getch();

if((out=fopen(nameout, "wb"))==NULL)

{

puts(" Не могу открыть выводной файл... ");

_getch();return; //exit(2);

}

struct tovar zap;

SetColor(14,1); //textcolor(YELLOW);

int k; system("cls");

int size=sizeof(struct tovar);

//rewind(in); // в начало файла

// за 1 раз считываем 1 структуру

while(fread(&zap, size,1,in)==1)

// запись в файл

fwrite(&zap,size,1,out);

fclose(in);fclose(out); //

/////////////////////////////////////////////////////

if((inout=fopen(nameout, "r+b"))==NULL)

{

puts(" Не могу открыть файл базы данных ... ");

_getch();return ;

}

SetColor(14,1); ///textcolor(YELLOW);

struct tovar x, y; // структуры типа tovar

// Определим размер базы в байтах и число записей

fseek(inout, 0L, SEEK_END); //В конец файла

system("cls"); SetColor(13,1);

long last=ftell(inout);

goto_xy(30,10); printf("Размер базы - %ld байт",last);

int n=last/sizeof(struct tovar);

goto_xy(30,11); printf("В базе %d записей\n",n);

SetColor(14,1);

goto_xy(10,24);printf("\r\nДля продолжения жми Enter");

_getch(); system("cls"); rewind(inout); // в начало файла

// сортировка

int priz;

k = n; //номер последней записи

do

{

priz=1; k--; rewind(inout); // в начало файла

for( int i=0; i < k; i++)

{

fseek(inout, (long)i*size, SEEK_SET);

fread(&x,size,1,inout);

fread(&y,size,1,inout);

if(x.kod > y.kod)

{

fseek(inout, (long)i*size, SEEK_SET); //назад

fwrite (&y,size,1,inout);

fwrite (&x,size,1,inout);

priz = 0;

}

}

}

while (priz == 0);

goto_xy(2,23); SetColor(13,1);

printf("\nСортировка завершена...Жми Enter");

_getch(); fclose(inout);

///////// распечатка БД после сортировки ///////

put_skl(nameout);

///////////////////////////////////////////////

}

//////////////////sort_skl.cpp конец//////////////////////////

//////////////////poisk_skl.cpp начало////////////////

// Программа выполняет поиск в ранее созданном бинарном

// файле, содержащем сведения о товарах на складе, записи

// с заданным названием товара. Структура записей:

/* struct tovar

{ int kod; //код товара

char name[25]; //наименование товара

float price; //цена за единицу

unsigned quant;//количество

};

*/

void poisk_skl(char *namein)

{

char name[25]; //название товара

char ch;

if((in=fopen(namein, "rb"))==NULL)

{

puts(" Не могу открыть файл базы данных ... ");

_getch();return;

}

struct tovar zap; // структура типа tovar

int k=0;

int size=sizeof(struct tovar);//размер структуры

int found=0;

size_bas(in);//Размер базы и число записей в ней

m2:rewind(in); // в начало файла

// за 1 раз считываем 1 структуру

cfone; SetColor(14,1); system("cls");

printf("Какую запись искать? \r\nВведи название товара ");

SetColor(10,1); printf("==>");

fflush(stdin);

gets_s(name); //scanf_s("%s", name); //cin>>name;

while(fread(&zap,size,1,in)==1)

{

if(strstr(zap.name, name))

//if(zap.name[strlen(name)]==' ') //name завершается пробелом?

{ goto_xy(2,20); SetColor(10,1);

printf("Найдена запись %d :\r\n",++k);

found=1;goto_xy(2,20); SetColor(14,1);

printf("\n%5d %-25s %10.2f %5u ",zap.kod,

zap.name, zap.price, zap.quant );

goto_xy(2,23); SetColor(13,1);

printf("Продолжать поиск(y/n)?");

ch=_getch();

if(ch== 'n' || ch== 'N' || ch== 'т'|| ch=='Т')

break;

}

}

if(!found)

{ //****** если запись не найдена *****/

SetColor(13,1);

printf("\nЗапись с названием %s не найдена",name);

SetColor(14,1);

printf("\n Вы можете: \r\n ");

printf("1. Повторить попытку \r\n ");

printf("2. Завершить работу \r\n ");

printf(" Ваш выбор ==> ");

ch=_getch();

switch (ch)

{

case '1': goto m2;

case '2': goto m3;

}

}

m3: goto_xy(2,25); SetColor(13,1); printf("Поиск завершен. Жми Enter");

fflush(stdin);

_getch();

}

//////////////////poisk_skl.cpp конец//////////////////

Литература

  1. Бьерн Страуструп. Язык программирования С++. Москва, 1995.

  2. Программирование на С++. Под ред. А.Д. Хомоненко.

  3. Дейтел Х., Дейтел П. Как программировать на С: Пер. с англ. М.: Издат. БИНОМ, 2000,-1008 с.

  4. Дейтел Х., Дейтел П. Как программировать на С++. Пер. с англ. М.: Издат. БИНОМ, 2000,-1033 с.

  5. Прата Стивен. Язык программирования С. Лекции и упражнения: Пер. с англ. Изд «ДиаСофт», 2000,-432с.

  6. Бочков С.О. и др. Язык программирования Си для персонального компьютера. - М.: Радио и связь, 1991,-384 с.

  7. Касаткин А. И., Вальвачев А. Н. Профессиональное программирование на языке Си. От Turbo C к Borland C++. Справочное пособие. -Мн.: Выш. шк. 1992. -240 с.

  8. Керниган Б., Ритчи Д. Язык программирования Си. -М.: Финансы и статистика, 1985.-279 с.

  9. Макогон В.С. Язык программирования Си для начинающих., Одесса; НПФ "Астропринт", 1993. -96 с.

  10. Уэйт М. и др. Язык Си. Руководство для начинающих. - М.: Мир, 1988. -512 с.

  11. Подбельский В. В. Язык Си++: Учеб. пособие. – М.: Финансы и статистика, 1999, 560с.

  12. Крячков А. В. Сухинина И. В. Томшин В. К. Программирование на С и С++. Практикум – Телеком, 2000.-344с.

13. Bohm C., Jacopini G. Flow – Diagrams. Turing Mashines and Languages with only Two Formation Rules // Commun. of ACM, 1966, V. 9, № 5, p. 366

14. Светозарова Г. И., Мельников А. А., Козловский А. В. Практикум по программированию на языке Бейсик: Учебное пособие для вузов. – М.: Наука, 1988. – 368с.

15. Абрамов С. А., Гнездилова Г. Г., Капустина Е. Н., Селюн М. И. Задачи по программированию. – М.: Наука, 1988. – 224с.

16. Пильщиков В. Н. Сборник упражнений по языку Паскаль: Учебное пособие для вузов. – М.: Наука, 1989. – 160с.

17. Корн Г., Корн Т. Справочник по математике для научных работников и инженеров, М.: Наука, 1986. -720 стр .

326