Помощь - Поиск - Пользователи - Календарь
Полная версия: строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
zmei123
ребят помогите очень надо плиз unsure.gif unsure.gif unsure.gif mega_chok.gif

дано k-литерных строк (эти строки сохраняются в массиве строк a ). Каждая строка содержит латинские и русские буквы, цифры и все возможные делители требуется:

1 надо выделить из каждой строки (сформировать еще один массив строк b и массив С из целых чисел, в котором будут храниться номера исходных строк , из которых выделяются подстроки) и напечатать подстроки (оформить процедурой)-расположенные между /* и */


если че не понятно в условии пишите прямо в форуме


надеюсь что кто нибудь поможет yes2.gif
volvo
Во-первых, давай определимся с компилятором, чем пользуешься?

Во-вторых, тебе теоретически или программу делать будем? (если программу - я перенесу тему в "Задачи")

Ну, и третье - приведи пример входного массива строк и соответствующего ему вывода...
zmei123
Цитата(volvo @ 27.01.2006 21:27) *

Во-первых, давай определимся с компилятором, чем пользуешься?

Во-вторых, тебе теоретически или программу делать будем? (если программу - я перенесу тему в "Задачи")

Ну, и третье - приведи пример входного массива строк и соответствующего ему вывода...



ну насчет компилятора то это турбо паскаль7.0 конечно
конечно нужна программа теоретически я сам ее объяснить могу

входной массив :

авыаыва/*авыаываыв*/авыаыва
аыва/*ывавы*/аывавы/*авыавыаыв*/авыаыв/*
кцукцув*/аываыв

вывод:
авыаываыв
ывавы
авыавыаыв

можеш ьпереносить тему а можеш и нет на твое усмотрение
zmei123
вот вроде че то сделал но не доконца можете объяснить в чем ошибка


Код
program mas1;

type
mas= array [1..20] of string;
mass= array [1..20] of integer;
procedure one(var a,b:mas;var c:mass;var y,x:string; k:integer;var u:integer);
var i,j,t,d,e:integer;
begin
  t:=0;
  d:=0;
  u:=0;
  x:='';
  y:='';
  for i:=1 to k do
    begin
    x:=a[i];
    begin
      begin
    T:=pos('*/',x);
    d:=pos('/*',x);
    if (t>d) then
    begin
      for e:=d+2 to t-1 do
      begin
        y:=y+a[i][e];
        {c[i]:=c[i]+s[i][e];}
        delete(x,d,1);
      end;
    end;
      end;
      begin
    if y<>'' then
    begin
      inc(u);
      b[u]:=y;
      y:='';
      c[u]:=i;
      delete(x,d,4);
      t:=0;
      d:=0;

      for e:=1 to d+1 do
      for p:=t-1 to length(x) do
      x:=x+x[e]+x[p]
    end;
      end;
    end;
  end;
end;


var a,b:mas;
    c:mass;
    n,k,i,u:integer;
    y,x:string;
begin
  writeln('vvedite k');
  readln(k);
  for i:=1 to k do
  begin
  readln(a[i]);
  end;
  one(a,b,c,y,x,k,u);
  for i:=1 to u do
  begin
  writeln(b[i],' ',c[i]);
  end;

  readln;
end.
volvo
blink.gif
Чего это такое? Попроще нельзя было сделать? Вот так, например:
program mas1;
type
  mas  = array [1..20] of string;
  mass = array [1..20] of integer;


procedure check(const a: mas; var b: mas; var c: mass;
          const n: integer; var p: integer);
var
  i, T, start, finish: integer;

begin
  p := 0;
  for i := 1 to n do begin
    start := pos('/*', a[i]);
    finish := pos('*/', a[i]);
    if start * finish > 0 then begin

      if start > finish then begin
        T := finish; finish := start; start := T
      end;

      writeln('debug: start = ', start, ' finish = ', finish);
      inc(p);
      b[p] := copy(a[i], start + 2, finish - start - 2);

      c[p] := i;

    end;

  end;
end;

var
  a, b: mas;
  c: mass;
    n,k,i,u:integer;
    y,x:string;
begin
  write('k = '); readln(k);

  for i := 1 to k do
    readln(a[i]);

  check(a, b, c, k, u);

  for i := 1 to u do
    writeln(b[i], '':5, c[i]);

  readln;
end.
zmei123
да , но если допустим строка :


fsd/*fdsfsd*/fsdfsd/*vcxvx*/vcxv
fsdfsd
fsdf

то выведет fdsfsd , а vcxvx где ?????????????

вот еще одна правдо мало отличающаяся от той только в ней я не пойму после прохода цикла он берет на 2 цикле строку из первого цикла получается каша ничего не могу поделать объясните че сдесь не так


Код
program mas1;

type
mas= array [1..20] of string;
mass= array [1..20] of integer;
procedure one(var a,b:mas;var c:mass;var y,x:string; k:integer;var u:integer);
var i,j,t,d,e,q,w,z:integer;
begin
  t:=0;
  d:=0;
  u:=0;
  x:='';
  y:='';
  for i:=1 to k do
    begin
    x:=a[i];
    for j:=1 to length(x) do
    begin
      begin
    T:=pos('*/',x);
    d:=pos('/*',x);
    if (t>d) then
    begin
      for e:=d+2 to t-1 do
      begin
        y:=y+a[i][e];
        {c[i]:=c[i]+s[i][e];}
        delete(x,d,1);
      end;
    end;
      end;
      begin
    if y<>'' then
    begin
      inc(u);
      b[u]:=y;
      y:='';
      c[u]:=i;
      delete(x,d,4);
      t:=0;
      d:=0;
      {z:=length(x);
      for q:=1 to d-1 do
      for w:=t to length(x) do
      begin
        x:=x+x[q]+x[w];
      end;
      delete(x,1,z);}
    end;
      end;
    end;
  end;
