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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2009, 12:57   #1
Джед
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 28
По умолчанию Сдвиг массива.

День добрый!
Такая вот у меня проблема.
Вот код.
Код:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std ;


int _tmain(int argc, _TCHAR* argv[])

{
	
		
	const int n=6;
	char const* pS [ n ] = 
	{ "1. Sozdatj massiv", 
	"2. Vivesti massiv", 
	"3. ", 
	"4. ", 
	"5. ", 
	"0. Exit" } ;
	int v, diapazon, minnum, *pmas,size_mas=1,r,*newmas,g,c,size_mas_2=1,max,summa; 
	bool Dinm=false;
	pmas=new int[size_mas];
	do
	{
		cout << "Menu\n" ;
		for ( int i = 0; i < n; i++ ) cout << pS [ i ] << endl ;
		cout << "\nYour choice - > " ;
		cin >> v ;
		cin.get();
		
		switch ( v )
		{
		case 1 : 
			cout << '\n' << pS [ 0 ] << "\n\n" ; 
		delete [] pmas;
		r=unsigned int (time(NULL)%32767);
		srand(r);
		cout<<"diapazon=?"<<endl;
		cin>>diapazon;
		cin.get();
		cout<<"minnum=?"<<endl;
		cin>>minnum;
		cin.get();
		cout<<"size of pmas=?"<<endl;
		cin>>size_mas;
		cin.get();


		pmas=new int[size_mas];
		for (int i=0;i<size_mas;i++)
			*(pmas+i)=int(rand()/32767.*diapazon)+minnum;
		for(int i=0;i<size_mas;i++)
			cout<<i<<"\t\t"<<*(pmas+i)<<endl;
		cout<<"\n\n\n\n"<<endl;
		Dinm=true;
		cin.get();
			break ;
		case 2 : 
			cout << '\n' << pS [ 1 ] << "\n\n" ;
			if (Dinm==false)
					cout<<"Massiv ne zapolnen"<<endl;
				else
				{
					for(int i=0;i<size_mas;i++)
					cout<<i<<"\t\t"<<*(pmas+i)<<endl;
				}
			cin.get();
			break ;
		case 3 :
			cout << '\n' << pS [ 2 ] << "\n\n" ;
			//
			break ;
		case 4 : 
			cout << '\n' << pS [ 3 ] << "\n\n" ; 
			//
			break ;
		case 5 : 
			cout << '\n' << pS [ 4 ] << "\n\n" ; 
			
			break ;
		case 0 : break ;
		default  : cout << "\nIllegal choice\n\n";
		}
	} while ( v != 0 ) ;
	return 0;
}
В case 3 мне надо произвести сдвиг массива на одну позицию влево (вверх), а в case 4 наоборот - вправо (вниз). Но если честно я не представляю как это сделать. Надо использовать указатели. А я с программированием не то что на "Вы", а скорее даже на "Он, Она, Оно"...
Заранее спасибо.
Джед вне форума Ответить с цитированием
Старый 09.06.2009, 13:06   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Это довольно просто.
Сдвиг влево:
Код:
tmp = нулевой элемент
цикл i от 0 до N-1
 элемент i = элемент i+1
элемент N = tmp
Сдвиг вправо:
Код:
tmp = элемент N
цикл от N до 1
 элемент i = элемент i-1
элемент 0 = tmp
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Типа такого?

Код:
int tmp=*pmas;
for (int i=0;i<size_mas-1;i++)
i+=1;
size_mas=tmp;
Хотя судя по всему, что-то не то...

Последний раз редактировалось Джед; 09.06.2009 в 13:32.
Джед вне форума Ответить с цитированием
Старый 09.06.2009, 13:33   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Типа такого?
Даже рядом не стояло )
Код:
int tmp = *pmas;
for(int i=0; i<size_mas-1; i++)
 *(pmas+i) = *(pmas+i+1);
*(pmas+size_mas-1) = tmp;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Ну я же говорил, что я хреновый программист))


После компиляции вылезает
Error 3 error C2360: initialization of 'tmp' is skipped by 'case' label ...

Что делать?
Джед вне форума Ответить с цитированием
Старый 09.06.2009, 13:39   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

У меня нет ошибок. Может, ему не нравится, что вы объявляете tmp внутри case. Объявите где-нибудь пораньше.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Именно на это он и ругался)

А сдвиг вправо будет выглядеть так?

Код:
int tmp=*(pmas+size_mas-1)
for(int i=pmas-1;i=0;i--)
*(pmas-i)=*(pmas-i-1)
*(pmas)=tmp
Джед вне форума Ответить с цитированием
Старый 09.06.2009, 14:11   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Джед
А сдвиг вправо будет выглядеть так?
Код:
int tmp=*(pmas+size_mas-1);
for(int i=size_mas-1;i>0;i--)
 *(pmas+i)=*(pmas+i-1);
*(pmas)=tmp;
А в неправильности своего кода вы могли убедиться и сами.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

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

А вот сдвинутый, но вся проблема в том, что 1 число из массива пропало, а на последнее место вылезло что-то непонятное, а мне надо чтоб массив циклически сдвигался... Т.е. 1 число стало бы последним. ((
Джед вне форума Ответить с цитированием
Старый 09.06.2009, 19:58   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Скринов еще поменьше у вас, конечно, не нашлось..

У меня все работает и все сдвигается. Вы наверняка что-нибудь изменили.
Код:
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std ;


int main()

{

	const int n=6;
	char const* pS [ n ] =
	{ "1. Sozdatj massiv",
	"2. Vivesti massiv",
	"3. ",
	"4. ",
	"5. ",
	"0. Exit" } ;
	int v, diapazon, minnum, *pmas,size_mas=1,r,*newmas,g,c,size_mas_2=1,max,summa;
	bool Dinm=false;
	pmas=new int[size_mas];
	int tmp;
	do
	{
		cout << "Menu\n" ;
		for ( int i = 0; i < n; i++ ) cout << pS [ i ] << endl ;
		cout << "\nYour choice - > " ;
		cin >> v ;
		cin.get();

		switch ( v )
		{
		case 1 :
			cout << '\n' << pS [ 0 ] << "\n\n" ;
		delete [] pmas;
		r=(unsigned int )(time(NULL)%32767);
		srand(r);
		cout<<"diapazon=?"<<endl;
		cin>>diapazon;
		cin.get();
		cout<<"minnum=?"<<endl;
		cin>>minnum;
		cin.get();
		cout<<"size of pmas=?"<<endl;
		cin>>size_mas;
		cin.get();


		pmas=new int[size_mas];
		for (int i=0;i<size_mas;i++)
			*(pmas+i)=int(rand()/32767.*diapazon)+minnum;
		for(int i=0;i<size_mas;i++)
			cout<<i<<"\t\t"<<*(pmas+i)<<endl;
		cout<<"\n\n\n\n"<<endl;
		Dinm=true;
		cin.get();
			break ;
		case 2 :
			cout << '\n' << pS [ 1 ] << "\n\n" ;
			if (Dinm==false)
					cout<<"Massiv ne zapolnen"<<endl;
				else
				{
					for(int i=0;i<size_mas;i++)
					cout<<i<<"\t\t"<<*(pmas+i)<<endl;
				}
			cin.get();
			break ;
		case 3 :
			cout << '\n' << pS [ 2 ] << "\n\n" ;
			tmp = *pmas;
 for(int i=0; i<size_mas-1; i++)
 *(pmas+i) = *(pmas+i+1);
*(pmas+size_mas-1) = tmp;
			//
			break ;
		case 4 :
			cout << '\n' << pS [ 3 ] << "\n\n" ;
			tmp=*(pmas+size_mas-1);
for(int i=size_mas-1;i>0;i--)
 *(pmas+i)=*(pmas+i-1);
*(pmas)=tmp;
			//
			break ;
		case 5 :
			cout << '\n' << pS [ 4 ] << "\n\n" ;

			break ;
		case 0 : break ;
		default  : cout << "\nIllegal choice\n\n";
		}
	} while ( v != 0 ) ;
	return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хитрый сдвиг массива xakzona Паскаль, Turbo Pascal, PascalABC.NET 1 07.05.2009 21:49
Задача про сдвиг массива 12345678 Общие вопросы C/C++ 11 02.02.2009 14:02
циклический сдвиг массива goacher Общие вопросы C/C++ 4 28.05.2008 20:11
циклический сдвиг массива goacher Паскаль, Turbo Pascal, PascalABC.NET 4 27.05.2008 22:26