Форум программистов, компьютерный форум CyberForum.ru

Учет товара на складе - C++

Восстановить пароль Регистрация
 
Fanarik1960
0 / 0 / 0
Регистрация: 02.04.2014
Сообщений: 21
03.04.2014, 11:07     Учет товара на складе #1
Программа называется Учет товаров на складе. Помогите мне сделать в данной программе поиск и сортировку. Исходник ниже:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <fstream>
using namespace std;
 
const int l_name = 30;
const int l_data = 30;
 
 struct Man
  { char name[l_name];
    int kol_vo;
    float stoimost;
    char data[l_data];
  };
 
 
int compare(const void *manl, const void *man2);
 
void create(void) 
 
{ SetConsoleCP(1251);
    SetConsoleOutputCP(1251); 
Man man; int pr; FILE *fbin;
  if ((fbin =fopen("dbase.bin","wb")) == NULL)
   puts("Ошибка создания файлы\n ");
  else
    { do
       {
        cout << "\n-------------Добавление данных-----------------";
        cout << "\n Наименование товара: ";
         cin.get() ; gets (man.name) ;
         cout << "\n Кол-во: ";
         cin >> man.kol_vo;
         cout << "\n Стоимость: ";
         cin >> man.stoimost;
         cout << "Дата:";
         cin>> man.data;
         fwrite(&man, sizeof(man),1,fbin);
         cout<< "\n Продолжить ввод (1-да/0-нет)";
         cin >> pr;
         cout << "\n----------------------------------";
         } while(pr == 1);
   }  
  fclose(fbin);
}
 void create2(void) 
 
{ Man man; int pr; FILE *fbin;
  if ((fbin =fopen("dbase.bin","ab")) == NULL)
   puts("Ошибка создания файлы\n ");
  else
    { do
       {
        cout << "\n-------------СОЗДАНИЕ ФАЙЛА-----------------";
        cout << "\n Наименование товара: ";
         cin.get() ; gets (man.name) ;
         cout << "\n Кол-во: ";
         cin >> man.kol_vo;
         cout << "\n Стоимость: ";
         cin >> man.stoimost;
         cout << "Дата:";
         cin>> man.data;
         fwrite(&man, sizeof(man),1,fbin);
         cout<< "\n Продолжить ввод (1-да/0-нет)";
         cin >> pr;
         cout << "\n----------------------------------";
         } while(pr == 1);
   }  
  fclose(fbin);
}
 
void view(void) 
  { SetConsoleCP(1251);
    SetConsoleOutputCP(1251); 
  FILE *fbin;
    if ((fbin =fopen("dbase.bin","rb")) == NULL)
      puts("Ошибка открытия файла\n");
    else
     {cout << "\n-------------ФАЙЛ ОТКРЫТ-----------------"; 
     fseek(fbin, 0, SEEK_END);
       int n_record = ftell(fbin)/sizeof(Man);
       Man *man = new Man[n_record];
       fseek(fbin, 0, SEEK_SET);
       fread(man, sizeof(Man),n_record, fbin);
       fclose(fbin);
      
       for (int i=0; i < n_record; i++)
 
        cout << "\n* Товар: " << man[i].name << "\n* Количество:  " <<
         man[i].kol_vo << "\n* Стоимость: " << man[i].stoimost <<"\n* Дата: " << man[i].data;
        cout << "\n";
        cout << "\n**************************************************";
     }
  }
 
 
 void work(void)
  { FILE *fbin;
    if ((fbin =fopen("dbase.bin","rb")) == NULL)
      puts("Ошибка открытия файла\n");
    else
     { fseek(fbin, 0, SEEK_END);
       int n_record = ftell(fbin)/sizeof(Man);
       Man *man = new Man[n_record];
       fseek(fbin, 0, SEEK_SET);
       fread(man, sizeof(Man),n_record, fbin);
       fclose(fbin);
       
       for (int i=0; i < n_record ; i++){
        if (man[i].stoimost > 1000)cout << "\n" << man[i].name << "  " <<
         man[i].kol_vo << "  " << man[i].stoimost <<" " << man[i].data;
        cout << "\n";
     }}
 }
 
 
int main(void)
 { int num;
 setlocale(LC_ALL,"Russian");
   do
    { cout << "\n-------------МЕНЮ-----------------"; 
      cout << "\n--- 1 - Добавление данных      ---";
      cout << "\n--- 2 - Просмотр файла         ---";
      cout << "\n--- 3 - Обработка файл         ---";
      cout << "\n--- 4 - Создать новый файл     ---";
      cout << "\n--- 5 - Поиск                  ---";
      cout << "\n--- Ваш выбор:";cin>>num; 
      cout << "\n----------------------------------";
      
      switch(num)
       { case 1: create2();break;
         case 2: view();break;
         case 3: work();break;
         case 4: create();break;
        
       }
    } while (num != 4);
}
 
