Переместить столбцы в матрице так, чтобы четный встал на место нечетного справа

Myrik

Текст программы не закомпилируеться так как это часть лабы там еще 4 модуля с прототипами функций, главным меню этц... кто знает как сделать помогите плиз :-)
/*Matrix module*/
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
int mat[10][10]={           {  10, 20, 30, 40, 50, 60, 70, 80,  90, -200},
                            { -10,-20,-30,-40,-50,-60,-70,-80, -90,-100},
                            {   6,  1,  2,  3,  4,  5,  6,  7,   8,   9},
                            {-345, 66, 57, 98, 69, 13, 22, 16,  76,  89},
                            { -66, 76, 45, 32, 76,867, 67,677,  68,   9},
                            {  45, 54, 65, 56, 78, 98, 10, -9,  55,  43},
                            {  16, 13,-20,-80, 44, 55, 66, 77,  88,  99},
                            {   0, -1, -2, -3, -4, -5, -6, -7,  -8,  -9},
                            {  12, 98, 10, 20, 30,-30,-50,-80,-777, -32},
                            {  13, 14, 15, 16, 17, 18, 19, 20,  11,  12}
                };
 
int min1=9, max1=9,cnt,tmin,m,f,tmin1,n1,n2;
/*Function: menu of the matrix */
void matrix()
{
    int x;
    clrscr();
    printf ("1 - Back to the main menu\n");
    printf ("2 - Get size of matrix with who you will work\n");
    printf ("3 - Show the Matrix\n");
    printf ("4 - Function processing of Matrix(Opredelyaetsya variantom zadaniya\n");
    fflush(stdin);
    scanf("%d", &x);
    switch(x)
    {
    case 1: return; 
        break;
    case 2: sizemat();
        break;
    case 3: viewmat();
        break;
    case 4: matr();
        break;
    default:printf("Wrong choice");
        break;
    }
}
/*Function: get size of matrix */
void sizemat()
{
    fflush(stdin);
    system("cls");
    printf("vvedite nomer stroku: ");
    scanf("%d", &min1);
    printf("vvedite nomer stolbca: ");
    scanf("%d", &max1);
}
/*Function: show the matrix */
void viewmat()
{
 
    system("cls");
    for (int i=0; i<min1; ++i)
    {
        for (int j=0; j<max1; ++j)
        {
            
            printf ("%8d",mat[i][j]);
            
        }
 
    }
    fflush(stdin);
        
}
/*Function: show min element in every column; and change location odd numbers of columns in matrix with  not odd numbers of colums in matrix */
 void matr ()
 {
    for (f=0; f<=min1; ++f)
    {
        for (tmin1=0, m=0; m<=max1; ++m)
 
        { 
            if (mat[tmin1][f] > mat[m][f])
            tmin1=m;
        }   
        printf ("Stolbec Nomer %d i ego min element: %d nahodyashiysya v stroke nomer %d\n", f,mat[tmin1][f], tmin1 );
            }
    for (n1=0, f=0; f<=min1; ++f)
    {
        for (n2=0,m=0; m<=max1; ++m)    
            {
                if (f%2==1)
 
                    {
                        n1=f;
                        printf ("ne4etniy stolbec Nomer %d, stroka nomer %d, element: %d\n", n1, m, mat[m][n1]);
 
                    }
                else 
                    {
                        n2=f;
                        printf ("4etniy stolbec Nomer %d, stroka nomer %d, element:  %d\n",n2, m, mat[m][n2]);
                    }
                     
        
        
            }
 
    
    }
 }
10 ответов

Myrik

так он просто выводит нечетные столбцы а местами не меняет... надо что бы 0 столбец встал на место 1 а 1 встал на место 0 и так далее...


Myrik

int tem=mat[i][j];
mat[i][j]=mat[i][j+1];
mat[i][j+1]=tem;
а что делается в этом коде?


Myrik

for(int jj=0;jj<10;jj+=2)
    {
        for(int ii=0;ii<10;ii++)
                    {
                int tem=mat[ii][jj];/*четные столбцы*/
                    mat[ii][jj]=mat[ii][jj+1]; /*четные "заменяються" на нечетные столбцы т.е. 0+1 2+1 4+1 ....*/ 
                    mat[ii][jj+1]=tem; /*к "tem" приравниваеться массив из нечетных столбцов т.е. четные становяться нечетными ))) блин запутался */ 
                    printf("%d\t",mat[ii][jj]); /* если так то выводит нечетные столбцы*/
                                        printf("\n");
                                        printf("%d\t",tem); /* если так то выводит четные столбцы*/
                    printf("\n");
 
                    
            }
как вывести матрицу полностью в адеватном виде ?)


Myrik

есть задачка посложнее. Дана матрица порядка MxN (M строк, N столбцов). Необходимо заполнить ее значениями и написать функцию, осуществляющую циклический сдвиг строк и/или столбцов массива указанное количество раз и в указанную сторону.думаю разберешься, там все по функциям раскидано.
#include <iostream>
#include <clocale>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <windows.h>
 
using namespace std;
bool move(int **&p, int &n, int &m);
bool copyDin2(int **&po, int **&po2, int &n, int &m);
bool newDin2(int **&p, int &n, int &m, bool automate);
bool RandDin2(int **&p, const int &n, const int &m, int a, int b);
bool PrintDin2( int **&p, const int &n, const int &m);
bool delDin2(int **&p, int &n, int &m);
 
