Рассортировать заданные даты в порядке возрастания - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.25 из 5
Похожие ответы