Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2010, 19:32   #1
Смородинка
Пользователь
 
Аватар для Смородинка
 
Регистрация: 29.09.2010
Сообщений: 12
Радость Массив строк.

Всем привет!!
Помогите с такой задачкой, плиз:
Дан массив строк. Необходимо вывести на экран все различные натуральные числа, символьная запись которых содержится только строго в одной из строк массива. (Память для массива строк должна быть выделена динамически)

Всё, на что меня хватило, это написать следующее:

Код:
#include<iostream>
#include<string.h>
using namespace std;
int main (){   
 cout<<"Vvedite n,m"<<endl;
 int n;
 int m;
cin>>n;
cin>>m;
 string mas[n][m];
 int i=0;
 int j=0;
 cout <<"Vvedite zn"<<endl;
for(i=0;i<n;i++){
 for(j=0;j<m;j++){
  cout<<"mas["<<i<<"]""["<<j<<"]:";     
  cin>>mas[i][j];
            
 }
}
            
 i=0;
 j=0;          
for(i=0;i<n;i++){
 for(j=0;j<m;j++){
  cout<<mas[i][j]<<endl;
  }
}
 i=0;
 j=0; 
int flag;
for (int b=0; b<m;b++){
        for(i=0;i<n;i++){
         for(j=0;j<m;j++){if(((int)mas[i][j]<=9)&&((int)mas[i][j]>=0)){
            if(mas[i][j]==b){;}else{cout<<b<<endl;}}
            }
 }    
}
         
    system("PAUSE");     
 return EXIT_SUCCESS;
}
но у меня не получается посимвольное сравнивание, плюс я не могу найти, как динамически выделить память.
Помогите плиз, а то у меня в понедельк пара, а это уже как долг считается...(((
Всем заранее спасибки!
Смородинка вне форума Ответить с цитированием
Старый 20.11.2010, 19:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
символьная запись которых содержится только строго в одной из строк массива.
А вот эту часть задания я не понял... Поясни примером.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2010, 20:02   #3
Смородинка
Пользователь
 
Аватар для Смородинка
 
Регистрация: 29.09.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А вот эту часть задания я не понял... Поясни примером.
Я поняла так: есть у нас строки:
фывй2ц4у4
фывйц3ц2
лдвыао5ц3

программа должна вывести 4 и 5, так как они не встречаются в других строках.
Смородинка вне форума Ответить с цитированием
Старый 21.11.2010, 01:38   #4
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

Предлагаю решить с помощью бинарного дерева:

Код:
#include <iostream>
#include <cctype>

class Tree
{
private:

    struct Numbers
    {
        char digit;
        bool wasItRepeated;
        Numbers * left, * right;
    } * Root;

    void recursivePrint( Numbers * root )
    {
        if( root )
        {
            recursivePrint( root->left );
            root->wasItRepeated || std::cout<<root->digit<<std::endl;
            recursivePrint( root->right );
        }
    }

    void recursiveClean( Numbers ** root )
    {
        if( *root )
        {
            recursiveClean( &( ( *root )->left ) );
            recursiveClean( &( ( *root )->right ) );
        }
        delete * root;
    }

public:

    Tree() { Root = NULL; }
    ~Tree(){ recursiveClean( &Root ); }

    void insert( char digit )
    {
        Numbers ** elem = &Root;

        while( *elem )
        {
            if( digit == ( *elem )->digit )
            {
                if( !( *elem )->wasItRepeated )
                    ( *elem )->wasItRepeated = true;
                return;
            }
            digit < ( *elem )->digit ? elem = &( ( *elem )->left ) : elem = &( ( *elem )->right );
        }
        ( *elem ) = new( Numbers );

        ( *elem )->wasItRepeated = false;
        ( *elem )->digit = digit;
        ( *elem )->left = ( *elem )->right = NULL;
    }

    void print()
    {
        std::cout<<"Numbers, which do not repeat:\n";
        recursivePrint( Root );
    }
};

int main()
{
    char * strings[] =
    {
        "alala12345",
        "ololo2",
        "tratata1",
    };

    Tree Obj;

    for( unsigned int j = 0; j < ( sizeof( strings ) / sizeof( char* ) ); j++ )
        for( char * p = strings[ j ]; *p; *p++ )
             if( isdigit( *p ) )
                 Obj.insert( *p );

    Obj.print();
    return 0;
}
Выделение памяти - оператор new, удаление - оператор delete. Я сразу сделал массив строк, чтобы их не вводить с клавиатуры. Вроде так проще всего. Будут вопросы - обращайтесь)
P.S советую всегда красиво и понятно форматировать код. Так в нем будет потом гораздо проще разбираться Вам и другим.

Последний раз редактировалось nowaalex; 21.11.2010 в 13:11.
nowaalex вне форума Ответить с цитированием
Старый 21.11.2010, 14:23   #5
Смородинка
Пользователь
 
Аватар для Смородинка
 
Регистрация: 29.09.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от nowaalex Посмотреть сообщение
Предлагаю решить с помощью бинарного дерева:...
Огромное спасибо, но есть одно но:')
Мне нобходимо "вывести на экран все различные натуральные числа"...
Смородинка вне форума Ответить с цитированием
Старый 21.11.2010, 14:56   #6
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

Так мой код это и делает)) натуральные числа в данном случае - 0, 1, 2, 3, 4, 5, 6, 7, 8 или 9, правильно?
В строке abc12de2 программа видит 3 цифры: 1,2,2. Или она должна увидеть число 12?

