Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2010, 22:39   #1
street_spirit
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 11
По умолчанию Преобразование массива в паскале

Помогите, пожалуйста, с задачей.
Пользователь с клавиатуры вводит некий текст, и он записывается в массив из char'ов (string по условию использовать нельзя). Среди литер текста особую роль играет знак # , появление которого означает отмену стоящей перед ним буквы, несколько знаков # означает отмену аналогичного числа букв. Создать массив заполненный текстом из первого массива с учетом роли этого знака. (ХЭ#E##НЕLO#LO = HELLO).

По моей задумке текст записывается в массив а, затем копируется в массив b. Циклом мы пробегаем по массиву b и как только доходим до # мы сдвигаем массив влево на 2 символа, тем самым удаляя # и стоящий перед ним символ.

Я написал код, но он не работает. Помогите разобраться, в чем ошибка. Заранее спасибо


Код:
const n = 80;
type symbols = array[1..n] of char;
var a,b,d:symbols; i,j:integer; c: char;

begin
writeln('Vvedite tekst: ');
i:=0;
repeat
 read(c);
 if (c<>chr(10))and(c<>chr(13)) then
 begin
  inc(i);
  a[i]:=c;
 end;
until (c=chr(10))or(i=N);

b:=a;

i:=1;
while (b[i]<>#0)and(i<=n) do
 begin
  if b[i]='#' then
   begin
     j:=i-1;
     while (b[j]<>#0)and(i<=n) do
      begin
       b[j]:=a[j+2];
       inc(j);
      end;
     i:=i-1;
   end
  else
  inc(i);
 end;

i:=1;
while (b[i]<>#0)and(i<=n) do
 begin
 write(b[i]);
 inc(i);
 end;


readln;
end.
street_spirit вне форума Ответить с цитированием
Старый 03.10.2010, 22:56   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

зачем здесь ДВА прохода? Это же классический однопроходный алгоритм.
Заводите Указатель (индекс == переменную, которая показывает, какой элемент массива будет записан). Встречаем букву - добавляем её в массив, индекс увеличиваем. Встречаем # - уменьшаем индекс.

Всё. Больше ничего не надо делать!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.10.2010, 21:52   #3
street_spirit
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 11
По умолчанию

Serge_Bliznykov, а нельзя ли немножко по подробней. А то что-то не очень понятно(
street_spirit вне форума Ответить с цитированием
Старый 04.10.2010, 22:24   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, примерно так:
Код:
const n = 80;
type symbols = array[1..n] of char;
var a: symbols; i, j: integer; c: char;

begin
  writeln('Vvedite tekst: ');
  i := 0;
  repeat
    read(c);
    if (c <> chr(10)) and (c <> chr(13)) then
    begin
      if c = '#' then begin
        if i > 0 then Dec(i);
      end
      else begin
        inc(i);
        a[i] := c;
      end;
    end;
  until (c = chr(10)) or (i = N);

{вывести результат}
  Writeln;
  Write('Result string = ');
  for j := 1 to i do Write(a[j]);
  WriteLn;

  Readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.10.2010, 22:25   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, примерно так:
Код:
const n = 80;
type symbols = array[1..n] of char;
var a: symbols; i, j: integer; c: char;

begin
  writeln('Vvedite tekst: ');
  i := 0;
  repeat
    read(c);
    if (c <> chr(10)) and (c <> chr(13)) then
    begin
      if c = '#' then begin
        if i > 0 then Dec(i);
      end
      else begin
        inc(i);
        a[i] := c;
      end;
    end;
  until (c = chr(10)) or (i = N);

{вывести результат}
  Writeln;
  Write('Result string = ');
  for j := 1 to i do Write(a[j]);
  WriteLn;

  Readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.10.2010, 23:33   #6
street_spirit
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 11
По умолчанию

Serge_Bliznykov, спасибо, ваша программа действительно работает..но она не подходит по условию задачи, к сожалению. У вас ненужные символы сразу отметаются как только пользователь их вводит. А в условии сказано, что сначала пользователь вводит данные в массив и на его основе создается 2й массив уже перобразованный. : (
street_spirit вне форума Ответить с цитированием
Старый 05.10.2010, 08:17   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Господи. ну это же ещё проще (тот же подход, только количество входных символом уже известно и на chr(10) chr(13) не надо проверять):
Код:
Kol := i; {рекомендую сохранить количество элементов в переменную Kol, 
            так нагляднее и понятней}
i:=0;
for j:=1 to Kol do
  if a[j]<>'#' then begin
    inc(i);
    b[i] := a[j];
  end
  else begin
    if i>0 then Dec(i);
  end;

{вывести результат}
  Writeln;
  Write('Result string = ');
  for j := 1 to i do Write(b[j]);
  WriteLn;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.10.2010, 08:59   #8
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

а зачем тут 2 массива
Цитата:
Код:
b[i] := a[j];
все ж можно в 1 сделать
Код:
var s:array[1..13] of Char;
    i:Integer;
    k:Integer;
    n:Integer;
begin
  { TODO -oUser -cConsole Main : Insert code here }
  s:='XR#E##HELO#LO';
  i:=1;
  n:=13;
  while i<=n do
  begin
   if s[i]='#' then begin
   for k:=i-1 to n-2 do
      begin
      s[k]:=s[k+2];
       end;
      Dec(n,2);
      dec(i);
      end
   else inc(i);
  end;
 for i:=1 to n do
 write(s[i]);
 Readln;
end.
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 05.10.2010, 09:17   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Mad_Cat, а Вы только мой последний пост читали? Или всю тему прочли?
Если только мой последний пост, тогда сообщаю Вам, что требование о втором массиве (по утверждению автора топика) — это обязательное требование задачи:
Цитата:
в условии сказано, что сначала пользователь вводит данные в массив и на его основе создается 2й массив уже перобразованный
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.10.2010, 19:08   #10
street_spirit
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 11
По умолчанию

Serge_Bliznykov, cпасибо огромное!
street_spirit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование двумерного массива в одномерный... S.Mihail Паскаль, Turbo Pascal, PascalABC.NET 5 09.12.2011 19:24
Преобразование массива с++ davart Помощь студентам 3 01.10.2010 09:25
Преобразование числового массива в набор текстовых файлов roy71 Microsoft Office Excel 9 15.02.2010 17:43
преобразование массива PARTOS Microsoft Office Excel 4 20.01.2010 17:21