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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2012, 21:04   #1
Каtерина
 
Аватар для Каtерина
 
Регистрация: 11.01.2012
Сообщений: 5
Печаль Задача на С++ Двухмерные массивы

Всем Великим программистам Привет! Прошу у Вас помощи в решении задачи по информатике. Помогите девушке, а то я ничего совсем не понмаю задачу, очень нужно сдать ее, а то плохо будет))
Трактовка:
Осуществить циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз (в зависимости от введенного режима). n может быть больше количества элементов в строке или столбце

Жду Вашей помоши
Каtерина вне форума Ответить с цитированием
Старый 11.01.2012, 22:05   #2
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

перед началом сдвига добавить строчку n % (количество строк - столбцов, зависит от режима)
вот вам пища для реализации данной работы... правда одномерный... но модификаций сделать не много... и вот ещё немного... если не будет получаться... а не ленью маяться... то пишите... поможем)...

Цитата:
Сообщение от VIK_aka_TOR Посмотреть сообщение
перед началом сдвига добавить строчку n % (количество строк - столбцов, зависит от режима)
вот вам пища для реализации данной работы... правда одномерный... но модификаций сделать не много... и вот ещё немного... и ещё...если не будет получаться... а не ленью маяться... то пишите... поможем)...
было бы желание... а решение найдется)
пишу код не только за печеньки

Последний раз редактировалось Stilet; 22.01.2012 в 22:45.
VIK_aka_TOR вне форума Ответить с цитированием
Старый 18.01.2012, 07:25   #3
Каtерина
 
Аватар для Каtерина
 
Регистрация: 11.01.2012
Сообщений: 5
По умолчанию

Помогите найти ошибку, выводит одну и туже матрицу, что я сделала не так?
Код:
#include <iostream>
 
using namespace std;
typedef int* stroka;              
 
class Matrix
{
public:
        stroka* matrix;
        int a, b;
        Matrix(int a1, int b1)
        {
                this->a = a1, this->b = b1;
                matrix = new stroka[a];
                for (int i = 0; i < a; ++i)
                        matrix[i] = new int[b];
        }
        ~Matrix(void)
        {
                for (int i = 1; i < a; ++i)
                        delete[]matrix[i];
                delete[]matrix;
        }
        void sdvig (int flag, int sdvig, int index)
        {
                if (!(sdvig % a) && flag == 2 || flag == 1 && !(sdvig % b))
                        return;
                else
                        if (flag == 2 && index >= 0 && index < b) // столбец
                        {
                                sdvig = sdvig > 0 ? sdvig % a : sdvig % a + a;
                                int* tmp = new int[sdvig];
                                for (int i = 0; i < sdvig; ++i)
                                {
                                 tmp[i] = matrix[a - sdvig + i][index]; // сохраняем последние элементы [сдвиг]
                                matrix[a - sdvig + i][index] = matrix[(a - 2*sdvig + i >= 0 ? a - 2*sdvig + i : (2 * (a - sdvig) + i) % a)][index];     
// на их место предыдущие [сдвиг]
                                }
                                for (int i = a - sdvig; i >= sdvig; --i)
                                        matrix[i][index] = matrix[i - sdvig][index];
                                for (int i = 0; i < sdvig; ++i)
                                        matrix[i][index] = tmp[i];
                                delete[]tmp;
                        }
                        else 
                                if (flag == 1 && index >= 0 && index <= a)
 // строка
                                {
                                        sdvig = sdvig > 0 ? sdvig % b : sdvig % b + b;
                                        int* tmp = new int[sdvig];
                                        for (int i = 0; i < sdvig; ++i)
                                        {
                                                tmp[i] = matrix[index][b - sdvig + i]; // сохраняем последние элементы [сдвиг]
                                                int t = b - 2*sdvig + i >= 0 ? b - 2*sdvig + i : (2 * (b - sdvig) + i) % b;
                                                matrix[index][b - sdvig + i] = matrix[index][t];        // на их место предыдущие [сдвиг]
                                        }
                                        for (int i = b - sdvig; i >= sdvig; --i)
                                                matrix[index][i] = matrix[index][i - sdvig];
                                        for (int i = 0; i < sdvig; ++i)
                                                matrix[index][i] = tmp[i];
                                        delete[]tmp;
                                }
        }
        friend ostream& operator<< (ostream& os, const Matrix& Buffer)
        {
                for (int i = 0; i < Buffer.a; ++i)
                {
                        for (int j = 0; j < Buffer.b; ++j)
                                os << Buffer.matrix[i][j] << "  ";
                        os << endl;
                }
                return os;
        }
};
 