int compare(const void *manl, const void *man2)
{ return strcmp(((Man *)manl)->name,
((Man *)man2)->name);
 }
 
 
//---------------------------------------------------------------------------
Помогите пожалуйста...

Добавлено через 21 час 53 минуты
Помогите пожалуйста с поиском и сортировкой по товарам. Или подскажите как сделать.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2014, 11:07     Учет товара на складе
Посмотрите здесь:

C++ Строки и структуры (Помогите доделать программу учета товаров на складе)
Помогите please cоставить программу, в которой описывается структура из полей: Название товара, Цена товара, Процентная ставка кредита. C++
C++ Составить программу, в которой описывается структура из полей: Название товара, Цена, Размер партии товара...
Классы. Баз данных о хранящихся на складе товарах C++
C++ Класс "Складская книга", содержащая названия товара, цену и количество на складе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ryuk
 Аватар для Ryuk
179 / 177 / 33
Регистрация: 10.06.2011
Сообщений: 869
03.04.2014, 11:09     Учет товара на складе #2
Fanarik1960, а что конкретно не получается и как вы хотите организовать поиск и сортировку?
Fanarik1960
0 / 0 / 0
Регистрация: 02.04.2014
Сообщений: 21
03.04.2014, 11:40  [ТС]     Учет товара на складе #3
Не получается сделать поиск, надо чтобы поиск работал так:
Вводишь название товара, результат вывести на экран, желательно чтобы кроме товара выводилось еще цена, количество и дата т.е. все что с ним связанно.
Ryuk
 Аватар для Ryuk
179 / 177 / 33
Регистрация: 10.06.2011
Сообщений: 869
03.04.2014, 12:02     Учет товара на складе #4
Fanarik1960, ну так в чем проблема, выдаете запрос на поиск, пользователь вводит нужный ему товар и далее вы осуществляете поиск по файлу. Было бы неплохо если бы у вас были данные в файле по форме какой нибудь записаны(например: [Имя товара] [Цена] [Количество] [Дата]) и для этой формы, для каждого параметра задать определенную границу названия, скажем к примеру 20 символов. И когда производится поиск, вы проверяете(если на 1 строку отводится 1 товар) в каждой строке совпадение n(число символов в искомом слове) символов и если вы нашли, то делаете какой нибудь счетчик-массив(если введено: лук. а в вашем списке есть: лук-порей, лук репчатый и т.д.) или же сразу на вывод.
Fanarik1960
0 / 0 / 0
Регистрация: 02.04.2014
Сообщений: 21
07.04.2014, 08:18  [ТС]     Учет товара на складе #5
В общем сделал я вот такой поиск, но он не работает. Помогите
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void find(void)
{
FILE *fbin;
    if ((fbin =fopen("dbase.bin","rb")) == NULL)
      puts("Ошибка открытия файла\n");
    else
 
    {cout << "\n-------------Поиск-----------------\n"; 
    fseek(fbin, 0, SEEK_END);
       int n_record = ftell(fbin)/sizeof(Man);
       Man *man = new Man[n_record];
       fseek(fbin, 0, SEEK_SET);
       fread(man, sizeof(Man),n_record, fbin);
       fclose(fbin);
    char tov[l_tov];
    cout << "Введите товар:";
    cin >> tov;;
       for (int i=0; i = n_record ; i++){
    
        if (man[i].name == tov)
        cout<<"\n"<<man[i].name << "\n" << "  " << man[i].kol_vo << "  " << man[i].stoimost <<" " << man[i].data;
        cout << "\n";
     }}  
}
IrineK
Заблокирован
07.04.2014, 08:32     Учет товара на складе #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Строка 20:
Цитата Сообщение от Fanarik1960 Посмотреть сообщение
if (man[i].name == tov)
if (strcmp (man[i].name, tov ) == 0) - сравнение двух строк char

Особенности strcmp: возвращает 0, если строки равны. Подробней здесь.
Fanarik1960
0 / 0 / 0
Регистрация: 02.04.2014
Сообщений: 21
07.04.2014, 09:34  [ТС]     Учет товара на складе #7
Исправил, программа запускается, но поиск не работает. Ввожу товар, который есть в списке товаров. Но результаты не отображаются.
IrineK
Заблокирован
07.04.2014, 09:45     Учет товара на складе #8
А когда просто распечатываешь все результаты, они отображаются?
Fanarik1960
0 / 0 / 0
Регистрация: 02.04.2014
Сообщений: 21
07.04.2014, 15:03  [ТС]     Учет товара на складе #9
Да. В программе происходит зацикливание

