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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2009, 14:49   #1
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию C++|Циклический сдвиг матрицы|Шаблоны|Перегрузка

Задание:
Цитата:
Осуществить циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз (в зависимости от введенного режима). n может быть больше количества элементов в строке или столбце.
Проблем несколько:
1. Функция sdvig при принятии матрицы из одной строки выкидывается на 1-м ретурне. Допустим массив (1,2,3,4,5,6). dlina=4. Условие=false, a return срабатывает.
=============
1-я проблема разрешилась сама...причиной было недописанное условие...сорри..не заметил...

2. Ну и сам сдвиг пока не получается заставить работать...

3. Туда ещё как-то надо впихнуть шаблон или перегрузку...

Подскажите плиз хоть что-нить

Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#include <windows.h>
//---------------------------------------------------------------------------
int i,j;
char bufRus[256];

char* Rus (char*);
int vibor_dlini(int);
void sdvig(int**,int,int,int);
void sdvig1(int**,int,int,int);

char* Rus (char* text)
{
   CharToOem(text,bufRus);
   return bufRus;
}

int vibor_dlini(int N)
{
   int dlina;
   cout<<Rus("На сколько элементов двигаем?____\b\b\b");
   cin>>dlina;
   if (dlina<N)
      return dlina;
   else
   {
      if (dlina%N==0)
         return 0;
      else
         return dlina%N;
   }
}

void sdvig(int** mas,int a,int b,int dlina)
{
   int index,buf_dlina=dlina,temp;
   if (dlina==0)
      return;
   if (b%dlina==1)

   for (i=0;i<a;i++)
   {
      dlina=buf_dlina;
      for(j=0;j<b;j++)
      {
         if (dlina>b-1)
            dlina=0;
         temp=mas[i][dlina];
         mas[i][dlina]=mas[i][j];
         mas[i][j]=temp;
         dlina++;
         cout<<Rus("\nВременная матрица: \n");
         for (int k=0;k<a;k++)
         {
            for (int l=0;l<b;l++)
            {
               cout<<mas[k][l]<<"    ";
            }
            cout<<"\n";
         }
      }
   }
   return;
}

/*void sdvig1(int** mas,int a,int b,int dlina)
{
   int index,buf_dlina=dlina,temp;
   if (dlina==0)
      return;
   for (i=0;i<a;i++)
   {
      dlina=buf_dlina;
      for(j=0;j<b;j++)
      {
         if (dlina>b)
            dlina=0;
         temp=mas[dlina][i];
         mas[dlina][i]=mas[i][j];
         mas[i][j]=temp;
      }
   }
}*/

void main()
{
   int kol_str,kol_stb,dlina_sdviga;
   short flag;
   cout<<Rus("Введите количество строк: ");
   cin>>kol_str;
   cout<<Rus("Введите количество столбцов: ");
   cin>>kol_stb;
   int **matr=new int *[kol_str];
   for (i=0;i<kol_str;i++)
      matr[i]=new int[kol_stb];
   for (i=0;i<kol_str;i++)
      for (j=0;j<kol_stb;j++)
      {
         cout<<Rus("Введите элемент [")<<i+1<<"]["<<j+1<<"]: ";
         cin>>matr[i][j];
      }
   cout<<Rus("\nИсходная матрица: \n");
   for (i=0;i<kol_str;i++)
   {
      for (int j=0;j<kol_stb;j++)
      {
         cout<<matr[i][j]<<"    ";
      }
      cout<<"\n";
   }
   do{
      cout<<Rus("Куда двигаем? \n1-Вправо\n2-Вниз\n");
      cin>>flag;
      switch (flag)
      {
         case 1:dlina_sdviga=vibor_dlini(kol_stb); sdvig(matr,kol_str,kol_stb,dlina_sdviga);break;
         case 2:dlina_sdviga=vibor_dlini(kol_str); sdvig(matr,kol_stb,kol_str,dlina_sdviga);break;
         default: cout<<Rus("Введено неверное число!");
      }
   }while (flag!=1&&flag!=2);
   cout<<Rus("\nСдвинутая матрица: \n");
   for (i=0;i<kol_str;i++)
   {
      for (int j=0;j<kol_stb;j++)
      {
         cout<<matr[i][j]<<"    ";
      }
      cout<<"\n";
   }
   delete []matr;
   cout<<Rus("Работа завершена!\a\a\a");
   getch();
}
//---------------------------------------------------------------------------

Последний раз редактировалось Troi666; 26.04.2009 в 14:58.
Troi666 вне форума Ответить с цитированием
Старый 26.04.2009, 19:01   #2
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Теперь прога работает. Но есть 2 проблемы.
В ней есть 2 функции похожие до степени сличения. Нельзя ли их как-нить в одну свести? И куда сюда можно шаблон или перегрузку вставить? Помогите плиз

Код:
//---------------------------------------------------------------------------
#include <vcl>
#include <iostream>
#include <conio>
#include <windows>
using namespace std;
//---------------------------------------------------------------------------
int i,j;
char bufRus[256];

char* Rus (char*);
int vibor_dlini(int);
void sdvig(int**,int,int,int);
void sdvig1(int**,int,int,int);

char* Rus (char* text)
{
   CharToOem(text,bufRus);
   return bufRus;
}

int vibor_dlini(int N)
{
   int dlina;
   cout<<Rus("На сколько элементов двигаем?____\b\b\b");
   cin>>dlina;
   if (dlina<N)
      return dlina;
   else
   {
      if (dlina%N==0)
         return 0;
      else
         return dlina%N;
   }
}

void sdvig(int** mas,int a,int b,int dlina)
{
   int temp;
   if (dlina==0)
      return;
   for (int k=0;k<dlina;k++)
      for (i=0;i<a;i++)
         for(j=0;j<b;j++)
         {
            temp=mas[i][j];
            mas[i][j]=mas[i][0];
            mas[i][0]=temp;
         }
}

void sdvig1(int** mas,int a,int b,int dlina)
{
   int temp;
   if (dlina==0)
      return;
   for (int k=0;k<dlina;k++)
      for (i=0;i<a;i++)
         for(j=0;j<b;j++)
         {
            temp=mas[j][i];
            mas[j][i]=mas[0][i];
            mas[0][i]=temp;
         }
}

void main()
{
   int kol_str,kol_stb,dlina_sdviga;
   short flag;
   cout<<Rus("Введите количество строк: ");
   cin>>kol_str;
   cout<<Rus("Введите количество столбцов: ");
   cin>>kol_stb;
   int **matr=new int *[kol_str];
   for (i=0;i<kol_str;i++)
      matr[i]=new int[kol_stb];
   for (i=0;i<kol_str;i++)
      for (j=0;j<kol_stb;j++)
      {
         cout<<Rus("Введите элемент [")<<i+1<<"]["<<j+1<<"]: ";
         cin>>matr[i][j];
      }
   cout<<Rus("\nИсходная матрица: \n");
   for (i=0;i<kol_str;i++)
   {
      for (int j=0;j<kol_stb;j++)
      {
         cout<<matr[i][j]<<"    ";
      }
      cout<<"\n";
   }
   do{
      cout<<Rus("Куда двигаем? \n1-Вправо\n2-Вниз\n");
      cin>>flag;
      switch (flag)
      {
         case 1:dlina_sdviga=vibor_dlini(kol_stb); sdvig(matr,kol_str,kol_stb,dlina_sdviga);break;
         case 2:dlina_sdviga=vibor_dlini(kol_str); sdvig1(matr,kol_stb,kol_str,dlina_sdviga);break;
         default: cout<<Rus("Введено неверное число!");
      }
   }while (flag!=1&&flag!=2);
   cout<<Rus("\nСдвинутая матрица: \n");
   for (i=0;i<kol_str;i++)
   {
      for (int j=0;j<kol_stb;j++)
      {
         cout<<matr[i][j]<<"    ";
      }
      cout<<"\n";
   }
   delete []matr;
   cout<<Rus("Работа завершена!\a\a\a");
   getch();
}
//---------------------------------------------------------------------------
Troi666 вне форума Ответить с цитированием
Старый 01.05.2009, 14:46   #3
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Ещё уменьшил код + чуток оптимизировал...осталось вставить шаблон и/или перегрузку...кто-нить может подсказать куда его сюда впихнуть можно?
Код:
//---------------------------------------------------------------------------
#include <vcl>
#include <iostream>
#include <conio>
#include <windows>
using namespace std;
//---------------------------------------------------------------------------
int i,j;
char bufRus[256];

