Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 30.01.2018
Сообщений: 38

Условие не выполняется

30.01.2018, 16:17. Показов 1444. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дана последовательность, содержащая от 2 до 50 слов, в каждом из которых от 1 до 8 строчных латинских букв; между соседними словами-не менее одного пробела, за последним словом-точка.
Напечатать те слова последовательности, которые отличны от последнего слова и удовлетворяют следующему свойству: слово симметрично(например, avva).
Нужно учесть все тонкости задания, в данный момент у меня проблема в том, что программа запускается, когда нет точки в конце слова, так и работает при этом некорректно
Код:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
label vvod,otbor,pss;
var
n,l:integer;
str,slovo:string;
A:array of string;
B:array  of boolean;
i,j,k,h:integer;
  begin
  repeat
  writeln('Введите количесвто слов(от 2 до 50),которое собираетесь вводить,слово должно состоять от 1 до 8 строчных латинских букв');
 
 
 
  readln(n);
  until (n>1) and (n<=50);
  SetLength(A,n);
  SetLength(B,n);
  k:=-1;
  read(str);
  vvod:
 
  for i:=1 to length(str) do begin //заполняем массива слов
      if (str[i]=' ') or (str[i]='.') or (str[i] in ['A'..'Z']) or (str[i] in ['А'..'Я']) or (str[i] in ['а'..'я'])   then begin
        k:=k+1; //индексация массива А
        for j:=1 to i-1 do
          A[k]:=A[k]+str[j];
            begin //делаем 1 пробел между словами
            l:=1;
            repeat
              if copy(str,l,2)='  ' then
              str := copy(str,1,l) + copy(str,l+2,length(str))
              else
                l := l + 1
        until (l > length(str));
        end;
     Delete(str,1,i); //удаляем пробел
   
    if str<>nil then goto vvod;
 
  end;
  
end;
B[n-1]:=false; //поледнее слово не выводим
for i:=0 to n-1 do //проверяем каждое слово на симметричность
  begin
    slovo:=A[i];
    h:=length(A[i]);
    k:=0;
    for j:=1 to h div 2 do 
      if slovo[j]=slovo[h+1-j] then k:=k+1;
    if k=h div 2 then B[i]:=true else B[i]:=false;
    if h>8 then goto vvod;
  end;
  
 
for i:=0 to n-2 do //проверяем слова на равенство с последним
  if A[i]=A[n-1] then B[i]:=false;
 
writeln('Результат: '); //выводим результат
for i:=0 to n-2 do
  if B[i]=true then write(A[i],' ');
  end.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.01.2018, 16:17
Ответы с готовыми решениями:

Не выполняется условие
Задание: Сумма первой и последней цифры четырехзначного числа равна второй цифре. Внести изменение в текст программы, добавить проверку...

Условие выполняется, но программа так не считает
Здравствуйте, если посчитать так, то условие выполняется (-7+3)/2+10=-7*-2; 14=14; Но программа почему-то не засчитывает, что данное...

Указатели: выяснить, выполняется ли условие для заданного числа
Даны натуральное число n, целые числа a1, ..., a2n. Выяснить, верно ли, что для i = l, ..., n выполнено a2n-i+1 &lt; ai &lt; a2n-i.

15
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
31.01.2018, 07:27
Цитата Сообщение от Wein Посмотреть сообщение
Дана последовательность, содержащая от 2 до 50 слов… за последним словом-точка.
Т.е. это какая-то строка. Но пользователю не обязательно считать количество этих слов!
Достаточно всего лишь ввести строку и в случае, если в ней присутствует точка, обрезать хвостик по её позиции:
Pascal
1
2
3
4
5
begin
  var s := ReadLnString('Введите последовательность слов:');
  if s.IndexOf('.')>-1 then s := s.Left(s.IndexOf('.'));
  WriteLn(s);
end.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~

