Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Сравнение двух строк 
:(
    Опции темы
Denzel666
Дата 16.12.2006, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 13.12.2006
Где: Дзержинск

Репутация: -1
Всего: нет



Приветствую мозговой центр сети интернет...Призываю откликнуться на просьбу...Поступила задача на сравнение 2-х строк ...Сравнивание производить по буквам,цифрам и пробелам...(Язык Си)...решение нужно как воздух...Если же программерам в косяк написать пару строк проги, буду рад хотя бы алгоритму решения...По моим соображениям в строках надо удалить все символы не относящиеся к символам указанным в задаче,а затем производить сравнение непосредственно строк с символами относящимися к поставленной задаче...если это не так просьба поправить меня...
PM MAIL   Вверх
Oleg_Ci
Дата 16.12.2006, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Код

#include <stdio.h>
#include <ctype.h>

bool cmp( const char * c1, const char * c2 ){// функция сравнения
    for(; *c1 && *c2; c1++, c2++ ){
        for(; !isalnum( *c1 ) && *c1 != ' ' ; c1++ );
        for(; !isalnum( *c2 ) && *c2 != ' ' ; c2++ );
        if( *c1 != *c2 ) break;
    }
    if( !*c1 && !*c2 )
        return true;
    else return false;
}

//_________ MAIN_________________
int main(int argc, char *argv[])
{
    char * c1 = "asdf. g,fds";
    char * c2 = "asd...f.. g{}[[[]f[ds";
    if( cmp( c1, c2 ))
        puts("True"); // строки похожи
    else puts("False"); // непохожи
    getchar();
    return 0;
}

PM MAIL   Вверх
Rockie
Дата 16.12.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



Олег4, это не Си smile


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Oleg_Ci
Дата 16.12.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



да, ошибочка вышла smile , тогда так
Код

#include <stdio.h>
#include <ctype.h>

int cmp( const char * c1, const char * c2 ){// функция сравнения
    do{
        for(; !isalnum( *c1 ) && *c1 != ' ' ; c1++ );
        for(; !isalnum( *c2 ) && *c2 != ' ' ; c2++ );
    }while( *c1++ == *c2++ && *c1 && *c2 );
    return !( *c1 + *c2 ); 
} // можно так - return *c1 + *c2   ...   if( !cmp( c1, c2 )) // <<

int main(int argc, char *argv[])
{
    char * c1 = "asdf. g,fds";
    char * c2 = "asd...f.. g{}[[[]f[ds";
    if( cmp( c1, c2 )) // <<
        puts("True");
    else puts("False");
    getchar();
    return 0;
}

PM MAIL   Вверх
Denzel666
Дата 17.12.2006, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 13.12.2006
Где: Дзержинск

Репутация: -1
Всего: нет



здесь как видите сравниваются строки...но это неверное решение...мне необходимо сравнить 

строки...равенство возможно лишь в том случае если длина строк одинакова и одинаково 

расположение элементов(символов) в строке...подскажите что не так...
PM MAIL   Вверх
Oleg_Ci
Дата 17.12.2006, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



А так ?
Код

#include <stdio.h>
#include <ctype.h>

int cmp( const char * c1, const char * c2 ){
    for(; *c1 && *c2 && !(( isalnum( *c1 ) && isalnum( *c2 ) || *c1 == ' ' || *c2 == ' ' ) && *c1 != *c2 ); c1++, c2++ );
    return !( *c1 + *c2 );
}

int main(int argc, char *argv[])
{
    // две "равные" строки
    char * c1 = "s-f g.2"; 
    char * c2 = "s[f g]2";

    if( cmp( c1, c2 ))
        puts("True");
    else puts("False");
    getchar();
    return 0;
}


Это сообщение отредактировал(а) Олег4 - 17.12.2006, 08:57
PM MAIL   Вверх
Denzel666
Дата 18.12.2006, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 13.12.2006
Где: Дзержинск

Репутация: -1
Всего: нет



не очень понятен алгоритм...с этим проблема всегда была...


PM MAIL   Вверх
Denzel666
Дата 18.12.2006, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 13.12.2006
Где: Дзержинск

Репутация: -1
Всего: нет



int strcmp(char s[],char t[])
{
18/12/2006)
for (;*s==*t;s++,t++*)
if(*s='\0')
return 0;
return *s-*t;
}

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

Добавлено @ 02:34 
18/12/2006)-вот эта строчка лишняя как вы понимаете
PM MAIL   Вверх
cardinal
Дата 18.12.2006, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 15
Всего: 99



Цитата(Denzel666 @  18.12.2006,  00:32 Найти цитируемый пост)
Возможно ли переделать вот это в чудо в требуемое? 

