Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi]Сравнение строк. с помшью ф-ции ORD


Автор: Нэраварин 9.3.2009, 14:17
С помощию множества решить неудалось т.к оно неможет содержать одинаковые эл. и например слово Бар и Абар оно сочтёт одним и тем же (если просто буквы сравнивать).
Идея алгоритма такова что нужно как то завести два масива вних впихать через ф-цию ORD коды символов и пробежав по масиву выяснить можно ли при перестановки букв из одного слова получить другое  (ну например ток-кот). 

Мой враг чистый лист,  мозг остановился или совсем у меня его нет smile , такое чувство что я даже забыл оператор присваивания, непонимаю как работает функция ORD и как с помощью неё вытащить с Edit(с текстом) код буквы а потом в масив впихнуть (это же очень просто, "но  я вобще невижу кода у себя в голове")

Условие задачи таково :Пусть даны две строки str1 и str2. Необходимо выяснить, можно ли из str1 путём перестановки литер получить строку str2

Пожалуйста помогите написать код.....

Автор: grigiv 11.3.2009, 07:02
Здравствуйте!
Еще нужна помощь?
Помогу за вознаграждение.

Обращайтесь:
grigiv@rambler.ru
http://www.grigiv.h15.ru

P.S. Высылайте подробное задание и сообщите желаемый срок выполнения работы.

Автор: Нэраварин 11.3.2009, 15:00
Если бы у мну было много денег я бы непарился отсыпал кому нада и все бы задачи были решены, но так как я руский а все русские любят холяву smile  то ....я расчитываю на безкорысную помощь smile 

Автор: zim22 11.3.2009, 15:19
Цитата(Нэраварин @  9.3.2009,  14:17 Найти цитируемый пост)
Пусть даны две строки str1 и str2. Необходимо выяснить, можно ли из str1 путём перестановки литер получить строку str2

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

Автор: Нэраварин 11.3.2009, 15:24
Цитата(zim22 @ 11.3.2009,  15:19)
Цитата(Нэраварин @  9.3.2009,  14:17 Найти цитируемый пост)
Пусть даны две строки str1 и str2. Необходимо выяснить, можно ли из str1 путём перестановки литер получить строку str2

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

А можно примерчиком в виде кода?   smile 

Автор: zim22 11.3.2009, 15:47
Цитата(Нэраварин @  11.3.2009,  15:24 Найти цитируемый пост)
А можно примерчиком в виде кода?

только на С++
Код
#include <iostream>
#include <string>
#include <algorithm>

int main(int argc, char *argv[])
{
    std::string s1("ivan");
    std::string s2("navi");

    std::sort(s1.begin(), s1.end());
    std::sort(s2.begin(), s2.end());

    if (s1 == s2)
        std::cout << "Equal" << std::endl;
    else
        std::cout << "Not equal" << std::endl;
    
    return 0;
}


Автор: Нэраварин 12.3.2009, 11:56
To zim22  пасиба конешно за помощь, но мне нужен пример на делфи и имено по такому алгоритму:
В массив впихать через ф-цию ORD коды символов, и пробежав по масиву,(и сравнив все коды символов) выяснить можно ли при перестановки букв из одного слова получить другое  (ну например ток-кот).   

С++ я незнаю но так посмотрев на код я понел что ты просто сортируешь а потом сравниваешь две строки; Но строки не имеют одинаковую длину просто пользователь вводит в Edit'ы разные слова, а мне нужно пробежав по двум этим строкам вывести на лейбл ответ можно ли составить из 1-го 2-е слово.(то есть банально если есть такое же кол-во букв и используются теже буквы то ответ "да" и пофиг если там будет абракадабра)

на паскале вроде бы нет такого для строк, а мне нужен пример кода(на паскале) где из Edit1 вытягивается с помощью функции ORD код символа и вставляется в масив вот имено это я и не понимаю как написать на паскале smile   smile  

Автор: morpheyushka 12.3.2009, 13:55
Цитата(Нэраварин @  12.3.2009,  11:56 Найти цитируемый пост)
из Edit1 вытягивается с помощью функции ORD код символа и вставляется в масив вот имено это я и не понимаю как написать на паскале smile   smile   

а что тут не понятного?
Код

var
  S: String;
  i: Integer;
  a: array of Integer;
begin
  S := Edit1.Text;
  SetLength(a, Length(S));
  for i := 0 to Length(S - 1) do
    a[i] := Ord(S[i+1]);
end;

Автор: Нэраварин 14.3.2009, 13:38
Цитата(morpheyushka @ 12.3.2009,  13:55)
Цитата(Нэраварин @  12.3.2009,  11:56 Найти цитируемый пост)
из Edit1 вытягивается с помощью функции ORD код символа и вставляется в масив вот имено это я и не понимаю как написать на паскале smile   smile   

а что тут не понятного?
Код

var
  S: String;
  i: Integer;
  a: array of Integer;
begin
  S := Edit1.Text;
  SetLength(a, Length(S));
  for i := 0 to Length(S - 1) do
    a[i] := Ord(S[i+1]);
end;



В строчке for i := 0 to Length(S - 1) do ошибка типо мол несовместимые типы строка и целое число, да и при том что то нехочет работать вбивка в масив таким образом

Автор: zim22 14.3.2009, 13:59
Цитата(Нэраварин @  14.3.2009,  13:38 Найти цитируемый пост)
for i := 0 to Length(S - 1) do

попробуй так:
for i := 0 to Length(S) - 1 do

Автор: Нэраварин 19.3.2009, 15:11
спасибо вам обоим за помощь, жаль немогу повысить вам репутацию, нет прав

Автор: Нэраварин 17.4.2009, 12:33
Оказалось, что решение этой задачи с помощью сортировки массива и поиск в нём совпадени оказалась неэффективная (Мол а что если у вас будет очень много слов и сортировка работать будет долго неэкономно не практично и т.п)

Я так думаю нужно впихнуть в массив коды букв или сами буквы(без разницы какого типа будет масив подойдут оба способа) и одновременно проходится по двум массивам и если находятся одинаковые буквы в них удалять их из масива такой логикой по идее мы прийдём к тому что у масивов будет нуль различий(в случае если можно составить слова) нуль различий и будет признаком схожести слов, но вот как это записать  на паскале "проходится одновремено по двум масивам да ещё и удалять одинаковые символы" я никак додуматься немогу особено как их удалять из масива.  smile   
Пожалуйста подскажите smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)