Дана строка , в которой содержится осмысленное текстовое сообщение. Слова сообщения...

0 голосов
80 просмотров

Дана строка , в которой содержится осмысленное текстовое сообщение. Слова сообщения разделяются В заданном формате дд- целое число из диапазона от 1 до 31, мм - целое число из диапазона от 1 до 12, а гг - целое число из диапазона от 1 до 2020 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается.) Заменить каждую дату сообщения на дату следующего дня. Написать программу на Паскале. Сроооооооооооооочнооо. Пооожалуйста.....


Информатика (17 баллов)
Дан 1 ответ
0 голосов
БОГ (320k баллов)
 
Правильный ответ

Во-первых, каков формат года? Должно быть 4 знака, то есть гггг = [0001, 2020]
Во-вторых, каков формат самой даты? Это число без разделителей? ддммгггг?
Или с разделителями - точками, что более естественно? дд.мм.гггг?
Или с разделителями - слешами, по-американски? дд/мм/гггг?
Или совсем по-американски, месяц впереди дня? мм/дд/гггг?
Или без разделителей, но в обратном порядке? ггггммдд? Я и такое видел!
Будем считать, что это число без разделителей, 1 вариант, ддммгггг. 8 цифр.
Тогда проверка должна быть примерно такой:
Пишу на бейсике, на паскаль сами переводите.
Poz1 = 1: Poz2 = 0
Do While Poz1 > 0 ' Цикл, пока в строке встречаются пробелы
   Poz2 = InStr(Poz1, Stroka, " ") ' Ищем пробел в строке
   If Poz2 > 0 Then ' Если нашли пробел - это конец слова
       If Poz2 - Poz1 = 8 Then ' Если длина слова 8 знаков
           Flag = True ' Признак, что это 8 цифр, устанавливаем в истину
           For i= 1 To 8
               If Chr( Mid (Stroka, Poz1 + i - 1, 1)) < &H30 Or _
                    Chr( Mid (Stroka, Poz1 + i - 1, 1)) > &H39 Then
                    Flag = False ' Какой-то из знаков оказался НЕ цифрой
               End If
           Next i
           If Flag = True Then ' Если это все же 8 цифр, то проверяем, дата ли это
               Day = Val (Mid (Stroka, Poz1, 2))
               Month = Val (Mid (Stroka, Poz1+2, 2))
               Year = Val (Mid (Stroka, Poz1+4, 4))
               If (Day >= 1) And (Day <= 31) And (Month >= 1) And (Month <= 12) _<br>                   And (Year >= 1) And (Year <= 2020) Then ' Если это ДАТА<br>                   Call ChangeDate(Day, Month, Year) ' Вызываем п/п замены даты
               End If
           End If
       End If
   Else ' Если не нашли пробел - это было последнее слово
       Poz2 = Len(Stroka) ' Устанавливаем Poz2 на конец строки
       If Poz2 - Poz1 = 8 Then ' Если длина слова 8 знаков
           Flag = True ' Признак, что это 8 цифр, устанавливаем в истину
           For i= 1 To 8
               If Chr( Mid (Stroka, Poz1 + i - 1, 1)) < &H30 Or _
                    Chr( Mid (Stroka, Poz1 + i - 1, 1)) > &H39 Then
                    Flag = False ' Какой-то из знаков оказался НЕ цифрой
               End If
           Next i
           If Flag = True Then ' Если это все же 8 цифр, то проверяем, дата ли это
               Day = Val (Mid (Stroka, Poz1, 2))
               Month = Val (Mid (Stroka, Poz1+2, 2))
               Year = Val (Mid (Stroka, Poz1+4, 4))
               If (Day >= 1) And (Day <= 31) And (Month >= 1) And (Month <= 12) _<br>                   And (Year >= 1) And (Year <= 2020) Then ' Если это ДАТА<br>                   Call ChangeDate(Day, Month, Year) ' Вызываем п/п замены даты
               End If
           End If
       End If
   End If
   Poz1 = Poz2 ' Устанавливаем начало нового слова
Loop
End Sub

