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

Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
snoop11
0 / 0 / 0
Регистрация: 05.12.2010
Сообщений: 26
02.01.2011, 18:16     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #1
Здравствуйте. Помогите пожалуйста решить задачу по структурам. на С++. Вот текст задачи:

Определить структурированный тип, набор функций (в виде меню) для работы с массивом
структур. В структурированной переменной предусмотреть способ отметки ее как не
содержащей данных (т.е. «пустой»). Функции должны работать с массивом структур или с
отдельной структурой через указатели, а также при необходимости возвращать указатель на
структуру. В перечень обязательных функций входят:
- «очистка» структурированных переменных;
- поиск свободной структурированной переменной;
- ввод элементов (полей) структуры с клавиатуры;
- вывод элементов (полей) структуры с клавиатуры;
- поиск в массиве структуры и минимальным значением заданного поля;
дополнительные функции
- сортировка массива структур в порядке возрастания заданного поля (при сортировке
разрешается присваивание структурированных переменных);
- удаление заданного элемента;
- изменение (редактирование) заданного элемента.
Интерфейс пользователя осуществить в виде командного процессора:

Личная библиотека. Картотека домашней библиотеки: выходные данные книги (авторы,
название, издательство и так далее), раздел библиотеки (специальная литература, хобби,
домашнее хозяйство, беллетристика и так далее), происхождение (покупка, кража, подарок) и
наличие книги в данный момент. Выбор книг по автору, году; инвентаризация библиотеки
(вывод всего списка книг по категориям).
Происхождение реализовать с помощью перечисления.

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




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

#include "stdafx.h"
# include <iostream>				
# include <stdio.h>				
# include <cstring>
# include <windows.h>
#include  <locale> 
# define nam 30						//Название пункта
# define zap 30						//Кол-во структур
# define izd 30	
# define nazv 30	
# define razd 30	
# define prois 30	
# define nal 30	

int er;								//Переключатель

using namespace std;

struct katalog
{char avtor[nam];					
char nazvanie[nazv];				
char izdatelstvo[izd];				
};
struct razdel
{int razde[razd];};
struct proishozhdenie
{
int proishozhdeni[prois];
};
struct nalichie
{
int nalichi[nal];
};

int sch=0;							//Счетчик полных записей


void enter_new()					// ф-ция ввода новой структуры
{ char avtor,nazvanie,izdatelstvo;
int razdel,proishozhdenie;nalichie;
	if(sch<zap)
	{
		cout<<"Запись номер ";cout<<sch++;

		cout<< endl<<"Выходные данные книги"<<endl;

		cout<< endl<<"Автор"<<endl;
		cin >> avtor[sch].name;

		cout<< endl<<"Название"<<endl;
		cin >> nazvanie[sch].nazvanie;

		cout<< endl<<"Издательство"<<endl;
		cin >> izdatelstvo[sch].izdatelstvo;

		cout<<"Раздел библиотеки "<<endl;
	cout <<endl<<"1. специальная литература"<<endl;
		cout <<endl<<"2. хобби"<<endl;
		cout <<endl<<"3. домашнее хозяйство"<<endl;
		cout <<endl<<"4. беллетристика"<<endl;
		cin >>razdel[sch];

		cout<<"Происхождение "<<endl;
		cout <<endl<<"1. Покупка"<<endl;
		cout <<endl<<"2. Кража"<<endl;
		cout <<endl<<"3. Подарок"<<endl;
		cin>>proishozhdenie[sch];

		cout<<"Наличие в данный момент "<<endl;
		cout <<endl<<"1. Есть в наличии"<<endl;
		cout <<endl<<"2. Нет в наличии"<<endl;
		cin>>nalichie;
		
	}
	else cout<<"Запись не имеет смысла :(";
	
	cout<<"Что делать дальше?"<<endl;
	cin>>er;
}

	
void del()								//ф-ция удаления записи
{	int d;								//номер записи, которую нужно удалить
	cout<<"\nВведите номер записи, которую необходимо удалить"<<endl;
	cout<<"Если необходимо удалить все записи,нажмите '0'"<<endl;
	cin>>d;
	if (d!=0)
		{for (int de_1=(d-1);de_1<sch;de_1++)
			avtor[de_1]=avtor[de_1+1];
			sch=sch-1;
		}
	if (d==0)
		for(int i=0;i<zap;i++)
		katalog[i]=bad;
cout<<"Что делать дальше?"<<endl;
cin>>er;
}