Добавлено через 5 часов 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void find(void)
{
 
  FILE *fbin;
    if ((fbin =fopen("dbase.bin","rb")) == NULL)
           puts("Ошибка открытия файла\n");
     else
        {
            cout << "\n-------------ПОИСК-----------------"; 
            fseek(fbin, 0, SEEK_END);
            int n_record = ftell(fbin)/sizeof(Man);
            //Man *man = new Man[n_record];
            fseek(fbin, 0, SEEK_SET);  
            char tov[l_tov];
            cout << "\n Введите товар:";
            cin >> tov;
            int k=0;
             for (int i=0; i < n_record; i++){
                 fread(&man2, sizeof(Man),1, fbin);
                 if (strcmp (man2.name, tov )==0)
                     {
                        cout<<"\n"<<man2.name << "\n" << "  " << man2.kol_vo << "  " << man2.stoimost <<" " << man2.data<<"\n";
                        k++;
                     cout << "**************************************************\n";
                    }                
             }
             if (k ==0)cout<<"Данные не найдены. Проверте правильность написания \n"; 
             fclose(fbin);
         } 
}
Спасибо всем кто помог. Помогите пожалуйста еще и с удалением строки с файла. Буду очень благодарен
IrineK
Заблокирован
07.04.2014, 18:25     Учет товара на складе #10
Цитата Сообщение от Fanarik1960 Посмотреть сообщение
с удалением строки с файла
Самый простой способ - с помощью вспомогательного файла.
1) создаем вспомогательный файл
2) копируем во вспомогательный файл то, что нам нужно (ненужное отфильтровываем ифом).
3) копируем из вспомогательного файла в основной
4) убиваем вспомогательный файл (remove)

Способ можно усовершенствовать (например, копировать только часть после ненужной записи). Но основная идея останется та же.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2014, 09:19     Учет товара на складе
Еще ссылки по теме:

Составить программу, выводящую на экран информацию о наличии товаров на складе C++
C++ Структуры. Список товаров, имеющихся на складе
Сведения об экспорте/импорте товара состоят из наименования товара, страны, количества C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Fanarik1960
0 / 0 / 0
Регистрация: 02.04.2014
Сообщений: 21
11.04.2014, 09:19  [ТС]     Учет товара на складе #11
Сделал удаление, но оно не работает. Посмотрите что не так пожалуйста:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void del(void)
{
    char s[200];
   FILE *t, *fbin;
    t = fopen("dbase.bin","rb");
    if(t == NULL)
    {
        printf("ГЋГёГЁГЎГЄГ* ïðè îòêðûòèè ГґГ*éëГ*.\n");
        system ("pause");
        exit(1);
    }
    fbin = fopen ("dbase1.bin", "wb");//ñîçäГ*Гѕ Г*îâûé ГґГ*éë äëÿ Г§Г*ГЇГЁГ±ГЁ Гў Г*ГҐГЈГ® ñòðîê, Гў êîòîðûõ Г*ГҐГІ ñîâïГ*äåГ*ГЁГ© Г± ââåäåГ*Г*îé ГґГ*ìèëèåé
    
    printf("Ââåäèòå òîâГ*Г°: ");
    scanf("%s",man2.name);
    int flag = 0;
    while(!feof(t))
    {
        if (fgets(s, 200, t))
        {
            char temp[30];
            int i = 0;
            while (sscanf(s + i, "%s", temp))
            {
                if (!strcmp(man2.name, temp)) 
                {
                    flag = 1;
                    break;
                }
                i += strlen(temp) + 1;
                if (i >= strlen(s)) break;
            }
            
            if (!flag) //åñëè Г*ГҐГІ ñîâïГ*äåГ*ГЁГ©
                fputs(s, fbin); //Г§Г*ïèñûâГ*Гѕ ñòðîêó Гў Г*îâûé âðåìåГ*Г*ûé
            flag = 0;
        }
    }
    fclose (t);
    fclose (fbin);
    
    remove("dbase.bin");
    rename("dbase1.bin","dbase.bin");
Добавлено через 21 час 11 минут
Помогите доделать пожалуйста!!!
Yandex
Объявления
11.04.2014, 09:19     Учет товара на складе
Ответ Создать тему
Опции темы

Текущее время: 11:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru