Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

В записях создаваемого файла заполнено только первое Поле, остальные 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 стр.

 

 



Поделиться:


Последнее изменение этой страницы: 2016-12-16; просмотров: 373; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.119.129 (0.017 с.)