Последний раз редактировалось nowaalex; 21.11.2010 в 15:08.
nowaalex вне форума Ответить с цитированием
Старый 21.11.2010, 15:21   #7
Смородинка
Пользователь
 
Аватар для Смородинка
 
Регистрация: 29.09.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от nowaalex Посмотреть сообщение
Так мой код это и делает)) натуральные числа в данном случае - 0, 1, 2, 3, 4, 5, 6, 7, 8 или 9, правильно?
В строке abc12de2 программа видит 3 цифры: 1,2,2. Или она должна увидеть число 12?
Да, и число 12 тоже, как и 12345 в вашей оригинальной программе. 0 кстати, не должен входить.
Смородинка вне форума Ответить с цитированием
Старый 21.11.2010, 15:22   #8
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

Ок, сейчас поправлю
nowaalex вне форума Ответить с цитированием
Старый 21.11.2010, 15:41   #9
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

Код:
#include <iostream>

class Tree
{
private:

    struct Numbers
    {
        unsigned int digit;
        bool wasItRepeated;
        Numbers * left, * right;
    } * Root;

    void recursivePrint( Numbers * root )
    {
        if( root )
        {
            recursivePrint( root->left );
            root->wasItRepeated || std::cout<<root->digit<<std::endl;
            recursivePrint( root->right );
        }
    }

    void recursiveClean( Numbers ** root )
    {
        if( *root )
        {
            recursiveClean( &( ( *root )->left ) );
            recursiveClean( &( ( *root )->right ) );
        }
        delete * root;
    }

public:

    Tree() { Root = NULL; }
    ~Tree() { recursiveClean( &Root ); }

    void insert( unsigned int digit )
    {
        Numbers ** elem = &Root;

        while( *elem )
        {
            if( digit == ( *elem )->digit )
            {
                if( !( *elem )->wasItRepeated )
                    ( *elem )->wasItRepeated = true;
                return;
            }
            digit < ( *elem )->digit ? elem = &( ( *elem )->left ) : elem = &( ( *elem )->right );
        }
        ( *elem ) = new( Numbers );

        ( *elem )->wasItRepeated = false;
        ( *elem )->digit = digit;
        ( *elem )->left = ( *elem )->right = NULL;
    }

    void print()
    {
        std::cout<<"Numbers, which do not repeat:\n";
        recursivePrint( Root );
    }
};

int main()
{
    char * strings[] =
    {
        "alala012345",
        "43foggh304fsg",
        "def344gfg",
        "dde45"
    };

    Tree Obj;

    for( unsigned int j = 0, val; j < ( sizeof( strings ) / sizeof( char* ) ); j++ )
        for( char * p = strings[ j ]; *p; )
            if( *p > '0' && *p <= '9' )
            {
                for( val = 0; *p >= '0' && *p <= '9'; *p++ )
                    val = 10 * val + *p - '0';
                Obj.insert( val );
            }
            else
                *p++;

    Obj.print();
    return 0;
}

Последний раз редактировалось nowaalex; 21.11.2010 в 16:02. Причина: Отредактировал
nowaalex вне форума Ответить с цитированием
Старый 21.11.2010, 15:59   #10
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

так подходит?
nowaalex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Массив строк Jane-sad Помощь студентам 2 22.10.2010 15:10
массив строк. zhenya.ya Общие вопросы C/C++ 2 24.09.2010 00:14
Массив строк L_Killer Помощь студентам 2 30.05.2010 01:58
Массив строк Siluet Помощь студентам 2 30.05.2009 07:38
Массив строк С++ Nina+ Помощь студентам 1 01.04.2009 23:22