Sub ChangeDate()
If (Day = 31) And (Month = 12) Then ' Если это было 31 декабря
     Year = Year + 1 ' То ставим 1 января следующего года
     strDay = "01": strMounth = "01": strYear = Trim(Str(Year))
ElseIf (Day = 31) And (Month = 1) Then ' 31 января
     strDay = "01": strMounth = "02": strYear = Trim(Str(Year))
ElseIf (Day = 28) And (Month = 2) And (Year Mod 4 <> 0) Then ' 28 февраля
     strDay = "01": strMounth = "03": strYear = Trim(Str(Year))
ElseIf (Day = 29) And (Month = 2) And (Year Mod 4 = 0) Then ' 29 февраля
     strDay = "01": strMounth = "03": strYear = Trim(Str(Year))
ElseIf (Day = 31) And (Month = 3) Then ' 31 марта
     strDay = "01": strMounth = "04": strYear = Trim(Str(Year))
ElseIf (Day = 30) And (Month = 4) Then ' 30 апреля
     strDay = "01": strMounth = "05": strYear = Trim(Str(Year))
ElseIf (Day = 31) And (Month = 5) Then ' 31 мая
     strDay = "01": strMounth = "06": strYear = Trim(Str(Year))
ElseIf (Day = 30) And (Month = 6) Then ' 30 июня
     strDay = "01": strMounth = "07": strYear = Trim(Str(Year))
ElseIf (Day = 31) And (Month = 7) Then ' 31 июля
     strDay = "01": strMounth = "08": strYear = Trim(Str(Year))
ElseIf (Day = 31) And (Month = 8) Then ' 31 августа
     strDay = "01": strMounth = "09": strYear = Trim(Str(Year))
ElseIf (Day = 30) And (Month = 9) Then ' 30 сентября
     strDay = "01": strMounth = "10": strYear = Trim(Str(Year))
ElseIf (Day = 31) And (Month = 10) Then ' 31 октября
     strDay = "01": strMounth = "11": strYear = Trim(Str(Year))
ElseIf (Day = 30) And (Month = 11) Then ' 30 ноября
     strDay = "01": strMounth = "12": strYear = Trim(Str(Year))
Else ' Любой другой день
     Day = Day + 1 ' Ставим следующий день
     If (Day < 10) Then strDay = "0" & Trim(Str(Day)) Else strDay = Trim(Str(Day))
     If (Mounth < 10) Then strMounth = "0" & Trim(Str(Mounth)) Else strMounth = Trim(Str(Mounth))
End If
If Year < 10 Then
     strYear = "000" & strYear
ElseIf Year < 100 Then
     strYear = "00" & strYear
ElseIf Year < 1000 Then
     strYear = "0" & strYear
End If
Stroka = Left(Stroka, Poz1) & strDay & strMonth & strYear & Mid(Stroka, Poz2)
End Sub
Как видите, программа оказалась весьма непростой.

оставил комментарий БОГ (320k баллов)

Перевод достаточно простой, языки похожи. Вместо цикла Do While (условие) ... Loop пишешь while (условие) do begin ... end;

оставил комментарий БОГ (320k баллов)

Вместо цикла For i=1 To 8 ... Next i пишешь for i=1 to 8 do begin ... end;

оставил комментарий БОГ (320k баллов)

Все if и присваивания пишутся точно также, тут и менять ничего не надо.

оставил комментарий БОГ (320k баллов)

Вначале не забудь перечислить переменные

оставил комментарий БОГ (320k баллов)

var Poz1, Poz2, i, Day, Month, Year : integer

оставил комментарий БОГ (320k баллов)

var Stroka, strDay, strMonth, strYear : string

оставил комментарий БОГ (320k баллов)

var Flag: boolean

оставил комментарий БОГ (320k баллов)

Вот здесь хороший учебник по паскалю, уточни, может какие функции по-другому пишутся, я все не помню: http://schools.keldysh.ru/sch887/pascal.htm

оставил комментарий БОГ (320k баллов)

если будут вопросы, обращайся

оставил комментарий (17 баллов)

спасибо большое

...