برنامه ای که چندنفر را از ورودی گرفته واولین اسم رابرحسب الفبا چاپ کند؟جابشو می خواهم.
برنامه ای که چندنفر را از ورودی گرفته واولین اسم رابرحسب الفبا چاپ کند؟جابشو می خواهم.
این برنامه دترمینان ماتریس رو به روش Laplace Expansion و بوسیله ی تابع بازگشتی! حساب میکنه.
فرمولش هست (سطر i ام رو به دلخواه انتخاب میکنیم) :
که B ماتریس شماست. bij هم عنصر هاش و Cij هم Cofactor ماتریس هست که خود Cofactor هست :
که Mij ماتریس Minor ماتریس مورد نظر هست که تعریفش هست ماتریسی که از حذف کردن سطر i ام و ستون j ام ماتریس حاصل میشه.
توی کدی که دادی تابع sign این 1- بتوان i+j رو محاسبه میکنه که ببینه جواب میشه 1- یا 1+(روش خوبی رو انتخاب نکرده به نظرم)
اصل روش اینه که شما میان دترمینان ها رو از دترمینان های ماتریس های کوچک شده (Minor) حساب میکنی و انقدر ادامه میدی تا به دترمینان ماتریس 2x2 برسی که فرمولش ساده هستش:
![]()
کاری که توی تابع det انجام میشه اینه که میبینه اگه ماتریس 2 در 2 هست از این فرمول آخری حساب میکنه.اگه بزرگتر بود میاد ماتریس های Minor رو بدست میاره و از طریق فرمول اول (و فراخونی خودش برای محاسبه ی دترمینان ماتریس Minor) توی یک حلقه جواب رو پیدا میکنه.
en.wikipedia.org/wiki/Laplace_expansion
دستت درد نکنه مهرزاد جان.(اسم من و شما یکی هست یعنی اسم من هم مهرزاد هست)
سلام.بچه ها میشه این کد را طوری تغییر دهید که دترمینان ماتریس را حساب کنه.این کد یک اشکالی که داره و نمی دونم چی هست وقتی ماتریس را مقدارش را خودت وارد می کنی دترمینان را حساب میکنه ولی وقتی به صورت random میگذاریم Divide Error میده.
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
void main(){
clrscr();
int a[5][5];
int i,j,n,d,k;
for (i=1;i<5;i++)
for (j=1;j<5;j++)
a[i][j]=random(9);
for (i=1;i<5;i++){
for (j=1;j<5;j++)
printf("%5d",a[i][j]);
printf("\n");}
for (k=1;k<5-1;k++)
for (i=k+1;i<5;i++)
for (j=1;j<5;j++)
a[i][j]=a[i][j]*(a[k][k]/a[i][k])-a[k][j];
d=1;
for (i=1;i<5;i++)
d=d*a[i][i];
printf("Determinant is:%d",d);
getch();
}
ئه جالبه![]()
به نظر نمیاد برنامت مشکل جدی که وسط کار قطع بشه داشته باشه. من اجراش کردم . اطلاعات هر 5 دانشجو رو گرفت..
به جز اون قسمتی که توی comment گذاشتی که احتمالا خودت میدونستی..
Last edited by m3hrz4d; 29-11-2007 at 23:35.
کلا اگه توی ماتریس عنصر 0 باشه مشکل داره.اصلا توی محاسبه ی دترمینان تقسیم نیست نمیفهمم این تقسیم برای چیه.حالا اگه صفر هم نداشته باشیم فکر نکنم درست حساب کنه.یه چیز دیگه اینکه مگه این برای 5 در 5 نباید باشه؟ ظاهرا 4 در چهار میگیره.
اون کد قبلی که دادی درست بود.
سلام آقا مهرزاد
مشکل رو پیداکردم (جاهایی که خط تیره گذاشتم) mark رو از نوع float به int تغییر دادم ولی یه سوالی دارم واینه که نمراتی که ما به ورودی میدیم همیشه که صحیح نیستند و مقدار اعشار هم دارن (مثلا15/25 ) به چه صورت عمل کنم تا جواب بده موقعه ای که به نوع float تغییر میدم از برنامه خارج میشه ممکنه در این قسمت از pointer استفاده کنیم یا خیر.....................
اینم کدی رو که تغییر دادم.........................
#include<stdio.h>
#include<conio.h>
void main()
{
//clrscr();
-----------------------------------int sum=0;
struct student
{
char name[10];
int stno;
----------------------------------int marks[5];
}s1[5];
for(int k=1;k<5;k++)
{
for(int j=0;j<5;j++)
{}
printf("student name%d:",k);
scanf("%s",s1[j].name);
printf("student number%d:",k);
scanf("%d",&s1[j].stno);
for(int i=0;i<5;i++)
{
printf("student marks%d:",k);
-----------------------------------scanf("%d",&s1[j].marks[i]);
sum+=s1[j].marks[i];
}
}
/*printf("name:%s\n",s1[j].name);
printf("name:%d\n",s1[j].stno);
printf("name:%f\n",sum/5);*/
getch();
}
}
توی یک کامپایلر جدید من همون کد اول رو راحت و بدون مشکل اجرا کردم اما وقتی توی ++Turbo C خواستم اجرا کنم توی خوندن float به این صورت مشکل داشت و از برنامه خارج میشد:
بجاش این رو زدم :کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اینطوری Turbo C مشکل نداشت!! حالا نمیدونم مشکل تو هم همینه یا چیز دیگه ایه!!کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
Last edited by m3hrz4d; 30-11-2007 at 16:11.
ممنون
آره مشکلم همین قسمت بود آخه من با ++Turbo C ورژن 3 داس کارمیکنم.
شما برای بار اول که برنامه رو تست کردید از چه کامپایلری استفاده کردی که دچار این مشکل نشد.
بازم ممنون از توجه شما آقا بهزاد..................
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)