کمک در کار با توابع در سی پلاس

سلام دوستان
من این برنامه رو نوشتم یک سرس مشکل داره اگه ممکنه بر طرفش کنید
ممنون
کد:
#include <stdio.h>
#include <conio.h>
//*******************************************
int Fib(int a)
{
 int x=0;
 for(int i=0 ; i<=a ; i++)
 {
  x=x+i;
  printf("Fibonachi = %d",x);
 }
}
//*******************************************
int Fact(int a)
{
 int x=1;
 for (int i=0 ; i<=a ; i++)
 {
  x=x*i;
 }
 printf("Factorile = %d",x);
}
//*******************************************
int Pow(int a,int b)
{
 int x=1;
 for (int i=1 ; i<=b ; i++)
 {
  x=x*a;
 }
 printf("Power = %d",x);
}
//*******************************************
void link(void)
{
 int a,b;
 printf(" Welcome \n Select Number Of Function : \n 1.Fibonachi \n 2.Factorile \n 3.Power");
 int z=getnumber();
 clrscr();
 switch (z)
 {
  case 1:
   printf("Enter Number For Result Fibonachi : ");
   a=getnumber();
   Fib(a);
  case 2:
   printf("Enter Number For Result Factorile : ");
   a=getnumber();
   Fact(int a);
  case 3:
   printf("Enter Number 1 For Result Power : ");
   a=getnumber();
   printf("Enter Number 2 For Result Power : ");
   b=getnumber();
   Fib(a,b);
  default:
   printf("Erorr : You Entered Unavalable Number");
 }
}
//*******************************************
void main()
{
 clrscr();
 Link();
 getch();
}
 
آخرین ویرایش:

the_king

مدیرکل انجمن
نکته اول :
توابعی مانند ()Fib که قرار نیست مقداری را برگردانند و در خودشان خروجی را چاپ می کنند (مطابق پیاده سازی کد شما)
را با خروجی void تعریف کنید و نه int.
در این حالت دیگر نیازی به خروج توسط return با یک مقدار بی فایده نخواهد بود و کامپایلر هم اخطار نخواهد داد.

نکته دوم :
روتین مربوط به تابع فیبوناچی الگوریتم درستی نداشت و اصلاح گردید.

نکته سوم :
برای توابعی مانند ()Fact که به سرعت به خروجی های عددی بزرگی می رسند بهتر است از نوع داده long استفاده کنید
و نه int تا در محاسبه اعداد بزرگ با مشکل مواجه نشوید.
برای خروجی مقادیر long همانطور که در کد مشاهده می کنید از "ld%" به جای "d%" استفاده کنید
(یک l مابین % و d اضافه می شود)

نکته چهارم :
اسامی توابعی مانند ()link با حروف کوچک و بزرگ متفاوت اند. در هنگام فراخوانی ()link از ()Link استفاده کرده بودید که
اشتباه است.

نکته پنجم :
توابعی که مقداری به عنوان ورودی نمی گیرند را با () خالی تعریف کنید و نه (void).

نکته ششم :
فراموش کرده بودید که تابع ()getnumber را معرفی کنید. یک نسخه مناسب ایجاد گردید.

نکته هفتم :
ساختار switch و case به نحوی است که اگر یک case را با فرمان break به انتهای ساختار هدایت نکنید، علاوه بر موارد
آن case مشخص، کد های مربوط به case بعدی را هم اجرا می کند.
مثلا در کد شما اگر آیتم 1 انتخاب می شد، case های 2 و 3 هم اجرا می شدند.
پس در موارد عادی بایستی در انتهای کدهای مربوط به هر case یک فرمان break هم اضافه کنید تا case بعدی اجرا نشود.

نکته هشتم :
در case دوم به جای ارسال متغیر a به تابع ()Fact از int a استفاده کرده بودید که نادرست است. نوع متغیر int را فقط در هنگام
تعریف کردن تابع بکار ببرید، نه در هنگام صدا کردن آن.

نکته نهم :
در case سوم بجای فراخوانی تابع ()Pow به اشتباه تابع ()Fib را با دو پارامتر فراخوانی کردید که نادرست است.

نکته دهم :
هیچگاه در نوشتن کد عجله نکنید. آرام بنویسید و پس از نوشتن هر سطر آنرا مجددا بخوانید. کد تان مملو از کدهای اشتباهی
است که صرفا به دلیل عجله در نوشتن آنها بوجود آمده اند.
چندین اشتباه املایی نظیر Fibonacci و Factorial را نیز صلاح کردم و بجای روتین ()getnumber در انتخاب گزینه ها از ()getch
استفاده کردم تا نیازی به فشردن کلید Enter هم نباشد.

کد:
#include <stdio.h>
#include <conio.h>
//*******************************************
void Fib(int a)
{
	int x=1,y=0,z;
	for(int i=1 ; i<a ; i++)
	{
		z=x;
		x+=y;
		y=z;
	}
	printf("Fibonachi = %d",x);
}
//*******************************************
void Fact(int a)
{
	long x=1;
	for (long i=2 ; i<=a ; i++)
	{
		x=x*i;
	}
	printf("Factorial = %ld",x);
}
//*******************************************
void Pow(int a,int b)
{
	long x=1;
	for (int i=1 ; i<=b ; i++)
	{
		x=x*a;
	}
	printf("Power = %ld",x);
}
//*******************************************
int getnumber()
{
	int num;
	scanf("%d",&num);
	return num;
}

void link()
{
	int a,b;
	printf(" Welcome \n Choose on of functions by number (1/2/3): \n [1] Fibonacci \n [2] Factorial \n [3] Power \n");
	fflush(stdin);
	char z=getch();
	if (!z)
		getch();
	clrscr();
	switch (z)
	{
		case '1':
			printf("Enter Number For Result Fibonacci : ");
			a=getnumber();
			Fib(a);
			break;
		case '2':
			printf("Enter Number For Result Factorial : ");
			a=getnumber();
			Fact(a);
			break;
		case '3':
			printf("Enter Number 1 For Result Power : ");
			a=getnumber();
			printf("Enter Number 2 For Result Power : ");
			b=getnumber();
			Pow(a,b);
			break;
		default:
			printf("Error : Invalid number.");
	}
}
//*******************************************
void main()
{
	clrscr();
	link();
	getch();
}
 
سلام the_king جان واقعا شرمنده کردی
انتظار همچین توضیحات دقیقی رو نداشتم
واقعا ممنون
درست میگی من در نوشتن کد خیلی عجله میکنم خوب تازه کارم دیگه تو وی بی هم اولش اینجوری بودم بعدا کم کم درست شدم
 

جدیدترین ارسال ها

بالا