Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для ekost
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 31

Поиск записи в структуре - не могу найти ошибку в написанной программе

10.10.2012, 20:08. Показов 1395. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю лабораторную - там нужно создать некое подобие базы данных с использованием структур.
Одно из заданий - реализовать функцию вывода информации о товаре после запроса названия товара.
Программу я написал по методичке, все работает кроме самого поиска.
Что не введу - оно не находит ничего, пишет, что товар не найден.
Подскажите пожалуйста для чайника - в чем моя ошибка?
вот сам код.
Не работает самая последняя функция в коде.
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
//Лаба 7 - структуры
# include <stdio.h>
# include <string.h>
# include <conio.h>
# include <iostream.h>
 
//-----------------------Константы и структуры--------------
const int len_name=20; // Длина текстовой строки в структуре
 
struct price {
        char tovar[len_name];  // Название товара
        char magaz[len_name]; //  Название магазина
        float cena; // Цена товара
};
const int size_p=sizeof(price); // 
 
//----------------------- Прототипы функций-----------------
 
int create_file (FILE *fbin);
int sort_file (FILE *fbin);
int print_file(FILE *fbin);
int search_tovar (FILE *fbin);
 
//-----------------------Основная программа------------------
 
int main() {
    FILE *fbin;
    char c;
 
    fbin=fopen("price.dat", "r+b"); // Открытие файла
    
    if (!fbin) {
          fbin = fopen("price.dat", "w+b"); // Создание нового файла
          
              if (!fbin) {
              puts("Ошибка открытия файла с данными\n");
              return 1;
          }
     }
     
     //Вывод меню и запуск необходимой функции
     
     while (1) {
          clrscr();
          puts("1. Добавление информации в файл"); 
          puts("2. Сортировка файла по алфавиту"); 
          puts("3. Вывод информации из файла");
          puts("4. Поиск товара по названию"); 
          puts("5. Выход из программы"); 
          puts("_______________________________________");  
          puts("Введите номер пункта меню"); 
          
          c=getch();
          switch (c) {
          case '1': create_file(fbin); break;
          case '2': sort_file(fbin); break;
          case '3': print_file(fbin); break;
          case '4': search_tovar(fbin); break;
          case '5': return 0;
          }
      }
}
//---------------------Запись в файл----------------------
int create_file(FILE *fbin){
 
    price elem;
    fseek(fbin, 0 , SEEK_END); // Указатель в конец файла
    puts ("Ввод данных о товаре\n");
    puts ("Для выхода введите символ *");
    puts("_______________________________________________________");
    
    while (1) {
          puts("Введите название товара");
          cin.getline (elem.tovar, len_name); // Ввод названия товара
          if (!strcmp (elem.tovar, "*")) // Если введена звездочка
              return 1;
          puts ("Введите название магазина"); 
          cin.getline (elem.magaz, len_name); // название магазина
          puts("Введите стоимость товара в гривнах");
          scanf ("%f",&elem.cena); // Цена товара
          fwrite(&elem, size_p, 1, fbin); // запись в файл
     }
}
          
//---------------------Вывод файла-----------------
int print_file(FILE *fbin){
    price elem;
    int n;
    clrscr();
    rewind (fbin); // Указатель в начало файла
    puts("Товар               Магазин             Стоимость"); // шапка таблицы
    puts("___________________________________________________");
    do{
        n=fread(&elem, size_p, 1, fbin); //чтение структуры из файла
        if (n<1) break; // Определение конца файла
        printf("%-20s%-20s%-8.2f\n", elem.tovar, elem.magaz, elem.cena);
    } while (1);
    puts("___________________________________________________");
    puts("Нажмите любую клавишу для выхода");
    getch();
    return 0;
}
 
//----------------------Сортировка записей в файле--------------------------
int sort_file (FILE *fbin) {
    long i,j;
    price elem1, elem2;
    
    puts ("Для сортировки нажмите любую клавишу");
    getch();
    fseek(fbin, 0, SEEK_END); // указатель в конец
    long len = ftell(fbin)/size_p; // Определяем длину файла
    rewind (fbin); // указатель в начало
    
    // пузырьковая сортировка
    for (i=len-1; i>=1; i--)
        for (j=0; j<=i-1; j++) {
            fseek(fbin, j*size_p, SEEK_SET); //указатель на j-запись
            fread(&elem1, size_p, 1, fbin); // читаем запись j в elem
            fread(&elem2, size_p, 1, fbin);// читаем следующую запись
            if (strcmp (elem1.tovar, elem2.tovar)>=1) {
            fseek(fbin,(-2)*size_p,SEEK_CUR); // указатель на 2 позиции назад
            
            // обмен значений
            fwrite(&elem2, size_p,1,fbin); // запись elem2
            fwrite(&elem1, size_p,1,fbin); //  потом запись elem1
        }
     }
     
     puts("Для выхода нажмите любую клавишу");
     getch();
     return 0;
}
 