Цитата Сообщение от Wein Посмотреть сообщение
в каждом из которых от 1 до 8 строчных латинских букв; между соседними словами-не менее одного пробела,
Это очень просто разбить на слова:
Pascal
1
2
3
4
5
6
7
begin
  var s := ReadLnString('Введите последовательность слов:');
  if s.IndexOf('.')>-1 then s := s.Left(s.IndexOf('.'));
  if s.Length = 0 then Halt;
  var words := s.ToWords;
  foreach var word in words do WriteLn(word);
end.
Ну а на латинские буквы можно „забить“ ;–)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~

Ну и по сути задания:
Pascal
1
2
3
4
5
6
7
8
9
begin
  var s := ReadLnString('Введите последовательность слов:');
  if s.IndexOf('.')>-1 then s := s.Left(s.IndexOf('.'));
  if s.Length = 0 then Halt;
  var words := s.ToWords;
  foreach var word in words do
    if (word <> words.Last) and (word = ReverseString(word)) then
      Print(word);
end.
Вот и всё!

Хотя последние три строки можно с лёгкостью заменить на одну:
Pascal
1
2
3
4
5
6
begin
  var s := ReadLnString('Введите последовательность слов:');
  if s.IndexOf('.')>-1 then s := s.Left(s.IndexOf('.'));
  if s.Length = 0 then Halt;
  s.ToWords.Where(word->(word <> s.ToWords.Last) and (word = ReverseString(word))).PrintLn;
end.
1
0 / 0 / 0
Регистрация: 30.01.2018
Сообщений: 38
31.01.2018, 10:29  [ТС]
Ну меня конечно удивило, как все красиво сделано, но проблема не решена, программа все равно запускается если за последним словом отсутствует точка и на латинские буквы забить нельзя, также они должны быть строчными, это обязательные условия.
@JuriiMW
Миниатюры
Условие не выполняется  
0
0 / 0 / 0
Регистрация: 30.01.2018
Сообщений: 38
31.01.2018, 10:38  [ТС]
Также программа работает, если в слове больше 8 символов
@JuriiMW
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
31.01.2018, 10:42
Лучший ответ Сообщение было отмечено Wein как решение

Решение

Чтобы не запускалась без точки, добавить условие:
Pascal
3
  if s.IndexOf('.')<0 then Halt;
Если не забивать на строчные латинские, то что же делать, если в строке вдруг появятся не только строчные латинские, а ещё и прописные или даже русские, или вообще какие-то цифры и символы препинания?
Ну, раз надо, значит надо:
Pascal
1
2
3
4
5
6
7
8
begin
  var s := ReadLnString('Введите последовательность слов:');
  if s.IndexOf('.')<0 then Halt;
  if s.IndexOf('.')>-1 then s := s.Left(s.IndexOf('.'));
  if s.Length = 0 then Halt;
  if Regex.Replace(s, '[^ a-z]', '').ToString <> s then Halt;
  s.ToWords.Where(word->(word <> s.ToWords.Last) and (word = ReverseString(word))).PrintLn;
end.
Добавлено через 1 минуту
P.S. Это я ещё не стал прикручивать проверку на длину слов до 8 символов…
Оставил вам для самостоятельной реализации ;–)
1
0 / 0 / 0
Регистрация: 30.01.2018
Сообщений: 38
31.01.2018, 10:44  [ТС]
Спасибо Вам большое!!! Теперь надо будет разобраться в этом коде, но это нечто). Удачи Вам.
@JuriiMW
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
31.01.2018, 10:49
Цитата Сообщение от Wein Посмотреть сообщение
но это нечто)
Щас придёт volvo и сделает вашу программу вообще всю в одну строку…

P.P.S. Выход при „> 8“
Pascal
1
  if s.ToWords.Max(word->word.Length) > 8 then Halt;
