Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 17.01.2012
Сообщений: 71

Программа выделяет слова в строке и удаляет несколько пробелов при необходимости

27.04.2016, 11:46. Показов 736. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени друзья. Суть программы в следующем. Ввожу строку,Затем выделяю слова из строки и записываю по одному слову в массив. Ошибка в следующем. Если встречается в строке несколько пробелов,то программа не удаляет лишние пробелы,а только зацикливается. Вот код:
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
program Poisk_Boyza_Nelsona;
 
var
  s: string;
  A: array[1..100] of string;
  i, j: integer;
 
begin
  j := 1;
  i := 1;
  Writeln('Vvedite stroky: ');
  readln(s);
  
  while S[1] = ' ' do
    delete(S, 1, 1);
  while i <= Length(S) do
  begin
      while (pos('  ', S) > 0) do
      delete(S, pos('  ', S), 1)
   
    if S[i] <> ' ' then
    begin
      A[j] := A[j] + S[i];
      inc(j);
      inc(i);
    end
    else
    begin
      writeln(A[j], ' ');
      inc(i);
    end;
  end;
end.
Подскажите где ошибка. В общем мне надо,что бы программа работала как с одним пробелом между слов,так и с несколькими пробелами между слов.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.04.2016, 11:46
Ответы с готовыми решениями:

Дана строка,где слова разделены участками из пробелов. Необходимо избавиться от лишних пробелов в строке
Дана строка,где слова разделены участками из пробелов. Необходимо избавиться от лишних пробелов в строке. Надеюсь на вашу помощь.

Удалить каждое четное слово в строке, при этом между словами может стоять не 1, а несколько пробелов
Требуется удалить каждое четное слово в строке, при этом между словами может стоять не 1 а несколько пробелов

Напечатать второе из слов, начинающихся на С, при том что в строке может быть несколько пробелов между словами
Напечатать второе из слов, начинающихся на С, при том что в строке может быть несколько пробелов между словами. Пробелы могут быть как в...

13
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
27.04.2016, 12:32
У вас где-то 2, где-то 1 пробел, используйте #32 для обозначения символа пробела, не запутаетесь
0
0 / 0 / 1
Регистрация: 17.01.2012
Сообщений: 71
27.04.2016, 12:39  [ТС]
Цитата Сообщение от capricornus CF Посмотреть сообщение
У вас где-то 2, где-то 1 пробел, используйте #32 для обозначения символа пробела, не запутаетесь
Строки:
Pascal
1
2
while S[1] = ' ' do
    delete(S, 1, 1);
Описывают что если первый символ равен пробелу,то он его удаляет.
А вот строки
Pascal
1
2
while (pos('  ', S) > 0) do
      delete(S, pos('  ', S), 1)
Должны удалять несколько пробелов между словами и оставлять один. В этом коде я не запутался. Правда эти строки и зацикливаются у меня.

Добавлено через 1 минуту
Подскажите пожалуйста,где ошибка.
0
8 / 8 / 8
Регистрация: 11.09.2015
Сообщений: 38
27.04.2016, 12:47
Цитата Сообщение от Zmei Посмотреть сообщение
while (pos(' ', S) > 0) do delete(S, pos(' ', S), 1)
Это достаточно сделать один раз, у вас вызывается для каждой позиции.

И изменять j нужно если пробел встретился, а не при каждой следующей букве.
0
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
27.04.2016, 12:56
Вообще, удаляет верно, в следующем цикле зависает. Сохраняя структуру вашего кода:
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
program Poisk_Boyza_Nelsona;
 
var
  s: string;
  A: array[1..100] of string;
  i, j: integer;
 
begin
  j := 1;
  i := 1;
  Writeln('Vvedite stroky: ');
  readln(s);
  
  while S[1] = ' ' do
    delete(S, 1, 1);
  while (pos('  ', S) > 0) do      
    delete(S, pos('  ', S), 1);
  
  for i:=1 to length(S) do    
    if S[i] <> ' ' then
    begin
      A[i] := A[i] + S[i];          
      writeln(A[i], ' ');
    end;      
end.
0
0 / 0 / 1
Регистрация: 17.01.2012
Сообщений: 71
27.04.2016, 12:59  [ТС]
Цитата Сообщение от Zvonkov Посмотреть сообщение
Это достаточно сделать один раз, у вас вызывается для каждой позиции.
И изменять j нужно если пробел встретился, а не при каждой следующей букве.
Вы имеете в виду вот так?
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
program Lineinii_poisk;
 
var
  s: string;
  A: array[1..100] of string;
  i, j: integer;
 
begin
  j := 1;
  i := 1;
  Writeln('Vvedite stroky: ');
  readln(s);
  
  while S[1] = ' ' do
    delete(S, 1, 1);
  
  while (pos('  ', S) > 0) do
    delete(S, pos('  ', S), 1);
  
  while i <= Length(S) do
  begin
    if S[i] <> ' ' then
    begin
      A[j] := A[j] + S[i];
      inc(i);
    end
    else
    begin
      writeln(A[j], ' ');
      inc(i);
      inc(j);
    end;
  end;
end.
0
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
27.04.2016, 13:01
без while, пост №5
0
8 / 8 / 8
Регистрация: 11.09.2015
Сообщений: 38
27.04.2016, 13:06
Вот, поправил. Правда код не красивый. Лучше с нуля писать :-)
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
program Poisk_Boyza_Nelsona;
 
var
  s: string;
  A: array[1..100] of string;
  i, j: integer;
 