void change()
	{int c;								//номер записи, которую нужно изменить
	 char per;
	cout<<"\nВведите номер записи"<<endl;
	cin>> c;
	do
		{
		cout<<"Введите: "<<endl;
		cout<<"1-для изменения Автора"<<endl;
		cout<<"2-для изменения Названия"<<endl;
		cout<<"3-для изменения Издательства"<<endl;
		cout<<"4-для изменения Раздела библиотеки\n";
		cout<<"5-для изменения Происхождения\n";
		cout<<"6-для изменения Наличия в данный момент\n";
		cout<<"7-для прекращения\n";
				cin>>per;
		switch (per)
			{
			case 1: cout<<"Введите новое имя ";
				cin>>avtor[c-1].name;break;
			case 2: cout<<"Введите новое название ";
				cin>>nazvanie[c-1].nazvanie;break;
			case 3: cout<<"Введите новое издательство  ";
				cin>>izdatelstvo[c-1].izdatelstvo;break;
			case 4: cout<<"Введите новый раздел библиотеки ";
				cin>>razdel[c-1].razdel;break;
			case 5: cout<<"Введите новую информацию о происхождении ";
				cin>>proishozhdenie[c-1].prois;break;
			case 6: cout<<"Введите новую информацию о наличии  ";
				cin>>nalichie[c-1].nal;break;
				cin>>per;
			}

		}while(per!=7);

	cout<<"Что делать дальше?"<<endl;
	cin>>er;
}

void out()				//ф-ция вывода записей
{
	int sw;					// переключатель
	int o;					//номер структ, кот. надо вывести
	cout<<endl<<"Введите: "<<endl;
	cout<<"1-если хотите вывести какую-либо запсь"<<endl;
	cout<<"2-если хотите вывести все записи"<<endl;
	cin>>sw;
	if(sw==1)
		{
		cout<<"Введите номер записи, которую нужно вывести"<<endl;
		cin>>o;
		cout<<endl;
		cout<<"имя автора ";cout<<avtor[o-1].name<<endl;
		cout<<"дату поступления";cout<<mas_student[o-1].date<<endl;
		cout<<"дату отчисления";cout<<mas_student[o-1].dat<<endl;
		}
	if(sw==2)
		{	for(int i=0;i<sw;i++)
			{
				cout<<"имя";cout<<mas_student[i].name<<endl;
			    cout<<"название ";cout>>nazvanie[i].nazvanie;
			    cout<<"издательство  ";cout>>izdatelstvo[i].izdatelstvo;
			    cout<<"раздел библиотеки ";cout>>razdel[i].razdel;
			    cout<<"происхождение ";cout>>proishozhdenie[i].prois;
			    cout<<"наличие  ";cout>>nalichie[i].nal;
			}
		}
	cout<<"Что делать дальше?"<<endl;
	cin>>er;
}



{int _tmain(int argc, _TCHAR* argv[])
{ 
		setlocale(LC_CTYPE, "Russian");

	cout<<"Записей пока нет"<<endl;
	cout<<"Введите:"<<endl;
	cout<<"1-для удаления записи"<<endl;
	cout<<"2-для ввода новой записи"<<endl;
	cout<<"3-для изменения записи"<<endl;
	cout<<"4-для вывода записи(ей)"<<endl;
	cout<<"5-для выхода"<<endl;
	cin>>er;

do
	{switch(er)
		{
		case 1:del();break;
		case 2:enter_new();break;
		case 3:change();break;
		case 4:out();break;

		}

	}
		while(er!=5);

}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2011, 18:16     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур
Посмотрите здесь:

C++ Написать библиотеку функций для работы с одномерным целочисленным массивом
структура для работы с массивом C++
C++ Создать структуру для работы с массивом
C++ Программа для любой работы с массивом!
Разработать программу со строковым меню для работы с двумерным массивом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
03.01.2011, 13:01     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #2
Цитата Сообщение от snoop11 Посмотреть сообщение
Личная библиотека. Картотека домашней библиотеки
делал что-то подобное:
main.cpp
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
#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);
}


book.h
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
#pragma once
#define SIZE 32
 
