Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <windows.h>
- #include <locale.h>
- struct BusPark
- {
- int ID;
- char Model[10];
- char FirstName[20];
- char LastName[20];
- char Patronymic[20];
- float CarryingAmount;
- int DayLastTO;
- int MonthLastTO;
- int YearLastTO;
- int RouteNumber;
- struct BusPark *Next;
- struct BusPark *Previous;
- };
- struct Pointers{
- struct BusPark *Head;
- struct BusPark *Tail;
- };
- struct Pointers List={.Head=NULL};
- void DataInput();
- void DataOutput();
- void UploadInFile();
- void DownloadFromFile(struct BusPark *Address);
- void AddElement();
- void DeleteElement();
- void CorrectElement();
- int SortElements();
- void ListWithTOEarlierThen();
- void DataOutputOneElement(struct BusPark *Address);
- void DriverWithMinimalCarryingAmount();
- void ListBusBeginsWithLetter();
- void TransferPtr(struct BusPark *LeftElement,struct BusPark *RightElement);
- int NumberOfBuses=0;
- int main() {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- setlocale(LC_ALL,"russian");
- int Interface=0;
- int Continue=1;
- while(Continue==1) {
- printf("Выберете нужное действие: \n1.Ввод данных\n2.Добавление элемента\n3.Удаление элемента\n4.Корректировка данных\n5.Вывод всех данных\n6.Формирование списка автобусов прошедших тех. обслуживание ранее заданной даты\n7.Вывод данных о водителе с наименьшей балансовой стоимостью автобуса\n8.Сортировка данных по номерам маршрута\n9.Вывод всех моделей автобусов, начинающихся на заданную букву\n10.Загрузка данных из файла\n11.Выгрузка данных в файл");
- printf("\nВыбранное действие: ");
- scanf("%d", &Interface);
- switch (Interface) {
- case 1:
- DataInput();
- break;
- case 2:
- if(NumberOfBuses)
- AddElement();
- else
- DataInput();
- break;
- case 3:
- if(NumberOfBuses) {
- DeleteElement();
- printf("\nУспешно выполнено!");
- }
- else
- printf("\nВы пока не ввели данные!");
- break;
- case 4:
- if(NumberOfBuses) {
- CorrectElement();
- printf("\nУспешно выполнено!");
- }
- else
- printf("\nВы пока не ввели данные!");
- break;
- case 5:
- if(NumberOfBuses) {
- DataOutput();
- }
- else {
- printf("\nВы пока не ввели данные!");
- }
- break;
- case 6:
- if(NumberOfBuses) {
- ListWithTOEarlierThen();
- }
- else {
- printf("\nВы пока не ввели данные!");
- }
- break;
- case 7:
- if(NumberOfBuses) {
- DriverWithMinimalCarryingAmount();
- }
- else {
- printf("\nВы пока не ввели данные!");
- }
- break;
- case 8:
- if(NumberOfBuses) {
- SortElements();
- }
- else {
- printf("\nВы пока не ввели данные!");
- }
- break;
- case 9:
- if(NumberOfBuses) {
- ListBusBeginsWithLetter();
- }
- else {
- printf("\nВы пока не ввели данные!");
- }
- break;
- case 10:
- if(NumberOfBuses)
- DownloadFromFile(List.Tail);
- else
- DownloadFromFile(List.Head);
- printf("\nУспешно выполнено!");
- break;
- case 11:
- if(NumberOfBuses) {
- UploadInFile();
- printf("\nУспешно выполнено!");
- }
- else {
- printf("\nВы пока не ввели данные!");
- }
- break;
- default:
- printf("\nВы выбрали несуществующий пункт!");
- break;
- }
- printf("\nХотите продолжить работу с меню? (1-Да, 0-Нет): ");
- scanf("%d",&Continue);
- system("cls");
- }
- getchar();
- getchar();
- return 0;
- }
- void DataInput()
- {
- int count=1, Continue=1, bad=1;
- struct BusPark *Address = NULL;
- struct BusPark *BeginPtr = NULL;
- struct BusPark *Temporary = NULL;
- printf("\nВведите данные: ");
- while(Continue==1)
- {
- if(BeginPtr==NULL)
- {
- BeginPtr= (struct BusPark *)malloc(sizeof(struct BusPark));
- if(BeginPtr==NULL)
- {
- printf("\nПамять не была выделена!");
- exit(1);
- }
- List.Head = BeginPtr;
- List.Tail = List.Head;
- Address = BeginPtr;
- Address->Previous = NULL;
- Address->Next=NULL;
- }
- else {
- Temporary=(struct BusPark *)malloc(sizeof(struct BusPark));
- if(Temporary==NULL)
- {
- printf("\nПамять не была выделена!");
- exit(1);
- }
- Address->Next=Temporary;
- Address->Next->Previous=Address;
- Address=Address->Next;
- List.Tail=Address;
- Address->Next=NULL;
- }
- printf("\nАвтобус №%d",count);
- printf("\nВведите модель автобуса: ");
- scanf("%s",Address->Model);
- printf("Введите ФИО водителя: ");
- scanf("%s %s %s",Address->FirstName,Address->LastName,Address->Patronymic);
- printf("Введите балансовую стоимость: ");
- scanf("%f",&Address->CarryingAmount);
- while(bad==1) {
- bad=0;
- printf("Введите дату последнего технического обслуживания (В формате ДД.ММ.ГГГГ): ");
- scanf("%d.%d.%d",&Address->DayLastTO,&Address->MonthLastTO,&Address->YearLastTO);
- if ((Address->DayLastTO > 31) || (Address->DayLastTO < 1)) {
- printf("Некорректный день запроса! Попробуйте еще раз!\n");
- bad=1;
- }
- if ((Address->MonthLastTO > 12) || (Address->MonthLastTO < 1))
- {
- printf("\nНекорректный месяц запроса! Попробуйте еще раз!\n");
- bad=1;
- }
- if (Address->YearLastTO < 0)
- {
- printf("\nНекорректный год запроса! Попробуйте еще раз!\n");
- bad=1;
- }
- }
- printf("Введите номер маршрута: ");
- scanf("%d",&Address->RouteNumber);
- Address->ID=count;
- count++;
- NumberOfBuses++;
- printf("\nХотите продолжить ввод? (1-Да, 0-Нет): ");
- scanf("%d",&Continue);
- }
- }
- void DataOutput() {
- int i;
- struct BusPark *Address = List.Head;
- printf("\nВведённые данные: ");
- for (i = 0; i < NumberOfBuses; i++) {
- printf("\nАвтобус №%d", Address->ID);
- printf("\nМодель автобуса: %s", Address->Model);
- printf("\nФИО водителя: %s %s %s", Address->FirstName, Address->LastName,Address->Patronymic);
- printf("\nБалансовая стоимость: %5.2f", Address->CarryingAmount);
- printf("\nДата последнего технического обслуживания (В формате ДД.ММ.ГГГГ): %d.%d.%d", Address->DayLastTO,Address->MonthLastTO,Address->YearLastTO);
- printf("\nНомер маршрута: %d", Address->RouteNumber);
- Address = Address->Next;
- }
- }
- void UploadInFile()
- {
- FILE *UploadPtr;
- struct BusPark *Address=List.Head;
- int i=0;
- if((UploadPtr=fopen("data.txt","w+b"))==NULL)
- {
- printf("\nНевозможно открыть файл data.txt!");
- exit(2);
- }
- for(i=0;i<NumberOfBuses;i++) {
- fwrite(Address, sizeof(struct BusPark), 1, UploadPtr);
- Address=Address->Next;
- }
- fclose(UploadPtr);
- }
- void DownloadFromFile(struct BusPark *Address){
- FILE *DownloadPtr;
- struct BusPark *Temporary=NULL;
- if((DownloadPtr=fopen("data.txt","r+b"))==NULL)
- {
- printf("\nНевозможно открыть файл data.txt!");
- exit(2);
- }
- do {
- if (Address == NULL) {
- Address = (struct BusPark *) malloc(sizeof(struct BusPark));
- if (Address == NULL) {
- printf("\nПамять не была выделена!");
- exit(1);
- }
- List.Head = Address;
- fread(Address, sizeof(struct BusPark), 1, DownloadPtr);
- Address->Previous = NULL;
- Address->Next = NULL;
- } else {
- List.Tail=Address;
- Address->Next=NULL;
- Temporary=(struct BusPark *)malloc(sizeof(struct BusPark));
- if(Temporary==NULL)
- {
- printf("\nПамять не была выделена!");
- exit(1);
- }
- fread(Temporary, sizeof(struct BusPark), 1, DownloadPtr);
- Address->Next=Temporary;
- Address->Next->Previous=Address;
- Address=Address->Next;
- }
- NumberOfBuses++;
- }while(!feof(DownloadPtr));
- NumberOfBuses--;
- fclose(DownloadPtr);
- }
- void AddElement()
- {
- int Place,i;
- struct BusPark *Address;
- struct BusPark *Current;
- struct BusPark *LeftElement;
- struct BusPark *RightElement;
- printf("\nВыберете на какое место вы хотети поместить добавленный элемент: ");
- scanf("%d",&Place);
- Address=(struct BusPark *)malloc(sizeof(struct BusPark));
- if(Place==1)
- {
- Address->Next=List.Head;
- Address->Previous=List.Head->Previous;
- List.Head->Previous=Address;
- List.Head=Address;
- }
- else
- {
- if((Place>NumberOfBuses+1)||(Place<1))
- {
- printf("\nНедопустимое место! (Возможно перед местом, куда вы хотите вставить новый элемент, нет предыдущего элемента)");
- free(Address);
- exit(3);
- }
- else if(Place==NumberOfBuses+1)
- {
- Address->Next=List.Tail->Next;
- Address->Previous=List.Tail;
- List.Tail->Next=Address;
- List.Tail=Address;
- }
- else
- {
- Current=List.Head;
- for(i=0;i<Place-1;i++)
- {
- Current=Current->Next;
- }
- RightElement=Current;
- LeftElement=Current->Previous;
- LeftElement->Next=Address;
- RightElement->Previous=Address;
- Address->Next=RightElement;
- Address->Previous=LeftElement;
- }
- }
- printf("\nАвтобус №%d",NumberOfBuses+1);
- printf("\nВведите модель автобуса: ");
- scanf("%s",Address->Model);
- printf("Введите ФИО водителя: ");
- scanf("%s %s %s",Address->FirstName,Address->LastName,Address->Patronymic);
- printf("Введите балансовую стоимость: ");
- scanf("%f",&Address->CarryingAmount);
- printf("Введите дату последнего технического обслуживания (В формате ДД.ММ.ГГГГ): ");
- scanf("%d.%d.%d",&Address->DayLastTO,&Address->MonthLastTO,&Address->YearLastTO);
- printf("Введите номер маршрута: ");
- scanf("%d",&Address->RouteNumber);
- Address->ID=NumberOfBuses+1;
- NumberOfBuses++;
- }
- void DeleteElement()
- {
- int Place,i;
- struct BusPark *Current;
- struct BusPark *Temporary;
- struct BusPark *RightElement;
- struct BusPark *LeftElement;
- printf("\nВведите элемент списка, который Вы хотите удалить: ");
- scanf("%d",&Place);
- if(Place==1)
- {
- Temporary=List.Head->Next;
- Temporary->Previous=NULL;
- free(List.Head);
- List.Head=Temporary;
- NumberOfBuses--;
- }
- else if(Place==NumberOfBuses)
- {
- Temporary=List.Tail->Previous;
- Temporary->Next=NULL;
- free(List.Tail);
- List.Tail=Temporary;
- NumberOfBuses--;
- }
- else if((Place>NumberOfBuses)||(Place<1))
- {
- printf("\nВы ввели не существующий элемент списка!");
- exit(3);
- }
- else
- {
- Current=List.Head;
- for(i=0;i<Place-1;i++)
- {
- Current=Current->Next;
- }
- RightElement=Current->Next;
- LeftElement=Current->Previous;
- LeftElement->Next=RightElement;
- RightElement->Previous=LeftElement;
- free(Current);
- NumberOfBuses--;
- }
- }
- void CorrectElement()
- {
- int Place,i;
- struct BusPark *Current;
- printf("\nВведите элемент списка, который Вы хотите изменить: ");
- scanf("%d",&Place);
- if((Place>NumberOfBuses)||(Place<1))
- {
- printf("\nВы ввели не существующий элемент списка!");
- exit(3);
- }
- Current=List.Head;
- for(i=0;i<Place-1;i++)
- {
- Current=Current->Next;
- }
- printf("\nВведите номер автобуса: ");
- scanf("%d",&Current->ID);
- printf("Введите модель автобуса: ");
- scanf("%s",Current->Model);
- printf("Введите ФИО водителя: ");
- scanf("%s %s %s",Current->FirstName,Current->LastName,Current->Patronymic);
- printf("Введите балансовую стоимость: ");
- scanf("%f",&Current->CarryingAmount);
- printf("Введите дату последнего технического обслуживания (В формате ДД.ММ.ГГГГ): ");
- scanf("%d.%d.%d",&Current->DayLastTO,&Current->MonthLastTO,&Current->YearLastTO);
- printf("Введите номер маршрута: ");
- scanf("%d",&Current->RouteNumber);
- }
- int SortElements()
- {
- int i,j=1;
- struct BusPark *StartPtr;
- if(NumberOfBuses==1)
- {
- printf("\nВ списке всего один элемент!");
- return 1;
- }
- else
- {
- while(j!=0)
- {
- j=0;
- StartPtr = List.Head;
- for(i=0;i<NumberOfBuses;i++)
- {
- if(StartPtr==List.Tail)
- {
- continue;
- }
- if(StartPtr->RouteNumber > StartPtr->Next->RouteNumber)
- {
- j++;
- TransferPtr(StartPtr,StartPtr->Next);
- }
- StartPtr = StartPtr->Next;
- }
- }
- }
- return 0;
- }
- void ListWithTOEarlierThen()
- {
- int i,EarlierYear=0,EarlierMonth=0,EarlierDay=0,bad=1;
- struct BusPark *Address;
- Address=List.Head;
- while(bad==1) {
- bad=0;
- printf("\nВведите дату информацию о автобусах раньше которой Вы хотите узнать (В формате ДД.ММ.ГГГГ): ");
- scanf("%d.%d.%d", &EarlierDay, &EarlierMonth, &EarlierYear);
- if ((EarlierDay > 31) || (EarlierDay < 1)) {
- printf("Некорректный день запроса! Попробуйте еще раз!");
- bad=1;
- }
- if ((EarlierMonth > 12) || (EarlierMonth < 1))
- {
- printf("\nНекорректный месяц запроса! Попробуйте еще раз!");
- bad=1;
- }
- if (EarlierYear < 0)
- {
- printf("\nНекорректный год запроса! Попробуйте еще раз!");
- bad=1;
- }
- }
- for(i=0;i<NumberOfBuses;i++)
- {
- if(Address->YearLastTO<EarlierYear)
- {
- DataOutputOneElement(Address);
- Address=Address->Next;
- continue;
- }
- else if(Address->YearLastTO>EarlierYear) {
- Address=Address->Next;
- continue;
- }
- if(Address->MonthLastTO<EarlierMonth)
- {
- DataOutputOneElement(Address);
- Address=Address->Next;
- continue;
- }
- else if(Address->MonthLastTO>EarlierMonth) {
- Address=Address->Next;
- continue;
- }
- if(Address->DayLastTO<=EarlierDay)
- {
- DataOutputOneElement(Address);
- Address=Address->Next;
- }
- else
- {
- Address = Address->Next;
- }
- }
- }
- void DataOutputOneElement(struct BusPark *Address) {
- printf("\nАвтобус №%d", Address->ID);
- printf("\nМодель автобуса: %s", Address->Model);
- printf("\nФИО водителя: %s %s %s", Address->FirstName, Address->LastName,Address->Patronymic);
- printf("\nБалансовая стоимость: %5.2f", Address->CarryingAmount);
- printf("\nДата последнего технического обслуживания (В формате ДД.ММ.ГГГГ): %d.%d.%d", Address->DayLastTO,Address->MonthLastTO,Address->YearLastTO);
- printf("\nНомер маршрута: %d", Address->RouteNumber);
- }
- void DriverWithMinimalCarryingAmount(){
- int i;
- struct BusPark *Address;
- float MinimalCarryingAmount;
- Address=List.Head;
- MinimalCarryingAmount=Address->CarryingAmount;
- for(i=0;i<NumberOfBuses;i++)
- {
- if(Address->CarryingAmount<MinimalCarryingAmount)
- MinimalCarryingAmount=Address->CarryingAmount;
- Address=Address->Next;
- }
- Address=List.Head;
- for(i=0;i<NumberOfBuses;i++)
- {
- if(Address->CarryingAmount==MinimalCarryingAmount)
- {
- printf("Водитель с наименьшей балансовой стоимостью: %s %s %s\n",Address->FirstName, Address->LastName,Address->Patronymic);
- }
- Address=Address->Next;
- }
- }
- void ListBusBeginsWithLetter()
- {
- int i;
- char BeginLetter;
- struct BusPark *Address;
- Address=List.Head;
- printf("\nВведите букву для поиска: ");
- scanf(" %c",&BeginLetter);
- printf("Модели автобусов начинающихся на данную букву: ");
- for(i=0;i<NumberOfBuses;i++)
- {
- if((Address->Model[0]==BeginLetter)||(Address->Model[0]==BeginLetter-32))
- {
- printf("\n%s",Address->Model);
- }
- Address=Address->Next;
- }
- }
- void TransferPtr(struct BusPark *LeftElement,struct BusPark *RightElement)
- {
- if(LeftElement==List.Head)
- {
- List.Head=RightElement;
- LeftElement->Next=RightElement->Next;
- RightElement->Previous=LeftElement->Previous;
- RightElement->Next=LeftElement;
- LeftElement->Previous=RightElement;
- }
- else if(RightElement==List.Tail)
- {
- List.Tail=LeftElement;
- LeftElement->Next=RightElement->Next;
- RightElement->Previous=LeftElement->Previous;
- RightElement->Next=LeftElement;
- LeftElement->Previous=RightElement;
- }
- else
- {
- LeftElement->Next=RightElement->Next;
- RightElement->Previous=LeftElement->Previous;
- RightElement->Next=LeftElement;
- LeftElement->Previous=RightElement;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement