PDA

View Full Version : مقاله: اعمال بر روی ماتریس ها



bavimorteza
چهارشنبه 22 اردیبهشت 1389, 16:41 عصر
با سلام خدمت دوستان من در کد زیر دو مشکل دارم یکی در قسمت 5 و دیگری در قسمت 6



#include <stdio.h>
#include <conio.h>
int main ()
{
int z;
printf("Please enter m for m*m matrix: ");
scanf("%d",&z);
int a[z][z], b[z][z], c[z][z];
int i,j,k,l,p,q,r,s,ii;
float mbavi[z][z];
float k2;
int jam,jam2;
while(l!=8)
{
printf("\n**************************\n INSTRUCTIONS\n**************************\n\n PLEASE enter the choice againt which matrix operation you want to apply.\n\nENTER 1 to perform matrix addition\nENTER 2 to perform subtraction\nENTER 3 to perform mutilpication\nENTER 4 to perform scalar matrix Mulitplication\nENTER 5 to perform matrix Inversion\nENTER 6 to find determinant of matrix\nENTER 7 to find transpose of a matrix\nENTER 8 to EXIT from program");
printf("\n\n PLEASE ENTER YOUR CHOICE: ");
scanf("%d",&l);
if(l==1)
{
printf("\n\nENTER First m*m matrix for addition\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf("\n");
printf("Element at %d*%d: ",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
printf("\n\nENTER SECOND m*m matrix for addition\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf("\n");
printf("Element at %d*%d: ",i+1,j+1);
scanf("%d",&b[i][j]);
}
}
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
c[i][j]=0; /*TO AVOID CARBAGE VALUES*/
c[i][j] = a[i][j] + b[i][j];
}
}
printf("\n FIRST MATIRX YOU ENTERED\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d \t", a[i][j]);
}
printf("\n");
}
printf("\n");
printf("\n SECOND MATRIX YOU ENTERED\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d \t",b[i][j]);
}
printf("\n");
}
printf("\nRESULT =\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d \t",c[i][j]);
}
printf("\n");
}
}
if(l==2)
{
printf("\n\nENTER FIRST 3*3 matrix for subtraction\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf("\nElement at %d*%d: ",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
printf("\n\nENTER SECOND 3*3 matrix for subtraction\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf("\nElement at %d*%d: ",i+1,j+1);
scanf("%d",&b[i][j]);
}
}
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
c[i][j]=0; /*TO AVOID CARBAGE VALUES*/
c[i][j] = a[i][j] - b[i][j];
}
}
printf("\n FIRST MATIRX YOU ENTERED\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d \t", a[i][j]);
}
printf("\n");
}
printf("\n SECOND MATRIX YOU ENTERED\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d \t",b[i][j]);
}
printf("\n");
}
printf("\nRESULT =\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d \t",c[i][j]);
}
printf("\n");
}
}
if (l==3)
{
printf("\nENTER First m*m matrix for MULIPLICATION\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf("\nElement at %d*%d: ",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
printf("\nENTER Second m*m matrix for MULIPLICATION\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf("\nElement at %d*%d: ",i+1,j+1);
scanf("%d",&b[i][j]);
}
}
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
c[i][j]=0; /* TO AVOID CARBAGE VALUES*/
for(k=0;k<z;k++)
c[i][j]=c[i][j]+(a[i][k]*b[k][j]);
}
}
printf("\nFIRST MATRIX YOU ENTERED:\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d \t",a[i][j]);
}
printf("\n");
}
printf("\nSECOND MATRIX YOU ENTERED:\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d \t ",b[i][j]);
}
printf("\n");
}
printf("\n\nRESULT= \n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d ",c[i][j]);
}
printf("\n");
}
}
if(l==4)
{
printf("\nENTER THE NO TO WHICH YOU WANT TO MUTILY MATRIX: ");
scanf("%d",&k);
printf("\nENTER 3*3 Matrix for scalar Multiplication by %d:\n",k);
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf("\nElement at %d*%d: ",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
c[i][j]=0;
c[i][j]= k*a[i][j];
}
}
printf("\n FIRST MATIRX YOU ENTERED\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d \t", a[i][j]);
}
printf("\n");
}
printf("\nRESULT =\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d \t",c[i][j]);
}
printf("\n");
}
}
if(l==5)
{
printf("\nENTER THE NO TO WHICH YOU WANT TO taghsim MATRIX: ");
scanf("%d",&k);
printf("\nENTER m*m Matrix for taghsim Multiplication by %d:\n",k);
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf("\nElement at %d*%d: ",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
c[i][j]=0;
mbavi[i][j]=0;
c[i][j]=(float)(a[i][j])/(float)k;
mbavi[i][j]=(float)c[i][j];
}
}
printf("\n FIRST MATIRX YOU ENTERED\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d \t", a[i][j]);
}
printf("\n");
}
printf("\nRESULT =\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %f \t",mbavi[i][j]);
}
printf("\n");
}
}
if(l==6)
{

printf("\nENTER 3*3 Matrix for scalar jam ghotr");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf("\nElement at %d*%d: ",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
for(i=0;i<z;i++)
{
printf("a[%d][%d]=%d \t",i,i,a[i][i]);
printf("i=%d and z=%d\t",i,z);
jam+=a[i][i];
}
printf("%d",jam);
printf("\n FIRST MATIRX YOU ENTERED\n");
for(i=0;i<z;i++)
{
for(j=0;j<z;j++)
{
printf(" %d \t", a[i][j]);
}
printf("\n");
}
printf("\nRESULT =\n");
printf(" %d \t",jam);
printf("\n");
}
if(l==7)
{
printf("\nENTER the matrix you wish to inverted\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("\nElement at %d*%d: ",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
c[i][j]=0;
c[0][0]=a[0][0];
c[0][1]=a[1][0];
c[0][2]=a[2][0];
c[1][0]=a[0][1];
c[1][1]=a[1][1];
c[1][2]=a[2][1];
c[2][0]=a[0][2];
c[2][1]=a[1][2];
c[2][2]=a[2][2];
}
}
printf("\nMATIRX YOU ENTERED\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf(" %d \t", a[i][j]);
}
printf("\n");
}
printf("\nRESULT =\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf(" %d \t",c[i][j]);
}
printf("\n");
}
}
if(l==8)
{
printf("\n\n\n THANKYOU VERY MUCH!!\n For Using MATRIX CALCULATOR");
}
if(l>=9)
{
printf("\n\n\n\n WARNING!\n YOU HAVE ENTERED AN INVALID ENTRY \n PLEASE SELECT A VALID ENTRY PRESS ENTER FOR ( OK )");
}
getch();
}
return 0 ;
}
/*___________________THE END_____________________*/

