عدم نمايش خروجي و بازگشت به صفحه ي منو

hobab1987

Member
سلام سلام
اين برنامه رو يه زماني نوشته بودم حالا اومدم يه كوچولو تغييرش دادم تا بهتر بشه اما بدتر شد!!!
وقتي ورودي دريافت مي كنه بيخيال خروجيش ميشه دليلش چي ميتونه باشه؟!!!
کد:
#include <iostream.h>
#include <conio.h>
#include <process.h>
void choice();
int power(int, int);
int fact(int);
int powfact(int, int);
void ret(int);
void quit();
void main()
 {
     int num, n;
     int a, b;
     clrscr();
   for( ; ; )
      {
          clrscr();
          choice();
          gotoxy(30,27);
          cin>>num;
         switch(num)
         {
         case 1:
             clrscr();
             gotoxy(30,15);
             cout<<"a=";
             cin>>a;
             gotoxy(30,17);
             cout<<"b=";
             cin>>b;
             gotoxy(30,19);
             cout<<"a^b="<<power(a,b);
             break;
         case 2:
             clrscr();
             gotoxy(30,15);
             cout<<"n=";
             cin>>n;
             gotoxy(30,17);
             cout<<"n!="<<fact(n);
             break;
         case 3:
             clrscr();
             gotoxy(30,15);
             cout<<"a=";
             cin>>a;
             gotoxy(30,17);
             cout<<"b=";
             cin>>b;
             gotoxy(30,19);
             cout<<"(a+b)^a/b! = "<<powfact(a,b);
             break;
         case 4:
             clrscr();
             gotoxy(30,15);
             cout<<"Enter one number to return base 2=";
             cin>>a;
             gotoxy(30,17);
             cout<<"Result=";
             ret(a);
             break;
         case 6:
             quit();
         }//End switch
      }//End for
 }//End main
void choice()
 {

     gotoxy(30,15);
     cout<<"1. a^b";
     gotoxy(30,17);
     cout<<"2. n!";
     gotoxy(30,19);
     cout<<"3. ((a+b)^a)/b!";
     gotoxy(30,21);
     cout<<"4. return to base 2";
     gotoxy(30,23);
     cout<<"5. base 2 return to base 10";
     gotoxy(30,25);
     cout<<"6. Exit";
 }//End choice
int power(int a, int b)
 {  
     int pw=1,i;
    for(i=0;i<b;i++)
        pw=pw*a;
    return pw;
 }//End power
int fact(int n)
 {
     int fc;
     if(n==1)
         return 1;
     else
         fc=n*fact(n-1);
     return fc;
 }//End fact
int powfact(int a, int b)
{
    int i,j,s,pw=1,fc=1;
    float tmp;
    s=a+b;
    for(i=0;i<a;i++)
        pw=pw*s;
    for(j=b;j>0;j--)
    fc*=j;
    tmp=(float)pw/fc;
    return tmp;
}
void ret(int a)
 {
  int i, j, n, r[20];
  for(i=0;a>0;i++)
  {
   r[i] = a%2;
   a = a/2;
  }
  cout<<a<<" ";
  for(j = i ; j > 0 ; j--)
  {
      cout<<r[i];
      cout<<" ";
  }
 }
void quit()
{
    char ans;
    clrscr();
    gotoxy(26,20);
    cout<<"Are you sure to Quite?(Y/N): ";
    cin>>ans;
    if (ans == 'y' || ans == 'Y')
        exit(0);
    else
        return;
  }
 

the_king

مدیرکل انجمن
سلام سلام
اين برنامه رو يه زماني نوشته بودم حالا اومدم يه كوچولو تغييرش دادم تا بهتر بشه اما بدتر شد!!!
وقتي ورودي دريافت مي كنه بيخيال خروجيش ميشه دليلش چي ميتونه باشه؟!!!
نتیجه رو بیخیال نمیشه، اتفاقا نمایش هم میده، اما چون بلافاصله حلقه for ادامه پیدا می کنه و در ابتدای حلقه
از ()clrscr استفاده کردید، دیگه فرصتی برای مشاهده خروجی ندارید و صفحه به سرعت پاک میشه.
ساده ترین راه حل اینه که در انتهای حلقه for یک ()getch اضافه کنید تا فرصت مشاهده نتایج را داشته باشید :
کد:
			case 6:
				 quit();
			}//End switch
			[B]getch();[/B]
		}//End for

