# Native Code > برنامه نویسی با C > برنامه نویسی با زبان C و ++C >  مشکل در برنامه ماتریس مربعی

## قلندری

با سلام و خسته نباشید خدمت اساتید بنده چند تا راهنمایی داشتم (البته لازم به ذکر هست که نمیخوام مسائل را حل کنید) فقط یه مقدار راهنمایی کنید ممنون میشم چون میدونم خلاف قوانیین هست حل مسئله های دانشجویی.

1-برنامه ای بنویسید که تعداد سطر یا ستون یک ماتریس مربعی را گرفته آنرا به شکل مارپیچی پر کند.

این سوال هست بنده اصلا به این مبحث آشنایی ندارم از دوستان هر کس بتونه راهنمایی کنه یا بگه باید  چکار کنم فقد در حد راهنمایی بقیشو میتونم انجام بدم با تشکر از دوستان و مدیریت محترم سایت.

----------


## قلندری

دوستان کسی نمیتونه منو راهنمایی کنه

----------


## queen-mm

يا من اطلاعاتم كمه يا شما خوب توضيح ندادين.به صورت مار پيچ پر كنه يعني چي؟

----------


## MOHSEN8000

با سلام
این راه حلی رو که الان میگم ، به نظرم عملی می رسه. اما واقعیتش اینه که همین الان که سوالتون رو دیدم به ذهنم رسید و توصیه می کنم اگه راه حل دیگه ای به ذهن خودتون رسید از اون استفاده کنید. اگه ابعاد ماتریس رو از کاربر بگیرید و ماتریس رو با توجه به اون بسازید ، برای پر کردن کافیه یک تابع بنویسید که بیرونی ترین لایه هر ماتریسی رو که بهش میدیم پر کنه . یعنی از اول سطر اول رو بعد ستون آخر و بعد سطر آخر و بعد ستون اول. که نوشتن این تابع فکر نکنم کار سختی باشه. حالا کافیه که هر بار که این تابع رو فراخوانی می کنیم ، یک نقطه شروع به اون بدهیم. مثلا اولین نقطه شروع برای تابع [0][0]a است و نقطه بعدی [1][1]a تا این که به المان وسط ماتریس برسیم که دیگه ماتریس کاملا پر شده. 
اگه توضیحاتم رو متوجه نشدید بگید تا یه جوره دیگه بگم.

----------


## قلندری

دوست عزیز با تشکر از شما اگه با یه مثال توضیح بدید ممنون میشم

----------


## MOHSEN8000

قسمت اصلیش اینه که همون تابع رو بنویسید ، بقیش دیگه راحته . تابع منظورم اینه که تابعی بنویسید که مثلا اعدادی رو که از کاربر می گیره ، به ترتیب بریزه داخل [0][0] , [1][0] , ... تا [9][0]  و بعد [9][1] , [9][2] , ... تا [9][9] و بعد [8][9] , [7][9]  و ... تا [0][9] , و آخر هم  [0][8] , [0][7] , ... تا [0][1] . این مثال برای ماتریس 10 در 10 بود. اگه به اندیس ها دقت کنی ، خیلی راحت می تونی برنامشو بنویسی. اگه نوشتی در واقع مثل اینه که بیرونی ترین لایه یه ماتریس 10 در 10 رو پر کردی. 
امیدوارم مثالم روشن بوده باشه. اگه توی نوشتن تابعش هم مشکل داشتید بپرسید.

----------


## javadimani

> دوست عزیز با تشکر از شما اگه با یه مثال توضیح بدید ممنون میشم


سلام
من این برنامه رو به روش خودم نوشتم
البته در پاسکال

 
uses crt;
var
  x:array[1..100,1..100] of integer;
  i,j,k,n,t:integer;
begin
clrscr;
write('Enter n :');readln(n);
if n mod 2=0 then t:=n div 2 else t:=(n div 2)+1;
k:=1;
i:=1;
while (i<=t) do
begin
for j:=i to n-i+1 do
begin
x[i,j]:=k;
inc(k);
end;
dec(k);
for j:=i to n-i+1 do
begin
x[j,n-i+1]:=k;
inc(k);
end;
dec(k);
for j:=n-i+1 downto i do
begin
x[n-i+1,j]:=k;
inc(k);
end;
dec(k);
for j:=n-i+1 downto i+1 do
begin
x[j,i]:=k;
inc(k);
end;
inc(i);
end;
 
for i:=1 to n do
begin
for j:=1 to n do write(x[i,j]:5);
writeln;
end;
 
readln;
end.
 



http://www.imani.tk

javadimani86@gmail.com

----------


## MOHSEN8000

با سلام
این کد رو همین الان نوشتم. با همون راهی که خودم گفتم نوشتمش. تابع spiral اون کار رو انجام می ده. فکر کنم به دردتون بخوره 
#include<iostream.h>
#include<iomanip.h>
void spiral ( int **a , int m , int row );
void matprint(int **a , int row);
void shift(int **a , int row , int s);
void main ( ){

int **a , i , j , m , row , x , s;

    cout<<"Please Enter The Number Of Row : "<<endl;
    cin>>row;
    
    a = new int*[row];
    for (int i = 0; i < row; i++)
        a[i] = new int[row];
    for( i = 0 ; i < row ; i++ ){
        for( j = 0 ; j < row ; j++ ){
            a[i][j] = 0;
        }
    }
    
    for ( i = 0 ; i <( row/2 ) ; i++ ){
        spiral ( a , i , row);
    }
    
    if ( row % 2 == 1 ){
        x = (row-1) / 2;
        cin>>a[x][x];
    }
    
    cout<<"\n\n\n"; 
    matprint(a,row);
    
    cout<<"Please Enter The Number Of Shift :"<<endl;
    cin>>s;
    
    shift(a,row,s);
    cout<<"\n\n\n";
    matprint(a,row);
}

void spiral ( int **a , int m , int row ){

    int x , y , i ;
    
    x = m;
    y = ( row - 1 ) - m;
    
    for ( i = m ; i <= y ; i++ ){
        cin>>a[x][i];
    }
    for ( i = m+1 ; i < y+1 ; i++ ){
        cin>>a[i][y];
    }
    for ( i = y-1 ; i >= m ; i-- ){
        cin>>a[y][i];
    }
    for ( i = y-1 ; i > m ; i-- ){
        cin>>a[i][x];
    }
    
}

void matprint(int **a , int row){
int i , j;
    for ( i = 0 ; i < row ; i++ ){
        for ( j = 0 ; j < row ; j++ ){
            cout<<setiosflags(ios::right)<<a[i][j]<<setw(3);
        }
        cout<<"\n";
    }
}
void shift(int **a , int row , int s){
    int i , j , temp2 , **temp;
    temp = new int*[row];
    for (int i = 0; i < row; i++){
        temp[i] = new int[row];
    }
        
    for ( i = 0 ; i < row ; i++ ){
        for ( j = 0 ; j < row ; j++ ){
            temp[i][j] = a[i][j];
        } 
    }
    s = s % row;
    temp2 = s;
    
    for( i = 0 ; i < row ; i++ ){
        temp2 %= row;
        for ( j = 0 ; j < row ; j++ ){
            a[j][temp2] = temp [j][i];
        } 
        temp2++;
    } 
}

----------


## javadimani

راه حل جالبی بود ازت تشکر می کنم

----------

