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

не могу понять что не так - C++

Восстановить пароль Регистрация
 
zoker
0 / 0 / 0
Регистрация: 18.11.2009
Сообщений: 8
24.12.2009, 11:33     не могу понять что не так #1
задание такое :
Структура "книга почтой":-наименование книги;-ФИО автора;-номер по каталогу;-издательство;-колличество в наличии(шт.);-стоимость книги.
Пользователь вводит номера по каталогу книг через пробел.Программа должна вывести список на экран ,с итоговой стоимостью.При этом каждой из них в списке необходимо уменьшить на 1 значение в поле "количество в наличии".Если количество равно 0,то такую запись необходимо удалить.Добавить новую "книгу почтой " в конец списка с введенными пользователем характеристиками.

Проблема: функция gets не срабатывает, следствие то что перебрасывает через 2 пункт меню в программе

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
#include "stdafx.h"
#include "stdio.h"
#include "student.h"
#include "stdlib.h"
#include "conio.h"
 
struct books
{
    char name[50];
    char writer[100];
    int number;
    char publisher[50];
    int amount;
    int price;  
}book[50];
 
int num_book=0,size=0;
 
void input ()
{
    char a[2];
    FILE *fp=fopen("books.txt", "wb");
    if (fp==NULL){printf(Rus("Ошибка при создании файла\n"));exit(0);};
    for(int i=0;i<99;i++)
    {
        printf(Rus("Название: "));  gets(book[i].name);
        printf(Rus("Автор: "));     gets(book[i].writer);   
        book[i].number=i+1;
        printf(Rus("Издательство: "));gets(book[i].publisher);
        printf(Rus("На складе: ")); scanf("%d",&book[i].amount);
        printf(Rus("Цена: "));      scanf("%d",&book[i].price);
        fwrite(&book[i], sizeof(book[i]),1,fp);
        num_book++;
        if (ferror(fp)!=NULL){printf(Rus("Ошибка при записи файла\n"));exit(0);};
        printf(Rus("\nЕсли хотите добавить еще одну книгу, нажмите Y ")); scanf("%s",&a);
        printf("\n");
        if(a[0]!='Y')break;
    }
    fclose(fp);
}
 
 
void number()
{
    int i,a,itog=0;
    char number[100];
    FILE *fp=fopen("books.txt", "r+b");
    if (fp==NULL){printf(Rus("Ошибка при создании файла\n"));exit(0);};
    printf("\n");
    printf(Rus("Введите номера книг по каталогу(меньше %d):\n"),num_book);
    gets(number);
    for(i=0;i<99;i++)
    {
        if(number[i]=='\0')break;
        if(number[i]>=0x30 && number[i]<=0x39)
        {
            if(number[i+1]>=0x30 && number[i+1]<=0x39)
            {
                if((number[i]+10*number[i+1])<=num_book)
                {
                    fread(&book[number[i]+10*number[i+1]], sizeof(book[i]), 1, fp);
                    printf(Rus("Название: %s\n"),book[i].name);
                    printf(Rus("Автор: %s\n"),book[i].writer);  
                    printf(Rus("Номер по каталогу: %d\n"),book[i].number);
                    printf(Rus("Издательство: %s\n"),book[i].publisher);
                    printf(Rus("На складе: %d\n"),book[i].amount);
                    printf(Rus("Цена: %d\n\n"),book[i].price);
                    book[i].amount--;
                    itog+=book[i].price;
                }
            }
        }
    }
    printf("\n-------------------------\n");
    printf(Rus("Итоговая сумма: %d\n"),itog);
    for(i=0;i<num_book;i++)
    {
        size+=sizeof(book[i]);
        fwrite(&book[i], sizeof(book[i]),1,fp);
    }
    fclose(fp);
}
 
void add()
{
    FILE *fp=fopen("books.txt", "r+b");
    if (fp==NULL){printf(Rus("Ошибка при открытии файла\n"));exit(0);};
    printf("\n");
    fseek(fp,long(size),SEEK_SET);
    printf(Rus("Название: "));  gets(book[num_book].name);
    printf(Rus("Автор: "));     gets(book[num_book].writer);    
    book[num_book].number=num_book+1;
    printf(Rus("Издательство: "));gets(book[num_book].publisher);
    printf(Rus("На складе: ")); scanf("%d",&book[num_book].amount);
    printf(Rus("Цена: "));      scanf("%d",&book[num_book].price);  
    printf("\n");
    num_book++;
    fwrite(&book[num_book], sizeof(book[num_book]),1,fp);
    fclose(fp);
}
 
