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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2010, 19:11   #1
Aндрей
Пользователь
 
Регистрация: 15.02.2009
Сообщений: 33
По умолчанию указатель на двумерный массив

Помогите разобраться пожалуйста. У меня имеется двумерный массив и функция сортировки. Функция сортирует одномерный массив. Нужно добавить указатель (*p) который ссылается на двумерный массив. Для указателя надо разработать формулу. Указатели я понимаю не очень, поэтому не смейтесь над моим кодом

Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#define size 3

void puzir(int mas[][size],int n, int m, int *p)
{
int i,j,temp;
//int *p;

p = (int *) mas;

for (i=n*m-1;i>1;i--)
{
for (j=1;j<i;j++)
if (p[j]<p[j-1])
{
temp=p[j];
p[j]=p[j-1];
p[j-1]=temp;
}
}
}

void main()
{
clrscr();
int i,j,n=3,m=3;
int a[3][3]={   { 16,12,13 },
                { 21,8,23 },
                { 10,32,33 }  };
int p[20];
for(i=0;i<n;i++){printf("\n");
  for(j=0;j<m;j++){
    printf(" %d  ",a[i][j]);}}

printf("\n");

//p = (int *) a;

puzir(a,n,m,p);

int k=n*m-1;i=0;
while(k>=i){
   if((i%3)==0){printf("\n");}
   printf(" %d  ",(p)[i]);
 i++;
}

getch();
}
Изображения
Тип файла: bmp Безымянный.bmp (222.2 Кб, 144 просмотров)

Последний раз редактировалось Aндрей; 12.05.2010 в 21:03.
Aндрей вне форума Ответить с цитированием
Старый 12.05.2010, 20:37   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Не вполне понял ваш вопрос. Двумерный массив через указатели задается так:
Код:
int ** Matrix;
int i, j;
Matrix = (int**)malloc(size * sizeof(int*));
for (i = 0; i < size; i++)
 Matrix[i] = (int*)malloc(size * sizeof(int));
for (i = 0; i < size; i++)
 for (j = 0; j < size; j++)
  Matrix[i][j] = i + j;
Двумерный массив - это по сути одномерный массив одномерных массивов; каждый его член - это указатель на обычный одномерный массив.
Что конкретно вы хотите с ним сделать?

Кстати, для оформления кода используется тег CODE (заглавными буквами, хотя не знаю, насколько важен регистр) - кнопочка # над окном сообщения, самая правая там.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 12.05.2010, 21:01   #3
Aндрей
Пользователь
 
Регистрация: 15.02.2009
Сообщений: 33
По умолчанию

Есть функция puzir, сортирующая одномерный массив. Этой функции передаются параметры двумерного массива. Препод сказал, что нужно добавить указатель, и работать с указателем. Нужно перевести дмумерный массив в указатель придумав формулу (на фотке я попытался нарисовать как объяснял препод)... если я все правильно понял то вроде так.

Последний раз редактировалось Aндрей; 12.05.2010 в 21:08.
Aндрей вне форума Ответить с цитированием
Старый 12.05.2010, 22:16   #4
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Насколько я понял, вам просто надо передавать двумерный массив через указатель. Никаких преобразований в виде формул использовать не надо. Почитайте в какой-нибудь книжке про указатели и массивы, а также про передачу аргументов в функцию через указатели (в т.ч. массивов).
Как примерно передавать двумерный массив в функцию и работать с ним:
Код:
#include <stdio.h>
#include <conio.h>

#define M 4
#define N 3

void PrintMatrix(int** arr, int n, int m)
 {
 int i, j;
 for (i = 0; i < n; i++)
  {
  for (j = 0; j < m; j++)
   printf("%d ", arr[i][j]);
  printf("\n");
  }
 }

int main()
{
int ** Matrix;
int i, j;
Matrix = (int**)malloc(N * sizeof(int*));
for (i = 0; i < N; i++)
 Matrix[i] = (int*)malloc(M * sizeof(int));
for (i = 0; i < N; i++)
 for (j = 0; j < M; j++)
  Matrix[i][j] = i + j;
PrintMatrix(Matrix, N, M);
getch();
}
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 18.05.2010, 20:51   #5
Aндрей
Пользователь
 
Регистрация: 15.02.2009
Сообщений: 33
По умолчанию

Код:
void puzir(int mas[][size],int n, int m, int *p)
{
int i,j,temp;

for(i = 0; i < n; i++){       //объясните пожалуйста, что происходит
   for(j = 0; j < m; j++)         //в этих строчках
       p[i*m+j]=mas[i][j];}

for (i=n*m;i>1;i--)
{
 for (j=1;j<i;j++)
     if (p[j]<p[j-1]){
	temp=p[j];
	p[j]=p[j-1];
	p[j-1]=temp;}
 }
}
Aндрей вне форума Ответить с цитированием
Старый 19.05.2010, 08:50   #6
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Этот цикл нужен чтобы все данные из двумерного мессива перевести в линейный, т.е. поочереди все строки двумерного массива mas мы записываем в одномерный p
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 19.05.2010, 23:05   #7
Aндрей
Пользователь
 
Регистрация: 15.02.2009
Сообщений: 33
По умолчанию