Не понял суть проблемы? Ты не понимаешь, что вам препод написал или эта функция делает не то, что нужно?

p.s. пользйуся тегами "код"!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
semi
Дата 18.12.2006, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 10.12.2006
Где: ой, все сложно...

Репутация: нет
Всего: нет



алгоритм говоришь... smile а если так:
проверяем, равны ли строки по длине.  если нет -> ответ отрицательный. 
если да -> проверяем вхождение строки 1 в строку 2. (там же была вроде стандартная функция, проверяющая наличие подстроки в строке). ну... и соответственно, если возвращает 1 (номер символа с которого начинается подстрока) то ответ положительный, а если null (или что она там возвращает в случае неудачи, не помню...) то отрицательный.

Олег4 даже не представляю, как он будет защищать лабу с твоим кодом, если даже не понимает что препод объяснял... smile
PM MAIL ICQ   Вверх
Oleg_Ci
Дата 18.12.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Вот попроще функция, только делает то что я понял в задании smile 
Код

int cmp( const char * c1, const char * c2 ){// функция сравнения
    do{
        if( isalnum( *c1 ) && isalnum( *c2 )) // если это символ или цыфра
        {    if( *c1 != *c2 ) break;    } // и они не равны - то выход

        else if( *c1 == ' ' || *c2 == ' '  ) // если хоть один пробел
            if( *c1 != *c2 ) break; // и они не равны - то выход

/* если не символ алфавита и не цифра и не пробел то пропускаем 
этот символ и продолжаем цикл */

    }while( *c1++ && *c2++ );

    return !( *c1 + *c2 ); 
}

PM MAIL   Вверх
Denzel666
Дата 19.12.2006, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 13.12.2006
Где: Дзержинск

Репутация: -1
Всего: нет



3:                      if( isalnum( *c1 ) && isalnum( *c2 )) // если это символ или цыфра

Вот это не понятно...Что такое  isalnum?Все непонимание на мамом деле в этой строчке кода...Это в лекциях нет...поэтому сетую на препода...

Добавлено @ 00:28 
Попробую изложить задачу на примере...Допустим даны 2 строки :
a df="2
и
a df="t2
По условию они сразу же не равны так как имеют разную длину...
a df="2
и
a df="2
В этом же случае если литеры "a" и в 1-ом и во 2-ом стринге  находятся  на одном и том же месте , и та же история с остальными символами, т.е. их коды и адрес в строках совпадают , при этом длины строк равны, только в этом случае они равны...


PM MAIL   Вверх
Denzel666
Дата 19.12.2006, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 13.12.2006
Где: Дзержинск

Репутация: -1
Всего: нет



Код

int strcmp(char s[],char t[])
{
for (;*s==*t;s++,t++*)
if(*s='\0')
return 0;
return *s-*t;
}


подскажите пожалуйста как работает эта функция...


M
alexeis1
Модератор: Выделяйте пожалуйста код. http://forum.vingrad.ru/index.php?showtopic=126445


Это сообщение отредактировал(а) alexeis1 - 19.12.2006, 14:04
PM MAIL   Вверх
cardinal
Дата 19.12.2006, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 15
Всего: 99



Цитата(Denzel666 @  18.12.2006,  22:19 Найти цитируемый пост)
Что такое  isalnum?

Функция, которая делает проверку на см. комментарий справа от исп. функции.
Цитата(Denzel666 @  18.12.2006,  22:45 Найти цитируемый пост)
подскажите пожалуйста как работает эта функция... 

Для начала прочитай о том, что такое указатели...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Oleg_Ci
Дата 19.12.2006, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Цитата(Denzel666 @  19.12.2006,  03:45 Найти цитируемый пост)
подскажите пожалуйста как работает эта функция...

Это сравнение двух строк, причём сравнивает все символы, а ты задание такое написал
Цитата(Denzel666 @  16.12.2006,  04:28 Найти цитируемый пост)
Сравнивание производить по буквам,цифрам и пробелам

Тебе обычное сравнение нужно или сравнение только по буквам,цифрам и пробелам ???

Код

int strcmp( const char * s, const char * t )
{
 for (;*s==*t; s++,t++) // перебираем все символы в обоих строках, и если "читаемые" символы равны то ...
  if(*s='\0') // ...если достигли конца строки то...
   return 0; // ...то строки равны

 return *s-*t; // на сколько строки "неравны"
}
это функция в книге " Б. Керниган, Д. Ритчи    Язык программирования Си  Издание 3-е"
описана, там глава про указатели, почитай smile 

( isalnum != 0 ) если это символ или цыфра
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0900 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.