Страница 1 из 1

Процедура, обратная UpCase. Pascal

Добавлено: 15 фев 2007, 22:55
Колядин Максим
Здравствуйте, программисты! Я долго искал, но, как ни странно, не нашел в Borland Pascal процедуры обратной UpCase. Есть ли такая процедура вообще?
Мне нужно создать программу, чтобы

Код: Выделить всё

var s,s2: string;
begin
s:='QwERtY';
s2:='qwerty';
....
s и s2 были равны. Не используя модуль strings. То есть, создать программу, где нет разницы между прописными и заглавными буквами.

Re: Процедура, обратная UpCase. Pascal

Добавлено: 16 фев 2007, 07:45
Dr_Grizzly
Попробуй LowerCase

Re: Процедура, обратная UpCase. Pascal

Добавлено: 16 фев 2007, 09:51
somewhere
&quot писал(а):То есть, создать программу, где нет разницы между прописными и заглавными буквами
В паскале действительно нет функции обратной UpCase. Если уж нужно сравнивать строки с разным регистром, то UpCase вполне подойдет. Ведь вовсе не обязательно сравнивать строки в нижнем регистре, можно и в верхнем. На крайняк можно и через Ord решить этот вопрос

Re: Процедура, обратная UpCase. Pascal

Добавлено: 16 фев 2007, 14:14
Колядин Максим
Вот тут написал модуль, который решает эту проблему. Т.к разница между "А" и "а" по ASCII в 32, то подойдёт функция s2:=chr(ord(s2)-32)

Код: Выделить всё

unit dstr;

interface

var i: integer;

procedure discase(s,s2: string);

implementation

procedure discase(s,s2: string);

begin
for i:= 1 to length(s) do if s[i]<>s2[i] then begin
   s2[i]:=chr(ord(s2[i])-32);
   if s[i]<>s2[i] then s2[i]:=chr(ord(s2[i])+64);
   end;
end;
end.
Написал, но с его использованием возникла проблемка -модуль ничего не обрабатывает. Не знаю, что я не так сделал, но как был s2='qwerty', так и остался. Хотя должен быть равен s(s='QwERtY').
Использую свой модуль так:

Код: Выделить всё

uses dstr,crt; 
var 
s,s2:string;
i: integer;
begin
clrscr;
readln(s);
readln(s2);
discase(s,s2);
if s=s2 then write('Строки равны.') else write('Строки не равны');
readkey;
end.
Может что-нибудь не так написал?

Re: Процедура, обратная UpCase. Pascal

Добавлено: 16 фев 2007, 14:24
Absurd
Колядин Максим писал(а):То есть, создать программу, где нет разницы между прописными и заглавными буквами.
Так делать не надо. Всегда используй Case-Sensitive сравнение. Нучуствительность к регистру - дурное наследие ДОС'а.

Re: Процедура, обратная UpCase. Pascal

Добавлено: 16 фев 2007, 16:07
Колядин Максим
Сообщение от Dr_Grizzly
Попробуй LowerCase

Спасибо! Работает! Только жаль что функцию сам придумал...
Сообщение от
сегда используй Case-Sensitive сравнение

Насколько я знаю, такой процедуры в Borland Pascal 7.0 нет. Но это не важно, меня сейчас интересует другой вопрос - почему мой модуль не обрабатывает string'и(см. выше)? Я правильно его написал?

Re: Процедура, обратная UpCase. Pascal

Добавлено: 16 фев 2007, 16:51
somewhere
&quot писал(а):procedure discase(s,s2: string);
В заголовке два параметра, которые можно менять, но они все равно потеряются, т.к. передаются по значению. Это значит, что при входе в процедуру параметры копируются на стек полностью. Меняя их значения они меняются лишь локально. Надо передавать их по ссылке, тогда они не копируются, на стек попадает лишь указатель на строку по которой код внутри процедуры и меняет значения самих переменных (т.е. уже не копию, а оригинал)

Код: Выделить всё

procedure discase(s:String; var s2: string);
Вообще почему-то все любят процедуры и никто не делает функции:

Код: Выделить всё

function LowCase(s:String):String;

Re: Процедура, обратная UpCase. Pascal

Добавлено: 16 фев 2007, 23:45
Колядин Максим
Всё... модуль работает. Никогда бы не подумал что есть разница между (s,s2: string) и (s: string; var s2: string) (до тебя, естественно). Спасибо.