PDA

View Full Version : بدست آوردن مقلوب یک عدد با تابع بازگشتی



BOB
شنبه 17 دی 1384, 01:48 صبح
سلام

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

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



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

gm.sara
یک شنبه 18 دی 1384, 15:38 عصر
سلام
این برنامه جالبی بود ولی بهتر نبود اول خودت کمی روش فکر می کردی شاید به نتیجه می رسیدی !
ولی خوب من برنامه را نوشتم و می ذارم این جا . در ضمن من عددم را 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
یک شنبه 18 دی 1384, 16:21 عصر
با سلام مجدد
برنامه قبلی که نوشتم برای عدد 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();
}

اَرژنگ
یک شنبه 18 دی 1384, 16:50 عصر
(منظور از مقلوب همان وارونه است)
مقلوب عدد 13056 برابر با 65031 و
مقلوب 1700 عدد 71 میشود. زیرا صفر پشت عدد معنی نداشته و این تابع نیز ،
مقلوب محاسبه شده را در یک متغیر عددی باید برگرداند.


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

gm.sara
دوشنبه 19 دی 1384, 00:01 صبح
مقلوب دیگه چیچیه؟
فارسی نداره این کلمه؟ یک چیزی در مایه‌هایه "برعکس"،"پشت و رو" و یا "وارانه"؟
فردوسی را از یاد نبرید!
۴ بار گفیتد مقلوب، یک بار وارونه!
سلام دوست عزیز
شما چرا اصل مطلب را ول کردید به فرعیات چسبیدید ؟:متفکر:

BOB
دوشنبه 19 دی 1384, 00:53 صبح
سلام

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


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

gm.sara
دوشنبه 19 دی 1384, 01:09 صبح
سلام
خوب می شه به جای خط printf در تابع متغییری در نظر گرفت که داخلش این عبارت باشد :

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

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

gm.sara
دوشنبه 19 دی 1384, 01:25 صبح
ممنون
روی راه حل آن فکر می کنم .:متفکر:

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

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

سید مسعود موحد
دوشنبه 19 دی 1384, 10:37 صبح
دوست عزیز
برای اینکار بهتر است که شما ورودی را به رشته تبدیل کنید و سپس آنرا وارونه نمایید و در نهایت تبدیل کنید به عدد که صفرهای ابتدای آن هم خود به خود پاک میشود

mzjahromi
دوشنبه 19 دی 1384, 10:47 صبح
این شبه کد همونه که می خواین؟


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
دوشنبه 19 دی 1384, 16:06 عصر
سلام نظرت درباره این چیه ؟

#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
سه شنبه 20 دی 1384, 01:08 صبح
سلام
جناب mzjahromi متشکرم ، پاسخ شما بسیار زیبا میباشد. دوست عزیز gm.sara قرار بود تابع فقط یک عدد را به عنوان پارامتر ورودی دریافت کنه ، با کمی تغییر در تابع میتوانی به جواب مورد نظر برسی.
فرمایش جناب ارژنگ نیز درست میباشد. ولی شخصا فکر نمیکنم اشکالی داشته باشه که پاسخها به زبان خاصی نوشته شوند. در هر صورت یک برنامه نویس باید بتواند با دیدن کد ، به هر زبانی ، به الگوریتم آن پی ببرد.

موفق باشید.

gm.sara
سه شنبه 20 دی 1384, 01:29 صبح
دوست عزیز
پس دیگه ببخشید که نتونستم کمکتون کنم .

vb1249
دوشنبه 21 بهمن 1392, 13:16 عصر
برای VB6 چگونه بنویسیم ؟