Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Сравнение строк


Автор: maxlav 23.6.2009, 21:33
Доброго времени суток!

Имеется задачка: для двух заданных строк символов вывести без повторений набор символов-цифр, не вошедших в обе последовательности, т.е. строка состоит из букв и цифр, необходимо вывести только цифры, которые имеются в одной строке, и отсутствуют в другой.

Подскажите пути решения в рамках общего (не углубленного) курса изучения языка C.


Автор: azesmcar 23.6.2009, 21:37
Цитата

Пройтись по первой строке,
     если текущий элемент - число
          тогда проверить
               есть ли это число в другой строке.

вот алгоритм, решайте

Автор: maxlav 24.6.2009, 12:11
Код
#include <stdio.h>
#include <string.h>
#define L 100
    int main (void){
    char s1[L], s2[L], res[L];
    int a, i, j, flag, len=0;
    puts("string 1:");
    gets(s1);
    puts("string 2:");
    gets(s2);
    for(i=0; i<strlen(s1); i++)
    if(s1[i]>=48 && s1[i]<=57){
        flag=1;
        for(j=0; j<strlen(s2); j++)
        if(s1[i]==s2[j]){
            flag=0; break;
        }
        if (flag==0) continue;
            flag=1;
            for(j=0; j<len; j++)
            if(s1[i]==res[j]){
                flag=0; break;
            }
            if(flag==0) continue;
                res[len++]=s1[i];
    }
    for(j=0; j<strlen(s2); j++)
    if(s2[j]>=48 && s2[j]<=57){
        flag=1;
        for(i=0; i<strlen(s1); i++)
        if(s2[j]==s1[i]){
            flag=0; break;
        }
        if (flag==0) continue;
            flag=1;
            for(i=0; i<len; i++)
            if(s2[j]==res[i]){
                flag=0; break;
            }
            if(flag==0) continue;
                res[len++]=s2[j];
    }
    printf("result string: \n%s\n", res);        
    return 0;
}



Вот что получилось, но выполняется не совсем корректно, что посоветуете?
Компилятор gcc в cygwin.

Автор: Cheloveck 24.6.2009, 16:34
Код

#include <iostream>
#include <string.h>

int main()
{
    // Получаешь строки как хочешь,
    // для простоты я сам написал.
    char one[] = "d15fddf48fd54";
    char two[] = "dfdf8df78";
    
    int one_count = strlen( one );
    int two_count = strlen( two );
    bool flag = false;
    
    for( int i = 0; i < one_count; i++ )
    {
        if( one[i] < '0' && one[i] > '9' ) // так можно, если знать коды.
            continue;

        for( int j = 0; j < two_count; j++ )
        {
            if( one[i] == two[j] )
            {
                flag = true;
                break;
            }
        }
        if( !flag )
            std::cout << one[i];
        else
            flag = false;
    }
    std::cout << std::endl;
    return 0;
}

Насчёт повторения ты ничего не говорил, но думаю, что ты справишься, если повторяющиеся символы нужно исключитью

З.Ы. компилятор g++ из GNU GCC в Linux =))) не ругается и делает всё правильно

Автор: Dov 25.6.2009, 00:53
Код
#define SIZE 10

int main()
{
    int    arr[SIZE] = { 0 };
    char   str1[]    = "787181262";
    char   str2[]    = "374675358"; 
    char * p;

    for( p = str1; *p; p++ )
        if( isdigit( *p ) && !arr[*p - '0'] )
            arr[*p - '0']++;

    for( p = str2; *p; p++ )
        if( isdigit( *p ) && !strchr( p + 1, *p ) )
            arr[*p - '0']++;

    for( int i = 0; i < SIZE; i++ )
        if( arr[i] == 1 )
            printf( "%d", i );

    puts("");
    return 0;
}

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