//Курсовая работа по теме: Покупка билетов междугородних автобусов на автовокзалах #include #include #include #define MAX_TRIPS 6 #define NUM_TOWNS 5 #define NUM_SEATS 45 #define CURR_TOWN "Москва\0" void getTime(int *ct); void showBusPlan(int arrSeats[NUM_TOWNS][MAX_TRIPS][NUM_SEATS], int *idMaxTrip, int *idTown, int *idTrip, int *idCh); int freeSeats(int arrSeats[NUM_TOWNS][MAX_TRIPS][NUM_SEATS], int *idMaxTrip, int *idTown, int *idTrip, int *idCh); int main(void) { int currTime,//текущее время idTown,//id города прибытия idTrip,//кол-во доступных рейсов в этот день idMaxTrip,//кол-во рейсов в этот день idCh,//номер выбранного рейса tmpWNum,//кол-во покупаемых билетов tmpWSeat,//временная переменная, для номера покупаемого места tmpError,//временная переменная, для отслеживания ошибок numFreeSeats;//кол-во оставшихся свободных мест на данном рейсе double priceTotal;//общая цена покупаемых билетов char currTownStr[20];//текущий город прибытия char arrivalCities[NUM_TOWNS][20] = {"Кострома","Владимир","Углич", "Пенза", "Ярославль"};//массив городов прибытия int arrTimes[NUM_TOWNS][MAX_TRIPS] = {{9,11,14,18,0,0},{12,16,20, 0,0,0},{10,15,19,0,0,0},{7,16,0,0,0,0},{6,9,12,15,18,21}};//массив расписания движения автобусов int arrSeats[NUM_TOWNS][MAX_TRIPS][NUM_SEATS];//массив мест на рейсах double arrPrices[NUM_TOWNS] = {175.5, 200.0, 321.5, 430.0, 140.0};//массив цен FILE* f;//файл с данными уже проданных мест на рейсы //инициализация idTrip = 0; idMaxTrip = 0; f = fopen("town.txt","r"); //заполнение массива for(int i = 0; i< NUM_TOWNS; i++) for(int j = 0; j "); gets(currTownStr); for(int i = 0; i < NUM_TOWNS; i++){ if(strcmp(currTownStr, arrivalCities[i]) == 0){ idTown = i; } } if(idTown < 0) printf("Not found.\n"); }while(idTown < 0); printf("\nТекущее время: %d.00\nДоступные рейсы до города %s:\n", currTime, currTownStr); for(int i = 0; i < MAX_TRIPS; i++){ if(arrTimes[idTown][i] != 0) idMaxTrip++; if(arrTimes[idTown][i] > currTime){ printf("#%d. %d.00\n", ++idTrip, arrTimes[idTown][i]); } } if(idTrip == 0){ printf("# Сегодня рейсов до города %s нет.\n",currTownStr); printf("\nПрограмма завершена.\n"); system("pause"); return(0); } printf("\n"); do{ printf("Введите номер рейса> "); tmpError = scanf("%d", &idCh); if(idCh <= 0 || idCh > idTrip || tmpError == 0){ printf("Неверный номер.\n"); fflush(stdin); } }while(idCh <= 0 || idCh > idTrip || tmpError == 0); printf("\nРейс до города %s в %d.00\n", currTownStr, arrTimes[idTown][idMaxTrip - idTrip + idCh -1]); //вывод схемы автобуса с учетом, что макс мест - 45, 2 ряда по 2 места в каждом showBusPlan(arrSeats,&idMaxTrip, &idTown, &idTrip, &idCh); numFreeSeats = freeSeats(arrSeats,&idMaxTrip, &idTown, &idTrip, &idCh); do{ tmpWNum = 1; printf("Введите, кол-во билетов. Для выхода введите -1 > "); tmpError = scanf("%d", &tmpWNum); if(tmpWNum == -1){ printf("\nПрограмма завершена.\n"); system("PAUSE"); return(0); }else if((tmpError == 0) || (tmpWNum <= 0)){ printf("Введены неверные данные.\n"); fflush(stdin); }else if(tmpWNum > numFreeSeats) { printf("Максимальное кол-во свободных билетов на данный рейс = %d.\n", numFreeSeats); fflush(stdin); } }while((tmpError == 0) || (tmpWNum > numFreeSeats) || ((tmpWNum <= 0))); for(int i = 0; i < tmpWNum; i++){ printf("Введите номер места> "); scanf("%d", &tmpWSeat); if(tmpWSeat < 1 || tmpWSeat > NUM_SEATS){ printf("Неверно введен номер места.\n"); fflush(stdin); i--; }else if(arrSeats[idTown][idMaxTrip - idTrip + idCh -1][tmpWSeat-1] == 1){ printf("Извините, данное место занято.\n"); i--; }else { arrSeats[idTown][idMaxTrip - idTrip + idCh -1][tmpWSeat-1] = 1; printf("Success.\n"); } } priceTotal = arrPrices[idTown] * tmpWNum; f = fopen("town.txt","w"); for(int i = 0; i< NUM_TOWNS; i++) for(int j = 0; j 14){ case 1: printf("%d билет по цене %.2fр.\nИтого:%.2fр.\n", tmpWNum, arrPrices[idTown], priceTotal); break; case 2: case 3: case 4: printf("%d билета по цене %.2fр.\nИтого:%.2fр.\n", tmpWNum, arrPrices[idTown], priceTotal); break; case 5: case 6: case 7: case 8: case 9: case 0: printf("%d билетов по цене %.2fр.\nИтого:%.2fр.", tmpWNum, arrPrices[idTown], priceTotal); break; default: break; }else{ printf("%d билетов по цене %.2fр.\nИтого:%.2fр.", tmpWNum, arrPrices[idTown], priceTotal); } } printf("\nПрограмма завершена.\n"); system("pause"); return(0); } void getTime(int *ct) { int tmp; do{ printf("Введите текущее время (часы)> "); tmp = scanf("%d", ct); if(*ct<0 || *ct>24 || tmp == 0){ printf("Error. Введены неверные данные.\n"); fflush(stdin); } }while(*ct<0 || *ct>24 || tmp == 0); fflush(stdin);//для очистки символа перехода на новую строку } void showBusPlan(int arrSeats[NUM_TOWNS][MAX_TRIPS][NUM_SEATS],int *idMaxTrip, int *idTown, int *idTrip, int *idCh) { for(int i = 1; i<= 5; i++){ printf(" "); for(int j = 0; j < 11; j++){ if(i<3 || j == 10){ if(arrSeats[*idTown][*idMaxTrip - *idTrip + *idCh -1][i+4*j-1] == 0) printf("[%.2d] ", i+4*j); else printf("[ ] "); }else if(i >3){ if(arrSeats[*idTown][*idMaxTrip - *idTrip + *idCh -1][(i-1)+4*j-1] == 0) printf("[%.2d] ", (i-1)+4*j); else printf("[ ] "); }else{ if(j < 10) printf(" "); else{ if(arrSeats[*idTown][*idMaxTrip - *idTrip + *idCh -1][42] == 0) printf("[43]"); else printf("[ ] "); } } } printf("\n"); } printf("\n"); } int freeSeats(int arrSeats[NUM_TOWNS][MAX_TRIPS][NUM_SEATS],int *idMaxTrip, int *idTown, int *idTrip, int *idCh) { int tmp = 0; for(int i = 0; i < NUM_SEATS; i++){ if(arrSeats[*idTown][*idMaxTrip - *idTrip + *idCh -1][i] == 0) tmp++; } return(tmp); }