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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 27.05.2009, 22:35   #1
Джед
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 28
По умолчанию Перепись значений в массив указателей.

Просьба помочь, народ!

Вот мой код, и начиная


Код:
#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
		
	
	int i, n,*pmas,diapazon, minnum;
	unsigned int r;	
	char cont;


	do
	{		
		cout<<"Size pmas?\n";
		cin>>n;
		pmas=new int[n];	
	
		r=(unsigned int)time(NULL)%32767;
		srand(r);
		cout<<"diapazon=?";
		cin>>diapazon;
		cin.get();
		cout<<"min. number=?";
		cin>>minnum;
		cin.get();
		


      	
	pmas=new int[n];	
	for(i=0;i<n;i++)
		*(pmas+i)=int(rand()/32767.*diapazon)+minnum;


	for(i=0;i<n;i++)
		cout<<pmas+i<<'\t'<<*(pmas+i)<<'\n';
	cout<<'\n';
		cin.get(); // создан исходный массив

	int max=*pmas;
	for(int f=0;f<n;)
	{
		max=*(pmas+f); // берём первое число, сравниваем с остальными
	
		for (int k=0;k<n;k++)
		{
		if(max<=*(pmas+k))
		{max=*(pmas+k);}
		}
		f++;
	}
	cout<<"maks. chislo:"<<max<<endl; // нашли макс значение
	cin.get();
	int a=0;
	for (int k=0;k<n;k++)
		{
		if(*(pmas+k)>=0 && *(pmas+k)!=0)
		a++;
		}
	cout<<"kolich. polozhit. el.:"<<a<<endl;

отсюда что-то неправильно. не производиться вывод массива указателей (вылазит break) или же выводиться, но совершенно не те адреса. 

	int **pnew;
	pnew= new int *[a];//новый массив с количеством элементов А
	int j=0;
	for (int k=0;k<a;)
		{
		if(*(pmas+k)>=0 && *(pmas+k)!=0)
			{
			*(pnew+j)=(pmas+k);
			k++;
			j++;
			}
		else
			k++;
		
	}	
	for(int y=0; y<a; y++)
	cout<<pnew+y<<'\t'<<*(pnew+y)<<**(pnew+y)<<'\n';
		
	
	
	
	 delete [] pnew;
	delete [] pmas;	
	cout<<"For continue -- <Enter>,for exit -- any symbol and <Enter>\n";
		cin.get(cont);

		
	}while (cont=='\n');
	

	
	return 0;
}
Кто-нибудь может подсказать, в чём проблема?

Вот само задание:

Сформировать одномерный динамический массив целых чисел. Используя массив указателей, произвести сортировку адресов положительных элементов массива по их возрастанию

Последний раз редактировалось Джед; 27.05.2009 в 22:39.
Джед вне форума
Старый 28.05.2009, 00:46   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Джед
произвести сортировку адресов положительных элементов массива по их возрастанию
Как-то не очень понял.. Они же (адреса) и так по порядку будут.

Вот в этой строчке табуляцию хорошо бы добавить:
Код:
for(int y=0; y<a; y++)
	cout<<pnew+y<<'\t'<<*(pnew+y)<<'\t'<<**(pnew+y)<<'\n';
Пример вывода:
Код:
Size pmas?
7
diapazon=?30
min. number=?1
0x3e39b8        15
0x3e39bc        26
0x3e39c0        7
0x3e39c4        10
0x3e39c8        14
0x3e39cc        17
0x3e39d0        30


maks. chislo:30

kolich. polozhit. el.:7
0x3e39e0        0x3e39b8        15
0x3e39e4        0x3e39bc        26
0x3e39e8        0x3e39c0        7
0x3e39ec        0x3e39c4        10
0x3e39f0        0x3e39c8        14
0x3e39f4        0x3e39cc        17
0x3e39f8        0x3e39d0        30
For continue -- <Enter>,for exit -- any symbol and <Enter>
Вроде, все то. Нет?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 28.05.2009, 01:30   #3
Джед
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 28
По умолчанию

У меня такая вот проблема.

Джед вне форума
Старый 28.05.2009, 01:54   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ошибка здесь:
Код:
for (int k=0;k<a;)  // нужно идти до n
		{
		if(*(pmas+k)>=0 && *(pmas+k)!=0)
			{
			*(pnew+j)=(pmas+k);
			k++;
			j++;
			}
		else
			k++;
		
	}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 28.05.2009, 09:59   #5
Джед
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 28
По умолчанию

Заработало)) Спасибо огроменное!
Джед вне форума
Старый 28.05.2009, 10:36   #6
Джед
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 28
По умолчанию