struct BOOK
{
    char author[SIZE];
    char title[SIZE];
    char category[SIZE];
    float price;
    int year;
    
};
 
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 CmpYear(BOOK* b1, BOOK* b2);
int CmpPrice(BOOK* b1, BOOK* b2);
int CmpAuthor(BOOK* b1, BOOK* b2);
int CmpTitle(BOOK* b1, BOOK* b2);


book.cpp
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
#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->price,book->year);
}
 
void InitBook(BOOK* book)
{
    const char* category[]={"Классика","Фантастика","Детская","Нет"};
    printf("Введите автора: ");
    scanf("%31s", book->author);
    fflush(stdin);
    printf("Введите название: ");
    scanf("%31s", book->title);
    fflush(stdin);
    printf("Введите категорию: Классика(1),Фантастика(2),Детская(3),Нет(4)\n");
    int n;
    scanf("%d",&n);
    if(n>0&&n<5)
        strcpy(book->category,category[n-1]);
    else
    {
        printf("Вы ввели неверное значение. Категория не выбрана\n");
        strcpy(book->category,category[3]);
    }
    fflush(stdin);
    printf("Введите цену: ");
    float price;
    scanf("%G", &price);
    if(price<0)
    {
        printf("Цена не может быть отрицательной. Установлена в нуль\n");
        price=0;
    }
    book->price=price;
    fflush(stdin);
    int year=0;
    while(year<1500||year>2011)
    {
        printf("Введите год издания: ");
        scanf("%d", &year);
        if (year<1500||year>2011)
        {
            printf("Год издания должен быть в пределах от 1500 до 2011 гг. н.э.\nПожалуйста, повторите ввод.\n");
            fflush(stdin);
        }
    }
    book->year=year;
    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].price
                    ,tmp.pBook[i].year);
            }
        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->price,book->year
                    );
            }
            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,CmpPrice);break;
        case 4:
            Sort(r,SwapBook,CmpYear);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 CmpYear(BOOK* b1, BOOK* b2)
{
    int nResult;
    int tmp1=b1->year;
    int tmp2=b2->year;
    (tmp1-tmp2<0)?nResult=-1:(tmp1-tmp2>0)?nResult=1:nResult=0;
    return nResult;
}
 
int CmpPrice(BOOK* b1, BOOK* b2)
{
    int nResult;
    float tmp1=b1->price;
    float tmp2=b2->price;
    (tmp1-tmp2<0)?nResult=-1:(tmp1-tmp2>0)?nResult=1:nResult=0;
    return nResult;
}
 
int CmpAuthor(BOOK* b1, BOOK* b2)
{
    return strcmp(b1->author,b2->author);
}
 
int CmpTitle(BOOK* b1, BOOK* b2)
{
    return strcmp(b1->title,b2->title);
}


Добавлено через 15 часов 55 минут
Цитата Сообщение от st_dent Посмотреть сообщение
делал что-то подобное:
main.cpp
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
#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);
}


book.h
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
#pragma once
#define SIZE 32
 
struct BOOK
{
    char author[SIZE];
    char title[SIZE];
    char category[SIZE];
    float price;
    int year;
    
};
 
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 CmpYear(BOOK* b1, BOOK* b2);
int CmpPrice(BOOK* b1, BOOK* b2);
int CmpAuthor(BOOK* b1, BOOK* b2);
int CmpTitle(BOOK* b1, BOOK* b2);


book.cpp
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
#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->price,book->year);
}
 
void InitBook(BOOK* book)
{
    const char* category[]={"Классика","Фантастика","Детская","Нет"};
    printf("Введите автора: ");
    scanf("%31s", book->author);
    fflush(stdin);
    printf("Введите название: ");
    scanf("%31s", book->title);
    fflush(stdin);
    printf("Введите категорию: Классика(1),Фантастика(2),Детская(3),Нет(4)\n");
    int n;
    scanf("%d",&n);
    if(n>0&&n<5)
        strcpy(book->category,category[n-1]);
    else
    {
        printf("Вы ввели неверное значение. Категория не выбрана\n");
        strcpy(book->category,category[3]);
    }
    fflush(stdin);
    printf("Введите цену: ");
    float price;
    scanf("%G", &price);
    if(price<0)
    {
        printf("Цена не может быть отрицательной. Установлена в нуль\n");
        price=0;
    }
    book->price=price;
    fflush(stdin);
    int year=0;
    while(year<1500||year>2011)
    {
        printf("Введите год издания: ");
        scanf("%d", &year);
        if (year<1500||year>2011)
        {
            printf("Год издания должен быть в пределах от 1500 до 2011 гг. н.э.\nПожалуйста, повторите ввод.\n");
            fflush(stdin);
        }
    }
    book->year=year;
    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].price
                    ,tmp.pBook[i].year);
            }
        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->price,book->year
                    );
            }
            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,CmpPrice);break;
        case 4:
            Sort(r,SwapBook,CmpYear);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 CmpYear(BOOK* b1, BOOK* b2)
{
    int nResult;
    int tmp1=b1->year;
    int tmp2=b2->year;
    (tmp1-tmp2<0)?nResult=-1:(tmp1-tmp2>0)?nResult=1:nResult=0;
    return nResult;
}
 
int CmpPrice(BOOK* b1, BOOK* b2)
{
    int nResult;
    float tmp1=b1->price;
    float tmp2=b2->price;
    (tmp1-tmp2<0)?nResult=-1:(tmp1-tmp2>0)?nResult=1:nResult=0;
    return nResult;
}
 
int CmpAuthor(BOOK* b1, BOOK* b2)
{
    return strcmp(b1->author,b2->author);
}
 
int CmpTitle(BOOK* b1, BOOK* b2)
{
    return strcmp(b1->title,b2->title);
}
Кстати, в этом примере не удается считать данные из файла. Может кто подскажет в чем проблема?
Минич
 Аватар для Минич
66 / 66 / 3
Регистрация: 26.11.2010
Сообщений: 123
03.01.2011, 14:03     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #3
Цитата Сообщение от st_dent Посмотреть сообщение
Кстати, в этом примере не удается считать данные из файла. Может кто подскажет в чем проблема?
В файле book.cpp
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
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].price
                                        , &tmp.pBook[i].year);
                        }
                delete[] r.pBook;
                r=tmp;
                if(size)flag=1;
        }
        else
                cout<<"Невозможно открыть файл."<<endl;
        fclose(f);
}
в строках 12 - 16 аргументы нужно передавать по ссылке
Теперь работает
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
03.01.2011, 15:00     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #4
И еще два вопроса:
1. При добавлении книги в полях автор, название считывает только по одному слову.
Например, пишешь chehov a.p. Добавляет только chehov.
2.Не распознает русские символы. Вместо Чехов выводит абракадабру.

Натолкните на мысль как исправить...
Минич
 Аватар для Минич
66 / 66 / 3
Регистрация: 26.11.2010
Сообщений: 123
03.01.2011, 15:13     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #5
Цитата Сообщение от st_dent Посмотреть сообщение
1. При добавлении книги в полях автор, название считывает только по одному слову.
Например, пишешь chehov a.p. Добавляет только chehov.
стоит попробовать getline()

Добавлено через 2 минуты
Цитата Сообщение от st_dent Посмотреть сообщение
2.Не распознает русские символы. Вместо Чехов выводит абракадабру.
что то с кодировкой
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
03.01.2011, 15:25     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #6
Цитата Сообщение от Минич Посмотреть сообщение
стоит попробовать getline()
К сожалению, нужно использовать scanf
Минич
 Аватар для Минич
66 / 66 / 3
Регистрация: 26.11.2010
Сообщений: 123
03.01.2011, 15:31     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #7
Цитата Сообщение от st_dent Посмотреть сообщение
К сожалению, нужно использовать scanf
интересно почему?!
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
03.01.2011, 15:38     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #8
Минич, задание такое
snoop11
0 / 0 / 0
Регистрация: 05.12.2010
Сообщений: 26
07.01.2011, 23:39  [ТС]     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #9
Цитата Сообщение от st_dent Посмотреть сообщение
делал что-то подобное:
main.cpp
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
#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);
}


book.h
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
#pragma once
#define SIZE 32
 
struct BOOK
{
    char author[SIZE];
    char title[SIZE];
    char category[SIZE];
    float price;
    int year;
    
};
 
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 CmpYear(BOOK* b1, BOOK* b2);
int CmpPrice(BOOK* b1, BOOK* b2);
int CmpAuthor(BOOK* b1, BOOK* b2);
int CmpTitle(BOOK* b1, BOOK* b2);


book.cpp
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
#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->price,book->year);
}
 