int main(void)
{
        Matrix Buffer(7, 5);
 
        for (int i = 0; i < Buffer.a; ++i)
                for (int j = 0; j < Buffer.b; ++j)
                        Buffer.matrix[i][j] = i + j + 1;        
        
        
        cout << Buffer << endl;
        Buffer.sdvig(1 /* столбец */, 3 /* сдвиг*/ , 3);
        cout << Buffer;
 
        system("Pause");
        return 0;
}
Помогите кто - нибудь

Ну посмотрите, кто-нибудь пожалуйста что в этом коде не верно

Последний раз редактировалось Stilet; 22.01.2012 в 23:14.
Каtерина вне форума Ответить с цитированием
Старый 22.01.2012, 22:52   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я посмотрел и слегка ужаснулся...
Циклический сдвиг это простая операция, а у тебя получился какой-то мегадинозаврический код, который трудно понять.
Может стоит переосмыслить метод сдвига, и сделать его попроще?

Вот так например:
Код:
// gdfgfdg.cpp: определяет точку входа для консольного приложения.
//http://www.programmersforum.ru/showthread.php?p=957886#post957886

#include "stdafx.h"
#include <iostream>
 
using namespace std;
typedef int* stroka;              
 
class Matrix
{
public:
        stroka* matrix;
        int a, b;
		int byX,byY;
        Matrix(int a1, int b1)
        {
                this->a = a1, this->b = b1;
                matrix = new stroka[a];
                for (int i = 0; i < a; ++i){
                        matrix[i] = new int[b];
						//for(int j=0;j<b;j++) matrix[i][j]=i + j + 1;
				}
        }
        
		~Matrix(void)
        {
                for (int i = 1; i < a; ++i)
                        delete[]matrix[i];
                delete[]matrix;
        }
        void sdvig (int _byX, int _byY){
			byX=_byX;
			byY=_byY;
		}
        
		friend ostream& operator<< (ostream& os, const Matrix& Buffer)
        {
                for (int i = Buffer.byY; i < Buffer.a+Buffer.byY; ++i)
                {
					for (int j = Buffer.byX; j < Buffer.b+Buffer.byX; j++)
                                os << Buffer.matrix[i % Buffer.a][j % Buffer.b] << "  ";
                        os << endl;
                }
                return os;
        }
};

int _tmain(int argc, _TCHAR* argv[])
{
        Matrix Buffer(7, 5);
 
        for (int i = 0; i < Buffer.a; ++i)
                for (int j = 0; j < Buffer.b; ++j)
                        Buffer.matrix[i][j] = i + j + 1;        
        
        
        Buffer.sdvig(0, 0);
        cout << Buffer << endl;
        Buffer.sdvig(1, 1);
        cout << Buffer;
 
        system("Pause");
   return 0;
}
Здесь определяются коэффициенты сдвига, а сам сдвиг происходит автоматом при выводе.
I'm learning to live...

Последний раз редактировалось Stilet; 22.01.2012 в 23:13.
Stilet вне форума Ответить с цитированием
Старый 01.02.2012, 22:06   #5
Каtерина
 
Аватар для Каtерина
 
Регистрация: 11.01.2012
Сообщений: 5
По умолчанию

Ошибку выдает
Код:
IntelliSense: идентификатор "_TCHAR" не определен
подскажите пожалуйста
Каtерина вне форума Ответить с цитированием
Старый 01.02.2012, 22:15   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ой а что у тя за компиль? У меня VS2010, просто возьми тело примера и вставь в свою функцию main - у нас они различны.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача в Паскале на двухмерные массивы (вывод матрицы) Диман-Качуг Помощь студентам 5 10.05.2011 10:22
Задача по VBA, матрицы(двухмерные массивы) userwii Помощь студентам 0 21.03.2011 21:48
C++. Двухмерные массивы. bpystep Помощь студентам 11 23.05.2010 13:49
Задача на двухмерные массивы! Помогите решить! dimmkka Общие вопросы .NET 1 18.02.2009 21:16
Двухмерные массивы (С++) Nattka Помощь студентам 2 04.12.2008 21:15