У меня ещё небольшой вопросик.
Дальше мне надо было отсортировать этот массив по возрастанию, но что-то не так. Если честно, я просто никогда их не сортировал, поэтому у меня небольшие проблемы.
Вот концовка проги.
Код:
for(int j=0; j<a; j++)
	cout<<pnew+j<<'\t'<<*(pnew+j)<<'\t'<<**(pnew+j)<<'\n';
	
	 int i,;
    int l;
	int pres;
    double tmp;

    for(i = 0; i <= n-1; i++)
    {
        for(l = 0; l <= n-2-i; l++)
        {
            if( pres(l)>pres(l+1) )
            {
                tmp = pres(l);
                pres(l) = pres(l+1);
                pres(l+1) = tmp;
            }
        }
    }
		
	
	delete [] pnew;
	delete [] pmas;	
	cout<<"To continue -- <Enter>,to exit -- any symbol and <Enter>\n";
		cin.get(cont);

		
	}while (cont=='\n');
Джед вне форума
Старый 28.05.2009, 11:12   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Так у вас:
Код:
int pres;
- переменная типа int
А тут:
Код:
  if( pres(l)>pres(l+1) )
            {
                tmp = pres(l);
                pres(l) = pres(l+1);
                pres(l+1) = tmp;
            }
вы к ней как к какой-нибудь функции обращаетесь.

Поэтому я даже не могу понять, что именно вы сортировать хотите.
Вот пример:
Код:
10
diapazon=?10
min. number=?-3
0x3e3a00        6
0x3e3a04        1
0x3e3a08        2
0x3e3a0c        4
0x3e3a10        4
0x3e3a14        -1
0x3e3a18        6
0x3e3a1c        -3
0x3e3a20        -1
0x3e3a24        6


maks. chislo:6

kolich. polozhit. el.:7
0x3e3a30        0x3e3a00        6
0x3e3a34        0x3e3a04        1
0x3e3a38        0x3e3a08        2
0x3e3a3c        0x3e3a0c        4
0x3e3a40        0x3e3a10        4
0x3e3a44        0x3e3a18        6
0x3e3a48        0x3e3a24        6
По какому столбцу нужна сортировка?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 28.05.2009, 11:16   #8
Джед
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 28
По умолчанию

По самому правому.
Джед вне форума
Старый 28.05.2009, 11:26   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Я сократил еще некоторые места.
Код:
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;

int main()
{
	int i, n,*pmas,diapazon, minnum;
	unsigned int r;	
	char cont;

	do
	{		
		cout<<"Size pmas?\n";
		cin>>n;
		pmas=new int[n];	
	
		r=(unsigned int)time(NULL)%32767;
		srand(r);
		cout<<"diapazon=?";
		cin>>diapazon;
		cin.get();
		cout<<"min. number=?";
		cin>>minnum;
		cin.get();
		
	pmas=new int[n];	
	for(i=0;i<n;i++)
		*(pmas+i)=int(rand()/32767.*diapazon)+minnum;

	for(i=0;i<n;i++)
		cout<<pmas+i<<'\t'<<*(pmas+i)<<'\n';
	cout<<'\n';
		cin.get(); // создан исходный массив

	int max=*pmas;
	for(int f=0;f<n;f++)
	{
		max=*(pmas+f); // берём первое число, сравниваем с остальными
		for (int k=0;k<n;k++)
		if(max<=*(pmas+k))
		 max=*(pmas+k);
	}
	cout<<"maks. chislo:"<<max<<endl; // нашли макс значение
	cin.get();
	int a=0;
	for (int k=0;k<n;k++)
		if(*(pmas+k)>0)	a++;

	cout<<"kolich. polozhit. el.:"<<a<<endl;

	int **pnew;
	pnew= new int *[a];//новый массив с количеством элементов А
	int j=0;
	for (int k=0;k<n;k++)
		if(*(pmas+k)>0)
			{
			 *(pnew+j)=(pmas+k);
			 j++;
			}

//sort
int tmp;
for(i=0; i<a-1; i++)
 for(j=i+1; j<a; j++)
  if(**(pnew+j)<**(pnew+i))
   {
    tmp = **(pnew+j);
    **(pnew+j) = **(pnew+i);
    **(pnew+i) = tmp;
   }
//--

	for(int y=0; y<a; y++)
	 cout<<pnew+y<<'\t'<<*(pnew+y)<<'\t'<<**(pnew+y)<<'\n';

	 delete [] pnew;
	delete [] pmas;	
	cout<<"For continue -- <Enter>,for exit -- any symbol and <Enter>\n";
		cin.get(cont);
		
	}while (cont=='\n');
	
	return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 28.05.2009, 18:12   #10
Джед
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 28
По умолчанию

Спасибо, всё работает перфектно)
Джед вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создать массив сл значений, сумма которых определена prasvit Помощь студентам 13 04.04.2009 03:35
Создание надстроек. Функция, возвращающая массив значений Jarik Microsoft Office Excel 6 13.01.2009 23:11
массив указателей на методы класса? cout Общие вопросы C/C++ 2 08.05.2008 09:43
Массив указателей на структуры SNAKE89 Общие вопросы C/C++ 4 27.12.2007 10:14