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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2011, 17:30   #11
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
Сообщение от Anton911 Посмотреть сообщение
Спасибо. Еще вопрос: Можно ли какнибудь проверить являетсяли тип переменной integer или string?
Элементарно
Пусть вашу переменную "зовут" elem.
Тогда вот вам примерчик:
Код:
Label1.Caption:=VarTypeAsText(VarType(elem));
asmodey1 вне форума Ответить с цитированием
Старый 08.09.2011, 18:15   #12
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Вобщем Нехочу плагиатить чужого, хочу методом проб и ошибок сделать шифровку\дешифровку. Пусть даже если и будет слабая, потом может быть наберусь опыту улучшу. Покачто сделал так:

ШИФРОВКА:
Код:
procedure TForm1.CodeClick(Sender: TObject);
var
s,IntCode:string;
len,i,CRC:integer;
begin
s:=editconsole.text;
editconsole.text:='';
len:=length(s);
if len<>0 then
i:=1;
IntCode:='';
while i<=len do
begin
CRC:=CRC+ord(s[i]);
IntCode:=IntCode+Inttostr(ord(s[i])+(2*i))+'$';
i:=i+1;
end;
IntCode:=IntCode+IntToStr(CRC);
memoconsole.Lines.Add(s+'='+IntCode);
end;
ДЕШИФРОВКА:
Код:
procedure TForm1.EncodeClick(Sender: TObject);
var
s,IntCode,temp:string;
len,i,CRC:integer;
begin
s:=editconsole.text;
editconsole.text:='';
len:=length(s);
if len<>0 then
i:=1;
IntCode:='';
CRC:=0;
while Pos('$',s)<>0 do
begin
temp:='';
temp:=Copy(s,1,Pos('$',s)-1);
Delete(s,1,Pos('$',s));
CRC:=CRC+(strtoint(temp)-(2*i));
IntCode:=intcode+chr(strtoint(temp)-(2*i));
memoconsole.Lines.Add('i='+inttostr(i));
i:=i+1;
end;
if CRC<>strtoint(s) then memoconsole.Lines.Add('Нарушена контрольная сумма')
else
memoconsole.Lines.Add(s+'='+IntCode+' CRC='+inttostr(CRC));
end;
Вот только, мне нужно как-либо проверить является ли temp:=Copy(s,1,Pos('$',s)-1); Числом, если да то продолжить работу если нет, то написать в memoconsole "Ошибка в данных". Поэтому вот и решил проверить на тип данных. Но я в тупике

asmodey1, ваш пример работает, но не совсем так как мне нужно. Мне нужно проверить что находится в переменной числа или символы, Не важно string переменная или char или word или другая. Я изначально вопрос не правильно поставил...
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 08.09.2011 в 18:23.
Anton911 вне форума Ответить с цитированием
Старый 08.09.2011, 22:50   #13
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
Сообщение от Anton911 Посмотреть сообщение
Мне нужно проверить что находится в переменной числа или символы, Не важно string переменная или char или word или другая. Я изначально вопрос не правильно поставил...
А если в переменной типа string внесены символы цифр ?
Посмотрите фунцию TryStrToInt...
Кстати, а как в word могут находиться символы ???
У вас там что - вообще свалка всех возможных типов ? Это что, новое извращение такое ?

Последний раз редактировалось asmodey1; 08.09.2011 в 22:53.
asmodey1 вне форума Ответить с цитированием
Старый 09.09.2011, 05:38   #14
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Цитата:
Сообщение от asmodey1 Посмотреть сообщение
А если в переменной типа string внесены символы цифр ?
Посмотрите фунцию TryStrToInt...
Кстати, а как в word могут находиться символы ???
У вас там что - вообще свалка всех возможных типов ? Это что, новое извращение такое ?
Спасибо, функция работает Что насчет word и char и прочего, это я просто пример привел. У меня шифровщик отдельная программа и весь его код сообщением выше

У меня тут еще 1 вопрос назрел, наверно очень глупповат... Но всеже, Никак немогу поделить integer на integer;
Предположим
Код:
Var
a,b,c:integer;
begin
c:=a/b;
И выдает ошибку типа: Incompatible types: 'Integer' and 'Extended'

Погуглил в интернете, нашел что нужно переводить в real, но если я так делать буду то будет много лишних безсмысленных и ненужных действий. Можноли это проще сделать?
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 09.09.2011, 05:53   #15
Surgeon
Форумчанин
 
Регистрация: 04.10.2007
Сообщений: 106
По умолчанию

Цитата:
Сообщение от Anton911 Посмотреть сообщение
У меня тут еще 1 вопрос назрел, наверно очень глупповат... Но всеже, Никак немогу поделить integer на integer;
Предположим
Код:
Var
a,b,c:integer;
begin
c:=a/b;
И выдает ошибку типа: Incompatible types: 'Integer' and 'Extended'

