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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2012, 13:27   #1
Onill
 
Регистрация: 28.04.2012
Сообщений: 5
Лампочка Обработка строк в Delphi

Здравствуйте, помогите разобраться в написании некоторых программ, я новичек по данной категории, кому не сложно напишите код программы в Delphi7, с объяснением.

1)Дана строка, содержащая полное имя файла. Выделить из этой строки название последнего каталога (без символов «\»). Если файл содержится в корневом каталоге, то вывести символ «\».

2)Дано зашифрованное предложение на русском языке (способ шифрования - Зашифровать строку, выполнив циклическую замену каждой буквы на букву того же регистра, расположенную в алфавите на K-й позиции после шифруемой буквы (например, для K = 2 «А» перейдет в «В», «а» — в «в», «Б» — в «Г», «я» — в «б» и т. д.). Букву «ё» в алфавите не учитывать, знаки препинания и пробелы не изменять.) и кодовое смещение K (0 < K < 10). Расшифровать предложение.

3)Дано предложение, зашифрованное по правилу(строку зашфровать, поместив вначале все символы, расположенные на четных позициях строки, а затем, в обратном порядке, все символы, расположенные на нечетных позициях (например, строка «Программа» превратится в «ргамамроП»). Расшифровать это предложение.

буду благодарен если кто откликнется
Onill вне форума Ответить с цитированием
Старый 28.04.2012, 13:44   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

задачи простые. но 2-я и 3-я решение, конечно, займёт какое-то время..

1-я.
Код:
var i, PosSlash1, PosSlash2 : integer; 
    s : string;
    LastFolder : string;
begin
   s := Edit1.Text;
   i := length(s);
   while (i>0) and ( s[i]<>'\' ) do Dec(i);
   if i>0 then PosSlash1 := i
   else begin
      ShowMessage('Ошибка! В исходной строке не задано полное имя файла!');
      Exit;
   end;
   Dec(i);
   while (i>0) and ( s[i]<>'\' ) do Dec(i);
   if i>0 then begin 
         PosSlash2 := i;
         LastFolder := Copy(s, PosSlash2 + 1, PosSlash1-PosSlash2-1);
   end
   else  LastFolder := '\';

   ShowMessage('Последний каталог = '+LastFolder);
если нужно консольное приложение, то замените ввод на Readln и все ShowMessage на WriteLn


а Вы сами что-то делать собираетесь? Или будете ждать готовенького решения задач?!

Последний раз редактировалось Serge_Bliznykov; 28.04.2012 в 13:46.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.04.2012, 13:50   #3
Onill
 
Регистрация: 28.04.2012
Сообщений: 5
По умолчанию

я сделал предъидущие 4 задачи, могу показать для подтверждения, просто эти 3 вызвали у меня заруднение. Тк 1 раз с таким сталкиваюсь.
Onill вне форума Ответить с цитированием
Старый 28.04.2012, 14:10   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Onill Посмотреть сообщение
я сделал предъидущие 4 задачи, могу показать для подтверждения, просто эти 3 вызвали у меня заруднение. Тк 1 раз с таким сталкиваюсь.
ясно.
т.е. всё-таки самостоятельно будете пытаться решить?
это похвально.

тогда маленькие советы/подсказки/hints:

вторая задача.
я бы завёл константу, содержащую весь допустимый алфавит. Номер символа в этой строки и даст нам код буквы. дальше к полученному коду нужно прибавить число K (NewCode := OldCode + K) и, если полученное число меньше длины алфавита, то взять из алфавита символ с кодом NewCode, если же число NewCode > длины алфавита, то нужно из этого кода вычесть длину алфавита и затем взять из алфавита символ с кодом NewCode.

у меня, конечно, чешутся руки написать решение. но я оставляю это удовольствие Вам

подсказки в виде кода
Код:
const
   Alphabet = 'абвгдежзийклмнопрстуфхцчшщъыьэюя';
   AlphabetUpper = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';

...
  перебор символов строки
  for i:=1 to Length(s)

...
  найти код символа в заданном алфавите (грубо говоря, позицию символа в строке-константе)
  OldCode := Pos( s[i], Alphabet);

  если полученный код получился 0 - но символа нет в данном алвавите и символ нужно оставить как есть


  NewCode := OldCode + K;
  if NewCode>Length(Alphabet) 
        then NewCode := NewCode - Length(Alphabet);


  получить символ с кодом NewCode из строки Alphabet
  s[i] := Alphabet[ NewCode ];

для третьей задачи я бы рекомендовал воспользоваться дополнительной строкой - где и накапливать результаты... а перебирать символы исходной строки двумя циклами - сначала по чётным индексам, потом, в обратную сторону, по нечётным...

Последний раз редактировалось Serge_Bliznykov; 28.04.2012 в 14:12.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.04.2012, 14:20   #5
Onill
 
Регистрация: 28.04.2012
Сообщений: 5
По умолчанию

Serge_Bliznykov спасибо за помощь неожидал, что кто-либо откликнится, если у меня будут вопросы по 3, могу ли я вам их задать?
Onill вне форума Ответить с цитированием
Старый 28.04.2012, 14:59   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Onill Посмотреть сообщение
Serge_Bliznykov спасибо за помощь неожидал, что кто-либо откликнится

пожалуйста!

Цитата:
Сообщение от Onill Посмотреть сообщение
, если у меня будут вопросы по 3, могу ли я вам их задать?
ну разумеется!
в этой же теме можете их и задавать.
И чем вопросы будут более конкретными (с вашими наработками в виде кода), тем быстрее и конкретнее получите ответ...


p.s. хотя, если честно, третья задача тоже очень простая. не думаю, что при её решении Вы запутаетесь..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.05.2012, 10:02   #7
Onill
 
Регистрация: 28.04.2012
Сообщений: 5
По умолчанию

К сожалению со 2 программой у меня вышли затруднения.. Попытался зашифровать строку и выполнить замену, но ничего не вышло

Код:
var
  i:integer;
  s,k:string;
begin
  a:= Edit30.Text;
  for i:=1 to length(s) do begin
    a:=ord(s[i]);
    if (a>191)and(a<224-k)and(a>224)and(a<225-k) then s[i]:=chr(a+k);
  end;
  edit31.text:=S;
end;


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 03.05.2012 в 10:43.
Onill вне форума Ответить с цитированием
Старый 03.05.2012, 10:42   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Onill, Вы мой пост #4 видите? Там строчки кода с комментариями видите?
Какое отношение ваши ord() и сравнения с 191, 224, 225 имеют к этому коду можете объяснить?
(и, кстати, вы хотя бы понимаете, что эти волшебные циферки обозначают? )

дальше - разве из исходного задания не ясно, что K - это целочисленная переменная?
Почему Вы её строкой сделали?!

дальше - где K иницилизируется? (в вашем случае K - это ключ шифра - на сколько символов сдвигать буквы). Где это у Вас задаётся.

дальше. что за переменная a вдруг возникла? Которой сначал строка присваивается. Потом идёт обращение к незаполненной переменной s, а потом a вдруг числовое значеие (которое ord() возвращает) присваивается).

дальше. если уже вы работаете с кодами символов напрямую так почему Вы не взяли предложенный мной алгоритм преобразования?!

Всё, что Вы написали - жуткая нелепица!


если уж так хотите работать напрямую с кодами символов, тогда рассмотрите такой пример кода
Код:
const
  AlphaBetLength = 32;

procedure TForm1.ButtonCryptClick(Sender: TObject);
{зашифровать строку путём сдвига символов на заданное число}
var
  i, K : integer;
  s: AnsiString;
  one, MaxCode : integer;
begin
  K := StrToIntDef(Edit_K.Text, 0);
  if (K<1) or (K>=10) then begin
    ShowMessage('Задайте переменную K ( 0 < K < 10 )!');
    Exit;
  end;
  s := Edit30.Text;
  for i:=1 to length(s) do begin

    if (s[i]>='А') and (s[i]<='Я') then MaxCode := ord('Я')
    else
      if (s[i]>='а') and (s[i]<='я') then MaxCode := ord('я')
      else MaxCode := 0;

    if MaxCode<>0 then begin
      one := ord(s[i]);
      one := one + K;

      if one>MaxCode then
         one := one - AlphaBetLength;
      s[i] := AnsiChar( one );
    end;  
  end;
  edit31.text:=S;
end;

Последний раз редактировалось Serge_Bliznykov; 03.05.2012 в 11:10.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.05.2012, 10:56   #9
Onill
 
Регистрация: 28.04.2012
Сообщений: 5
По умолчанию

циферки взяты из таблицы ASCI
Onill вне форума Ответить с цитированием
Старый 03.05.2012, 11:24   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я выложил вариант криптования. разбирайтесь.
попытайтесь декрипт самостоятельно написать.
Успехов.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка строк Litrian Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 22.04.2011 18:14
Обработка строк MO_oNLight Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 22.05.2010 16:20
Обработка строк в delphi Ulena Помощь студентам 5 31.03.2010 12:47
Обработка текста, строк (Delphi) ekzobyte Помощь студентам 2 28.05.2009 00:41
задачи по теме "Обработка строк" на Delphi 7 matrix8325 Помощь студентам 3 27.04.2009 09:47