Текст программы с комментариями
#include "stdafx.h" #include "stdio.h" #include "conio.h" #include "iostream" using namespace std;
int sz=0; const int N=20;
struct delo { char nomer[N]; char marka[N]; char probeg[N]; }; void vivod(delo *d) // вывод на экран { cout << "\n\n"<< "н/п.п." << "\t"<< "Номер" << "\t" << "Марка" << "\t" << "Пробег (км)" << "\n"; for(int i=0;i<sz;i++,d++) cout << i+1 << "\t" << d->nomer << "\t" << d->marka << "\t" << d->probeg << "\n"; } delo *sort3(delo *d) // пробег { delo *g, *t; // g - вспомогательный указатель delo *l = new delo[1]; // l - будет массив отсортированных структур t=g=d; int i, b1, b; for (b=sz-1; b!=0; b=b1) // b граница отсортированной части, Пока граница не сместится к правому краю { b1=0; // b1 место последней перестановки for (i=0; i<b; i++) // Просмотр массива { char x,y; t=&(d[i]); g=&(d[i+1]); x=t->probeg[0]; y=g->probeg[0]; for(int j=1; x==y && j<N; j++) { x=t->probeg[j]; y=g->probeg[j]; } if (x>y) { *l=*t; *t=*g; *g=*l; // Перестановка с запоминанием места b1=i; } } } delete []l; return d; } delo *sort2(delo *d) // марка { delo *g, *t; // g - вспомогательный указатель delo *l = new delo[1]; // l - будет массив отсортированных структур t=g=d; int i, b1, b; for (b=sz-1; b!=0; b=b1) // b граница отсортированной части, Пока граница не сместится к правому краю { b1=0; // b1 место последней перестановки for (i=0; i<b; i++) // Просмотр массива { char x,y; t=&(d[i]); g=&(d[i+1]); x=t->marka[0]; y=g->marka[0]; for(int j=1; x==y && j<N; j++) { x=t->marka[j]; y=g->marka[j]; } if (x>y) { *l=*t; *t=*g; *g=*l; // Перестановка с запоминанием места b1=i; } } } delete []l; return d; } delo *sort1(delo *d) // номер { delo *g, *t; // g - вспомогательный указатель delo *l = new delo[1]; // l - будет массив отсортированных структур t=g=d; int i, b1, b; for (b=sz-1; b!=0; b=b1) // b граница отсортированной части, Пока граница не сместится к правому краю { b1=0; // b1 место последней перестановки for (i=0; i<b; i++) // Просмотр массива { char x,y; t=&(d[i]); g=&(d[i+1]); x=t->nomer[0]; y=g->nomer[0]; for(int j=1; x==y && j<N; j++) { x=t->nomer[j]; y=g->nomer[j]; } if (x>y) { *l=*t; *t=*g; *g=*l; // Перестановка с запоминанием места b1=i; } } } delete []l; return d; } delo *add(delo *d) // Добавление новой записи { cout << "\n*Вами выбрана функция \"добавление записи\"*\n"; sz++; delo *p; delo *g = new delo[sz]; p=g; if(sz>0) for(int i=0; i<sz; i++) g[i]=d[i]; delete []d; g=&g[sz-1]; cout << "\nВведите номер автомобиля: "; cin >> g->nomer; cout << "\nВведите марку автомобиля: "; cin >> g->marka; cout << "\nВведите пробег автомобиля в киллометрах: "; cin >> g->probeg; return p; } delo *voprsort(delo *d) // Однонаправленная Шейкер-сортировка { cout << "\n*Вами выбрана функция \"сортировать\"*\n"; char vopr; if (sz>1) { vivod(d); cout << "Выбирете поле, по которому хотите отсортировать:\n1.Номер\n2.Марка\n3.Пробег (км)\n"; vopr=_getch(); switch (vopr) { case '1': d=sort1(d); break; case '2': d=sort2(d); break; case '3': d=sort3(d); break; } } else cout << "\nНечего сортировать\n"; vivod(d); return d; } delo *delet(delo *d) // удаление записи { cout << "\n*Вами выбрана функция \"удаление записи\"*\n"; delo *p; delo *g = new delo[sz]; p=g; int num; vivod(d); cout << "\nВведите номер записи, которую хотите удалить:\n"; cin >> num; for (int i=num-1; i<sz; i++) d[i]=d[i+1]; sz--; if(sz>0) for(int i=0; i<sz; i++) g[i]=d[i]; delete []d; d=g; return d; } delo *change(delo *d) // изменение записи { cout << "\n*Вами выбрана функция \"изменение записи\"*\n"; int num; char vopr; delo *g; g=d; vivod(d); cout << "\nВведите номер записи:"; cin >> num; if((num-1<sz) && (num-1)>0) { cout << "\nВыберите поле, которое хотите изменить:\n1.Номер\n2.Марка\n3.Пробег (км)\n"; vopr=_getch(); d=&d[num-1]; switch (vopr) { case '1': cout << "\nНомер:"; cin >> d->nomer; break; case '2': cout << "\nМарка:"; cin >> d->marka; break; case '3': cout << "\nПробег (км):"; cin >> d->probeg; break; } d=g; } else cout << "*Выбрана несуществующая запись*\n"; return d; } void poisk(delo *d) // линейный поиск по 3м полям одноврменно (пробег у нас строка) { cout << "\n*Вами выбрана функция \"поиск записи\"*\n"; char vopr[N]; int n=0; if (sz>1) { cout << "Введите, что мы ищем:"; cin >> vopr; cout << "\n\n"<< "н/п.п." << "\t"<< "Номер" << "\t" << "Марка" << "\t" << "Пробег (км)" << "\n"; for(int i=0; i<sz; i++) { if((strcmp(d[i].nomer, vopr)==0)||(strcmp(d[i].marka, vopr)==0)||(strcmp(d[i].probeg, vopr)==0)) { n+=1; cout << n << "\t" << d->nomer << "\t" << d->marka << "\t" << d->probeg << "\n"; } } } else cout << "\n*Негде искать*\n"; } void save(delo *d, char f[]) // сохранение { cout << "\n*Вами выбрана функция \"сохранить в файл\"*\n"; FILE *fd=fopen(f, "w"); fprintf(fd,"%d\n",sz); for(int i=0; i<sz; i++, d++) fprintf(fd,"%s %s %s\n", d->nomer, d->marka, d->probeg); fclose(fd); cout << "*файл сохранен*\n"; } delo *loada(delo *d, char f[]) // загрузка с добавлением { char k[N]; int nn=0; FILE *fd=fopen(f, "r"); fscanf(fd, "%s", &k); for(int i=strlen(k)-1; i>=0; i--) nn=nn*10+k[i]-'0'; delo *p = new delo[sz+nn]; for(int i=0; i<sz; i++) p[i]=d[i]; for(int i=sz;i<(sz+nn);i++) { fscanf(fd, "%s %s %s", &(p[i].nomer), &(p[i].marka), &(p[i].probeg)); } sz+=nn; fclose(fd); delete []d; d=p; cout << "*Файл загружен*\n"; vivod(d); return d; } delo *loadz(delo *d, char f[]) // загрузка с заменой { sz=0; char k[N]; FILE *fd=fopen(f, "r"); fscanf(fd, "%s", &k); for(int i=strlen(k)-1; i>=0; i--) sz=sz*10+k[i]-'0'; delo *p = new delo[sz]; for(int i=0;i<sz;i++) { fscanf(fd, "%s %s %s", &(p[i].nomer), &(p[i].marka), &(p[i].probeg)); } fclose(fd); delete []d; d=p; cout << "*Файл загружен*\n"; vivod(d); return d; } delo *voprload(delo *d, char f[]) // выбор загрузки из файла { cout << "\n*Вами выбрана функция \"загрузка из файла\"*\n"; char v; cout << "Какую загрузку вы хотите?\n1. Загружаем с заменой существующего.\n2. Загружаем с добавлением к существующему.\n"; v=_getch(); switch(v) { case '1': d=loadz(d,f); break; case '2': d=loada(d,f); break; default: cout << "\nОшибка!\n"; break; } return d; }
int* main() { setlocale(LC_ALL, "Russian"); char vr=-1; delo *p = new delo[sz], *q,*d; // перераспределение памяти надо сделать не забыть =) q=d=p; for(;;) { cout << "\n_________________________________________________________\n1. Добавить запись\n2. Удалить запись\n3. Сортировать\n4. Поиск\n5. Вывод таблицы на экран\n6. Сохранить в файл\n7. Открыть из файла "\ "\n8. Изменение записи\n9. Очистить экран\n0. Выход\n_________________________________________________________\n"; vr=_getch(); switch(vr) { case '1': d=add(d); break; case '2': d=delet(d); break; // надо дописать delet case '3': d=voprsort(d); break; case '4': poisk(d); break; case '5': vivod(d); break; case '6': save(d, "chubaka.txt"); break; // работает case '7': d=voprload(d, "chubaka.txt"); break; // почти работает case '8': d=change(d); break; case '9': system("cls"); break; case '0': exit(0); break; default: cout << "\nАААШИПКО!11!!!!!!11!!!!!!!!\n"; continue; break; } } delete []p; }
|