begin
  j := 1;
  i := 1;
  Writeln('Vvedite stroky: ');
  readln(s);
  
  while S[1] = ' ' do
    delete(S, 1, 1);
  while (pos('  ', S) > 0) do
    delete(S, pos('  ', S), 1);
 
  while i <= Length(S) do
  begin
    if S[i] <> ' ' then
    begin
      A[j] := A[j] + S[i];
      inc(i);
    end
    else
    begin
      writeln(A[j], ' ');
      inc(i);
      inc(j);
    end;
  end;
  writeln(A[j], ' ');
end.
Добавлено через 3 минуты
Не обновил страницу...
Да так. Только ещё добавить вывод последнего слова, как сделал в сообщении выше.

capricornus CF, через for - тоже вполне вариант, только забыли что А - это массив строк, у вас получилось по одной букве переписываем
0
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
27.04.2016, 13:12
Цитата Сообщение от Zvonkov Посмотреть сообщение
А - это массив строк, у вас получилось по одной букве переписываем
Ну, собственно, не вникал, задания ведь нет:
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
var
  s: string;
  A: array[1..100] of string;
  i, j: integer;
 
begin
  j := 1;
  i := 1;
  Writeln('Vvedite stroky: ');
  readln(s);
  
  while S[1] = ' ' do
    delete(S, 1, 1);
  while (pos('  ', S) > 0) do      
    delete(S, pos('  ', S), 1);
  
  for i := 1 to length(S) do 
  begin  
    if S[i] <> ' ' then    
      A[j] := A[j] + S[i] else 
      begin
       writeln(A[j], ' ');
       inc(j);
      end;        
  end
end.
0
0 / 0 / 1
Регистрация: 17.01.2012
Сообщений: 71
27.04.2016, 13:15  [ТС]
О я вас благодарю за помощь и правильный код.

Цитата Сообщение от Zvonkov Посмотреть сообщение
Вот, поправил. Правда код не красивый. Лучше с нуля писать :-)
А не покажите мастер класс? Я в этом человек можно сказать не новый,но и поучиться не против. Согласен,что код не красивый. Может предложите свой вариант. С удовольствием узнал бы другой метод.
0
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
27.04.2016, 13:19
Zvonkov, у вас переменная i в цикле с 19 по 31 строки меняется безусловно (либо в одном либо в другом блоке), чтобы не плодить дубли кода - выход в цикле for, в вашем варианте можно поставить ее после условного блока:
Pascal
19
20
21
22
23
24
25
26
27
28
29
while i <= Length(S) do
  begin
    if S[i] <> ' ' then    
      A[j] := A[j] + S[i]
    else
    begin
      writeln(A[j], ' ');
      inc(j);      
    end;
    inc(i);
  end;
0
8 / 8 / 8
Регистрация: 11.09.2015
Сообщений: 38
27.04.2016, 13:23
Zmei, спасибо. Можно взять код capricornus CF - будет красивее, и как заметили - правильнее.

Ну и чтобы совсем хорошо было, нужно ещё удалить пробелы в конце строки, например, вот так:
Pascal
1
2
  while S[length(S)] = ' ' do
    delete(S,length(S),1);
Или функцию
Pascal
1
trim(s)
использовать.
0
0 / 0 / 1
Регистрация: 17.01.2012
Сообщений: 71
27.04.2016, 13:24  [ТС]
Я вам благодарен за объяснения и потраченное время на меня. Думаю я много из этого узнал. Ваши старания не прошли даром.
0
8 / 8 / 8
Регистрация: 11.09.2015
Сообщений: 38
27.04.2016, 13:31
Удачи! На всякий случай итоговый код:
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
program Poisk_Boyza_Nelsona;
 
var
  s: string;
  A: array[1..100] of string;
  i, j: integer;
 
begin
  j := 1;
 
  Writeln('Vvedite stroky: ');
  readln(s);
 
// Lвумя while удаляем пробелы вначале и конце строки.
// Вместо этого можно использовать функцию trim
  while S[1] = ' ' do
    delete(S, 1, 1);
 
  while S[length(S)] = ' ' do
    delete(S,length(S),1);
 
  while (pos('  ', S) > 0) do
    delete(S, pos('  ', S), 1);
 
  for i := 1 to Length(S) do
  begin
    if S[i] <> ' ' then
      A[j] := A[j] + S[i]
    else
    begin
      writeln(A[j]);
      inc(j);
    end;
  end;
  writeln(A[j]);
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.04.2016, 13:31
Помогаю со студенческими работами здесь

В заданной строке определить количество слов (в строке может содержаться несколько пробелов подряд).
В заданной строке определить количество слов (в строке может содержаться несколько пробелов подряд).

Программа, которая вводит текст, удаляет в нем все слова заданной длины, а оставшиеся слова выводит в алфавитн
Разработать программу, которая вводит текст, удаляет в нем все слова заданной длины, а оставшиеся слова выводит в алфавитном порядке.

Массив символов (Подсчитать количество слов в строке, при условии, что в качестве разделителя слов используется один или несколько пробелов)
Написать программу, в которой с клавиатуры вводится строка символов. Подсчитать количество слов в строке, при условии, что в качестве...

Как заменить в строке несколько пробелов на один?
усли в строке между словами несклько пробелов, то как сделать чтобы между словами остался один пробел и этот пробел заменился на символ...

Как в строке несколько подряд идущих пробелов заменить на один?
1.Как в строке несколько подряд идущих пробелов заменить на один? 2.Как подсчитать кол-во слов в строке? (слова отделены друг от друга...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru