# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > الگوریتم، کامپایلر، هوش مصنوعی و ساختمان داده ها >  بدست آوردن مقلوب یک عدد با تابع بازگشتی

## BOB

سلام

این سوال خیلی آسونه ... ولی در عین آسانی نیاز به کمی دقت و خلاقیت داره.

یک تابع *بازگشتی* بنویسید که عددی را به عنوان ورودی دریافت و مقلوب آن را محاسبه کرده و بازگرداند.(منظور از مقلوب همان وارونه است).
مثلا مقلوب عدد 13056 برابر با 65031 و مقلوب 1700 عدد 71 میشود. زیرا صفر پشت عدد معنی نداشته و این تابع نیز ، مقلوب محاسبه شده را در یک متغیر عددی باید برگرداند.
پس اعلان تابع به این شکل میشود ...


long rev(long x)
{
.....
.....
}

----------


## gm.sara

سلام 
این برنامه جالبی بود ولی بهتر نبود اول خودت کمی روش فکر می کردی شاید به نتیجه می رسیدی ! 
ولی خوب من برنامه را نوشتم و می ذارم این جا . در ضمن من عددم را int گرفتم ولی اگر می خواهی می تونی تو long int بگیری فرقی نمی کند ؟ 
خوشحال می شوم اگر از برنامه استفاده کردی بگی که برنامه به دردت خورد یا نه یا اشکالات برنامه ام را بگویی .
موفق باشی 
#include<stdio.h>
#include<conio.h>
void maghloob(int x){
     if (x/10){
        if (x%10)
           printf("%d",x%10);
	maghloob(x/10);
     }
}
void main(void){
     int x;
     clrscr();
     printf("Enter an integer number:");
     scanf("%d",&x);
     printf("\nmaghloob=");
     maghloob(x);
     getch();
}

----------


## gm.sara

با سلام مجدد
برنامه قبلی که نوشتم برای عدد 1700 جواب می دهد ولی برای 13056 جواب درست نمی داد تصحیح شده اش را دوباره برایت گذاشتم :
باز هم ممنون می شوم اگر نظرت را در رابطه با برنامه بگویی یا اشکالش را بگویی ؟
#include<stdio.h>
#include<conio.h>
void maghloob(int x){
     if (x){
	printf("%d",x%10);
	maghloob(x/10);
     }
}
void main(void){
     int x;
     clrscr();
     printf("Eneter an integer number:");
     scanf("%d",&x);
     while (x%10==0)
	 x=x/10;
     printf("\nmaghloob=");
     maghloob(x);
     getch();
}

----------


## اَرژنگ

> (منظور از مقلوب همان وارونه است) 
> مقلوب عدد 13056 برابر با 65031 و 
> مقلوب 1700 عدد 71 میشود. زیرا صفر پشت عدد معنی نداشته و این تابع نیز ، 
> مقلوب محاسبه شده را در یک متغیر عددی باید برگرداند.


مقلوب دیگه چیچیه؟
فارسی نداره این کلمه؟ یک چیزی در مایه‌هایه "برعکس"،"پشت و رو" و یا "وارانه"؟
فردوسی را از یاد نبرید!
۴ بار گفیتد مقلوب، یک بار وارونه!

----------


## gm.sara

> مقلوب دیگه چیچیه؟
> فارسی نداره این کلمه؟ یک چیزی در مایه‌هایه "برعکس"،"پشت و رو" و یا "وارانه"؟
> فردوسی را از یاد نبرید!
> ۴ بار گفیتد مقلوب، یک بار وارونه!


سلام دوست عزیز
شما چرا اصل مطلب را ول کردید به فرعیات چسبیدید ؟ :متفکر:

----------


## BOB

سلام

دوست عزیز gm.sara  ... اگر خودم جوابشو نمیدونستم ، مطلب رو به شکل دیگری عنوان میکردم!
فکر میکنم شما اصلا به صورت مسئله توجه نکردین ..! جواب دادن به این سوال ، به شکلی که شما نوشتین کار بسیار ساده ای است .
اصل مسئله اینه که ، تابع مربوطه باید خروجی عددی داشته باشه ، وگرنه چاپ ارقام پشت سرهم که کاری نداشت.   برای همین اعلان تابع رو نیز ذکر کردم :

long rev(long x)
{
.....
.....
}

----------


## gm.sara