void print()
{
    int i;
    FILE *fp=fopen("books.txt", "rb");
    if (fp==NULL){printf(Rus("Ошибка при создании файла\n"));exit(0);};
    printf("\n");
    printf(Rus("\nКаталог:\n\n"));
    if(num_book==0)num_book=1;
    for(i=0;i<num_book;i++)
    {
        fread(&book[i], sizeof(book[i]), 1, fp);
        printf(Rus("Название: %s\n"),book[i].name);
        printf(Rus("Автор: %s\n"),book[i].writer);  
        printf(Rus("Номер по каталогу: %d\n"),book[i].number);
        printf(Rus("Издательство: %s\n"),book[i].publisher);
        printf(Rus("На складе: %d\n"),book[i].amount);
        printf(Rus("Цена: %d\n\n"),book[i].price);
        printf("\n");
    }
    printf("\n");
    fclose(fp);
}
 
int main()
{
    int choise;
    bool flag=1;
    while(flag)
    {
        printf(Rus("Нажмите\n\t1-Для ввода книг в каталог\n\t2-Для ввода номеров и получения списка нужных книг\n\t3-Для добавления книги в конец каталога\n\t4-Для получения списка книг в наличии\n\t5-Для выхода из программы\n"));
        scanf("%d",&choise);
        printf("\n");
        switch(choise)
        {
            case 1:input();break;
            case 2:number();break;
            case 3:add();break;
            case 4:print();break;
            case 5:flag=0;break;
            default:printf("Неизвестная комманда\n");
        }
    }
    getch();
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.12.2009, 12:29     не могу понять что не так #2
Цитата Сообщение от zoker Посмотреть сообщение
функция gets не срабатывает,
Перед вызовом этой функции напишите:
C
1
_flushall();
zoker
0 / 0 / 0
Регистрация: 18.11.2009
Сообщений: 8
24.12.2009, 12:57  [ТС]     не могу понять что не так #3
после проверки выяснилось что
функция namber не правильно работает
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.12.2009, 05:21     не могу понять что не так #4
Цитата Сообщение от zoker Посмотреть сообщение
после проверки выяснилось что
функция namber не правильно работает
я об этом догадывался. А что должна эта функция выполнять? Полностью опишите все что должна выполнять эта функция.
zoker
0 / 0 / 0
Регистрация: 18.11.2009
Сообщений: 8
26.12.2009, 00:28  [ТС]     не могу понять что не так #5
спасибо уже разобрался во всём))
zoker
0 / 0 / 0
Регистрация: 18.11.2009
Сообщений: 8
09.01.2010, 13:55  [ТС]     не могу понять что не так #6
понял что до конца не разобрался , в данной программе проблема такого рода , что она записывает в файл , сохраняет в нем , при выходе из самой программы (в меню 5 пункт) должно всё оставаться , при запуске программы заново она показывает только первую книгу которую я вбил в прошлом заходе,

предположительно проблема в
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void print()
{
        int i;
        FILE *fp=fopen("books.txt", "rb");
        if (fp==NULL){printf(Rus("Ошибка при создании файла\n"));exit(0);};
        printf("\n");
        printf(Rus("\nКаталог:\n\n"));
        if(num_book==0)num_book=1;
        for(i=0;i<num_book;i++)
        {
                fread(&book[i], sizeof(book[i]), 1, fp);
                printf(Rus("Название: %s\n"),book[i].name);
                printf(Rus("Автор: %s\n"),book[i].writer);      
                printf(Rus("Номер по каталогу: %d\n"),book[i].number);
                printf(Rus("Издательство: %s\n"),book[i].publisher);
                printf(Rus("На складе: %d\n"),book[i].amount);
                printf(Rus("Цена: %d\n\n"),book[i].price);
                printf("\n");
        }
        printf("\n");
        fclose(fp);
}
если тут
C++
1
if(num_book==0)num_book=1;
; значение 1 поменять на 5 или 10 еще норм и всё работает Но если более то начинает выдавать пустые книги ,я так понимаю надо что б в цикле нумеровало каждую книгу и потом выводило все колличество введеных книг
Yandex
Объявления
09.01.2010, 13:55     не могу понять что не так
Ответ Создать тему
Опции темы

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