end;


var a,b:mas;
    c:mass;
    n,k,i,u:integer;
    y,x:string;
begin
  writeln('vvedite k');
  readln(k);
  for i:=1 to k do
  begin
  readln(a[i]);
  end;
  one(a,b,c,y,x,k,u);
  for i:=1 to u do
  begin
  writeln(b[i],' ',c[i]);
  end;

  readln;
end.
volvo
Цитата(zmei123 @ 28.01.2006 21:24)
да, но если допустим строка :
fsd/*fdsfsd*/fsdfsd/*vcxvx*/vcxv
fsdfsd
fsdf
то выведет fdsfsd , а vcxvx где ?????????????


Измени процедуру вот так:
procedure check(const a: mas; var b: mas; var c: mass;
          const n: integer; var p: integer);
var
  i, T, start, finish: integer;

begin
  p := 0;
  for i := 1 to n do begin

    finish := -1;
    repeat
      inc(finish, 2);

      start := finish + pos('/*', copy(a[i], finish, 255)) - 1;
      finish := finish + pos('*/', copy(a[i], finish, 255)) - 1;

      if start <> finish then begin

        if start > finish then begin
          T := finish; finish := start; start := T
        end;

        inc(p);
        b[p] := copy(a[i], start + 2, finish - start - 2);

        c[p] := i;

      end;

    until start = finish;


  end;
end;
Должно работать...

И пользуйся тегами !!!
klem4
Вот мой вариант, офрмил не очень красиво правда .. При желанииможно убрать циклы из основной части ..

uses crt;
type
   TType = string;
   TArray = array [1..100] of TType;

procedure Input(var arr : TArray; n : byte);
var
   i : byte;
begin
   for i := 1 to n do begin
      write('s[',i,']=');
      readln(arr[i]);
   end;
   writeln;
end;

procedure CheckStr(s : TType; var arr : TArray; size : byte; var i : byte);
const
   open   = '/*';
   close  = '*/';
begin
   while (length(s) > 0) and (pos(open,s) <> 0) do begin
      delete(s,1,pos(open,s)+1);
      if (pos(close,s) < pos(open,s)) or ((pos(close,s) <> 0) and (pos(open,s) = 0)) then begin
         inc(i);
         arr[i] := copy(s,1,pos(close,s)-1);
         delete(s,1,pos(close,s)+1);
      end;
   end;
end;

var
   _in,_out : TArray;
   size,size1,j : byte;
begin

   clrscr;

   write('n = '); readln(size);

   Input(_in, size);

   size1 := 0;

   for j := 1 to size do CheckStr(_in[j], _out, size, size1);

   for j := 1 to size1 do writeln(_out[j]);

   readln;

end.
zmei123
ой спасибо заработало lol.gif но мне еще надо чтобы она выводила символ (с наименьшим кодом) из получившихся строк и чтобы в исходных строках она удаляла пробелы в начале строки nea.gif
klem4
Ответы на эти вопросы найдешь тут : FAQ : Строки
zmei123
вот прога она должна выводить все тоже самое что и до этого но и удалять пробелы в исходном массиве ,чего она не делает можете объяснить почему

uses crt;
type
   TType = string;
   TArray = array [1..100] of TType;
   mass=array [1..20] of integer;

procedure Input(var arr : TArray; n : byte);
var
   i : byte;
begin
   for i := 1 to n do begin
      write('s[',i,']=');
      readln(arr[i]);
   end;
   writeln;
end;

procedure CheckStr(s : TType; var arr : TArray;var rew:mass; size : byte; var i : byte;var j:integer);
const
   open   = '/*';
   close  = '*/';
   var
   k:integer;
   e:integer;
   q:integer;
begin
   while (length(s) > 0) and (pos(open,s) <> 0) do begin
      delete(s,1,pos(open,s)+1);
      if (pos(close,s) < pos(open,s)) or ((pos(close,s) <> 0) and (pos(open,s) = 0)) then begin
	 inc(i);
	 arr[i] := copy(s,1,pos(close,s)-1);
	 rew[i]:=j;
	 delete(s,1,pos(close,s)+1);

      end;
   end;
end;


procedure tri(var s:tarray;var n:byte);
var j,q,e,k:integer;
    x:string;
begin
  k:=0;
  e:=0;
  for q:=1 to n do
  begin
    x:=s[q];
    begin
      for j:=1 to length(s[q]) do
      begin
	if copy(x,j,1)=' ' then
	begin
	  k:=k+1;
	end;
      end;
      for e:=k to length(s[q]) do
      begin
	write(x[e]);
      end;
    end;
  end;
end;
var
   _in,_out : TArray;
   rew:mass;
   size,size1,i,n : byte;
   j:integer;
begin
   clrscr;
   write('n = '); readln(size);
   Input(_in, size);
   begin
     tri(_in,size);
   end;
   size1 := 0;
   for j := 1 to size do
   CheckStr(_in[j], _out,rew, size, size1,j);
   for j := 1 to size1 do
   begin
     writeln(_out[j],' ',rew[j]);
   end;
   readln;
end.


Тегами пользоваться будем ?
volvo
Еще одно сообщение без тегов - и я тебя начну наказывать !!! mad.gif Надоел !!!

Цитата
она должна выводить все тоже самое что и до этого но и удалять пробелы в исходном массиве ,чего она не делает
Что, ВСЕ пробелы удалять? Ты задание изначально какое привел? Теперь так и будешь по крупицам что-то новое выдумывать?

"Коней на переправе не меняют"...
zmei123
извини я новичок в этом деле , значит все услвие приводить вначале хорошо так и сделаю good.gif
generic viagra with overnight de
Conecta Propecia
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.