Помощь - Поиск - Пользователи - Календарь
Полная версия: проблема с задачей по структурам > Информатика / Программирование
Образовательный студенческий форум > Другие дисциплины > Информатика / Программирование
SnooP↑
Здравствуйте. Гляньте пожалуйста, что с программой, если не трудно. Не правильно отображает наличие и происхождение. проблема с коддировкой (не понимает русского) но это не проблема. Ещё в названии не отображается больше одного автора (это то что я заметил но закончились все варианты того как это исправить. от код:
book.cpp
Код

// 6.cpp: определяет точку входа для консольного приложения.
//


#include "stdafx.h"
#include<windows.h>
#include "BOOK.h"
#include <string.h>
#include <iostream>

#define RED FOREGROUND_RED|FOREGROUND_INTENSITY
#define GREEN FOREGROUND_GREEN|FOREGROUND_INTENSITY
using namespace std;

void PrintBook(BOOK* book)
{
        printf("\tАвтор: %s.\n\tНазвание: %s.\n\tКатегория: %s.\n\tпроисхождение: %G.\n\tналичие книги в данный момент: %d.\n",
                book->author,book->title, book->category,book->origin,book->presence);
}

void InitBook(BOOK* book)
{
            setlocale( LC_ALL,"Russian" );
    const char* presence[]={"Есть в данный момент","Нет в данный момент"};
    const char* category[]={"специальная литература","хобби","домашнее хозяйство","беллетристика"};
    const char* origin[]={"покупка","кража","подарок"};    

cout << "Введите автора: " << endl;
   cin>>book->author;
      fflush(stdin);

cout <<"Введите название: " << endl;
   cin>>book->title;
      fflush(stdin);




        cout <<"Введите категорию: \nспециальная литература(1),\nхобби(2),\nдомашнее хозяйство(3),\nбеллетристика(4)\n"<< endl;
   int w;
     cin >>w;
if(w>0&&w<5)
   strcpy(book->category,category[w-1]);
     else
        {
         cout <<"Вы ввели неверное значение. Категория не выбрана\n"<<endl;
         strcpy(book->category,category[3]);
        }
        fflush(stdin);




cout << "Введите происхождение: \nпокупка(1),\nкража(2),\nподарок(3)\n" << endl;
   int o;
     cin >>o;
if(o>0&&o<5)
   strcpy(book->origin,origin[o-1]);
     else
        {
         cout <<"Вы ввели неверное значение. Категория не выбрана\n"<<endl;
         strcpy(book->origin,origin[3]);
        }
        fflush(stdin);


      

        
                cout << "Наличие: Есть в данный момент(1),Нет в данный момент(2)\n"<<endl;
          
int p;
        cin >>p;
        if(p>0&&p<3)
                strcpy(book->presence,presence[p-1]);
        else
        {
                cout <<"Вы ввели неверное число. продолжение невозможно.\n"<<endl;
                strcpy(book->presence,presence[1]);

        }

         fflush(stdin);




}

void menu(int&enter)
{
        HANDLE hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);//для изменения цвета
        SetConsoleTextAttribute(hConsoleHandle, GREEN);
        cout<<"\nВыберите действие:\n"
                <<"(1)Распечатать содержимое картотеки.\n"
                <<"(2)Добавить книгу в картотеку.\n"
                <<"(3)Удалить книгу (книги) из картотеки.\n"
                <<"(4)Записать текущее содержимое картотеки в файл.\n"
                <<"(5)Считать из файла содержимое в картотеку.\n"
                <<"(6)Упорядочить книги в картотеке.\n"
                <<"(0)Выход из программы."
                <<endl;
        cin>>enter;
        SetConsoleTextAttribute(hConsoleHandle, RED);
        if(enter<0||enter>6)
                cout<<"Вы ввели неправильное значение."<<endl;
        cin.sync();             //для того,чтобы цикл
        cin.clear();    //не бегал по кругу при ошибочном вводе
        
}

void ExitProg(records& r,bool &flag)
{
        flag=0;         //нет элементов
        delete [] r.pBook;
        r.pBook=0;
        r.size=0;
}

void PrintRecord(records& r,bool& flag)
{
        if(!flag)       //если массив пуст
                cout<<"Нет книг в картотеке."<<endl;
        else
        {
                for(int i=0;i<r.size;i++)
                {
                        cout<<i+1<<"ая книга:"<<endl;
                        PrintBook(&r.pBook[i]);
                }
        }
}

void AddBook(records& r,bool& flag)
{
        if(!flag)       //если это первое добавление
        {
                InitBook(r.pBook);
                flag=1; //первое добавление уже было
        }
        else    //если книги уже есть
        {
                BOOK * tmp=new BOOK[r.size+1];  //выделили нужное кол-во памяти
                memcpy(tmp,r.pBook,r.size*sizeof(BOOK));        //переписали содержимое
                delete[] r.pBook;       //очистили уже ненужную память
                r.pBook=tmp;    //перенаправили указатель
                tmp=0;
                InitBook(&r.pBook[r.size]); //отправили адрес созданного кусочка на инициализацию
                r.size++;       //увеличили кол-во книг
        }
}

void ReadFile(records& r,bool& flag)
{
        FILE *f = fopen("record.txt", "r");
        if(f)
        {
                int size=0;
                fscanf(f,"size=%d ", &size);
                records tmp = {new BOOK[size],size};
                for (int i=0;i<size;i++)
                        {
                                fscanf(f,"Автор: %s Название: %s Категория: %s Происхождение: %G Наличие: %d\n"

                                        , &tmp.pBook[i].author
                                        , &tmp.pBook[i].title
                                        , &tmp.pBook[i].category
                                        , &tmp.pBook[i].origin
                                        , &tmp.pBook[i].presence);
                        }
                delete[] r.pBook;
                r=tmp;
                if(size)flag=1;
        }
        else
                cout<<"Невозможно открыть файл."<<endl;
        fclose(f);
}

void WriteFile(records& r,bool& flag)
{
        if(!flag)       //если не было первого добавления
                cout<<"Нет книг в картотеке."<<endl;
        else
        {
                FILE *f = fopen("record.txt","w");
                if(f)
                {                      
                        fprintf(f,"size=%d\n",r.size);
                        for (int i=0;i<r.size;i++)
                        {
                                BOOK* book = &r.pBook[i];
                                fprintf(f,
                                        "Автор: %s Название: %s Категория: %s Происхождение: %G Наличие: %d\n",
                                        book->author,book->title, book->category,book->origin,book->presence
                                        );
                        }
                        cout<<"Картотека успешно переписана в файл record.txt"<<endl;
                }
                else
                        cout<<"Невозможно открыть файл"<<endl;
                fclose(f);
        }
}

void DelBook(records& r,bool& flag)
{
        if(!flag)       //если нет книг
                cout<<"Нет книг в картотеке."<<endl;
        else            //если книги есть
        {
                if(r.size==1&&flag==1) //если в картотеке только 1 книга
                {
                        flag=0;
                        cout<<"1ая книга успешно удалена."<<endl;
                }
                else    //если книг больше 1
                {
                        int  enter=0;
                        while(enter<1||enter>r.size+1)  //пока не введено правильного номера
                        {
                                cout<<"Введите номер книги , которую хотите удалить"<<endl;
                                cin>>enter;
                                if(enter<1||enter>r.size+1)     //если введен неправильный номер
                                {
                                        cout<<"Вы ввели неправильное значение."<<endl;
                                        cin.sync();             //для того,чтобы цикл
                                        cin.clear();    //не бегал по кругу при ошибочном вводе
                                }
                                else  
                                {
                                        BOOK * tmp=new BOOK[r.size-1];  //выделили нужное кол-во памяти
                                        for(int i=0,j=0;j<r.size-1;i++,j++)     //переписали содержимое
                                        {
                                                if(i+1==enter)i++;
                                                tmp[j]=r.pBook[i];
                                        }
                                        delete[] r.pBook;       //очистили уже ненужную память
                                        r.pBook=tmp;    //перенаправили указатель
                                        tmp=0;
                                        cout<<enter<<"ая книга успешно удалена."<<endl;
                                        --r.size;
                                }
                        }
                }
        }
}

void SortBook(records& r,bool& flag)
{
        if(!flag)
                cout<<"Нет книг в картотеке."<<endl;
        else if(r.size==1)
                cout<<"В картотеке только 1 книга!"<<endl;
        else
        {
                cout<<"По какому полю отортировать книги?"<<endl;
                cout<<"(1)По автору.\n(2)По названию.\n(3)По происхождению.\n(4)По наличию."<<endl;
                int enter=0;
                while(enter<1||enter>4)
                {
                        cin>>enter;
                        if(enter<1||enter>4)
                        {
                                cout<<"Вы ввели неправильное значение.\nПовторите ввод."<<endl;
                                cin.sync();
                                cin.clear();
                        }
                }
                switch(enter)
                {
                case 1:
                        Sort(r,SwapBook,CmpAuthor);break;
                case 2:
                        Sort(r,SwapBook,CmpTitle);break;
                case 3:
                        Sort(r,SwapBook,CmpPresence);break;
                case 4:
                        Sort(r,SwapBook,CmpOrigin);break;
                }
        }
}