Погуглил в интернете, нашел что нужно переводить в real, но если я так делать буду то будет много лишних безсмысленных и ненужных действий. Можноли это проще сделать?
Результат операции деления всегда дробное число, вне зависимости от реального результата.
Можно так:
Код:
c:=Round(a/b)
Есть и другие виды функции округления , а есть еще операция целочисленного деления div:
Код:
c:=a div b
Но при округлении уйдет часть числа а это не гуд.
Все не так плохо, как вам кажется, на самом деле все гораздо хуже.
http://delphiworld.narod.ru/dw.html - 5000 статей!!! удобный поиск, оффлайн сборник, рекомендую всем
Surgeon вне форума Ответить с цитированием
Старый 09.09.2011, 12:47   #16
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Достаточно просто объявить с как extended...
asmodey1 вне форума Ответить с цитированием
Старый 16.09.2011, 18:06   #17
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию Улучшенный алгоритм

Кодировщик:
Код:
function TForm1.MyCodeEncode(esString:string;iEncodee:integer):String;
var
s,IntCode,temp:string;
len,i,intt,Encodeee,RandInt:integer;
ext:extended;
CRC:real;
begin
s:=esString;
len:=length(s);
i:=1;
IntCode:='';
CRC:=0;
if len<>0 then
begin
case iEncodee of
0:
begin
Randomize;
RandInt:=Random(9)+1;
      while i<=len do
      begin
      CRC:=CRC+ord(s[i]);
      ext:=ord(s[i])*((2+i)*i)+RandInt;
      IntCode:=IntCode+floattostr(ext)+'$';
      i:=i+1;
      end;
IntCode:=IntCode+floatToStr(CRC)+inttostr(RandInt);
Result:=IntCode;
end;
1:
begin
RandInt:=strtoint(Copy(s,len,1));
Delete(s,len,1);
len:=length(s);
if Pos('$',s)<>0 then
begin
  while Pos('$',s)<>0 do
  begin
  temp:='';
  temp:=Copy(s,1,Pos('$',s)-1);
  Delete(s,1,Pos('$',s));
 TryStrToFloat(temp,ext);
 ext:=(ext-RandInt)/((2+i)*i);
 CRC:=CRC+ext;
 IntCode:=intcode+chr(strtoint(floattostr(trunc(ext))));
 i:=i+1;
 end;
// Delete(s,length(s),1);
 TryStrToInt(s,intt);
   if CRC<>intt then Result:=''
   else
   Result:=IntCode;
end;
end;
end;
end
else  Result:='';
end;
Сжимальщик:
Код:
function TForm1.PackUnPack(sString:String;Unpack:integer):string;
var S,Temp,Res:string;
i,j:integer;
begin
Res:='';
Temp:='';
Temp:=sString;
case Unpack of
0:
begin
if Length(Temp)>1 then
begin
s:='';
while Length(Temp)>1 do
begin
s:=Copy(Temp,1,2);
Delete(Temp,1,2);
  if (s[1]<>'$') and (s[2]<>'$') then
  Res:=Res+Alfavit[strtoint(s)][1]
  else
   for j := 100 to 120 do
      if Alfavit[j][0]=s then
      begin
      Res:=Res+Alfavit[j][1];
      end;
   end;
if length(Temp)=1 then   Res:=Res+'!'+Temp;
Result:=Res;
end;
end;

1:
begin
if Length(Temp)>0 then
begin
s:='';
while Length(Temp)>0 do
begin
s:=Temp[1];
Delete(Temp,1,1);
  if (s<>'!') then
  begin
    for j := 0 to 120 do
      if Alfavit[j][1]=s then
      begin
      Res:=Res+Alfavit[j][0];
      end;
  end else
  begin
  Res:=Res+Temp[1];
  s:=''; Temp:='';
  end;
end;
end;
Result:=Res;
end;

end;
end;
Получается сначало строка S шифруется, а потом сжимается и после этого уже можно с ней работать. Если нужно расшифровать, то сначало разжимается, потом расшифровывается. Смотрите ниже...

Код:
procedure TForm1.CodeClick(Sender: TObject);
var S,s1:String;
begin
S:=MyCodeEncode(EditConsole.Text,0);
s1:=PackUnpack(S,0);
if s<>'' then
memoconsole.Lines.Add('Шифровка:'+s1)
else
memoconsole.Lines.Add('Шифровка не удалась');
editconsole.text:='';
end;
Код:
procedure TForm1.EncodeClick(Sender: TObject);
var S,s1:String;
begin
s1:=PackUnpack(EditConsole.Text,1);
S:=MyCodeEncode(s1,1);
if s<>'' then
memoconsole.Lines.Add('Дешифровка:'+s)
else
memoconsole.Lines.Add('Дешифровка не удалась, данные неверны или повреждены');
editconsole.text:='';
end;
В итоге например строка www.programmersforum.ru превратится в аЗАМhWПbЕгqУкМAДЦoКbtЖbыКfцЗivМjBЁp сЖtxЁtвЖzQНе4КйяНкБКmmИчjМюsЁow!6
Есть ли какиенибудь предложения по улучшению?
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 16.09.2011 в 18:19.
Anton911 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кодировка utf8. Работа с символами. Перевод русских букв в латинских аналог dr.Chas PHP 3 24.03.2011 16:47
Задача с символами pasha1993 Помощь студентам 5 13.10.2010 12:15
задача с символами с++ kate311893 Помощь студентам 6 19.09.2010 20:11
Рисование символами. (*_*) Общие вопросы C/C++ 2 04.03.2009 23:03