#define _CRT_SECURE_NO_WARNINGS
#include <tchar.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <conio.h>
struct TList {
char* item; //название
int hour; //час прибытия
int min; //минута прибытия
int sec; //секунда прибытия
};
struct TMass {
TList *date; //массив струкутур
int length;//длинна массива
};
void InitialList (int n,TMass *list) { // инициализация пустого списка
int i;
list->date=new TList[n];
list->length=n;
for (i = 0; i < n; i++) {
list->date[i].item=NULL;
list->date[i].hour=0;
list->date[i].min=0;
list->date[i].sec=0;
}
}
void FreeElem(TList *text){
text->item=NULL;
text->hour=0;
text->hour=0;
text->hour=0;
}
int EmpCheck(int n,TMass *list) {
int i;
for (i = 0; i < n; i++) {
if (list->date[i].item!=NULL) {
return 1;
}
}
return 0;
}
void FreeList(int n,TMass *list)
{
int i;
if (EmpCheck(n,list)==0) {
printf("Список уже пуст\n");
return;
}
for (i = 0; i < n;i++){
list->date[i].item=NULL;
list->date[i].hour=0;
list->date[i].min=0;
list->date[i].sec=0;
}
printf("Список очищен\n");
return;
}
void CheckSE(int n, int *s, int *e, TMass *list) {
int s1=0,e1=0,i,metka=1;
for (i = 0; i < n; i++) {
if (list->date[i].item != NULL && metka) {s1=i; metka=0;}
if (list->date[i].item == NULL && i>s1 && s1!=0) {e1=i-1; break;}
}
if (s1==0) {s1=n/2; e1=n/2;}
*s=s1; *e=e1;
}
void ShowList(int n,TMass *list) {
int start,end,i;
CheckSE(n,&start,&end,list);
if (EmpCheck(n,list)==0) {printf("\nСписок пуст\n");return;}
for (i=start;i<end+1;i++){
printf("%s - %d:%d:%d\n\n",list->date[i].item, list->date[i].hour,list->date[i].min,list->date[i].sec);
}
return;
}
void AddElem(int n,int z,TMass *list) {
int start,end;
CheckSE(n,&start,&end,list);
int flag=1;
char s1[20]; //название
char s2[3]; //час прибытия
char s3[3]; //минута прибытия
char s4[3];//секунда прибытия
printf("Введите название:");
scanf("%s",s1);
while (flag){
printf("\nВведите час прибытия:");
scanf("%s",s2);
printf("\nВведите минуту прибытия:");
scanf("%s",s3);
printf("\nВведите секунду прибытия:");
scanf("%s",s4);
if ((atoi(s2)!=0 ) && (atoi(s3)!=0) && (atoi(s4)!=0)) {flag=0;}
}
if (z==0) {
list->date[start-1].item=" ";
strcpy(list->date[start-1].item,s1);
list->date[start-1].hour=atoi(s2);
list->date[start-1].min=atoi(s3);
list->date[start-1].sec=atoi(s4);
}
if (z==-1) {
list->date[end+1].item=" ";
strcpy(list->date[end+1].item,s1);
list->date[end+1].hour=atoi(s2);
list->date[end+1].min=atoi(s3);
list->date[end+1].sec=atoi(s4);
}
if (z>0) {
TMass doplist;
InitialList(n,&doplist);
z=start+z;
int i;
for (i = z; i < n; i++) {
doplist.date[i].item,list->date[i].item;
doplist.date[i].hour=list->date[i].hour;
doplist.date[i].min=list->date[i].min;
doplist.date[i].sec=list->date[i].sec;
}
for (i = z; i < n-1; i++) {
list->date[i+1].item=doplist.date[i].item;
list->date[i+1].hour=doplist.date[i].hour;
list->date[i+1].min=doplist.date[i].min;
list->date[i+1].sec=doplist.date[i].sec;
}
list->date[z].item=" ";
strcpy(list->date[z].item,s1);
list->date[z].hour=atoi(s2);
list->date[z].min=atoi(s3);
list->date[z].sec=atoi(s4);
}
}
void AddElemFromTxt(int n, int z, TMass*list,TList*text){
int start,end;
CheckSE(n,&start,&end,list);
char s1[20]; //название
int s2; //час прибытия
int s3; //минута прибытия
int s4;//секунда прибытия
int i;
strcpy(s1,text->item);
s2=text->hour;
s3=text->min;
s4=text->sec;
if (z==0) {
list->date[start-1].item=" ";
strcpy(list->date[start-1].item,s1);
list->date[start-1].hour=(s2);
list->date[start-1].min=(s3);
list->date[start-1].sec=(s4);
}
if (z==-1) {
list->date[end+1].item=" ";
strcpy(list->date[end+1].item,s1);
list->date[end+1].hour=(s2);
list->date[end+1].min=(s3);
list->date[end+1].sec=(s4);
}
if (z>0) {
TMass doplist;
InitialList(n,&doplist);
z=start+z;
int i;
for (i = z; i < n; i++) {
doplist.date[i].item=list->date[i].item;
doplist.date[i].hour=list->date[i].hour;
doplist.date[i].min=list->date[i].min;
doplist.date[i].sec=list->date[i].sec;
}
for (i = z; i < n-1; i++) {
list->date[i+1].item=doplist.date[i].item;
list->date[i+1].hour=doplist.date[i].hour;
list->date[i+1].min=doplist.date[i].min;
list->date[i+1].sec=doplist.date[i].sec;
}
list->date[z].item=" ";
strcpy(list->date[z].item,s1);
list->date[z].hour=(s2);
list->date[z].min=(s3);
list->date[z].sec=(s4);
}
}
void CreateList (int n, TMass *list) {
if (EmpCheck(n,list)==1){
printf("Сначало освободите список\n");
return;
}
InitialList (n,list);
char s1[20]; //название
printf("Для создания пустого введите **, или введите название элмента:\n");
scanf("%s",s1);
if (!strcmp(s1,"**")){
printf("\nСоздан пустой список\n");
printf("Нажмите любую клавишу\n");
getch();
return;
}
int start,end;
CheckSE(n,&start,&end,list);
int flag=1;
char s2[3]; //час прибытия
char s3[3]; //минута прибытия
char s4[3];//секунда прибытия
while (flag){
printf("\nВведите час прибытия:");
scanf("%s",s2);
printf("\nВведите минуту прибытия:");
scanf("%s",s3);
printf("\nВведите секунду прибытия:");
scanf("%s",s4);
if (atoi(s2)!=0 && atoi(s3)!=0 && atoi(s4)!=0) {flag=0;}
}
list->date[start].item=" ";
strcpy(list->date[start].item,s1);
list->date[start].hour=atoi(s2);
list->date[start].min=atoi(s3);
list->date[start].sec=atoi(s4);
printf("Создан список из 1 элемента\n");
return;
}
void DelElem(int n, int z,TMass *list) {
int start,end,i;
CheckSE(n,&start,&end,list);
if (z==0 || z==1) {
list->date[start].item=" ";
list->date[start].hour=0;
list->date[start].min=0;
list->date[start].sec=0;
}
if (z==-1) {
list->date[end].item=" ";
list->date[end].hour=0;
list->date[end].min=0;
list->date[end].sec=0;
}
if (z>1) {
z=z+start-1;
for (i = z; i < n-1; i++){
list->date[i].item=list->date[i+1].item;
list->date[i].hour=list->date[i+1].hour;
list->date[i].min=list->date[i+1].hour;
list->date[i].sec=list->date[i+1].hour;
}
}
}
void ReadElem(int n, int z,TMass *list, TList *dop) {
int start,end;
CheckSE(n,&start,&end,list);
z=start-1+z;
dop->item=list->date[z].item;
dop->hour=list->date[z].hour;
dop->min=list->date[z].min;
dop->sec=list->date[z].sec;
}
void doElem(int n,int z,int zo, TMass *list) {
int start,end;
CheckSE(n,&start,&end,list);
TList dop;
if (z==0) {
ReadElem(n,1,list,&dop);
zo=start+zo-1;
list->date[zo].item=dop.item;
list->date[zo].hour=dop.hour;
list->date[zo].min=dop.min;
list->date[zo].sec=dop.sec;
}
if (z==-1) {
ReadElem(n,end-start+1,list,&dop);
zo=start+zo-1;
list->date[zo].item=dop.item;
list->date[zo].hour=dop.hour;
list->date[zo].min=dop.min;
list->date[zo].sec=dop.sec;
}
if (z==1) {
ReadElem(n,zo-1,list,&dop);
zo=start+zo-1;
list->date[zo].item=dop.item;
list->date[zo].hour=dop.hour;
list->date[zo].min=dop.min;
list->date[zo].sec=dop.sec;
}
if (z==2) {
ReadElem(n,zo+1,list,&dop);
zo=start+zo-1;
list->date[zo].item=dop.item;
list->date[zo].hour=dop.hour;
list->date[zo].min=dop.min;
list->date[zo].sec=dop.sec;
}
}
void logWrite(FILE*f2,TMass*list) {
int start,end,i;
int n=list->length;//жаль, что об этом вспомнил только тут и в итоге по всем функциям n водил((
CheckSE(n,&start,&end,list);
if (EmpCheck(n,list)==0) {fprintf(f2,"Список пуст\n");return;}
for (i=start;i<end+1;i++){
fprintf(f2,"%s - %d:%d:%d\n",list->date[i].item,list->date[i].hour,list->date[i].min,list->date[i].sec);
}
for (i=0;i<50;i++){
fprintf(f2,"=");
}
return;
}
//==========================================================================================
void addFromFile(int n,int z,FILE*f1,TMass*list) {
char s[50];
char p[50];
while (1){
TList text;
fscanf(f1,"%s", s); strcpy(text.item,s); //копирует а нужно чтобы заменял
if (strcmp(s,"end")==0) break; //признак конца - названия end
fscanf(f1,"%s", s); text.hour=atoi(s);
fscanf(f1,"%s", s); text.min=atoi(s);
fscanf(f1,"%s", s); text.sec=atoi(s);
AddElemFromTxt(n,z,list,&text);
if (z==-1) {z--;}
z++;
}
z=0;
}
void Filter(TMass*list) {
int n=list->length;
int start,end,i;
CheckSE(n,&start,&end,list);
n=end-start+1;
TList prove; int hour=0,sec=0,min=0;
for (i = 0; i < n; i++) {
ReadElem(n,i,list,&prove);
hour=prove.hour;
min=prove.min;
sec=prove.sec;
printf("\n%d %d %d\n",hour,min,sec);
if (((hour*10000+min*100+sec)>=152035) && (hour*10000+min*100+sec)<=185010){
AddElem(n,i,list);
}
else{
DelElem(n,i,list);
}
}
}
int main()
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
char ch1,ch2,sh[2],shh[2];
TMass list;
int n=20;
InitialList (n,&list);
FILE *f1;
if ((f1 = fopen("input.txt", "r")) == NULL) { printf("Неудалось открыть файл для чтения \n"); getch(); return 0 ; }
FILE *f2;
if ((f2 = fopen("log.txt", "w")) == NULL) { printf("Неудалось открыть файл для записи \n"); getch(); return 0 ; }
int i;
//CreateList(n,&list); ShowList(n,&list); ShowList(n,&list);
do
{
printf("Q-очистить список;\n");
printf("W-добавить элементы из текстового в начало; E-в конец;R-после произвольного;\n");
printf("A-добавить элемент с клавиатуры в начало; S-конец; D-после произвольного;\n");
printf("Z-удалить N элементов с начала; X-конца; C-после текущего;\n");
printf("1-сделать текущим элментом первый; 2-последний; 3-предыдущий; 4-следующий\n");
printf("F-фильтр\n");
fflush(stdin);
ch1=getchar();
fflush(stdin);
ch1=toupper(ch1);
switch (ch1)
{
//----------первая часть: создание двоичного из текстового
case 'Q': FreeList(n,&list); logWrite(f2,&list);ShowList(n,&list); break;
case 'W': addFromFile(n,0,f1,&list); logWrite(f2,&list);ShowList(n,&list); break;
case 'E': addFromFile(n,-1,f1,&list); logWrite(f2,&list);ShowList(n,&list); break;
case 'R': printf("Выберете место после которого втсавлять\n"); scanf("%s",sh); if (atoi(sh)!=0){addFromFile(n,atoi(sh),f1,&list); logWrite(f2,&list);ShowList(n,&list);} break;
case 'A': AddElem(n,0,&list);logWrite(f2,&list);ShowList(n,&list); break;
case 'S': AddElem(n,-1,&list);logWrite(f2,&list);ShowList(n,&list); break;
case 'D': printf("Выберете место после которого втсавлять\n"); scanf("%s",sh); if (atoi(sh)!=0){ AddElem(n,atoi(sh),&list);logWrite(f2,&list);ShowList(n,&list);} break;
case 'Z':printf("Кол-во N для удаления"); scanf("%s",shh); if (atoi(shh)!=0){
for (i=0;i<atoi(shh);i++){DelElem(n,0,&list);}logWrite(f2,&list);ShowList(n,&list);} break;
case 'X':printf("Кол-во N для удаления"); scanf("%s",shh); if (atoi(shh)!=0){
for (i=0;i<atoi(shh);i++){DelElem(n,-1,&list);}logWrite(f2,&list);ShowList(n,&list);} break;
case 'C':printf("Кол-во N для удаления"); scanf("%s",shh);
printf("Выберете место после которого втсавлять"); scanf("%s",sh);
if (atoi(shh)!=0 && atoi(sh)!=0){
for (i=0;i<atoi(shh);i++){DelElem(n,atoi(sh),&list);}logWrite(f2,&list);ShowList(n,&list);} break;
case'1':printf("Выберете текущий элемент"); scanf("%s",sh); if (atoi(sh)!=0){ doElem(n,0,atoi(sh),&list);logWrite(f2,&list);ShowList(n,&list);} break;
case'2':printf("Выберете текущий элемент"); scanf("%s",sh); if (atoi(sh)!=0){ doElem(n,-1,atoi(sh),&list);logWrite(f2,&list);ShowList(n,&list);} break;
case'3':printf("Выберете текущий элемент"); scanf("%s",sh); if (atoi(sh)!=0){ doElem(n,1,atoi(sh),&list);logWrite(f2,&list);ShowList(n,&list);} break;
case'4':printf("Выберете текущий элемент"); scanf("%s",sh); if (atoi(sh)!=0){ doElem(n,2,atoi(sh),&list);logWrite(f2,&list);ShowList(n,&list);} break;
case'F': Filter(&list);logWrite(f2,&list);ShowList(n,&list);
case 'P': printf("Завершение работы\n"); break;
default: {
printf("Нет такой команды\nPress any key\n");
getch(); }
}
} while(ch1!='P') ;
getch();
return 0;
}