![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
SnooP↑ |
![]()
Сообщение
#1
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 67 Регистрация: 29.9.2010 Город: Мосты Учебное заведение: БГТУ (г. Минск) Вы: студент ![]() |
Здравствуйте. Гляньте пожалуйста, что с программой, если не трудно. Не правильно отображает наличие и происхождение. проблема с коддировкой (не понимает русского) но это не проблема. Ещё в названии не отображается больше одного автора (это то что я заметил но закончились все варианты того как это исправить. от код:
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↑ |
![]()
Сообщение
#2
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 67 Регистрация: 29.9.2010 Город: Мосты Учебное заведение: БГТУ (г. Минск) Вы: студент ![]() |
все проблемы решил сам тему можете удалять
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 28.5.2025, 12:14 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru