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

Поиск:

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


Новичок



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

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



День добрый. Столкнулся с проблемой в написании алгоритма. По заданию Дан двумерный массив целых чисел А [ 1..N , 1..N ]. Нужно сформировать линейный массив В [ 1..N*N ], получающийся при чтении данного массива так, как показано на рисунке.
Условия задачи: Ввод размера массива пользователем. Обращатся к элементам через указатели.
user posted image

Я написал всю программу, кроме самого алгоритма обхода. Хотел делать через switch..case в итоге еще больше запутался.
Прилагаю код:
В этой части всё рабочее:
Код

#include <iostream>    

using namespace std;
void lab6();
void create_Aarray(int *pA,const int N);
void show_Aarray(const int *pA,const int N);
void create_Barray(const int *pA,int *pB,int N);
void show_Barray(const int *pB,const int N);
bool chknum(char x[100]);
int N;


int main(){
  setlocale(LC_ALL,".1251");
  char answer;
  cout<<"\n С помощью этой программы ....";
  while (true){  //бесконечный цикл с запросом на продолжение работы
    lab6();        
    cout<<"\n \n Вы хотите продолжить работу с программой? (Y/N)";
    cin>>answer;
    cin.ignore();
    if (answer=='Y'||answer=='y')
        continue;
    else
        return 0;
  }
}


void lab6(){
    char str[10];
    cout<<"\n \n Введите размер массива: "; 
    cin>>str;
    cout<<"\n";
    if (chknum(str)){ //ввел ли пользователь число?
        N=atoi(str);
        int *pA=new int[N*N]; //объявление указателей на массивы
        int *pB=new int[N*N]; 
                      create_Aarray(pA,N); //создаем массив А из случайных чисел
                      show_Aarray(pA,N);  //выводим его на экран
                      create_Barray(pA,pB,N); //преобразуем массив А в массив B
                      show_Barray(pB,N);  //выводим его на экран
                      delete pA;        
                      delete pB;
    }
    else
        lab6();
}
bool chknum(char x[10]){  //ф-ция проверки на принадлежность к числам
    for(int i=0;i<strlen(x);i++){
        if(!isdigit(x[i])){ 
            cout<<"\n Ошибка! Введите число.";
            return false;
        }
        else
            continue;
    }
}
void create_Aarray(int *pA,const int N){  //заполнение массива А случайными числами
    for (int i=0;i<N*N;i++,pA++){
        *pA=rand()%(10);
    }
}

void show_Aarray(const int *pA,const int N){  //вывод на экран массива А ввиде матрицы
    int c=0;
    for (int i=0;i<N*N;i++,pA++){
        cout<<" "<<*pA<<" ";
        if (c+1>=N){
            cout<<'\n'; 
            c=0;
        }
        else 
            c++;
         
    }
    cout<<'\n';
}

void show_Barray(const int *pB,const int N){ //вывод на экран массива B ввиде строки
    cout<<"\n";
    int c=0;
    for (int i=0;i<N*N;i++,pB++){
        cout<<" "<<*pB<<" ";
        if (c+1>=10){
            cout<<'\n'; 
            c=0;
        }
        else
            c++;
    }
}

Здесь сам алгоритм обхода, который не выходит придумать
Код

void create_Barray(const int *pA,int *pB,int N){ //создание массива B из элементов массива А.
    int length=N,DIRECTION=0,even_odd=1;
    
    pA+=(N-1)*N; //начальный элемент обхода. левый нижний угол
    *pB=*pA;
    switch (DIRECTION) {    //направления заполнения массива
    case 0:{                //вверх
                pB++;
                pA-=N;                    
                DIRECTION++;            
        }
            case 1:{                  //по диагонали вниз или вверх. 
                if (even_odd%2==0){
                    for (i=0;i<length;i++,pB++)
                    


                }
                else{

            
                }
                DIRECTION++;   
         }



    }


}

Вроде бы по логике понятно, но реализовать не могу в силу небольшого опыта. 

PM MAIL   Вверх
mekhanikus
Дата 27.10.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


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

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



Почему бы, для начала, не определить нормальный двумерный массив А?
Код

int* pA = new int[N][N];

После этого, имхо, легче придумать алгоритм обхода.

Это сообщение отредактировал(а) mekhanikus - 27.10.2009, 13:32
PM MAIL   Вверх
kirkhammett
Дата 27.10.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



По заданию я не могу обращатся к элементам массива через индексы. Как бы я его не задал, все равно придется пользоватся только адресами элементов в памяти.
PM MAIL   Вверх
Dikey
Дата 27.10.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 6.3.2008
Где: Украина г.Изюм

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



объявляеш функцию типа (int *p)
в функцию нужно передавать  (&имя_массива[строка])
а в функции принимать и обрабатывать построчно с помощью указателя на массив.(int *p)
нужно еще цикл организовать для перебора строк.
Двумерный массив+указатели
Просто пример,это не решение твоей задачи.
Код

int arr[10][100];//объявляем двухмерный массив
for (int i=0;i<10;i++)
      read_arr(&arr[i]);//отправляем адрес начала i строки

int read_arr(int *p){
     for (int i=0;i<100;i++){
           cout<<*p;//печатаем все элементы i строки
              p++;
     }
     return 0;
}


Это сообщение отредактировал(а) Dikey - 27.10.2009, 18:44
PM MAIL WWW ICQ Skype   Вверх
Albor
Дата 28.10.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include <iostream>
using namespace std;

void main()
{
    const int M(7);
    const int N(7);
    int Arr[M][N];// исходный двумерный массив
    int k(0);
    for(int i=0; i<M;i++)// заполняем исходный массив
    {
        for (int j=0;j<N;j++)
        {
            *(*(Arr+i)+j)=k++;
        }
    }
    int mm=M-1;
    int nn=0;
    int arr[M*N];// целевой одномерный массив
    k=0;
    bool bVerh=true;
    bool bPravo=false;

    while(k<M*N)
    {
        *(arr+k++)=*(*(Arr+mm)+nn);
        if(bVerh) --mm;
        else ++mm;
        if(bPravo) ++nn;
        else --nn;
        if(nn<0 || nn>N-1) //переход левой и правой границы
        {
            bPravo=!bPravo;// меняем направление лево/право
            nn=nn<0?0:N-1;
            bVerh=nn==0?false:true;
            if(mm<0) 
            {
                mm=0;
                ++nn;
            }
            if(nn==N-1) mm-=2;
        }
        if(mm<0 || mm>M-1)//переход верхней/нижней границы
        {
            bVerh=!bVerh; //меняем направление верх/низ
            mm=mm<0?0:M-1;
            bPravo=mm==M-1?false:true;
            if(mm==0) nn+=2;
        }
    
        
    }
    k=0;
    while(k<M*N) cout<<*(arr+k++)<<' ';
    
}

Как по мне - заполнять массив лучше последовательными значениями, а не случайными, тогда легче отследить правильность работы алгоритма обхода.
PM MAIL ICQ   Вверх
dima19911991
Дата 27.5.2011, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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

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

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


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

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


 




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


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

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