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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2009, 12:48   #1
Kirk_Hammett
Новичок
Джуниор
 
Регистрация: 19.10.2009
Сообщений: 2
По умолчанию Работа с массивом через указатели

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


Я написал всю программу, кроме самого алгоритма обхода. Хотел делать через 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++;   
		 }



	}


}
Не знаю как управится с счетчиками. Закономерность вроде бы понятна.
На нечетный шаг диагональ идет сверху вниз. На четный снизу вверх. При этом кол-во проходов по элементам диагонали растет до главной диагонали, а потом уменьшается.
Kirk_Hammett вне форума Ответить с цитированием
Старый 27.10.2009, 20:45   #2
Chea
 
Регистрация: 28.09.2009
Сообщений: 4
По умолчанию

Код:
void create_Barray(int *pA,int *pB,int N){ //создание массива B из элементов массива А.

	int *a=pA;
   int h;
   int step=2; // сколько шагов от начала края диагонали до конца
   int delta=(N+1); // шаг по указателю что бы попасть на следующий элемент диагонали
   int dvig=-N; // шаг по указателю что бы перейти на следующую диагональ

	a+=(N-1)*N; 

  *pB++=*a;

   while (step<=N) // движения ниже главной диагонали
      {
         a+=dvig; // переход на следующую диагональ
         dvig=-N/dvig; // подготовка для следующего перехода
         for (h=0;step>h;h++) // по диагонали
            {
               *pB++=*a;
               a+=delta; // следующий элемент диагонали
            }
         a-=delta; // если вышли из цикла нужно вернуть последнее изменение указателя
         step++; // на следующей диагонали на 1 клетку больше
         delta=0-delta; // следующую диагональ идем в обратном направлении
      }
   step--; // в конце предыдущего цикла было лишнее изменение
   step--; // так как из пред. цикла выходим когда прошли главную диагональ то
            // следующая буден на 1 меньше (или step=N-1)
   dvig=-N/dvig; //направление перехода по диагоналям меняется
                  // вверху двигаемся вправо, внизу - вверх
   while (step>0) // движения выше главной диагонали
      {
         a+=dvig;
         dvig=-N/dvig;
         for (h=0;step>h;h++)
            {
               *pB++=*a;
               a+=delta;
            }
         a-=delta;
         step--;
         delta=0-delta;
      }
      
}
Chea вне форума Ответить с цитированием
Старый 27.10.2009, 22:43   #3
Kirk_Hammett
Новичок
Джуниор
 
Регистрация: 19.10.2009
Сообщений: 2
По умолчанию

Премного благодарен. Сейчас проверю.
Все отлично работает. Спасибо.

Последний раз редактировалось Kirk_Hammett; 27.10.2009 в 23:11.
Kirk_Hammett вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с массивом kritik Помощь студентам 10 22.07.2009 20:00
Работа с массивом GaSST Microsoft Office Excel 5 04.06.2009 07:57
Как работать с двумерными массивами через указатели? pascalC Общие вопросы C/C++ 1 12.11.2008 08:33
Работа с массивом: n на n ! Angst Помощь студентам 1 24.01.2008 22:14