نمایش نتایج 1 تا 5 از 5

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

  1. #1

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

    سلام ...به این کدی که نوشتم دقت کنید

    یه برنامه ای که تعداد ستون ها و سطر های ماتریس اول و تعداد ستون های ماتریس

    دوم را میگیره (تعداد سطر های ماتریس دوم همان تعداد ستون های ماتریس اول میشه)

    و حالا سه تا ارایه-1-ماتریس اول2-ماتریس دوم-3-ماتریسی برای نگهداری ضرب ماتریس

    1 در ماتریس 2

    سه تا تابع هم برای گرفتن اعداد -ضرب دو ماتریس و چاپ نتایج ضرب دو ماتریس(ماتریس سوم) نوشتم.

    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    void clrscr(void)
    {
    system("cls");
    printf("****************************************** \n");
    }
    void mget(int mat[][],int,int mat1[][],int);
    void mul(int mat[][],int,int mat1[][],int,int mat2[][],int);
    void mout(int mat2[][],int);
    int main(void){
    int e,f,g,h;
    printf("Enter szie of mat:x,y:");
    scanf("%d%d",&e,&f);
    printf("\nEnter size of mat1:y");
    scanf("%d",&g);
    int mat[e][f];
    int mat1[f][g];
    int mat2[e][g];
    mget(mat,e,mat1,f);
    mul(mat,f,mat1,g,mat2,g);
    mout(mat2,e);
    getch();
    return 0;
    }
    //*************start mget function****************
    void mget(int mat[][f],int e,int mat1[][g],int f){
    int i=0;
    printf("\n Please instert mat elements:\n");
    printf("first insert one's row with space between them:\n");
    for(i=0;i<e;i++)
    if(i>0)printf("\n now insert %d's row with space between them:\n",i);
    for(register int j=0;j<f;j++)
    scanf("%d",&mat[i][j]);
    clrscr();
    printf("now insert mat1 elemets:\n");
    printf("first insert one's row with space between them:\n");
    for(i=0;i<f;i++)
    if(i>0)printf("\n now insert %d's row with space between them:\n",i);
    for(register int j=0;j<g;j++)
    scanf("%d",&mat1[i][j]);
    clrscr();
    printf("mget function has been ti end with successfully\n");
    }//***************end of mget function****************
    //****************start mul function******************
    void mul(int mat[][f],int e,int mat1[][g],int f,int mat2[][g],int e){
    int temp=0;
    for(int i=0;i<e;i++)
    for(register int j=0;j<g;j++){
    for(int z=0;z<f;z++)
    temp+=mat[i][f]*mat1[f][j];
    mat2[i][j]=temp;
    temp=0;
    }
    clrscr();
    }//************end of mul function***************
    //*************start mout function***************
    void mout(int mat2[][g],int e){
    for(int i=0;i<e;i++){
    printf("\n");
    for(register int j=0;j<g;j++)
    printf("mat2[i][j]=%d\t",mat2[i][j]);
    }//end of external for
    clrscr();
    }//*************end of mout function**************
    //end of program's codes
    }


    به الگوی توابع در اول برنامه توجه کنید:

    void mget(int mat[][],int,int mat1[][],int);
    void mul(int mat[][],int,int mat1[][],int,int mat2[][],int);
    void mout(int mat2[][],int);


    میگم نوشتن تعداد بعد دوم ارایه در الگوی تابع ضروری هست؟

    اگر سه بعدی یا بیشتر باشه ,نوشتن بعد اخر ضروری هست؟

    میدونم در تابع اصلی اجازه تعریف ارایه رو در حین اجرای برنامه ندارم که کامپایلر

    بهم گیر میده:
    int main(void){
    int e,f,g,h;
    printf("Enter szie of mat:x,y:");
    scanf("%d%d",&e,&f);
    printf("\nEnter size of mat1:y");
    scanf("%d",&g);
    int mat[e][f];
    int mat1[f][g];
    int mat2[e][g];
    mget(mat,e,mat1,f);
    mul(mat,f,mat1,g,mat2,g);
    mout(mat2,e);
    getch();
    return 0;
    }


    ایا به غیر از حافظه پویا ,راهی برای حل این مشکل هست؟؟یعنی اول تعداد رو از کاربر بگیرم

    بعد ارایه رو تعریف کنم ...

    دیدید که چند متغیر عمومی تعریف کردم و بعد اونا رو در برنامه اصلی در فراخوانی توابع

    به توابع فرستادم,در پارامتر های متناظر با همین ارگومان ها متغیر هایی هم نام با

    متعیر های اصلی تعریف شدند ,حالا در این تابع دیگه متغیر های عمومی اعتبار نداره درسته؟؟

    پس بهتر نیست اصلا تعداد بعد اول ارایه رو به عنوان پارامتر نفرستیم؟؟؟

    این کار اجباریه؟؟


    دیگه این که مشکلات حاد برنامه چیه که من رعایت نکردم؟

  2. #2
    کاربر دائمی آواتار clover
    تاریخ عضویت
    خرداد 1388
    محل زندگی
    اصفهان - اراک
    پست
    646

    نقل قول: مشکل با برنامه c در مورد ماتریس ها

    دوست عزیز ، من هم مثل شما تازه کارم و به مشکلات شما برخورد کردم . پس اگه اشتباهی بود از دوستان دیگه میخوام که تصحیح کنن .
    اولا به هیچ عنوان نمی تونید ابعاد آرایه را در هنگام اجرای برنامه بگیرید و بعد آرایه را با ابعاد دلخواه یا به تعبیری متغیر اعلان کنید . راهی که من استفاده کردم همون حافظه پویا هست . به کد من دقت کنید :

    // Make Matrix : This function make a matrix and return **
    int **makeMat(int row, int col)
    {
    int **array = new int * [row];
    for (int i=0; i<row; i++)
    {
    array[i] = new int [col];
    }
    return array;
    }


    تابعی که ملاحظه می کنید دو تا پارامتر که همون طول و عرض ماتریس مربعی هستند را می گیره و به صورت پویا اون ماتریس را ایجاد می کنه و بعد یه آرایه از آرایه ها بر می گردونه .

    اما در مورد ارسال آرایه ها به توابع اگر آرایه ی شما چند بعدی باشه فقط می تونید بعد اول را بدون مقدار بذارید ، مثلا اگه آرایه شما سه بعدی باشه حتما باید اندازه دو بعد آخر را در تعریف تابع مشخص کنید . اگر حتما می خواهید که از آرایه ها به روش معمول (و نه با حافظه پویا) برای نگهداری و ضرب ماتریس ها استفاده کنید می تونید از همون اول خیال خودتونو راحت کنید و مثلا آرایه های 50 * 50 تعریف و استفاده کنید .

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

    در مورد متغیر های سراسری و متغیر های محلی همنام با آنها که در یک تابع تعریف میشن باید بگم که شما از هر دو متغیر در داخل تابع می تونید استفاده کنید . این کار با استفاده از عملگر دسترسی به محدوده (Scope Resolution) قابل انجام هست .
    به مثال زیر توجه کنید :
    int x = 8;
    int sample(int x)
    {
    x = 5;
    ::x = 10;
    cout<<"Local X = "<<x;
    cout<<"Global X = "<<::x;
    }


    در واقع زمانی که از عملگر :: (Scope Resolution) استفاده می کنید دارید از متغیر x که به صورت سراسری تعریف شده استفاده دسترسی پیدا می کنید .

    در ادامه برای کامل کردن بحث متن دو تا برنامه را اضافه می کنم . مثالها دانشجویی هستند اما احساس نمی کنم آوردنشون در اینجا کار نادرستی باشه .

  3. #3
    کاربر دائمی آواتار clover
    تاریخ عضویت
    خرداد 1388
    محل زندگی
    اصفهان - اراک
    پست
    646

    ضرب آرایه ها با استفاده از ماتریس ها در ++C

    در این مثال از آرایه های ثابت 20 * 20 استفاده شده ، بازم یاد آوری می کنم که من یه تازه کارم پس اگه ایراد یا پیشنهادی هست واقعا خوشحال می شم که مطرح بشه .
    برنامه در Turbo C++‎ V3.0 DOS Full کاملا تست شده و با کمی تغییر در ++VC هم قابل استفاده هست .

    //Multiply Two Matrix

    #include <iostream.h>
    #include <conio.h>

    // function prototype
    int getMat(int &, int &);
    void fillMat(int, int, int[][20]);
    void multiMat(int [][20], int, int,
    int [][20], int, int,
    int [][20], int &, int &);
    void showMat(int [][20], int, int);


    int main()
    {
    int aMat[20][20]={0},
    bMat[20][20]={0},
    rMat[20][20]={0},
    aRow, aCol, bRow, bCol, rRow, rCol;
    clrscr();
    // Input Matrix a, b
    cout<<"Enter number of Row & Column of Matrix A : ";
    if (getMat(aRow, aCol))
    {
    cout<<"\nError : numbers must be greater than 0 !";
    getch();
    return 1;
    }
    cout<<"Enter number of Row & Column of Matrix B : ";
    if (getMat(bRow, bCol))
    {
    cout<<"\nError : numbers must be greater than 0 !";
    getch();
    return 1;
    }
    // Test For Multiply
    if (aCol != bRow)
    {
    cout<<"\nError : Can not multiply this matrixes !";
    getch();
    return 1;
    }
    // Fill Matrix a, b
    cout<<"\n\nFill Matrix A\n---------------------\n";
    fillMat(aRow, aCol, aMat);
    cout<<"\n\nFill Matrix B\n---------------------\n";
    fillMat(bRow, bCol, bMat);
    // Multiply Matrix a , Matrix b
    multiMat(aMat, aRow, aCol,
    bMat, bRow, bCol,
    rMat, rRow, rCol);
    // Show Results
    clrscr();
    cout<<"Matrix A :\n---------------------\n";
    showMat(aMat, aRow, aCol);
    cout<<"\n\n\nMatrix B :\n---------------------\n";
    showMat(bMat, bRow, bCol);
    cout<<"\n\n\nMultiply A, B :\n---------------------\n";
    showMat(rMat, rRow, rCol);
    cout<<"\n\nPress Any Key ...";
    getch();
    return 0;
    }

    // Get Matrix Parameters : This function get and test parameters of input matrix .
    int getMat(int &row, int &col)
    {
    cin>>row>>col;
    if (row<=0)
    return 1;
    if (row>20)
    return 1;
    if (col<=0)
    return 1;
    if (col>20)
    return 1;
    return 0;
    }

    // Fill Matrix : This function fill matrix with input numbers .
    void fillMat(int row, int col, int mat[][20])
    {
    for (int i=0; i<row; i++)
    {
    cout<<"Row "<<i+1<<" :\n";
    for (int j=0; j<col; j++)
    {
    cout<<" Column "<<j+1<<" : ";
    cin>>mat[i][j];
    }
    }
    }

    // Multiply Two Matrix : This function multiply two matrix
    void multiMat(int aMat[][20], int aRow, int aCol,
    int bMat[][20], int bRow, int bCol,
    int rMat[][20], int &rRow, int &rCol)
    {
    int sum;
    rRow = aRow;
    rCol = bCol;
    for (int i=0; i<aRow; i++)
    for (int j=0; j<bCol; j++)
    {
    sum=0;
    for (int k=0; k<aCol; k++)
    sum += aMat[i][k] * bMat[k][j];
    rMat[i][j] = sum;
    }
    }

    // Show Matrix : This function show content of Matrix
    void showMat(int mat[][20], int row, int col)
    {
    for (int i=0; i<row; i++)
    {
    cout<<endl;
    for (int
    j=0; j<col; j++)
    {
    cout.width(4);
    cout<<mat[i][j];
    }
    }
    }

  4. #4
    کاربر دائمی آواتار clover
    تاریخ عضویت
    خرداد 1388
    محل زندگی
    اصفهان - اراک
    پست
    646

    ضرب دو ماتریس با استفاده از آرایه های پویا

    و این هم برنامه دوم و استفاده از حافظه پویا و اشاره گر ها . دقت کنید که در تابع makeMat شناسه array آرایه از اشاره گر ها هست و خونه های اون با آدرس آرایه های دیگه پر میشن . دقت کنید که array یک آرایه تک بعدی هست اما ما با دو اندیس ([5][2]array) به خونه های اون دسترسی پیدا می کنیم . در واقع در این مثال ([5][2]array) ما داریم به خونه 6 آرایه ای اشاره می کنیم که آدرسش در خونه 3 آرایه array قرار داره .

    این مثال هم در 2008 ++VC کاملا تست شده و کار میکنه .

    // M2Mat.cpp : Defines the entry point for the console application.
    //

    #include "stdafx.h"
    #include <iostream>
    #include <conio.h>
    #include <stdlib.h>

    using namespace std;

    // function prototype
    int getMat(int &, int &);
    int **makeMat(int, int);
    void fillMat(int **, int, int);
    int **multiMat(int **, int, int,
    int **, int, int);
    void showMat(int **, int, int);
    void delMat(int **, int, int);

    int _tmain(int argc, _TCHAR* argv[])
    {
    int **aMat, **bMat, **rMat,
    aRow, bRow, rRow,
    aCol, bCol, rCol;
    system("cls");
    // Get Parameters, Make and Fill Matrix 'A'
    cout<<"Matrix 'A'\n-----------\n";
    if (getMat(aRow, aCol))
    {
    cout<<"\nError : Numbers must be greater than 0 !";
    _getch();
    return 1;
    }
    aMat=makeMat(aRow, aCol);
    fillMat(aMat, aRow, aCol);

    // Get Parameters, Make and Fill Matrix 'B'
    cout<<"\n\nMatrix 'B'\n-----------\n";
    if (getMat(bRow, bCol))
    {
    cout<<"\nError : Numbers must be greater than 0 !";
    _getch();
    return 1;
    }
    bMat=makeMat(bRow, bCol);
    fillMat(bMat, bRow, bCol);

    // Clear Screan And Go To Show Result
    system("cls");
    cout<<"Matrix 'A'\n---------------\n";
    showMat(aMat, aRow, aCol);
    cout<<"\n\nMatrix 'B'\n---------------\n";
    showMat(bMat, bRow, bCol);

    // Multiply Two Matrix If Can Do It
    if (aCol != bRow)
    {
    cout<<"\n\nCan not multiply two Matrixes !\n";
    }
    else
    {
    rRow = aRow;
    rCol = bCol;
    cout<<"\n\nResult Matrix\n---------------\n";
    rMat = multiMat(aMat, aRow, aCol,
    bMat, bRow, bCol);
    showMat(rMat, rRow, rCol);
    delMat(rMat, rRow, rCol);
    }
    delMat(aMat, aRow, aCol);
    delMat(bMat, bRow, bCol);
    cout<<"\n\nPress Any Key ...";
    _getch();
    return 0;
    }

    // Get Matrix : This function get matrix parameters
    int getMat(int &row, int &col)
    {
    cout<<"Rows : ";
    cin>>row;
    cout<<"Columns : ";
    cin>>col;
    if (row<=0 || col<=0)
    return 1;
    return 0;
    }



    // Make Matrix : This function make a matrix and return **
    int **makeMat(int row, int col)
    {
    int **array = new int * [row];
    for (int i=0; i<row; i++)
    {
    array[i] = new int [col];
    }
    return array;
    }

    // Fill Matrix : This function fill matrix with input numbers .
    void fillMat(int **mat, int row, int col)
    {
    cout<<endl;
    for (int i=0; i<row; i++)
    {
    cout<<"Row "<<i+1<<" :\n";
    for (int j=0; j<col; j++)
    {
    cout<<" Column "<<j+1<<" : ";
    cin>>mat[i][j];
    }
    }
    }

    // Multiply Two Matrix : This function multiply two matrix
    int **multiMat(int **aMat, int aRow, int aCol,
    int **bMat, int bRow, int bCol)
    {
    int sum;
    // Make Result Matrix
    int **array = new int * [aRow];
    for (int i=0; i<aRow; i++)
    {
    array[i] = new int [bCol];
    }
    // Start Multiply
    for (int i=0; i<aRow; i++)
    for (int j=0; j<bCol; j++)
    {
    sum=0;
    for (int k=0; k<aCol; k++)
    sum += aMat[i][k] * bMat[k][j];
    array[i][j] = sum;
    }
    return array;
    }

    // Show Matrix : This function show content of Matrix
    void showMat(int **mat, int row, int col)
    {
    for (int i=0; i<row; i++)
    {
    cout<<endl;
    for (int j=0; j<col; j++)
    {
    cout.width(4);
    cout<<mat[i][j];
    }
    }
    }

    // Delete Matrix : This function delete Matrix and free memory
    void delMat(int **mat, int row, int col)
    {
    for (int i=0; i<row; i++)
    {
    delete [] mat[i];
    }
    delete [] mat;
    }

  5. #5

    نقل قول: مشکل با برنامه c در مورد ماتریس ها

    مرسی از وقتی که گذاشتی.مطالب همراه با مثال ها کامل بود

    حالا مهم نیست که توسط چه کامپایلری کامپایل بشه ,یا تکه کد باشه-مهم محتوای کد(در قالب c)هست

    مثل اکسپلویت هایی که به صورت poc منتشر میشن(برای اهلش)

قوانین ایجاد تاپیک در تالار

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