Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2011, 00:42   #1
Shadow94
Пользователь
 
Аватар для Shadow94
 
Регистрация: 17.04.2011
Сообщений: 18
Сообщение Структуры данных

Доброго времени суток!
Уже какой день подряд решаю задачу, всё никак не получается решить, нужна помощь... Вот, собственно, задача:
"Инвентаризация. В инвентарном файле содержатся сведения о том, изделия каких видов продукции и в каком количестве хранились на складе на момент последней инвентаризации. Сведения включают артикул изделия, наименование, единицы измерения, количество. 2-ой файл содержит сведения о поступлении и отпуске некоторых видов продукции, структура данных здесь дополнена типом операции (поступление или отпуск) и датой ее проведения. 2-й файл может содержать несколько сообщений по одному виду продукции. Составить программу, обеспечивающую ввод и сохранение данных, возможность дополнения 2-го файла, просмотра 1-го и 2-го файлов, обновления инвентарного файла на основе данных 2-го файла (после обновления 2-ой файл переименовывается в архивный)."

Программный код:
Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

struct dat
{
int day, month, year;
};

struct sved
{
char name[20], ed_izmer[10], operation[20];
int count, art;
dat data[20];
}invent[100];


void main()
{
int n=0, i=0, j=0, k=0, r=0;
char s='\0',c='\0';
char filename1[]="С:\\BORLANDC\\invent1.dat";
char filename2[]="C:\\BORLANDC\\invent2.dat";
int p=0, o=0;
clrscr();
FILE*f1, *f2;
f1=fopen(filename1, "rb+");
f2=fopen(filename2, "rb+");
printf("Vvedite kolichestvo izdeliy ");
scanf("%i",&n);
if (f1)
{
 do
 {
  fflush(stdin);
  printf("\nFail #1 suchestvuet. Vyberite deistvie:\n");
  printf("0 - sozdat' zanovo\n");
  printf("1 - dobavit' dannye v fail\n");
  printf("2 - otkazat'sya ot vvoda\n");
  s=getche();
  if (s=='0') f1=fopen(filename1, "wb+");
  else if (s=='1') f1=fopen(filename1, "ab+");
 }
 while (s!='0' && s!='1' && s!='2');
}
else f1=fopen(filename1, "wb+");

if (s!='2')
{
 A:
  fflush(stdin);
  printf("\nVvedite naimenovanie izdelya: ");
  gets(invent[i].name);
  fprintf(f2, invent[i].name);
  printf("\nVvedite edinicu izmereniya: ");
  scanf("%s",&invent[i].ed_izmer);
  printf("\nVvedite artikul izdelya: ");
  scanf("%d",&invent[i].art);
  printf("\nVvedite kolichestvo produkcii: ");
  scanf("%d",&invent[i].count);
  fwrite(&invent[i],sizeof(invent[i]),1,f1);
}

if (f2)
{
 do
 {
  fflush(stdin);
  printf("\nFail #2 suchestvuet. Vyberite deistvie:\n");
  printf("0 - sozdat' zanovo\n");
  printf("1 - dobavit' dannye v fail\n");
  printf("2 - otkazat'sya ot vvoda\n");
  s=getche();
  if (s=='0') f2=fopen(filename2, "wb+");
  else if (s=='1') f2=fopen(filename2, "ab+");
 }
 while (s!='0' && s!='1' && s!='2');
}
else f2=fopen(filename2, "wb+");
if (s!='2')
{
  do{
  printf("\nVvedite den', mesyac, god provedeniya operacii: ");
  scanf("%d %d %d",&invent[i].data[j].day,&invent[i].data[j].month,&invent[i].data[j].year);
    do{
  printf("\nTip operacii: postuplenie ili otpusk? [P/O] ");
  fflush(stdin);
  c=getch();
  if(c=='P' || c=='p') p++;
  if(c=='O' || c=='o') o++;
      }while (c!='p' && c!='P' && c!= 'o' && c!='O');
  invent[i].operation[j]=c; //zapis' ocherednogo tipa operacii v strukturu
  fflush(stdin);
  printf("\nProdolghit' vvod tipov operaciy i daty dlya dannogo izdeliya? [Y/N] ");
  s=getch();
  j++;
   }while (s=='Y' || s=='y');
  fwrite(&invent[i],sizeof(invent[i]),1,f2); //Zapis' struktury s tipami i datami operaciy v fail
  fflush(stdin);

  printf("\nObnovit' inventarny fail na osnove dannyh 2-go faila? [Y/N] ");
  s=getch();
  if (s=='Y' || s=='y')
  {
   invent[i].count+=p-o;
   fwrite(&invent[i].count,sizeof(invent[i].count),1,f1);
   p=0;
   o=0;
  }

  fflush(stdin);
  printf("\nHotite vvesti dannye po drugomu izdeliyu? [Y/N] ");
  c=getch();
  if (c=='Y' || c=='y')
  {
   i++;
   r+=j;
   j=0;
   goto A;
  }

}
//Posle obnovleniya pereimenovyvaem 2-oy fail v arkhivnyi
fclose(f2);
f2=fopen(filename2,"rb");

fflush(stdin);
printf("\nProsmotret' faily? [Y/N] ");
s=getch();
if (s=='Y' || s== 'y')
{
  printf("\n-----------------------\nProsmotr failov\n-----------------------\n");
  for (int i=0; i<n; i++)
  {
    fread(&invent[i], sizeof(invent[i]),1,f1);
    printf("\n%s",invent[i].name);
    printf("  %s",invent[i].ed_izmer);
    printf("  %d",invent[i].art);
    printf("  %d",invent[i].count);
    fread(&invent[i], sizeof(invent[i]),1,f2);
     for (k=0; k<r; k++)
	printf("  %d.%d.%d; ",invent[i].data[k].day,invent[i].data[k].month,invent[i].data[k].year);
    printf("  %s",invent[i].operation);
  }
  printf("\n-----------------------\n");
}
getch();
}
Shadow94 вне форума Ответить с цитированием
Старый 18.04.2011, 00:43   #2
Shadow94
Пользователь
 