1
0 / 0 / 0
Регистрация: 30.01.2018
Сообщений: 38
31.01.2018, 10:53  [ТС]
Ну для человека, который приступил к паскалю с нуля 2 месяца назад и это шедевр , может посоветуете что-нибудь и не буду упускать этот шанс.

@JuriiMW
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
31.01.2018, 10:54
Совет один: Практикуйся!
0
0 / 0 / 0
Регистрация: 30.01.2018
Сообщений: 38
31.01.2018, 10:55  [ТС]
Просто словил стыд за свой код
@JuriiMW
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
31.01.2018, 10:59
Да простят меня модераторы, вот ссылочка с хорошими задачами для практики: Project Euler
Регистрация обязательная, но бесплатная…
(Для „входа“ в условия на английском, можно ещё и на русском: Проект Эйлер)
2
0 / 0 / 0
Регистрация: 30.01.2018
Сообщений: 38
31.01.2018, 11:02  [ТС]
Искренне благодарен! Спасибо за выделенное время!
@JuriiMW
0
31.01.2018, 20:53

Не по теме:

JuriiMW, ну всё... :ireful: Теперь Вам конец. ]:-> Сейчас как всё проверю... Нет ссылок на другие форумы, нет нарушения авторского права, и нет ответа на вопрос темы в виде ссылки на решение по вопросу темы. Реклама, спам или нежелательный контент в ссылках не найден! Вы попались! Никаких нарушений! Единственное - сообщение не по теме, но портить Ваше сообщение тегами [OFF][/OFF], если честно, рука не поднимается... Очень полезное сообщение, по моему мнению. :yes: :senor:

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33412 / 21522 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 12
01.02.2018, 14:38
Цитата Сообщение от JuriiMW Посмотреть сообщение
Щас придёт volvo и сделает вашу программу вообще всю в одну строку…
В одну тут вряд ли получится, но я бы написал без RegEx-ов:
Pascal
1
2
3
4
5
6
7
8
begin
  var s := ReadlnString('s ='); s := LeftStr(s, s.IndexOf('.') + 1);
  var w := s.ToWords(' .'.ToArray);
  if (s.Trim = '') or (s.Any(v -> not (v in [' ', '.', 'a' .. 'z'])))
                   or (not w.Count.InRange(2, 50)) 
                   or (w.Any(v -> v.Length > 8)) then writeln('Ошибочные входные данные')
  else w.Where(v -> (v <> w.Last) and (v = ReverseString(v))).Println;
end.
0
0 / 0 / 0
Регистрация: 30.01.2018
Сообщений: 38
01.02.2018, 18:10  [ТС]
volvo,
Цитата Сообщение от volvo Посмотреть сообщение
InRange
паскаль ошибку выдает и программа не запускается
0
Эксперт Pascal/Delphi
6812 / 4568 / 4820
Регистрация: 05.06.2014
Сообщений: 22,433
01.02.2018, 18:13
Wein, обновите pabc.net
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.02.2018, 18:13
Помогаю со студенческими работами здесь

Найти первый член для которого выполняется условие
Последовательность образована по закону:

Найти первый член последовательности, для которого выполняется условие
Дано действительное число ε (ε&gt;0). Последовательность a1, a2, … образована по следующему закону: a(n)=(1-1/2)(1-1/3)...(1-1/n+1); ...

Найти первый из номеров последовательности, для которых выполняется условие
Помогите решить с обьяснением пожалуйста: Дано число D (&gt; 0). Последовательность чисел AN определяется следующим образом: A1 = 2, ...

Оператор условия не открывает ветвь then begin end, несмотря, на то, что условие выполняется
Учусь по самоучителю &quot;Песни о Паскале&quot;. Код программы предложенный автором не кидать, и ваши коды тоже т.к. сам хочу разобраться. Условие...

Не выполняется условие
В двух словах, надо написать программу которая проверяла бы что x^2 + y^2 = z^2 при заданном n для всех x, y и z меньших 100 не имеет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru