Рассортировать заданные даты в порядке возрастания - QBasic
Формулировка задачи:
Дан перечень дат (формат - "21сентября 1982г.") Рассортировать эти даты в порядке возрастания (данные - даты водятся с клавиатуры )
Решение задачи: «Рассортировать заданные даты в порядке возрастания»
textual
Листинг программы
CLS 'Создаем тип для списка дат TYPE DataType day AS INTEGER TextMonth AS STRING * 100 'Просто с запасом :) month AS INTEGER year AS INTEGER END TYPE INPUT "Vvedite kolichestvo dat: ", n PRINT "Format - 1 January 2000" DIM spisok(n) AS DataType FOR i = 1 TO n DO 'Ввод даты PRINT : PRINT "("; i; ") "; INPUT "Vvedite datu: ", DATA$ DATA$ = LTRIM$(RTRIM$(DATA$)) + " " 'Пробел в конце - для удобства последующего разделения на число/месяц/год l = LEN(DATA$) InputTo = 1 lastJ = 1 correct = 1 'Разделение даты на число/месяц/год 'Учтено, что при вводе они могли разделяться более, чем одним пробелом FOR j = 1 TO l IF MID$(DATA$, j, 1) = " " THEN IF MID$(DATA$, j - 1, 1) <> " " THEN SELECT CASE InputTo CASE 1 spisok(i).day = VAL(MID$(DATA$, lastJ, j - lastJ)) CASE 2 spisok(i).TextMonth = MID$(DATA$, lastJ, j - lastJ) CASE 3 spisok(i).year = VAL(MID$(DATA$, lastJ, j - lastJ)) END SELECT InputTo = InputTo + 1 END IF lastJ = j + 1 END IF NEXT j 'Это самая нудная часть - преобразование месяца из текста в его номер, определение числа дней в нем SELECT CASE RTRIM$(spisok(i).TextMonth) CASE "January" spisok(i).month = 1 maxday = 31 CASE "February" spisok(i).month = 2 maxday = 29 CASE "March" spisok(i).month = 3 maxday = 31 CASE "April" spisok(i).month = 4 maxday = 30 CASE "May" spisok(i).month = 5 maxday = 31 CASE "June" spisok(i).month = 6 maxday = 30 CASE "July" spisok(i).month = 7 maxday = 31 CASE "August" spisok(i).month = 8 maxday = 31 CASE "September" spisok(i).month = 9 maxday = 30 CASE "October" spisok(i).month = 10 maxday = 31 CASE "November" spisok(i).month = 11 maxday = 30 CASE "December" spisok(i).month = 12 maxday = 31 CASE ELSE correct = 0 'Других месяцев просто нет, значит что-то введено не так END SELECT 'Проверка введенных значений - вдруг дней больше, чем может быть в месяце, или же ввели отрицательное число IF spisok(i).year < 0 THEN correct = 0 IF spisok(i).day > maxday OR spisok(i).day <= 0 THEN correct = 0 'Если дата введена не верно, сообщим об этом пользователю IF correct = 0 THEN COLOR 4: PRINT "Data vvedena neverno!": COLOR 7 LOOP WHILE correct = 0 'Будем повторять ввод, пока не добьемся верной даты NEXT i 'Сортировка списка дат FOR i = 1 TO n - 1 MinYear = spisok(i).year MinMonth = spisok(i).month MinDay = spisok(i).day MinJ = i FOR j = i TO n IF (spisok(j).year < MinYear) OR (spisok(j).year = MinYear AND spisok(j).month < MinMonth) OR (spisok(j).year = MinYear AND spisok(j).month = MinMonth AND spisok(j).day < MinDay) THEN MinYear = spisok(j).year MinMonth = spisok(j).month MinDay = spisok(j).day MinJ = j END IF NEXT j SWAP spisok(i), spisok(MinJ) NEXT i 'Последний рубеж - вывод упорядоченного списка на экран CLS FOR i = 1 TO n PRINT spisok(i).day; RTRIM$(spisok(i).TextMonth); spisok(i).year NEXT i
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д