توی قسمت 5 ) عبارت c[i][j]=(float)(a[i][j])/(float)k; رو در نمایش آخر میخوام که اعشاری هم داشته باشه ولی هر کاری میکنم تقسیم صحیح میکنه
قسمت 6 ) جواب نهایی رو چرت و پرت میده
لطفا به من کمک کنید
با تشکر

x.xoma
چهارشنبه 22 اردیبهشت 1389, 18:37 عصر
سلام دوست عزیز

در مورد قسمت 6 که فرمودید مقدار رو چرت و پرت میده باید عرض کنم که کاملا حق دارد ؛ چرا؟ عرض میکنم.

زمان تعریف یک متغیر یک مقدار بدرد نخور از قبل در تمامی آنها است که بهتر است برای جلوگیری از به وجود آمدن همچین مشکلی در ابتدای تعریف به آنها مقدار بدهیم.
شما به دستور =+ که در خط 288 برنامه گذاشته اید تمام آن زباله ها را با مقدارهای خودتان جمع کرده اید ؛ که به همین علت آن مقدارهای عجیب و غریب را نشان میدهد. راه حل آن ساده است ؛ کافی است در هنگام تعریف متغیر jam ؛ مقدار آن را برابر صفر بگذارید.


موردی را نیز میخواستم عرض کنم ؛ به این سبک برنامه نوشتن شما برنامه "با کد اسپاگتی" میگویند ؛ و پیدا کردن اشتباهات این نوع برنامه ها کابوسی برای هر کسی است ؛ ولی اگر بتوانید قسمت های مختلف را مجزا بنویسید (در غالب توابع مختلف) هم برنامه شما زیبا تر است ؛ هم مرتب تر است ؛ هم پایداری بیشتری دارد و هم عیب یابی آن آسان میشود. احتمالا علت اینکه تا بحال جواب نگرفته بودی نیز همین سبک کد نویسی شما بوده است. در مورد قسمت 5 نیز اگر منظور خود را از انتضارتان از این قسمت برنامه به طور دقیق بفرمایید ممنون میشوم.

mohsensaghafi
چهارشنبه 22 اردیبهشت 1389, 20:45 عصر
سلام دوست عزیز.
در مورد قسمت 5 هم باید بگم که در این قسمت


c[i][j]=(float)(a[i][j])/(float)k;
شما یک متغیر از نوع اعشاری رو به یه متغیر از نوع اعشاری تقسیم می کنی که حاصلش قطعا اعشاریه اما به یه متغیر از نوع صحیح داره انتسابش می دی. اینجاست که کل قسمت اعشار از بین می ره.