ورود

View Full Version : سوال: رفع اشکال کد ماتريس 4×4



ali najafi
سه شنبه 28 دی 1389, 22:14 عصر
سلام.
من این کد رو نوشتم. :متفکر:
عملکردش اینه:
محتویات یک ماتریس 4*4 رو از ورودی میخونه و این کار هارو انجام میده:
1-MAZوMIN اون رو مینویسه(بزرگترین و کوچکترین عنصر)
2-دونه دونه عنصر های اون رو مقلوب میکنه و مینویسه.البته جدا مینویسه،منظورم اینه که این دو تا پایینی ها رو روی اون اولیه انجام میده.
3-جای سطر و ستون رو عوض میکنه(مثلا [1][2] میشه[2][1])
4-یک ماتریس 2*2 رو از ورودی میخونه و اگه تمام عنصر های اون بین ماتریس قبلی بود،TRUE یا FALSE میده.
این هم از کد:

#include <stdio.h>
#include <conio.h>
void MAX_MIN();
void MAGHLOOB();
void REPLACE();
void TRUE_FALSE();
void INPUT(int);
int m[3][3];
int mm[3][3];
int n[1][1];
void main()
{
printf("Welcome to this program.");
printf("Please enter a matris 4*4:");
INPUT(1);
MAX_MIN();
MAGHLOOB();
REPLACE();
TRUE_FALSE();
}
void MAX_MIN()
{
int b1=-32767,b2=32767,i;
for(i=0;i<=3;i++){
if(m[0][i] > b1)b1 = m[0][i];
};
i=0;
for(i=0;i<=3;i++){
if(m[0][i] > b1)b1 = m[1][i];
};
i=0;
for(i=0;i<=3;i++){
if(m[0][i] > b1)b1 = m[2][i];
};
i=0;
for(i=0;i<=3;i++){
if(m[0][i] > b1)b1 = m[3][i];
};
i=0;
for(i=0;i<=3;i++){
if(m[0][i] < b2)b2 = m[0][i];
};
i=0;
for(i=0;i<=3;i++){
if(m[0][i] < b2)b2 = m[1][i];
};
i=0;
for(i=0;i<=3;i++){
if(m[0][i] < b2)b2 = m[2][i];
};
i=0;
for(i=0;i<=3;i++){
if(m[0][i] < b2)b2 = m[3][i];
};
};
printf(" MAX = %d \n MIN = %d \n",b1,b2);
}
void MAGHLOOB()
{
int i,sh;
for(sh=0;sh<=3;sh++){
mm[0][sh]=m[0][sh];
};
sh=0;
for(sh=0;sh<=3;sh++){
mm[1][sh]=m[1][sh];
};
sh=0;
for(sh=0;sh<=3;sh++){
mm[2][sh]=m[2][sh];
};
sh=0;
for(sh=0;sh<=3;sh++){
mm[3][sh]=m[3][sh];
};
printf("\n");
for(i=0;i<=3;i++){
do{
mm[0][i]=m[0][i]%10;
printf("%d",mm[0][i]);
m[0][i]/=10;
}while(m[0][i]!=0);
};
i=0;
printf("\n");
for(i=0;i<=3;i++){
do{
mm[1][i]=m[1][i]%10;
printf("%d",mm[1][i]);
m[1][i]/=10;
}while(m[1][i]!=0);
};
i=0;
printf("\n");
for(i=0;i<=3;i++){
do{
mm[2][i]=m[2][i]%10;
printf("%d",mm[2][i]);
m[2][i]/=10;
}while(m[2][i]!=0);
};
i=0;
printf("\n");
for(i=0;i<=3;i++){
do{
mm[3][i]=m[3][i]%10;
printf("%d",mm[3][i]);
m[3][i]/=10;
}while(m[3][i]!=0);
};
}
void REPLACE()
{
int sh;
mm[0][0]=m[0][0];
mm[0][1]=m[1][0];
mm[0][2]=m[2][0];
mm[0][3]=m[3][0];
mm[1][0]=m[0][1];
mm[1][1]=m[1][1];
mm[1][2]=m[2][1];
mm[1][3]=m[3][1];
mm[2][0]=m[0][2];
mm[2][1]=m[1][2];
mm[2][2]=m[2][2];
mm[2][3]=m[3][2];
mm[3][0]=m[0][3];
mm[3][1]=m[1][3];
mm[3][2]=m[2][3];
mm[3][3]=m[3][3];

for(sh=0;sh<=3;sh++){
printf("%d",mm[0][sh]);
};
sh=0;
for(sh=0;sh<=3;sh++){
printf("%d",mm[1][sh]);
};
sh=0;
for(sh=0;sh<=3;sh++){
printf("%d",mm[2][sh]);
};
sh=0;
for(sh=0;sh<=3;sh++){
printf("%d",mm[3][sh]);
};
sh=0;
}
void TRUE_FALSE()
{
int b0=0,b1=0,b2=0,b3=0,i=0,n=0;
INPUT(2)
for(i=0;i <= 3;i++){
if(n[0][0] == m[0][i]){
b0=1;
break;
};
};
for(i=0;i<=3;i++){
if(n[0][1] == m[1][i]){
b1=1;
break;
};
};
for(i=0;i<=3;i++){
if(n[1][0] == m[2][i]){
b2=1;
break;
};
};
for(i=0;i<=3;i++){
if(n[1][1] == m[3][i]){
b3=1;
break;
};
};
if((b0==1)&&(b1==1)){
if((b2==1)&&(b3==1))n=1;
};
printf("\n");
if(n==1){
printf("TRUE");
}
else
{
printf("FALSE");
};
printf("\n \t\t\t\t\t Press any key to exit...");
}
void INPUT(int c)
{
int i;
if(c==2) goto D;
for(i=0;i<=3;i++){
scanf("%d",m[0][i]);
};
i=0;
for(i=0;i<=3;i++){
scanf("%d",m[1][i]);
};
i=0;
for(i=0;i<=3;i++){
scanf("%d",m[2][i]);
};
i=0;
for(i=0;i<=3;i++){
scanf("%d",m[3][i]);
};
};
D:
if(c==2){
scanf("%d",n[0][0];
scanf("%d",n[0][1];
scanf("%d",n[1][0];
scanf("%d",n[1][1];
};
};

}



11 تا ارور و 2 تا غلط داره.فکر کنم اکثر ارور هاش نوشتاری باشه.
اگه میشه،یک نگاهی بندازین.بعضی ارور هاش عجیبه! کم کم داره اعصابم رو خورد میکنه.:عصبانی++:
راستی یک چیزی یادم رفت:
من با این کار میکنم:
TURBO C++ IDE
زود تر یک نگاهی بندازین.قولش رو دادم. :ناراحت:
دستتون درد نکنه.

sh4mid
سه شنبه 28 دی 1389, 23:11 عصر
سلام

من با این کار میکنم:
TURBO C++ IDE

بابا به پیر ، به پیغمبر ، این Compiler از رده خارجه ، چرا ولش نمی کنید ؟ :عصبانی::عصبانی::عصبانی::عصب نی::عصبانی::عصبانی::عصبانی:: صبانی::عصبانی::عصبانی::عصبا ی::عصبانی::عصبانی::عصبانی::ع بانی::عصبانی::عصبانی:


11 تا ارور و 2 تا غلط داره
خیلی بیشتر از اینهاست Compiler درپیت تشریف داره :قهقهه: :قهقهه:


محتویات یک ماتریس 4*4 رو از ورودی میخونه
اومدی تو کدت نوشتی int m[3][3] این ماتریس 3 در 3 هست ، نه 4در4(یعنی آخرین خونش m[2][2] ) و در بیشتر کدت اومدی مثلا نوشتی



if(m[0][i] > b1)b1 = m[0][i];
که آخرین مقدار i برابر است با 3 و -----> نوشتن روی مقداری از حافظه که معلوم نیست به کجا اشاره می کنه
این یکی از مشکلات کدت بود ، مشکل دیگرش اینه که باید برای متغیرات نام های معنادار بگذاری
اومدی اول برنامت تعریف کردی



int n[1][1];


بعد تو تابع TRUE_FALSE اومدی نوشتی



int b0=0,b1=0,b2=0,b3=0,i=0,n=0;

و دو خط پایین تر نوشتی



for(i=0;i <= 3;i++){
if(n[0][0] == m[0][i]){
b0=1;
break;
};
};


compiler از کجا بفهمه منظور شما از n[0][0] اون متغیر محلی هست ، یا اون آرایه؟:متفکر: :متفکر:

اون اواخر هم نوشتی



};
D:

{ اضافه هست

راستی هیچ وقت از goto استفاده نکن

ali najafi
چهارشنبه 29 دی 1389, 14:46 عصر
چرا از goto استفاده نکنم!
در ضمن،تا جایی که من میدونم،خونه های آرایه از 0,0 شروع میشه پس آرایه ی من 4*4 هست.
در مورد n هم خوب،:خجالت:

sh4mid
چهارشنبه 29 دی 1389, 21:56 عصر
سلام

چرا از goto استفاده نکنم!
این مدل برنامه نویسی مال اونوقتها بود که برنامه نویسی ساختیافته نبود (دوران یکه تازی FORTRAN :قهقهه: )
شما هر مدل برنامه رو می تونید تنها با استفاده از روال ها یا ترکیبی از اون ها بنویسید (http://en.wikipedia.org/wiki/Structured_program_theorem)
اگر تعداد خطوط برنامتون زیاد بشه ، کد تون میشه ماکارونی (http://en.wikipedia.org/wiki/Spaghetti_code) :قهقهه: :قهقهه: و در نهایت وقتی میرسه که دنبال کردن منطق برنامه یک کابوس میشه


خونه های آرایه از 0,0 شروع میشه
بله خونه های آرایه از 0 شروع میشه ، ولی طبق تعریف خودتون int m[3][3] این آرایه 3X3 هست یعنی آخرین خونش میشه m[2][2] نه m[3][3]
کدتون رو با VC اجرا کنید تا ببینید چندتا Warning از نوع C4789 (http://msdn.microsoft.com/en-us/library/w0c0bww3.aspx) میده (تازه یک سری رو هم نمی تونه تشخیص بده و برنامه موقع اجرا Crash می کنه)