Имя: Пароль:
IT
 
такое возможно в паскале?
,
0 program345
 
28.08.14
13:07
Доброго дня!
цель: сделать инверсию символов методом рекурсии путем вызова процедуры.


исполнение:
var
a:string;


procedure revers (a:string);
  var
    b:char;
    c:integer;
  begin
    c:=length(a);
    if c=0 then
      write('вы не ввели число!');
    b:=a[c];
    write(b);
    c:=c-1;
      if c<>0 then
        revers(a)
        end;
    
    begin
      writeln('введите символы для инверсии: ');
      readln(a);
      revers(a);
      
   end.
    

\________

платформа pascalabc net
1 program345
 
28.08.14
13:08
почемуто не работает(
2 Ненавижу 1С
 
гуру
28.08.14
13:08
хвастаешься?
3 Kuzmich123
 
28.08.14
13:08
Ну, вообще, движешься в правильном направлнеии. Еще бы форум правильный подобрать - цены б не было.
4 HeroShima
 
28.08.14
13:08
Всё можно, только выбрось его.
5 HeroShima
 
28.08.14
13:10
А лучше сожги.
6 dmpl
 
28.08.14
13:11
(1) Как именно не работает?
7 DirecTwiX
 
28.08.14
13:12
if c<>0 then
        revers(Copy(a,1,c))
8 program345
 
28.08.14
13:14
(6) зацикливание
9 vs7719
 
28.08.14
13:16
Потому что, переменная с постоянно затирается при каждом рекурсивном вызове.
10 HeroShima
 
28.08.14
13:17
(8) значит c<>0 всегда срабатывает. Это не паскаль, это логика.
11 dmpl
 
28.08.14
13:17
(8) Ну дык строка же длину не меняет, тебе надо подстроку передавать, либо начальное смещение в качестве параметра.
12 neo_matrix_123
 
28.08.14
13:19
не хватает while
13 program345
 
28.08.14
13:21
хвала   DirecTwiX
вот так работает:



var
a:string;


procedure revers (a:string);
  var
    b:char;
    c:integer;
  begin
    c:=length(a);
    if c=0 then
      write('вы не ввели число!');
    b:=a[c];
    write(b);
    c:=c-1;
      if c<>0 then
        revers(Copy(a,1,c))
        end;
    
    begin
      writeln('введите символы для инверсии: ');
      readln(a);
      revers(a);
      
   end.
14 neo_matrix_123
 
28.08.14
13:21
уменьшение переменной c на единицу должно быть в цикле. в виртовском паскале это было так :-)
15 dmpl
 
28.08.14
13:25
(13) Непонятно только зачем так делать. С точки зрения производительности эта реализация - адЪ.
16 HeroShima
 
28.08.14
13:28
(15) зато с рекурсией - типа круто
17 Мутабор
 
28.08.14
13:32
Раньше от таких рекурсий стек переполнялся (под досом). Я одну прогу так же написал так она после себя не давала обращаться к дискам, приходилось перезагружаться.
18 HeroShima
 
28.08.14
13:35
Глубину нужно фиксировать.
19 Мутабор
 
28.08.14
13:36
Да, вместо обхода переменной в обратном направлении рекурсия, а еще на эту же переменную :)
20 Мутабор
 
28.08.14
13:38
Не помню, в паскале индексы с 1 начинаются?
21 program345
 
28.08.14
13:39
если есть варианты как сделать без функции copy - пожалуйста.
22 program345
 
28.08.14
13:39
(20) да
23 dmpl
 
28.08.14
13:44
(21) Вместо c:=length(a) передавай c-1 в качестве параметра.
24 DirecTwiX
 
28.08.14
13:46
(21)
for i:=length(s) downto 1 do
  write(s[i]);
25 HeroShima
 
28.08.14
13:46
(24) пошляк...
26 program345
 
28.08.14
13:51
(23) это как?
27 dmpl
 
28.08.14
13:55
(26) Тебе копия строки нужна только для того, чтобы определить индекс текущего символа. Ну так и передавай индекс.
28 program345
 
28.08.14
14:07
(27) код такой?:

var
a:string;


procedure revers (a:string);
  var
    b:char;
    c:integer;
  begin
    c:=length(a);
    if c=0 then
      write('вы не ввели число!');
    b:=a[c];
    write(b);
    c:=c-1;
      if c<>0 then
        revers(a[c-1])
        end;
    
    begin
      writeln('введите символы для инверсии: ');
      readln(a);
      revers(a);
      
   end.


не работает..
29 vcv
 
28.08.14
14:18
> сделать инверсию символов методом рекурсии
А ведь это, похоже, учебная задача. А потом  такой студент устроится в 1С и накодит такими методами реальную задачу... Грустно, господа :(
30 dmpl
 
28.08.14
14:31
(28) Параметров у процедуры должно быть 2: исходная строка и индекс.
31 program345
 
28.08.14
14:37
(30) что-то непонятно...
32 dmpl
 
28.08.14
14:46
(31) Зачем каждый раз вычислять c:=length(a), если мы знаем, что при каждом вызове результат будет меньше на 1? Не проще ли отнять от текущего значения c единицу и передать ее с вызовом? Будет revers(a, c-1)
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший