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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2010, 15:14   #1
GrihaI
Пользователь
 
Регистрация: 23.04.2010
Сообщений: 13
По умолчанию Динамические массивы и указатели

В функцию min_max передаю адреса min,max, как в функции присвоить этим переменным адреса максимального и минимального значений? чтобы в функции swap поменять местами ?
Код:
#include <stdlib.h>
#include <iostream>
#include <time.h>
using namespace std;
//создает массив 
int**create(int h,int w)
{
	int**p,i;
	p=new int*[h];
	for(i=0;i<h;i++)
		p[i]=new int[w];
	return p;
}
//вывод массива на экран
void print(int **p,int h,int w)
{
	int i,j;
	for(i=0;i<h;i++)
	{
		for(j=0;j<w;j++)
		{
			cout<<p[i][j]<<"\t";
		}
		cout<<endl;
	}
}

//заполнение массива 
void add(int **p,int h,int w)
{
	int i,j;
	for(i=0;i<h;i++)
		for(j=0;j<w;j++)
		{
			p[i][j]=rand()%21-10;
		}
}
//поиск максимального и минимального значений
void min_max(int **p,int h,int w,int &min,int &max)
{
	int i,j;
	min=max=p[0][0];
	for(i=0;i<h;i++)
		for(j=0;j<w;j++)
		{
			if(p[i][j]<min)min=p[i][j];
			if(p[i][j]>max)max=p[i][j];
		}
}
//Меняет местами пер-вый и максимальный элементы
// последний и минимальный элементы.
//эта функция работает неправильно :(
void swap(int **p,int h,int w,int &min,int &max)
{
	int temp;
	temp=max;
	max=p[0][0];
	p[0][0]=temp;
	temp=min;
	min=p[h-1][w-1];
	p[h-1][w-1]=temp;
}
void main()
{
	int h,w;
	int **array_a;
	int min,max;
	srand (time (NULL));
	cout<<"height:";
	cin>>h;
	cout<<"width:";
	cin>>w;
	array_a=create(h,w);
	add(array_a,h,w);
	cout<< "Содержимое массива\n";
	print(array_a,h,w);
	min_max(array_a,h,w,min,max);
	printf("Min: %d\nMax: %d\n",min,max);
	swap(array_a,h,w,min,max);
	print(array_a,h,w);
	cin>>w;
}
Для спасибо Z298312474269
GrihaI вне форума Ответить с цитированием
Старый 30.05.2010, 17:00   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

А не проще ли в min_max запоминать индексы максимума и минимума и в ней же после цикла поменять их местами? Тогда функция swap вообще не нужна
И Вы передаёте не адреса, а переменные по ссылке, это разные вещи
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 30.05.2010, 17:05   #3
GrihaI
Пользователь
 
Регистрация: 23.04.2010
Сообщений: 13
По умолчанию

Проще, но я хотел именно так.
Люблю знаете ли заниматься сексом в гамаке и стоя!
Для спасибо Z298312474269
GrihaI вне форума Ответить с цитированием
Старый 30.05.2010, 17:40   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Делается это так:
Код:
void swap(int &min, int &max)
{
     int temp = min;
     min = max;
     max = temp;     // Так как элементы переданы по ссылке, то идет их
                            // непосредственная модификация
}

void min_max(int **p, int h, int w, int *&min, int *&max)   // Не смущайтесь "указателю 
{                                         // на ссылку" - для компилятора это ссылка на указатель
     min = max = &p[0][0];
     for(int i=0; i<h; i++)
	for(int j=0; j<w; j++)
	{
		if(p[i][j] < *min) min = &p[i][j];     // Сохраняем найденные адреса
		if(p[i][j] > *max) max = &p[i][j];    // в переданных указателях,
	}                                                              // и результат в вызывающей
}            // функции сохранится в соответствующих аргументах - передача по ссылке
И купите себе новую клавиатуру, на которой работает Пробел!
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 30.05.2010, 17:41   #5
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Делается это так:
Код:
void swap(int &min, int &max)
{
     int temp = min;
     min = max;
     max = temp;     // Так как элементы переданы по ссылке, то идет их
                            // непосредственная модификация
}

void min_max(int **p, int h, int w, int *&min, int *&max)   // Не смущайтесь "указателю 
{                                         // на ссылку" - для компилятора это ссылка на указатель
     min = max = &p[0][0];
     for(int i=0; i<h; i++)
	for(int j=0; j<w; j++)
	{
		if(p[i][j] < *min) min = &p[i][j];     // Сохраняем найденные адреса
		if(p[i][j] > *max) max = &p[i][j];    // в переданных указателях,
	}                                                              // и результат в вызывающей
}            // функции сохранится в соответствующих аргументах - передача по ссылке
И купите себе новую клавиатуру, на которой работает Пробел!
Случайно два отправил...
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."

Последний раз редактировалось Syuf; 30.05.2010 в 17:46.
Syuf вне форума Ответить с цитированием
Старый 30.05.2010, 17:52   #6
GrihaI
Пользователь
 
Регистрация: 23.04.2010
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Syuf Посмотреть сообщение
И купите себе новую клавиатуру, на которой работает Пробел!
За решение большое спасибо !
А набираю я экранной клавой, из-за моих физических особенностей, поэтому часто пропускаю пробел.
Для спасибо Z298312474269
GrihaI вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
указатели. динамические списки -Spirit- Помощь студентам 1 18.05.2010 14:41
Указатели и динамические массивы iiunbreakableii Общие вопросы Delphi 7 04.09.2009 14:43
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39
Указатели, динамические списки Al-Fencer Паскаль, Turbo Pascal, PascalABC.NET 4 27.04.2009 12:44
Указатели и динамические массивы. Airou Общие вопросы C/C++ 5 16.01.2009 19:05