void Sort(records& r, void (*Swap)(BOOK*, BOOK*), int (*Compare)(BOOK*, BOOK*))
{
        for(int i=0; i<r.size; i++)
                for(int j=r.size-1; j>=i; j--)
                {
                        BOOK* pCurrent = &r.pBook[i];
                        BOOK* pPrevious =&r.pBook[j];
                        if((*Compare)( pPrevious, pCurrent ) > 0)//требуется переставить
                                (*Swap)( pPrevious, pCurrent );
                }
}

void SwapBook(BOOK* b1, BOOK* b2)
{
        BOOK tmp=*b1;
        *b1=*b2;
        *b2=tmp;
}




int CmpAuthor(BOOK* b1, BOOK* b2)
{
        return strcmp(b1->author,b2->author);
}




int CmpPresence(BOOK* b1, BOOK* b2)
{
        return strcmp(b1->presence,b2->presence);
}


int CmpOrigin(BOOK* b1, BOOK* b2)
{
        return strcmp(b1->origin,b2->origin);

}

int CmpTitle(BOOK* b1, BOOK* b2)
{
        return strcmp(b1->title,b2->title);
}





main.cpp
Код
// stdafx.cpp: исходный файл, содержащий только стандартные включаемые модули
// 6.pch будет предкомпилированным заголовком
// stdafx.obj будет содержать предварительно откомпилированные сведения о типе

#include "stdafx.h"

#include <cstdio>
#include <iostream>

#include "BOOK.h"

#define   stop __asm nop        


using namespace std;

void main()
{
        setlocale( LC_ALL,"Russian" );

        int enter=-1;
        bool flagExit=true;
        bool flagFirst=false;//нет элементов
        cout<<"Добро пожаловать в картотеку."<<endl;
        records rec={new BOOK[1],1};
        do
        {
                menu(enter);
                switch(enter)
                {
                case 0:
                        ExitProg(rec,flagExit);break;
                case 1:
                        PrintRecord(rec,flagFirst);break;
                case 6:
                        SortBook(rec,flagFirst);break;
                case 5:
                        ReadFile(rec,flagFirst);break;
                case 4:
                        WriteFile(rec,flagFirst);break;
                case 3:
                        DelBook(rec,flagFirst);break;
                case 2:
                        AddBook(rec,flagFirst);break;
                }
                if(enter)enter=-1;
        } while(flagExit);
}
// TODO. Установите ссылки на любые требующиеся дополнительные заголовки в файле STDAFX.H
// , а не в данном файле


// TODO. Установите ссылки на любые требующиеся дополнительные заголовки в файле STDAFX.H
// , а не в данном файле


book.h
Код

#pragma once
#define SIZE 32

struct BOOK
{
        char author[SIZE];
        char title[SIZE];
        char category[SIZE];
        char presence[SIZE];
        char origin[SIZE];
        
};

struct records
{
        BOOK* pBook;            //указатель на массив книг
        int size;       //количество книг
};

void PrintBook(BOOK* book);
void InitBook(BOOK* book);
void menu(int& enter);
void ExitProg(records& r,bool& flag);
void PrintRecord(records& r,bool& flag);
void ReadFile(records& r,bool& flag);
void WriteFile(records& r,bool& flag);
void DelBook(records& r,bool& flag);
void AddBook(records& r,bool& flag);

void SortBook(records& r,bool& flag);
void Sort(records& r, void (*Swap)(BOOK*,BOOK*), int (*Compare)(BOOK*, BOOK*));
void SwapBook(BOOK* b1, BOOK* b2);
int CmpOrigin(BOOK* b1, BOOK* b2);
int CmpPresence(BOOK* b1, BOOK* b2);
int CmpAuthor(BOOK* b1, BOOK* b2);
int CmpTitle(BOOK* b1, BOOK* b2);




заранее благодарен.
SnooP↑
все проблемы решил сам тему можете удалять
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.