گویا مورد 4 و 5 هنوز کامل نشده.
 

hobab1987

Member
دوست عزيز ممنون ، هنوز برنامه رو اجرا نكردم، 4 روميه تبديل مبنا به 2 ست ايرادي داره؟ 5 هم بايد اضافه كنم!
 

the_king

مدیرکل انجمن
دوست عزيز ممنون ، هنوز برنامه رو اجرا نكردم، 4 روميه تبديل مبنا به 2 ست ايرادي داره؟ 5 هم بايد اضافه كنم!

آره، ایراد داره. یک نگاهی به کدتون بندازیم :
کد:
void ret(int a)
 {
  int i, j, n, r[20];
  for(i=0;[B]a>0[/B];i++)
  {
   r[i] = a%2;
   a = a/2;
  }
[B]  cout<<a<<" ";[/B]
  for([B]j = i[/B] ; [B]j > 0[/B] ; j--)
  {
[B]      cout<<r[i];[/B]
      cout<<" ";
  }
 }
ایراد اول اینه که شرط a > 0 حلقه for اول رو ابتدای اون قرار دادید. عیب اش اینه که اگر عدد خود 0 بود،
دیگه رقم هایش را جدا نمی کنه.
ایراد دوم درست بعد از پایان حلقه for اول است که مقدار a رو به cout فرستادید. طبیعی است که این مقدار
همیشه 0 است و کاربردی نداره.
ایراد سوم اینه که شما در حلقه for دوم، مقدار اندیس j را از i شروع کردید تا 1 ادامه دادید، در صورتی که اندیس های
ذخیره شده از i - 1 الی 0 ثبت شده اند. در واقع شما هم یک اندیسی را چاپ می کنید که مقدارش نامعلوم است و
هم یک اندیس [0] را جا انداخته اید.
ایراد چهارم در چاپ اندیس ها است، شما بجای [r[j که به مقدار j حلقه بستگی دارد، مقدار [r[i را چاپ می کنید که
اصلا مقدار i در حلقه تغییری نداشته است و همیشه ثابت است.

بجای آن کد، از کد زیر استفاده کنید :
کد:
void ret(int a)
{
	int i = 0, j, n, r[20];
	do
	{
		r[i] = a % 2;
		a = a / 2;
		i++;
	} while (a > 0);
	for(j = i - 1; j >= 0 ; j--)
	{
		cout << r[j];
		cout << " ";
	}
}
 

hobab1987

Member
يك سوال در مورد اين برنامه و مشكلي كه در اين جور برنامه ها باهش بر مي خورم
تبديل int به float هست
با اينكه اين تبديل رو انجام دادم اما عدد صحيح باز چاپ مي كند!! البته اين تابع توسعه پيدا كرده powfact برنامه بالاست!
کد:
[SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] setab([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] a, [/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] b)
{
[/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] c1, c2, c3;
[/SIZE][SIZE=2][COLOR=#0000ff]float[/COLOR][/SIZE][SIZE=2] c4;
c1=a+b;
c2=powab(c1, a);
c3=fact(b);
c4=([/SIZE][SIZE=2][COLOR=#0000ff]float[/COLOR][/SIZE][SIZE=2])c2/c3;
[/SIZE][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2] c4;
}
[/SIZE]

براي تبديل مبناي 2 به 10 ميشود راهنمايي كنيد؟
 
آخرین ویرایش:

mo.esmp

Member
تابع رو از نوع صحیح انتخاب کرديد بايد نوع تابع رو اعشاری انتخاب کنيد
کد:
[LEFT]float setab(int a, int b)[/LEFT]
 

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

بالا