Модераторы: 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   Вверх
Denzel666
Дата 20.12.2006, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

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

По буквам цифрам и пробелам...а про  isalnum так и не понял...это стандартная ф-ция?
PM MAIL   Вверх
cardinal
Дата 20.12.2006, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


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

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



Первое, что выплевывает google...
http://www.elook.org/programming/c/isalnum.html


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

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


Friend
**


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

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



здесь или тут, а здесь точно найдёшь

isalnum - библиотечная функция
PM MAIL   Вверх
Denzel666
Дата 21.12.2006, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Функция, которая делает проверку на см. комментарий справа от исп. функции.


это стандартная ф-ция isalnum?

Олег4 , можно попросить ссылку на книгу эту(и)?
PM MAIL   Вверх
cardinal
Дата 21.12.2006, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


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

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



Цитата(Denzel666 @  20.12.2006,  23:22 Найти цитируемый пост)
Олег4 , можно попросить ссылку на книгу эту(и)? 

У меня такое впечатление, что ты и слово "библиотека" неправильно понимаешь... smile 


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

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


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

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



1) Ссылки на страницы руководства (man-страницы): 
    
    a) isalnum(): 
        * in english: http://www.opengroup.org/onlinepubs/007908...sh/isalnum.html
        * in russian: http://www.opennet.ru/man.shtml?topic=isal...3&russian=0
    
   b) strcmp()
        * in english: http://www.opengroup.org/onlinepubs/007908...xsh/strcmp.html
        * in russian: http://www.opennet.ru/man.shtml?topic=strc...3&russian=0

2) Denzel666, всё-таки я тебя не пойму! Если уж объясняешь на примерах, то объясняй на них до конца, так чтоб очевидно понятно стало, что именно нужно!

Что должна возвращать требуемая тебе функция на следующих «тестах»: 
ans_strcmp( "123 abc", "123abc" );  //=> Тут, ясен пень, 0, т.е. равны.
ans_strcmp( "123 abc", "123 +abc" );  //=> Тут, тоже понятно, ненулевое значение, т.е. неравны.
ans_strcmp( "123-ab c", "123+ab c" );  // А тут что?
ans_strcmp( "123 ab\"c", "123 ab\\c" );  // И тут?
?

В последнем случае длины строк равны, все цыфры, буквы и пробелы одинаковы и стоят на одинаковых позициях, что по твоей изначальной спецификации, вроде, должнен получиться 0 (равны). Функция strcmp() из стандартной библиотеки C для таких паратетров вернёт ненулевое значение (неравны).

Так что именно тебе нужно?!.


Это сообщение отредактировал(а) V_A_KeRneL - 21.12.2006, 10:23


--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
Rockie
Дата 21.12.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(cardinal @  21.12.2006,  02:56 Найти цитируемый пост)
У меня такое впечатление, что ты и слово "библиотека" неправильно понимаешь...  smile  

smile


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


Friend
**


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

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



Цитата(Denzel666 @  21.12.2006,  04:22 Найти цитируемый пост)
это стандартная ф-ция isalnum?

да.
Цитата(Denzel666 @  21.12.2006,  04:22 Найти цитируемый пост)
Олег4 , можно попросить ссылку на книгу эту(и)?

http://forum.vingrad.ru/topic-33456.html
8 ссылка smile 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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