Аватар для Shadow94
 
Регистрация: 17.04.2011
Сообщений: 18
По умолчанию

Объясняю, как я делал задачу. У меня одна структура на два файла (в один файл записываются одни данные, в другой другие). Типы операций (поступление или отпуск) по каждому изделию хранятся в массиве, например "поступление и поступление" это массив "pp". В структуре есть ещё одна структура, содержащая дату (день, месяц, год). Насчет обновления файла на основе второго: например, количество изделия было 111. Массив операций "pp", т.е. поступило ещё 2. Следовательно, количество уже будет 113.
Но у меня проблемы с выводом, т.е. со считыванием данных из файлов. А именно, проблемы с датой. Неправильно она выводится, и всё тут. И ещё я не совсем понял про переименования второго файла в архивный.
Если кто-то поможет, буду очень благодарен!
P.S. Компилятор - Borland C++ 3.1 вроде

Последний раз редактировалось Shadow94; 18.04.2011 в 00:46. Причина: Дополнение
Shadow94 вне форума Ответить с цитированием
Старый 21.04.2011, 11:14   #3
Shadow94
Пользователь
 
Аватар для Shadow94
 
Регистрация: 17.04.2011
Сообщений: 18
По умолчанию

Тему можно закрывать, с задачей разобрался. Вот код, может кому-нибудь пригодится
Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

struct dat
{
int day, month, year;
};

struct sved
{
char name[20], ed_izmer[10], operation[20];
int count, art;
dat data[20];
}invent[50];