void InitBook(BOOK* book)
{
    const char* category[]={"Классика","Фантастика","Детская","Нет"};
    printf("Введите автора: ");
    scanf("%31s", book->author);
    fflush(stdin);
    printf("Введите название: ");
    scanf("%31s", book->title);
    fflush(stdin);
    printf("Введите категорию: Классика(1),Фантастика(2),Детская(3),Нет(4)\n");
    int n;
    scanf("%d",&n);
    if(n>0&&n<5)
        strcpy(book->category,category[n-1]);
    else
    {
        printf("Вы ввели неверное значение. Категория не выбрана\n");
        strcpy(book->category,category[3]);
    }
    fflush(stdin);
    printf("Введите цену: ");
    float price;
    scanf("%G", &price);
    if(price<0)
    {
        printf("Цена не может быть отрицательной. Установлена в нуль\n");
        price=0;
    }
    book->price=price;
    fflush(stdin);
    int year=0;
    while(year<1500||year>2011)
    {
        printf("Введите год издания: ");
        scanf("%d", &year);
        if (year<1500||year>2011)
        {
            printf("Год издания должен быть в пределах от 1500 до 2011 гг. н.э.\nПожалуйста, повторите ввод.\n");
            fflush(stdin);
        }
    }
    book->year=year;
    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].price
                    ,tmp.pBook[i].year);
            }
        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->price,book->year
                    );
            }
            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,CmpPrice);break;
        case 4:
            Sort(r,SwapBook,CmpYear);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 CmpYear(BOOK* b1, BOOK* b2)
{
    int nResult;
    int tmp1=b1->year;
    int tmp2=b2->year;
    (tmp1-tmp2<0)?nResult=-1:(tmp1-tmp2>0)?nResult=1:nResult=0;
    return nResult;
}
 
int CmpPrice(BOOK* b1, BOOK* b2)
{
    int nResult;
    float tmp1=b1->price;
    float tmp2=b2->price;
    (tmp1-tmp2<0)?nResult=-1:(tmp1-tmp2>0)?nResult=1:nResult=0;
    return nResult;
}
 
int CmpAuthor(BOOK* b1, BOOK* b2)
{
    return strcmp(b1->author,b2->author);
}
 
int CmpTitle(BOOK* b1, BOOK* b2)
{
    return strcmp(b1->title,b2->title);
}


Добавлено через 15 часов 55 минут


Кстати, в этом примере не удается считать данные из файла. Может кто подскажет в чем проблема?
Огромное вам спасибо. Вы мне очень помогли. Подскажите пожалуйста, немного переделал под себя но неадекватн окак-то работает. Не подскажете в чём дело? вот код:

book.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)
{
        const char* category[]={"специальная литература","хобби","домашнее хозяйство","беллетристика"};
        printf("Введите автора: ");
        scanf("%31s", book->author);
        fflush(stdin);
        printf("Введите название: ");
        scanf("%31s", book->title);
        fflush(stdin);
        printf("Введите категорию: \nспециальная литература(1),\nхобби(2),\nдомашнее хозяйство(3),\nбеллетристика(4)\n");
        int n;
        scanf("%d",&n);
        if(n>0&&n<5)
                strcpy(book->category,category[n-1]);
        else
        {
                printf("Вы ввели неверное значение. Категория не выбрана\n");
                strcpy(book->category,category[3]);
        }
        fflush(stdin);
        printf("Введите происхождение: ");
		printf("Происхождение: \nпокупка(1),\nкража(2),\nподарок(3)\n");
		float origin;
        scanf("%G", &origin);
        book->origin=origin;
        fflush(stdin);



        printf("Наличие книги: ");
		printf("Наличие: Есть в данный момент(1),Нет в данный момент(2)\n");
		float presence;
        scanf("%d", &presence);

        if(presence<0&&presence>2)
        {
                printf("Вы сделали неправильный выбор. Продолжение не возможно!\n");
                
        }
        book->presence=presence;
        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)
{
        int nResult;
        float tmp1=b1->presence;
        float tmp2=b2->presence;
        (tmp1-tmp2<0)?nResult=-1:(tmp1-tmp2>0)?nResult=1:nResult=0;
        return nResult;
 }


int CmpOrigin(BOOK* b1, BOOK* b2)
{
        int nResult;
        float tmp1=b1->origin;
        float tmp2=b2->origin;
        (tmp1-tmp2<0)?nResult=-1:(tmp1-tmp2>0)?nResult=1:nResult=0;
        return nResult;


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


book.h
Код
#pragma once
#define SIZE 32
 
struct BOOK
{
        char author[SIZE];
        char title[SIZE];
        char category[SIZE];
		float presence;
        float origin;
        
};
 
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);

main.cpp
Код
#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
// , а не в данном файле


Заранее спасибо большое за помощь.
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
09.01.2011, 01:45     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #10
Цитата Сообщение от snoop11 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
struct BOOK
{
  char author[SIZE];
  char title[SIZE];
  char category[SIZE];
  float presence;
  float origin;
};
Насколько я понял, вы в переменных presence и origin текст хотите хранить.Тогда float вам не подойдет.
Вот так попробуйте:
C++
1
2
3
4
5
6
7
8
struct BOOK
{
 char author[SIZE];
 char title[SIZE];
 char category[SIZE];
 char presence[SIZE];
 char origin[SIZE];
};
snoop11
0 / 0 / 0
Регистрация: 05.12.2010
Сообщений: 26
09.01.2011, 15:15  [ТС]     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #11
это я замечал, исправлял, но программа не запускается. там проблема с инициализацией. "невозможно из char сделать char что-то в этом роде. Не поможете?
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
09.01.2011, 17:40     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #12
snoop11,
сейчас запустил с вашими исправлениями - у меня всё работает.
Единственное заголовки почистил:
main.cpp
C++
1
#include "BOOK.h"

book.cpp
C++
1
#include "BOOK.h"

book.h
C++
1
2
3
4
#pragma once
#include <cstdio>
#include <iostream>
#include <windows.h>
snoop11
0 / 0 / 0
Регистрация: 05.12.2010
Сообщений: 26
09.01.2011, 17:56  [ТС]     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #13
почистил по вашему примеру. error C2440: инициализация: невозможно преобразовать 'char [32]' в 'char' Не существует контекста, в котором такое преобразование возможно. Стоит C++ Экспресс выпуск 2008
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
09.01.2011, 22:47     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #14
snoop11, выкладывайте код ещё раз весь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2011, 19:30     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
snoop11
0 / 0 / 0
Регистрация: 05.12.2010
Сообщений: 26
10.01.2011, 19:30  [ТС]     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур #15
book.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)
{
        const char* category[]={"специальная литература","хобби","домашнее хозяйство","беллетристика"};
        printf("Введите автора: ");
        scanf("%31s", book->author);
        fflush(stdin);
        printf("Введите название: ");
        scanf("%31s", book->title);
        fflush(stdin);
        printf("Введите категорию: \nспециальная литература(1),\nхобби(2),\nдомашнее хозяйство(3),\nбеллетристика(4)\n");
        int n;
        scanf("%d",&n);
        if(n>0&&n<5)
                strcpy(book->category,category[n-1]);
        else
        {
                printf("Вы ввели неверное значение. Категория не выбрана\n");
                strcpy(book->category,category[3]);
        }
        fflush(stdin);
        printf("Введите происхождение: ");
		printf("Происхождение: \nпокупка(1),\nкража(2),\nподарок(3)\n");
		float origin;
        scanf("%G", &origin);
        book->origin=origin;
        fflush(stdin);



        printf("Наличие книги: ");
		printf("Наличие: Есть в данный момент(1),Нет в данный момент(2)\n");
		float presence;
        scanf("%d", &presence);

        if(presence<0&&presence>2)
        {
                printf("Вы сделали неправильный выбор. Продолжение не возможно!\n");
                
        }
        book->presence=presence;
        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)
{
        int nResult;
        float tmp1=b1->presence;
        float tmp2=b2->presence;
        (tmp1-tmp2<0)?nResult=-1:(tmp1-tmp2>0)?nResult=1:nResult=0;
        return nResult;
 }


int CmpOrigin(BOOK* b1, BOOK* b2)
{
        int nResult;
        float tmp1=b1->origin;
        float tmp2=b2->origin;
        (tmp1-tmp2<0)?nResult=-1:(tmp1-tmp2>0)?nResult=1:nResult=0;
        return nResult;


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


book.h
Код
#pragma once
#define SIZE 32
 
struct BOOK
{
        char author[SIZE];
        char title[SIZE];
        char category[SIZE];
		float presence;
        float origin;
        
};
 
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);

main.cpp
Код
#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
// , а не в данном файле

это последний который работал у меня но выдавал 11 предупреждений.
Yandex
Объявления
10.01.2011, 19:30     Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур
Ответ Создать тему
Опции темы

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