Посмотрите пожалуйста, почему не работает, замучался уже тыркаться.
Главное, когда выбираю сортировку выбором то все работает, а когда пузырьком, то не работает, даже не дает ввести элемент который надо найти, сразу пишет что элемент не найден. И если задать больше 3*3, то если выбрать пузырек программа ничего не выводит, а если выбрать выбором то все работает(((( хотя поидее все должно работать..
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#define size 50

//VIVIOD NA ECRAN MATRICI int

void vyvod_mas(int mas[][size], int str,int stlb)
{
	int i,j;
	for(i=0;i<str;i++)
	{printf("\n");
	 for(j=0;j<stlb;j++)
		 printf(" %d  ", mas[i][j]); }
}

//VIVIOD NA ECRAN MATRICI int
void vyvod_mas2(int mas[], int n, int m)
{
	int i;
	for(i=0;i<n*m;i++){
		if((i%m)==0){printf("\n");}
		printf(" %d\ ",mas[i]);}
}


void puzir(int mas[][size],int n, int m)
{
int i,j,temp;
int *p;

for(i = 0; i < n; i++){
	for(j = 0; j < m; j++){
		p[i*m+j]=mas[i][j];}}

for (i=n*m;i>1;i--)
{
 for (j=1;j<i;j++)
	if (p[j]<p[j-1]){
		 temp=p[j];
		 p[j]=p[j-1];
		 p[j-1]=temp;}
 }
for(i = 0; i < n; i++){
	for(j = 0; j < m; j++)
		mas[i][j]=p[i*m+j];}
}


void Vibor(int mas[][size],int n, int m) {
	int i, j, k, temp,*p;
for(i = 0; i < n; i++){
	for(j = 0; j < m; j++)
		p[i*m+j]=mas[i][j];}

	for( i=0; i < n*m; i++) {   	// prohodi
		k=i; temp=p[i];

		for( j=i+1; j < n*m; j++)	// vibor naimenshego elementa
			if (  p[j] < temp ) {
				k=j; temp=p[j];	        // k - index naimenshego elementa
			}
		p[k] = p[i]; p[i] = temp;   	// menyaem mestami min s a[i]
	}
for(i = 0; i < n; i++){
	for(j = 0; j < m; j++)
		mas[i][j]=p[i*m+j];}
}

void func(int mas[][size], int n, int m, int *p){
int i,j;
for(i = 0; i < n; i++){
	for(j = 0; j < m; j++)
		p[i*m+j]=mas[i][j];}
}

// posledovatelniy poisk
void posledovat_poisk(int mas[], int n, int key){
	int i,j,k=0;
	for(i=0;i<n;i++){
	if(mas[i]==key){
	printf(" mas[%d] = %d\n",i,mas[i]);k++;}}
	if(k==0){printf(" element ne naiden!");}
	}

	void main()
	{
	clrscr();
	const el=50;
	int a[el][el],a2[50],i,na,ma,k=1,S,key,element,result;
	printf("\n");
	printf(" vvedite razmer matrici: ");
	scanf("%d%d",&na,&ma);
	randomize();
	for(i=0;i<na;i++){
	for(int j=0;j<ma;j++){
	a[i][j]=random(10);}}
	vyvod_mas(a,na,ma);
	printf("\n");
	printf("\nViberite sortirovku:\n 1: puzirek\n 2: viborom\n");
	scanf("%d",&S);
	switch(S)
	{
	case 1:{
	puzir(a,na,ma);
	vyvod_mas(a,na,ma);
	func(a,na,ma,a2);
	break;}
	case 2:{
	Vibor(a,na,ma);
	vyvod_mas(a,na,ma);
	func(a,na,ma,a2);
	break;}
	default:{ printf("neverniy vibor! \n");k=0;break;}
	}
	if(k){
	printf("\n\n vvedite iskomiy element: ");
	scanf("%d",&key);
	printf("\n");
	posledovat_poisk(a2,na*ma,key);
	}
	getch();
	}

Последний раз редактировалось Aндрей; 19.05.2010 в 23:20.
Aндрей вне форума Ответить с цитированием
Старый 20.05.2010, 06:25   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Вы же объявляете p, но не выделяете под него память.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 20.05.2010, 09:16   #9
Aндрей
Пользователь
 
Регистрация: 15.02.2009
Сообщений: 33
По умолчанию

Гром спасибо большое))) Посмотри пожалуйста, правильно я сделал? вроде работает.
Код:
void puzir(int mas[][size],int n, int m)
{
int i,j,temp;
int* p;
p=(int*)malloc(n*sizeof(int*));     //ВОТ

for(i = 0; i < n; i++){
	for(j = 0; j < m; j++){
		p[i*m+j]=mas[i][j];}}

for (i=n*m;i>1;i--)
{
 for (j=1;j<i;j++)
	if (p[j]<p[j-1]){
		 temp=p[j];
		 p[j]=p[j-1];
		 p[j-1]=temp;}
 }
for(i = 0; i < n; i++){
	for(j = 0; j < m; j++)
		mas[i][j]=p[i*m+j];}
}
Aндрей вне форума Ответить с цитированием
Старый 20.05.2010, 09:40   #10
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Только он должен быть побольше:
Код:
p=(int*)malloc(n*m*sizeof(int*));
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать массив в функции, через указатель. Как? TwiX Общие вопросы Delphi 10 01.04.2010 11:36
как скопировать ucInData(указатель) в массив iInput AlexVI Общие вопросы C/C++ 3 14.02.2010 16:26
Двумерный массив, одномерный массив. Branbal Помощь студентам 14 18.11.2009 12:40
указатель на массив Cpluser Общие вопросы C/C++ 6 23.09.2009 21:46
Двумерный массив Veroni4ka Помощь студентам 3 12.05.2009 11:09