void main()
{
clrscr();
FILE *f1, *f2;
int i=0, struct_num=0, A[50][50], B[50], j=0, k=0, p=0, o=0;
char s='\0', c='\0';
char filename1[]="C:\\invent1.dat";
char filename2[]="C:\\invent2.dat";
f1=fopen(filename1, "rb+");
f2=fopen(filename2, "rb+");

if (f1)
{
 do
 {
  fflush(stdin);
  printf("\nFail #1 suchestvuet. Vyberite deistvie:\n");
  printf("0 - sozdat' zanovo\n");
  printf("1 - dobavit' dannye v fail\n");
  printf("2 - otkazat'sya ot vvoda\n");
  printf("3 - prosmotret' fail\n");
  s=getche();
  if (s=='0') f1=fopen(filename1, "wb+");
  else if (s=='1') f1=fopen(filename1, "ab+");
  if (s=='3')
  {
    printf("\n-----------------------\nProsmotr failov\n-----------------------\n");
    while(!feof(f1))
    {
    fread(&invent[i],sizeof(invent[i]),1,f1);
    printf("\n%s",invent[i].name);
    printf("  %s",invent[i].ed_izmer);
    printf("  %d",invent[i].art);
    printf("  %d",invent[i].count);
    i++;
    }
    printf("\n-----------------------\n");
    goto END;
  }
 }
 while (s!='0' && s!='1' && s!='2' && s!='3');
}
else f1=fopen(filename1, "wb+");

if (s!='2')
{
 A: fflush(stdin);
  printf("\nVvedite naimenovanie izdelya: ");
  gets(invent[i].name);
  fprintf(f2, invent[i].name);
  printf("\nVvedite edinicu izmereniya: ");
  scanf("%s",&invent[i].ed_izmer);
  printf("\nVvedite artikul izdelya: ");
  scanf("%d",&invent[i].art);
  printf("\nVvedite kolichestvo produkcii: ");
  scanf("%d",&invent[i].count);
  fwrite(&invent[i],sizeof(invent[i]),1,f1);
}


if (f2)
{
 do
 {
  fflush(stdin);
  printf("\nFail #2 suchestvuet. Vyberite deistvie:\n");
  printf("0 - sozdat' zanovo\n");
  printf("1 - dobavit' dannye v fail\n");
  printf("2 - otkazat'sya ot vvoda\n");
  s=getche();
  if (s=='0') f2=fopen(filename2, "wb+");
  else if (s=='1') f2=fopen(filename2, "ab+");
 }
 while (s!='0' && s!='1' && s!='2');
}
else f2=fopen(filename2, "wb+");

if (s!='2')
{
  do{
  printf("\nVvedite den', mesyac, god provedeniya operacii: ");
  scanf("%d %d %d",&invent[i].data[j].day,&invent[i].data[j].month,&invent[i].data[j].year);
    do{
  printf("\nTip operacii: postuplenie ili otpusk? [P/O] ");
  fflush(stdin);
  c=getch();
  if(c=='P' || c=='p')
   {
     printf("\nSkol'ko tovara postupilo? ");
     scanf("%d",&A[i][j]);
     p+=A[i][j];
   }

  if(c=='O' || c=='o')
   {
     printf("\nSkol'ko tovara otpusheno? ");
     scanf("%d",&A[i][j]);
     o+=A[i][j];
   }
      }while (c!='p' && c!='P' && c!= 'o' && c!='O');
  invent[i].operation[j]=c; //zapis' ocherednogo tipa operacii v strukturu
  B[i]++;
  fflush(stdin);
  fwrite(&invent[i].data[j],sizeof(invent[i].data[j]),1,f2);
  fwrite(&invent[i].operation[j],sizeof(invent[i].operation[j]),1,f2);
  printf("\nProdolghit' vvod tipov operaciy i daty dlya dannogo izdeliya? [Y/N] ");
  s=getch();
  j++;
   }while (s=='Y' || s=='y');
}

  printf("\nObnovit' inventarny fail na osnove dannyh 2-go faila? [Y/N] ");
  s=getch();
  if (s=='Y' || s=='y')
  {
   invent[i].count+=p-o;
   fwrite(&invent[i].count,sizeof(invent[i].count),1,f1);
   p=0;
   o=0;
  }

printf ("\nVvesti dannye po eche odnomu izdeliyu?");
do
{
printf ("\nNajmite 'Y' ili 'N' nezavisimo ot registra ");
s=getch();
} while (s!='Y' && s!='y' && s!='N' && s!='n');
if (s=='Y' || s=='y')
 {
  i++;
  j=0;
  goto A;
 }
struct_num=i;

//Posle obnovleniya pereimenovyvaem 2-oy fail v arkhivnyi
fclose(f2);
f2=fopen(filename2,"rb");

fflush(stdin);
printf("\nProsmotret' faily? [Y/N] ");
s=getch();
if (s=='Y' || s== 'y')
{
    printf("\n-----------------------\nProsmotr failov\n-----------------------\n");
    for (i=0; i<=struct_num; i++)
    {
	fread(&invent[i],sizeof(invent[i]),1,f1);
	printf("\n%s",invent[i].name);
	printf("  %s",invent[i].ed_izmer);
	printf("  %d",invent[i].art);
	printf("  %d",invent[i].count);
	fread(&invent[i],sizeof(invent[i]),1,f2);
	for (k=0; k<B[i]; k++)
	 {
	   printf("  %d.%d.%d|",invent[i].data[k].day,invent[i].data[k].month,invent[i].data[k].year);
	   printf("%c - %d  ",invent[i].operation[k], A[i][k]);
         }
	printf("\n-----------------------\n");
    }
}
END:
getch();
}
Shadow94 вне форума Ответить с цитированием
Старый 21.04.2011, 22:14   #4
blacktener
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 78
По умолчанию ?

а в чем ошибка была?
blacktener вне форума Ответить с цитированием
Старый 22.04.2011, 01:01   #5
Shadow94
Пользователь
 
Аватар для Shadow94
 
Регистрация: 17.04.2011
Сообщений: 18
По умолчанию

blacktener, выводились данные неправильно, точнее все выводилось правильно, кроме даты и операций)
Shadow94 вне форума Ответить с цитированием
Старый 22.04.2011, 08:24   #6
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

первое: программу с goto даже не хочется смотреть..
второе: скорей всего проблема (если как вы говорите) в низкоуровненых fwrite, fread
третье: дебаг спасет мир!
onewho вне форума Ответить с цитированием
Старый 22.04.2011, 10:03   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Ну, можно и так:
Код:
getch(); return;
Это кому как нравиться. Я, например, ничего предосудительного в goto не вижу.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 22.04.2011, 10:37   #8
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

а это?
Код:
A: fflush(stdin);
  printf("\nVvedite naimenovanie izdelya: ");
  gets(invent[i].name);
  fprintf(f2, invent[i].name);
...
/* овер 70 строк кода */
...
if ... goto A;
разумеется из-за какого-то goto END; я бы не стал капризничать

Последний раз редактировалось onewho; 22.04.2011 в 10:40.
onewho вне форума Ответить с цитированием
Старый 22.04.2011, 11:50   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

В данном случае лучше использовать конструкцию do while(). Лишние метки в приложении не есть гуд.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структуры данных SlayerLiving C++ Builder 2 07.03.2011 20:26
Структуры данных LeNus'Ka Помощь студентам 4 23.11.2010 17:43
С++ Структуры данных DarkSwan Помощь студентам 0 27.10.2010 12:21
Структуры данных в С++ ArniLand Общие вопросы C/C++ 2 14.07.2010 18:34
Динамические структуры данных на Си STIGGA Общие вопросы C/C++ 1 05.12.2009 00:50