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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

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

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

var s,s2: string;
begin
s:='QwERtY';
s2:='qwerty';
....
s и s2 были равны. Не используя модуль strings. То есть, создать программу, где нет разницы между прописными и заглавными буквами.
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Попробуй LowerCase
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):То есть, создать программу, где нет разницы между прописными и заглавными буквами
В паскале действительно нет функции обратной UpCase. Если уж нужно сравнивать строки с разным регистром, то UpCase вполне подойдет. Ведь вовсе не обязательно сравнивать строки в нижнем регистре, можно и в верхнем. На крайняк можно и через Ord решить этот вопрос
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

Вот тут написал модуль, который решает эту проблему. Т.к разница между "А" и "а" по 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.
Может что-нибудь не так написал?
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Колядин Максим писал(а):То есть, создать программу, где нет разницы между прописными и заглавными буквами.
Так делать не надо. Всегда используй Case-Sensitive сравнение. Нучуствительность к регистру - дурное наследие ДОС'а.
2B OR NOT(2B) = FF
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

Сообщение от Dr_Grizzly
Попробуй LowerCase

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

Насколько я знаю, такой процедуры в Borland Pascal 7.0 нет. Но это не важно, меня сейчас интересует другой вопрос - почему мой модуль не обрабатывает string'и(см. выше)? Я правильно его написал?
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

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

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

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

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

function LowCase(s:String):String;
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

Всё... модуль работает. Никогда бы не подумал что есть разница между (s,s2: string) и (s: string; var s2: string) (до тебя, естественно). Спасибо.
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Ответить