Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Строковый тип данных

Автор: Lesnik 19.12.2006 0:25

Вводится строка из слов, разделённых пробелами или запятыми.
Разбить строку на слова и вывести их на экран в алфовитном порядке.

Просмотрел в FAQ методы сортировок и не совсем понял какая нужна. Надо делать без функций и процедур. Программа должна быть без лишних наворотов.

Тому, кто поможет, скажу ОГРОМНОЕ спасибо и буду ставить + в репутацию до конца недели smile.gif

Автор: мисс_граффити 19.12.2006 2:21

ну, допустим, + ты ставить не сможешь при всем желании.
сортировка подойдет любая, выдернуть код из функций/процедур и запихнуть в основную программу - не проблема.
для начала - разбей на слова.
с этим ты разобрался?
как разбиваешь? в массив засовываешь или по-другому?

Автор: Lesnik 19.12.2006 2:32

Цитата(мисс_граффити @ 18.12.2006 22:21) *

ну, допустим, + ты ставить не сможешь при всем желании.

Значит только спасибо smile.gif

Я выбрал этот способ
Код

const

   limits = [#0..#32,'.',',',':',';','!','?','"'];
type

   TWords = array[1..40] of string;

var
   text : string;
   words : TWords;

function GetWords(s : string; var w : TWords) : byte;
var
   i,back,n : byte;
begin
   i := 1;
   n := 0;
   while(i<=length(s)) do begin
      while(i<=length(s)) and (s[i] in limits) do
       inc(i);
      if i<=length(s) then begin
         back := i;
         while(i<=length(s)) and not(s[i] in limits) do
          inc(i);
         inc(n);
         w[n] := copy(s, back, i-back);
      end;
   end;

   GetWords := n;
end;


Вроде покороче будет.

Мы эту тему только начали изучать и мне досталась эта задача sad.gif
Код, который в функции надо вставить в основную программу как я понял?

Автор: мисс_граффити 19.12.2006 4:43

ну да.
вставляй.
и допиши ввод строки и вывод массива слов на экран (работаешь как с обычным массивом: в цикле выводишь каждый из элементов), тогда пойдем дальше.

Автор: Lesnik 19.12.2006 4:57

Цитата(мисс_граффити @ 19.12.2006 0:43) *

ну да.
вставляй.
и допиши ввод строки и вывод массива слов на экран (работаешь как с обычным массивом: в цикле выводишь каждый из элементов), тогда пойдем дальше.



Код

program COK;
uses crt;
const

   limits = [#0..#32,'.',' '];
type

   TWords = array[1..40] of string;

var
   text : string;
   words : TWords;
   i,back,n : byte;
begin
For i:=1 to 40 do
begin
Readln(text);
twords[i]:=text;
end;
   i := 1;
   n := 0;
   while(i<=length(s)) do begin
      while(i<=length(s)) and (s[i] in limits) do
       inc(i);
      if i<=length(s) then begin
         back := i;
         while(i<=length(s)) and not(s[i] in limits) do
          inc(i);
         inc(n);
         w[n] := copy(s, back, i-back);
      end;
For i:=1 to 40 do
Writeln(twords[i]);


      end.

Получилось так.

Автор: мисс_граффити 19.12.2006 5:13

хорошо, следующее задание: сделать, чтобы это работало.

Автор: Lesnik 19.12.2006 13:33

Цитата(мисс_граффити @ 19.12.2006 1:13) *

хорошо, следующее задание: сделать, чтобы это работало.


Код

program COK;
uses crt;
const

   limits = [#0..#32,'.',' '];
type

   TWords = array[1..40] of string;

var
   text : string;
   words : TWords;
   i,back,n : byte;
begin
For i:=1 to 40 do
begin
Read(text);
words[i]:=text;
end;
   i := 1;
   n := 0;
   while(i<=length(text)) do begin
      while(i<=length(text)) and (text[i] in limits) do
       inc(i);
      if i<=length(text) then begin
         back := i;
         while(i<=length(text)) and not(text[i] in limits) do
          inc(i);
         inc(n);
         words[n] := copy(text, back, i-back);
      end;
For i:=1 to 40 do
Writeln(words[i]);

end;
      end.

Запускается, но не выводит. Наверное, неправильно рассавил ввод и вывод.

Автор: Malice 19.12.2006 14:08

Да нет, все должно работать. Может Alt-F5 надо или Readln; в конце программы. Осталось только сортировку, берешь вот отсюда http://forum.pascal.net.ru/index.php?showtopic=3065 любую.

Автор: Lesnik 19.12.2006 15:25

Цитата(Malice @ 19.12.2006 10:08) *

Да нет, все должно работать. Может Alt-F5 надо или Readln; в конце программы. Осталось только сортировку, берешь вот отсюда http://forum.pascal.net.ru/index.php?showtopic=3065 любую.

Даже с ридлн выкидывает.
При альт+ф5 я вжу просто пустой экран

Автор: volvo 19.12.2006 15:40

Правильно... Ты печатаешь 40 строк (большинство из них - пустые), высота экрана = 25 строк... Что ты увидишь?

Вот это запусти:

program COK;
uses crt;
const

limits = [#0..#32,'.'];
type

TWords = array[1..40] of string;

var
text : string;
words : TWords;
i,back,n : byte;
begin
readln(text);
i := 1;
n := 0;
while(i<=length(text)) do begin
while(i<=length(text)) and (text[i] in limits) do inc(i);
if i<=length(text) then begin
back := i;
while(i<=length(text)) and not(text[i] in limits) do inc(i);
inc(n);
words[n] := copy(text, back, i-back);
end;
end;

For i:=1 to n do
Writeln(words[i]);

end.

Для того, чтобы отсортировать слова - просто ПЕРЕД выводом поставь еще любую сортировку, для 40 элементов - тот же "пузырек"...

Автор: Lesnik 19.12.2006 16:12

Цитата(volvo @ 19.12.2006 11:40) *



Для того, чтобы отсортировать слова - просто ПЕРЕД выводом поставь еще любую сортировку, для 40 элементов - тот же "пузырек"...

Перед
Код

if i<=length(text) then begin
?




Автор: volvo 19.12.2006 16:14

Нет... Перед

   For i:=1 to n do
Writeln(words[i]);

Автор: Lesnik 20.12.2006 3:10

Такс
если я выбрал этот метод сортировки

Код

Type
  arrType = Array[1 .. n] Of Integer;

Procedure Bubble(Var ar: arrType; n: integer);
Var i, j, T: Integer;
Begin
  For i := 1 To n Do
    For j := n DownTo i+1 Do
      If ar[Pred(j)] > ar[j] Then Begin { < }
        T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
      End
End;

Он подойдёт?

Если его отделять от процедуры, то он будет выглядеть так?
Код

Type
  arrType = Array[1 .. n] Of Integer;
var
ar:arrtype;
n,t:integer;
Begin
  For i := 1 To n Do
    For j := n DownTo i+1 Do
      If ar[Pred(j)] > ar[j] Then Begin { < }
        T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
      End
End;

Автор: Lesnik 20.12.2006 4:13

Вот, что получилось



Код

program COK;
uses crt;
const

   limits = [#0..#32,' ',','];
type

   TWords = array[1..40] of string;

var
   text : string;
   words : TWords;
   t,i,j,back,n : byte;
begin
clrscr;
   readln(text);
   i := 1;
   n := 0;
   while(i<=length(text)) do begin
      while(i<=length(text)) and (text[i] in limits) do inc(i);
      if i<=length(text) then begin
         back := i;
         while(i<=length(text)) and not(text[i] in limits) do inc(i);
         inc(n);
         words[n] := copy(text, back, i-back);
      end;
   end;


Begin
  For i := 1 To n Do
    For j := n DownTo i+1 Do
      If words[Pred(j)] > words[j] Then Begin { < }
        T := words[Pred(j)];
        words[Pred(j)] := words[j];
        words[j] := T
      End;
End;

   For i:=1 to n do
     Writeln(words[i]);

end.

T := words[Pred(j)]; - тут выдаёт ошибку

Автор: Malice 20.12.2006 4:15

потому что t-byte, а words[i] - string. Сделай t тоже string.

Автор: Lesnik 20.12.2006 4:21

Цитата(Malice @ 20.12.2006 0:15) *

потому что t-byte, а words[i] - string. Сделай t тоже string.

Я вместо Т продолжил использовать text.
Всё работает. Всем ОГРОМНОЕ спасибо (как и обещал ;)) и give_rose.gif