#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include struct TElem { char* fam; char* name; char* otch; int god; char* dolgh; int stag; char* obr; }; struct TMass { TElem *date; int len;//длинна полная int beg,end;//начало и конец массива с символами }; int Sechas=NULL;//Указатель на элемент void InitialList (TMass *rab,int n) { int i; rab->date=new TElem[n]; rab->len=n; rab->beg=-1; rab->end=-1; for (i = 0; i < n; i++) { rab->date[i].dolgh=NULL; rab->date[i].fam=NULL; rab->date[i].god=NULL; rab->date[i].name=NULL; rab->date[i].obr=NULL; rab->date[i].otch=NULL; rab->date[i].stag=NULL; } } int ProvPust(TMass *rab) { if (rab->beg>rab->end) {return 0;}; return 1; } void FreeList(TMass *rab) { int i=rab->beg; if (ProvPust(rab)==0) {printf("Сначало Создайте список!\n");return;}; if (rab->beg==rab->end) { free(rab->date[i].fam); free(rab->date[i].name); free(rab->date[i].otch); free(rab->date[i].dolgh); free(rab->date[i].obr); }; for (i=rab->beg;iend;i++) { free(rab->date[i].fam); free(rab->date[i].name); free(rab->date[i].otch); free(rab->date[i].dolgh); free(rab->date[i].obr); } delete[] rab->date; rab->beg=-1; rab->end=-2; printf("Память очищена\n"); return; } void AddElem(TMass *rab,int Poz) { char s1[20];//фамилия char s2[20];//имя char s3[20];//отчество char s4[5];//год рождения int s4i; char s5[20];//должность char s6[5]; int s6i;//стаж char s7[20];//образование bool flag=FALSE; printf("Введите фамилию:"); scanf("%s",s1); printf("\nВведите имя:"); scanf("%s",s2); printf("\nВведите Отчество:"); scanf("%s",s3); do { printf("\nВведите год рождения:"); scanf("%s",s4); s4i=atoi(s4); if (s4i==0) {printf("Год рождения должен быть цыфрой!\n"); _getch();} } while(s4i==0); printf("\nВведите должность:"); scanf("%s",s5); do { printf("\nВведите стаж:"); scanf("%s",s6); if (s6[0]=='0') {s6i=0;flag=TRUE;} else { s6i=atoi(s6); if (s6i==0) {printf("Стаж должен быть цыфрой!\n"); printf("Нажмите любую клавишу\n"); _getch();} else {flag=TRUE;}; }; } while (flag==FALSE); printf("\nВведите образование:"); scanf("%s",s7); printf("\n"); rab->date[Poz].fam=(char *) malloc (sizeof(s1)); strcpy(rab->date[Poz].fam,s1); rab->date[Poz].name=(char *) malloc (sizeof(s2)); strcpy(rab->date[Poz].name,s2); rab->date[Poz].otch=(char *) malloc (sizeof(s3)); strcpy(rab->date[Poz].otch,s3); *rab->date[Poz].otch=*s3; rab->date[Poz].god=s4i; rab->date[Poz].dolgh=(char *) malloc (sizeof(s5)); strcpy(rab->date[Poz].dolgh,s5); rab->date[Poz].stag=s6i; rab->date[Poz].obr=(char *) malloc (sizeof(s7)); strcpy(rab->date[Poz].obr,s7); } void AddVPoz(TMass *rab,int Poz,int prov) { int i; if (prov==1) {Poz=Poz-1;rab->beg=rab->beg-1;} else { if (prov==2) {Poz=Poz+1;rab->end=rab->end+1;} else { for (i=rab->end+1;i>Poz;i--) { rab->date[i]=rab->date[i-1]; } rab->end=rab->end+1; printf("Provet \n"); };}; AddElem(rab,Poz); Sechas++; return; } void CreateList (TMass *rab) { if (ProvPust(rab)==1) {printf("Сначало освободите список\n"); return;}; InitialList (rab,2000); rab->beg=9; rab->end=9; Sechas=9; char s1[2]; printf("Наберите ** если хотите создать нулевой список, или введите чтобы нибудь другое если зотите добавить элемент:"); scanf("%s",s1); if (s1[0]=='*' && s1[1]=='*') //Проверяем на конечный символ { printf("\nСоздан нулевой список\n"); printf("Нажмите любую клавишу\n"); _getch(); return; } AddElem(rab,9); printf("Создан список из 1 элемента\n"); return; } void ShowList(TMass *rab) { if (ProvPust(rab)==0) {printf("Сначало создайте список!\n");return;}; int i=rab->beg,n=(rab->end)+1; for (i;idate[i].fam,rab->date[i].name,rab->date[i].otch,rab->date[i].god,rab->date[i].dolgh,rab->date[i].stag,rab->date[i].obr); } return; } void DellElem(TMass *rab,int Poz) { printf("Удаляю %s %s %s\n",rab->date[Poz].fam,rab->date[Poz].name,rab->date[Poz].otch); if (Poz!=rab->end) { int i; if (Sechas==rab->end) {Sechas=Sechas-1;}; for (i=Poz;iend-1;i++) { rab->date[Poz]=rab->date[Poz+1]; }; }; free(rab->date[rab->end].fam); free(rab->date[rab->end].name); free(rab->date[rab->end].otch); free(rab->date[rab->end].dolgh); free(rab->date[rab->end].obr); rab->end=rab->end-1; printf("Удаленно\n"); return; } void SledUkaz(TMass *rab) { if (Sechas==NULL) {Sechas=rab->beg;} else {Sechas=Sechas+1;}; if (Sechas>rab->end) {Sechas=rab->end;}; return; } void PredUkaz(TMass *rab) { if (Sechas==NULL) {Sechas=rab->beg;} else {Sechas=Sechas-1;}; if (Sechasbeg) {Sechas=rab->beg;}; return; } void UkazNach(TMass *rab) { Sechas=rab->beg; } void UkazKon(TMass *rab) { Sechas=rab->end; } void VivodTecElem(TMass *rab) { printf("Сейча указатель указывает на такую запись:\n"); printf("%s %s %s.Год рождения %d.Должность %s.Стаж %d.Образование %s\n",rab->date[Sechas].fam,rab->date[Sechas].name,rab->date[Sechas].otch,rab->date[Sechas].god,rab->date[Sechas].dolgh,rab->date[Sechas].stag,rab->date[Sechas].obr); } int main() { SetConsoleOutputCP(1251); SetConsoleCP(1251); char ch1,ch2=' '; TMass rab; rab.beg=-1; rab.end=-2; int i; do { printf("N-Создать список; D-очистить список; S-показать список;\nU-Удалить элемент;P-передвинуть указатель;A-добавить элемент;\nV-Вывести текущий элемент\nE-конец.\nВаш выбор?"); fflush(stdin); ch1=getchar(); fflush(stdin); ch1=toupper(ch1); switch (ch1) { //----------первая часть: создание двоичного из текстового case 'N': CreateList(&rab); break; case 'D': FreeList(&rab); break; case 'S': ShowList(&rab); break; case 'V': VivodTecElem(&rab); break; case 'U': while(ch2!='E') { printf("Откуда удалять записть N-Начало K-Конец P-после текущего E-вернутся назад\nВыш выбор:"); fflush(stdin); ch2=getchar(); fflush(stdin); ch2=toupper(ch2); switch (ch2) { case'N':DellElem(&rab,rab.beg);ch2='E'; break; case'K':DellElem(&rab,rab.end);ch2='E'; break; case'P':DellElem(&rab,Sechas);ch2='E'; break; default: {printf("Нет такой команды\nPress any key\n"); _getch(); } } }; ch2=' '; break; case 'A': while(ch2!='E') { printf("Куда добавить записть N-Начало K-Конец P-после текущего E-вернутся назад\nВыш выбор:"); fflush(stdin); ch2=getchar(); fflush(stdin); ch2=toupper(ch2); switch (ch2) { case'N':AddVPoz(&rab,rab.beg,1);ch2='E'; break; case'K':AddVPoz(&rab,rab.end,2);ch2='E'; break; case'P':AddVPoz(&rab,Sechas,0);ch2='E'; break; default: {printf("Нет такой команды\nPress any key\n"); _getch(); } } }; ch2=' '; break; case 'P': while(ch2!='E') { printf("Куда передвинуть N-Начало; K-Конец; P-после текущего; D-перед текущим; E-вернутся назад\nВыш выбор:"); fflush(stdin); ch2=getchar(); fflush(stdin); ch2=toupper(ch2); switch (ch2) { case'N':UkazNach(&rab);ch2='E'; break; case'K':UkazKon(&rab);ch2='E'; break; case'P':SledUkaz(&rab);ch2='E'; break; case'D':PredUkaz(&rab);ch2='E'; break; default: {printf("Нет такой команды\nPress any key\n"); _getch(); } } }; ch2=' '; printf("\nУказатель передвинут, и указывает на элемент под номером %d\n",Sechas-rab.beg+1); break; case 'E': printf("Пока\n"); break; default: { printf("Нет такой команды\nPress any key\n"); _getch(); } } } while(ch1!='E') ; _getch(); return 0; }