سلام 
خوب می شه به جای خط printf در تابع متغییری در نظر گرفت که داخلش این عبارت باشد :
p=x%10+10*p
البته در اول تابع در هنگام تعریف متغیر p مقدار اولیه به صفر باید داد وبرای جلوگیری از صفرشدن مرتب p می توان آن را به صورت سراسری تعریف کرد . و در پایان هم مقدار p را return کنی و در بدنه اصلی برنامه استفاده کنی .
اگر باز هم منظورت را اشتباه متوجه شدم بگو .

----------


## BOB

سلام
دوست عزیز ممکنه با این دست راه حلها به جواب برسی ... ولی فکر نمیکنی اینکار با اصول اولیه استفاده و کاربرد توابع در تناقضه !! ( استفاده از متغیر سراسری در تابع !!!! )
جواب مورد نظر ، یک تابع بازگشتی مستقل و با رعایت اصول برنامه نویسی میباشد .
موفق باشید.

----------


## gm.sara

ممنون 
روی راه حل آن فکر می کنم . :متفکر:

----------


## اَرژنگ

> سلام دوست عزیز
> شما چرا اصل مطلب را ول کردید به فرعیات چسبیدید ؟


من اصل مطلب را ول کردم به فرعیات چسبیدم؟ :متعجب:  
 اسمه این انجمن "انجمن الگریتمه"، سوالی که پرسیده شده و جوابهایه که فرستاده شدن در سی میباشند.
میشه این کار را در سه خط پاسکال نوشت، ولی این بخش ،بخش الگریتم. 
نتیجتاً 
۱.این سوال مربوط به این بخش نیست، باید بستش و بردش به قسمت سی.
۲.از جواب دادن به سوال در بخش الگریتم با هر زبانی خواصی باید پرهیز کرد.
۳.چرا در بخش الگریتم خیلیها سوال را در یک زبان بخصوص جواب میدند؟ برایه پاسکال بخش پاسکال هست، برایه سی انجمن سی هست .....
بخش الگریتم برایه الگریتمه. :بامزه:  
اگر کسی فرق الگریتم را با پایوند کردن الگریتم در یک زبان بخصوصی نمیدند، باید یاد آوری کنیم.

اگر اشتباه میگم :اشتباه:  ، بفرمائید
با تشکر فراوان که نظرتان را بیان کردید. :لبخند گشاده!:

----------


## سید مسعود موحد

دوست عزیز
برای اینکار بهتر است که شما ورودی را به رشته تبدیل کنید و سپس آنرا وارونه نمایید و در نهایت تبدیل کنید به عدد که صفرهای ابتدای آن هم خود به خود پاک میشود

----------


## mzjahromi

این شبه کد همونه که می خواین؟

int Rev(N);
Begin
 if n>0 Then
   return  Power(10,Trunc(Ln(n)/Ln(10)))* (n mod 10)+Rev(N div 10);
ENd;

----------


## gm.sara

سلام نظرت درباره این چیه ؟
#include<stdio.h>
#include<conio.h>
int maghloob(int x,int p){
     if (x){
	p=x%10+p*10;
	maghloob(x/10,p);
     }
     else
	return p;
}
void main(void){
     int x,p=0;
     clrscr();
     printf("Eneter an integer number:");
     scanf("%d",&x);
     while (x%10==0)
	 x=x/10;
     printf("\nmaghloob=");
     p=maghloob(x,p);
     printf("%d",p);
     getch();
}
این همونیه که می خواستی ؟

----------


## BOB

سلام
جناب  mzjahromi متشکرم ،  پاسخ شما بسیار زیبا میباشد.    دوست عزیز gm.sara قرار بود تابع فقط یک عدد را به عنوان پارامتر ورودی دریافت کنه ، با کمی تغییر در تابع میتوانی به جواب مورد نظر برسی.
فرمایش جناب ارژنگ نیز درست میباشد. ولی شخصا فکر نمیکنم اشکالی داشته باشه که پاسخها به زبان خاصی نوشته شوند. در هر صورت یک برنامه نویس باید بتواند با دیدن کد ، به هر زبانی ، به الگوریتم آن پی ببرد.

موفق باشید.

----------


## gm.sara

دوست عزیز 
پس دیگه ببخشید که نتونستم کمکتون کنم .

----------


## vb1249

برای VB6 چگونه بنویسیم ؟

----------