char* Rus (char*);
int vibor_dlini(int);
void sdvig(int**,int,int,int,bool);

char* Rus (char* text)
{
   CharToOem(text,bufRus);
   return bufRus;
}

int vibor_dlini(int N)
{
   int dlina;
   cout<<Rus("На сколько элементов двигаем?____\b\b\b");
   cin>>dlina;
   if (dlina<N)
      return dlina;
   else
      return dlina%N;
}

void sdvig(int** mas,int a,int b,int dlina,bool flag)
{
   int temp;
   if (dlina==0)
      return;
   for (int k=0;k<dlina;k++)
      for (i=0;i<a;i++)
         for(j=0;j<b;j++)
         {
            if (flag)
               swap(mas[i][0],mas[i][j]);
            else
               swap (mas[0][i],mas[j][i]);
         }
}

void main()
{
   int kol_str,kol_stb,dlina_sdviga;
   short flag;
   cout<<Rus("Введите количество строк: ");
   cin>>kol_str;
   cout<<Rus("Введите количество столбцов: ");
   cin>>kol_stb;
   int **matr=new int *[kol_str];
   for (i=0;i<kol_str;i++)
      matr[i]=new int[kol_stb];
   for (i=0;i<kol_str;i++)
      for (j=0;j<kol_stb;j++)
      {
         cout<<Rus("Введите элемент [")<<i+1<<"]["<<j+1<<"]: ";
         cin>>matr[i][j];
      }
   cout<<Rus("\nИсходная матрица: \n");
   for (i=0;i<kol_str;i++)
   {
      for (int j=0;j<kol_stb;j++)
      {
         cout<<matr[i][j]<<"    ";
      }
      cout<<"\n";
   }
   do{
      cout<<Rus("Куда двигаем? \n1-Вправо\n2-Вниз\n");
      cin>>flag;
      switch (flag)
      {
         case 1:dlina_sdviga=vibor_dlini(kol_stb); sdvig(matr,kol_str,kol_stb,dlina_sdviga, true);break;
         case 2:dlina_sdviga=vibor_dlini(kol_str); sdvig(matr,kol_stb,kol_str,dlina_sdviga, false);break;
         default: cout<<Rus("Введено неверное число!");
      }
   }while (flag!=1&&flag!=2);
   cout<<Rus("\nСдвинутая матрица: \n");
   for (i=0;i<kol_str;i++)
   {
      for (int j=0;j<kol_stb;j++)
      {
         cout<<matr[i][j]<<"    ";
      }
      cout<<"\n";
   }
   delete []matr;
   cout<<Rus("Работа завершена!\a\a\a");
   getch();
}
//---------------------------------------------------------------------------

Последний раз редактировалось Troi666; 01.05.2009 в 14:53.
Troi666 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклический сдвиг строки матрицы Alex1991 Помощь студентам 1 14.04.2009 21:20
циклический сдвиг массива goacher Общие вопросы C/C++ 4 28.05.2008 20:11
циклический сдвиг массива goacher Паскаль, Turbo Pascal, PascalABC.NET 4 27.05.2008 22:26
Циклический сдвиг столбцов в массиве С++ Помогите! Ладушка Общие вопросы C/C++ 10 01.05.2008 23:17