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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема повторения кода 
V
    Опции темы
Alexandr507
Дата 5.11.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 19.7.2009

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



Здравствуйте, в коде возникла проблема повторения кода.

Код

        for(;;)    
    {
        int a = 0;
        int x = 0;
        int y = 0;
        bool exit = false;

        while(a<summa)
        {
            messag[y][x] = slovo[a];
            if (y!= size1-1){++y;}
            else {++x; y = 0;}
            ++a;
        }

        exit = true;
        if(exit == true)
            break;
    }


этот код встречается три раза в программе, и абсолютно одинаковый, за исключением 10 строчки

в первом случае 
    
Код
messag[y][x] = slovo[a];


во втором
    
Код
messag_2[y][x] = messag[x][y];
    

в третьем
    
Код
messag_2[x][y] = messag_2[y][x];


Очень некрасиво. В раздумиях над тем как избавится от повторения кода и сделать из трех почти одинаковых циклов - один,
 возникла мысль поместить весь цикл в функцию с возвращающим типом void. а каждый раз разную строчку номер 10 заменить на  предварительно объявленные в main два указателя на тип char , которым там же в main будут присвоены messag[y][x] и  slovo[a] соотвественно ,затем  когда будет произведен вызов функции второй раз,  переприсвоенны для  messag_2[y][x] и messag[x][y] и соотвественно третий раз -  messag_2[x][y] и messag_2[y][x].
передавать в функцию указатели по адресу, что бы функция получала доступ непосредственно к этим массивам.

Код

char *ptr1 = messag[y][x];  
char * ptr2 = slovo[a];
...
cikl(summa, &ptr1, &ptr2);
...

char *ptr1 = messag_2[y][x] ;  
char * ptr2 = messag[x][y];
...
cikl(summa, &ptr1, &ptr2);
...


char *ptr1 = messag_2[x][y];
char * ptr2 = messag_2[y][x];
...
cikl(summa, &ptr1, &ptr2);
...


void cikl(int summa, char* ptr1, char* ptr2)
{
        for(;;)    
    {
        int a = 0;
        int x = 0;
        int y = 0;
        bool exit = false;

        while(a<summa)
        {
            *ptr1 = *ptr2;
            if (y!= size1-1){++y;}
            else {++x; y = 0;}
            ++a;
        }

        exit = true;
        if(exit == true)
            break;
    }

}


но наткнулся на проблему. в цикле  первоначально все закрученно вокруг индексов 'x', 'y' и 'a'.  в переделанном варианте  указатели без индексов, и черт знает что куда будет присваиваться. вообщем видимо такой способ не прокатывает. подскажите что можно сделать.
С уважением.
PM MAIL   Вверх
mes
Дата 5.11.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата

Код

    for(;;)    
    {
   ...
        exit = true;
        if(exit == true)
            break;
    }


это чтоб остальных запутать ? 
Цитата(Alexandr507 @  5.11.2009,  12:47 Найти цитируемый пост)
   
Код

     while(a<summa)
        {
            ...
            if (y!= size1-1){++y;}
            else {++x; y = 0;}
            ++a;
        }


ну а это нагляднее/логичнее в двухуровневом for (один for для x, другой для y)



Это сообщение отредактировал(а) mes - 5.11.2009, 13:54


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 19.7.2009

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



По-моему не суть,  проблема что так, что эдак остается.  Конечно так лучше, нагляднее, но в данном примере меня другое интересует

Это сообщение отредактировал(а) Alexandr507 - 5.11.2009, 14:20
PM MAIL   Вверх
mes
Дата 5.11.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(Alexandr507 @  5.11.2009,  13:19 Найти цитируемый пост)
По-моему не суть,  проблема что так, что эдак остается.  Конечно так лучше, нагляднее, но в данном примере меня другое интересует

messag и другие это статические двумерные массивы или динамические ?

Добавлено через 3 минуты и 47 секунд
P.S.
Цитата(Alexandr507 @  5.11.2009,  12:47 Найти цитируемый пост)
            messag[y][x] = slovo[a];

на всякий случай замечу, если массивы у Вас типа char, то этой строчкой Вы копируете не данные, а указатель..



--------------------
PM MAIL WWW   Вверх
Alexandr507
Дата 5.11.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 19.7.2009

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



все массивы динамические двумерные, только slovo[]  одномерный, но тоже динамический  

Это сообщение отредактировал(а) Alexandr507 - 5.11.2009, 14:49
PM MAIL   Вверх
mes
Дата 5.11.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(Alexandr507 @  5.11.2009,  13:48 Найти цитируемый пост)
все массивы динамические 

(чтоб развеять сомнения)  приведите определения этих двух массивов (messag и slovo).
smile



--------------------
PM MAIL WWW   Вверх
bsa
Дата 5.11.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



может так сделать?
Код
void func(char **messag, const char *slovo)
{
    for(;;)    
    {
        int a = 0;
        int x = 0;
        int y = 0;
        bool exit = false;
        while (a < summa)
        {
            messag[y][x] = slovo[a];
            if (y != size1-1)
               ++y;
            else {
               ++x;
               y = 0;
            }
            ++a;
        }
        exit = true;
        if(exit == true)
            break;
    }
}

PM   Вверх
Alexandr507
Дата 5.11.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 19.7.2009

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



Цитата(mes @ 5.11.2009,  14:53)

(чтоб развеять сомнения)  приведите определения этих двух массивов (messag и slovo).
smile

Ошибся ошибся)
 
Код

slovo[a];
 не является динамическим

Добавлено через 14 минут и 48 секунд
bsa, для первого вызова функции funk , куда под  указателями *ptr1 и *ptr2 будут передаваться messag[y][x] и  slovo[a], ваш код конечно подойдет, но для второго , куда должны передаваться   messag_2[x][y] и  messag_2[y][x] , а также messag_2[y][x]   и messag[x][y] соотвественно для третьего вызова, не прокатит. ведь второй параметр в функции funk является одномерным массивом.

даже не знаю как быть, столько лишнего по большому счету кода.
PM MAIL   Вверх
mes
Дата 5.11.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(Alexandr507 @  5.11.2009,  16:03 Найти цитируемый пост)
даже не знаю как быть, столько лишнего по большому счету кода. 

может для начала приведете
Цитата(mes @  5.11.2009,  13:53 Найти цитируемый пост)
определения этих двух массивов 

или словами опишите  задачу по распределению одного по массива по другому.. (Напрягаться и догадываться мне сегодня лень smile )


Это сообщение отредактировал(а) mes - 5.11.2009, 18:46


--------------------
PM MAIL WWW   Вверх
xvr
Дата 6.11.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Передавайте функции для присваивания:
Код

void func1(int x, int y, int a)
{
 messag[y][x] = slovo[a];
}

void func2(int x, int y, int a)
{    
 messag_2[y][x] = messag[x][y];
}

void func3(int x, int y, int a)
{    
 messag_2[x][y] = messag_2[y][x];
}

void func( void (*f)(int,int,int) )
{
        int a = 0;
        int x = 0;
        int y = 0;
        while (a < summa)
        {
            f(x,y,a);
            if (y != size1-1)
               ++y;
            else {
               ++x;
               y = 0;
            }
            ++a;
        }
}

// вызов:
func(func1);
func(func2);
func(func3);

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 19.7.2009

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



xvr, спасибо, то что надо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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