- •Институт математики, экономики и механики кафедра математического обеспечения компьютерных систем в. С. Макогон, и. Н. Лисицына
- •Оглавление
- •Введение
- •Основныетипы данных, операции и выражения
- •Описание переменных.
- •Операции , выражения и операторы.
- •3. Операторы управления программой. Базовые управляющие структуры.
- •Операторы ветвления Условный оператор if
- •Оператор - переключатель
- •Операторы повторения (цикла).
- •4. Программирование алгоритмов линейной структуры.
- •5. Программирование разветвляющихся алгоритмов (оператор if).
- •6. Программирование разветвляющихся алгоритмов (оператор switch)
- •Оператор for
- •Цикл с постусловием do -while
- •8. Итерационные циклы
- •Задачи для самостоятельного решения
- •9. Программирование алгоритмов с использованием функций
- •Основные понятия численного решения уравнений
- •10. Программирование алгоритмов с использованием массивов
- •11. Символьные переменные и строки. Обработка строк.
- •Другие средства ввода-вывода символов и строк
- •Массивы строк
- •12. Указатели
- •Массивы указателей
- •2. Описание метода трапеций
- •3. Программный комплекс
- •13. Структуры
- •Указатели на структуры
- •14. Файлы. Потоковый ввод-вывод
- •Функции для работы с файлами
- •Открытие файловых потоков
- •Закрытие файловых потоков
- •Удаление файлов
- •Переименование файлов
- •Реинициализация
- •Функции для ввода-вывода по символам
- •1 Вариант) содержит только буквы исходной строки
- •2 Вариант) перевернута по отношению к исходной
- •Двоичные (бинарные) файлы. Блочно-ориентированный ввод-вывод.
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 конец//////////////////
Литература
Бьерн Страуструп. Язык программирования С++. Москва, 1995.
Программирование на С++. Под ред. А.Д. Хомоненко.
Дейтел Х., Дейтел П. Как программировать на С: Пер. с англ. М.: Издат. БИНОМ, 2000,-1008 с.
Дейтел Х., Дейтел П. Как программировать на С++. Пер. с англ. М.: Издат. БИНОМ, 2000,-1033 с.
Прата Стивен. Язык программирования С. Лекции и упражнения: Пер. с англ. Изд «ДиаСофт», 2000,-432с.
Бочков С.О. и др. Язык программирования Си для персонального компьютера. - М.: Радио и связь, 1991,-384 с.
Касаткин А. И., Вальвачев А. Н. Профессиональное программирование на языке Си. От Turbo C к Borland C++. Справочное пособие. -Мн.: Выш. шк. 1992. -240 с.
Керниган Б., Ритчи Д. Язык программирования Си. -М.: Финансы и статистика, 1985.-279 с.
Макогон В.С. Язык программирования Си для начинающих., Одесса; НПФ "Астропринт", 1993. -96 с.
Уэйт М. и др. Язык Си. Руководство для начинающих. - М.: Мир, 1988. -512 с.
Подбельский В. В. Язык Си++: Учеб. пособие. – М.: Финансы и статистика, 1999, 560с.
Крячков А. В. Сухинина И. В. Томшин В. К. Программирование на С и С++. Практикум – Телеком, 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 стр .