void main()
{
    setlocale(LC_CTYPE, "rus");
    int **mas=0,N=0,M=0;
    int **mas3=0;
newDin2(mas,N,M, false);
RandDin2(mas,N,M,1,25);
system("cls");
cout<<"Массив 1"<<endl;
PrintDin2(mas,N,M);
move(mas,N,M);
cout<<"Массив 1 со смещением"<<endl;
PrintDin2(mas,N,M);
delDin2(mas,N,M);
 
}
 
bool move(int **&p, int &n, int &m)
{int step;
char ans, ans2;
cout<<"Что сдвигаем (l)ines/(c)olomus?";
cin>>ans;
cout<<"В какую сторону (l)eft/(r)ight?";
cin>>ans2;
cout<<"На сколько сдвигаем?";
cin>>step;
if(ans2=='l'&&ans=='l')
{
if(step<n)
{step=n-step;}
if(step>=n)
{step=n-(step%n);}
}
    if(ans2=='l'&&ans=='c')
    {
    if(step<m)
    {step=m-step;}
    if(step>=m)
    {step=m-(step%n);}
    }
    int **tmp=0;
    newDin2(tmp, n, m, true);
    copyDin2(p, tmp, n, m);
    if(ans=='c')
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(j+step<m)
                {p[i][j+step]=tmp[i][j];}
                else
                {p[i][(j+step)%m]=tmp[i][j];}
            }
        }
    }
    if(ans=='l')
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(i+step<n)
                {p[i+step][j]=tmp[i][j];}
                else
                {p[(i+step)%n][j]=tmp[i][j];}
            }
        }
    }
delDin2(tmp,n,m);
return true;
    
}
 
bool copyDin2(int **&po, int **&po2, int &n, int &m)
{
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
        po2[i][j]=po[i][j];
        }
    }
    return true;
}
 
bool newDin2(int **&p, int &n, int &m, bool automate)
{
    if(automate==false)
    {cout<<"n=";
    cin>>n;}
        if(n<=0)
        {
        cout<<"Error input\n";
            return false;
        }
        p = new int *[n];
        if(p==0)
        {
        cout<<"Error memory\n";
            return false;
        }
if(automate==false)
{cout<<"m=";
cin>>m;}
    if(m<=0)
        {
        cout<<"Error input\n";
            return false;
        }
for (int i=0; i<n; i++)
{
p[i]=new int[m];
    if(p[i]==NULL)
    {cout<<"memory error\n";
    return false;
    }
}
return true;
}
 
bool PrintDin2( int **&p, const int &n, const int &m)
{
if(n<=0||m<=0)
{
cout<<"Error\n";
return false;
}
        for(int i=0;i<n;i++)
        {
        for(int j=0; j<m;j++)
        {cout<<setw(6)<<p[i][j];}
        cout<<endl;
        }
        return true;
 
}
 
bool RandDin2(int **&p, const int &n, const int &m, int a, int b)
{
if(n<=0||m<=0)
{
cout<<"Error\n";
return false;
}
srand((unsigned int)time(0));
        for(int i=0;i<n;i++)
        {
        for(int j=0; j<m;j++)
        {p[i][j]=rand()%(b-a+1)+a;}
        }
        return true;
 
}
 
bool delDin2(int **&p, int &n, int &m)
{
if(n<=0||m<=0)
{cout<<"Error\n";
return false;}
        for(int i=0;i<n;i++)
        {if(p[i]!=NULL)
        delete [] p[i];}
            if(p!=0)
            {
            delete p;
            p=NULL;
            return true;
            }
            else return false;
}


Myrik

printf("%d\t",tem);
зачем выводить сразу в этом же месте где меняется? я наверху написал как сделать вывод
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
printf("%d\t",mat[i][j]);
printf("\n");
}
если хочешь выводить здесь то думаю не трудно было догадаться изменить
printf("%d\t",tem);
на
printf("%d\t",mat[ii][jj+1]);
printf("%d\t",mat[ii][jj]); /* если так то выводит нечетные столбцы*/
 printf("\n");
 printf("%d\t",tem);
выводишь
mat[ii][jj]
а потом tem который тоже равен:
tem=mat[ii][jj]


Myrik

скажите что сделать?


Myrik

поменять местами четный столбец исходной матрицы с нечетным справа т.е. 0 с 1 , 2 с 3, 4 с 5 и так далее... матрица 10х10


Myrik

возьмите цикл с шагом 2 и меняйте местами)
for(int i=0;i<10;i++)
{
for(int j=0;j<n;j+=2)
{
int tem=mat[i][j];
mat[i][j]=mat[i][j+1];
mat[i][j+1]=tem;
}
}


Myrik

О_О немного понятно но не совсем... а как потом на экран вывести исходную матрицу с поменяными столбцами? а то у меня не получаеться...


Myrik

for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
printf("%d\t",mat[i][j]);
printf("\n");
}
О_О немного понятно но не совсем...
что именно не понятно, смотри j=0 берем mat[i][0]=mat[i][1]; далее j=2 берем mat[i][2]=mat[i][3]; и так далее