//--------------------Поиск товара------------ИМЕННО ЗДЕСЬ НЕ РАБОТАЕТ
int search_tovar (FILE *fbin){
    int not_found; // флаг поиска
    char s[len_name]; // Строка поиска
    int n;
    
    price elem;
    
    while (1) {
    puts ("Введите название требуемого товара или '*' для выхода");        
    cin.getline(s, len_name); // Запоминаем товар в строке S
    if (!strcmp(s, "*")) break; // выход, если нажали звездочку
    rewind (fbin); // указатель в начало файла
    not_found=1; // флаг - товар не найден
    
    do {
      n=fread(&elem, size_p, 1, fbin); // чтение записи
      if (n<1) break; // Если n < 1  - то конец файла
      if (strstr(elem.tovar, s)) // Ищем строку s  в поле tovar
       if (elem.tovar[strlen(s)]==' ') { // Имеется пробел после фамилии
        strcpy(s,elem.tovar); // Копируем tovar в s
        puts("____________________________________________");
        puts("Товар               Магазин             Стоимость"); 
        printf("%-20s%-20s%-8.2f\n", elem.tovar, elem.magaz, elem.cena);
        puts("____________________________________________");
        not_found=0; //  товар найден
        }
     } 
     while (1);
     if (not_found)
     puts ("Требуемый товар отсутствует в базе");
   }
  puts ("Для выхода нажмите любую клавишу"); 
  getch();
  return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.10.2012, 20:08
Ответы с готовыми решениями:

Помогите найти ошибку в программе: не правильно выводит время в структуре TRAIN
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstring&gt; using namespace std; struct TRAIN { char station; int number; ...

Найти ошибку в программе постфиксной записи
В постфиксной записи (или обратной польской записи) операция записывается после двух операндов. Например, сумма двух чисел A и B...

Не могу найти ошибку в программе
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cctype&gt; #define is_delim(c) (std::isspace((c)) || std::ispunct((c))) using...

4
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
10.10.2012, 21:35
для чего вот это
C++
1
elem.tovar[strlen(s)]==' '
?
0
 Аватар для ekost
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 31
10.10.2012, 21:48  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
для чего вот это
C++
1
elem.tovar[strlen(s)]==' '
?
такой код есть в аналогичной задаче - примере в методичке, там нужно найти сотрудника и посчитать его среднюю зарплату, я из примера выкинул все подсчеты, оставив тлько поиск.

Как я понимаю - это добавляет пробел к слову-запросу, типа - коррекция ошибки ввода пользователем.
Я пробовал закомментировать эту строку - сразу куча ошибок при компилляции.
"Имеется пробел после фамилии - это коммент из методички, я забыл его поправить.
0
 Аватар для dederkay
46 / 46 / 4
Регистрация: 08.12.2010
Сообщений: 161
10.10.2012, 22:03
Ну хочу вам сказать что данный код тут не подходит и вам стоит просто закоментить и код будет выглядеть примерно так
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
int search_tovar (FILE *fbin)
{
    int not_found; // флаг поиска
    char s[len_name]; // Строка поиска
    int n;
 
    price elem;
 
    while (1)
    {
        cout<<"Введите название требуемого товара или '*' для выхода"<<endl;  
        fflush(stdin);
        cin.getline(s, len_name); // Запоминаем товар в строке S
        if (!strcmp(s, "*")) break; // выход, если нажали звездочку
        rewind (fbin); // указатель в начало файла
        not_found=1; // флаг - товар не найден
 
        do 
        {
            n = fread(&elem, size_p, 1, fbin); // чтение записи
            if (n < 1)
            {
                break; // Если n < 1  - то конец файла
            }
            if (strstr(elem.tovar, s))
            {// Ищем строку s  в поле tovar
                //if (elem.tovar[strlen(s)]==' ') 
                //{ // Имеется пробел после фамилии
                    //strcpy(s,elem.tovar); // Копируем tovar в s
                    cout<<"____________________________________________"<<endl;
                    cout<<"Товар               Магазин             Стоимость"<<endl; 
                    printf("%-20s%-20s%-8.2f\n", elem.tovar, elem.magaz, elem.cena);
                    cout<<"____________________________________________"<<endl;
                    not_found = 0; //  товар найден
                //}
            }
        } 
        while (1);
        if (not_found)
        {
            cout<<"Требуемый товар отсутствует в базе"<<endl;
        }
    }
    cout<<"Для выхода нажмите любую клавишу"<<endl; 
    system("pause");
    return 0;
}
так же меня удивил ваш способ вывода то ли путс то принтф то син, а так же посоветую прочитать хоть немного о правильном стиле программирования ибо код трудный для чтения. К тому же чем вас cout не удовлетворяет? Далее если юзать С тогда только принтф и тд, или же С++ где есть filestream и только cout.
это не только упростит читабельность но и немножко оптимизирует программу.
1
 Аватар для ekost
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 31
10.10.2012, 22:07  [ТС]
Спасибо за подсказку, сейчас попробую.
ПО поводу разных операторов вывода, то это такая методика обучения в методичке странная - в одних лабах - printf , в других - cout<< , в третьих - puts, как я понимаю - это они постепенно показывают что есть разные способы ввода-вывода и как его применять...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.10.2012, 22:07
Помогаю со студенческими работами здесь

не могу найти ошибку в программе
задача Дана символьная строка. Подсчитать количество букв k в последнем ее слове считает только буквы К в первом слове и выдаёт...

Не могу найти ошибку в программе
Добрый вечер, уважаемые программисты. Прошу у вас помощи с программой. Нужно её сдавать, а она не работает. Буду очень благодарен за любую...

Не могу найти ошибку в программе
Разложение числа на сумму двух квадратов &quot;for(a=o;a&lt;=floor(sqrt(W));x++); for(b=0;b&lt;=floor(sqrt(w));y++); if(a*a+b*b==W) ...

Не могу найти ошибку в программе
Не могу найти ошибку в программе #include &quot;stdafx.h&quot; #include &lt;iostream.h&gt; #include &lt;math.h&gt; #include &lt;fstream.h&gt; ...

Не могу найти ошибку в программе
Здравствуйте! Не могу понять, как полностью отладить программу. Определенное понимание о характере ошибке есть( ниже прложил ее название),...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru