PDA

View Full Version : سوال: تابع مبنای من کجا مشکل داره؟



hercool
جمعه 13 فروردین 1389, 08:55 صبح
سلام خدمت دوستان
از مدیران می خوام که پاکش نکنن چون می خوام ایراد برنامه نویسی خودم رو بدونم
ممنون
من می خوام تابعی داشته باشم که عدد رو به مبنای دو ببره
نوشتم این تابع رو اما اخرین حلقه رو خارج نمیکنه

# include <iostream>
# include <conio.h>
using namespace std;
int mabna(int i);
int main()
{int i,c,num,s;
cout<<" please enter name:";
cin>>i;
c=mabna(i);
cout<<c;getch();}
int mabna (int i){int s,num,k;
for (int k = i; k > 0; k = k/10)
{
s = k%2 ;
cout<<s;
return s;
}
}
مثلا برای ورودی 4 باید بده 001 اما میده 00
خود برنامه رو بصورت بدون تابع دارم که مشکلی نداره اما این رو گیر میده هر کاری کردم نشد ممنون میمش راهنمایی کنید
که تابع من چرا اینجوری کار می کنه

این برنامه بدون تابع هست


# include <iostream>
# include <conio.h>
using namespace std;
void main()
{int i,num,sir;
cout<<" please enter name:";
cin>>num;
for (int i = num; i > 0; i = i/2)
{
sir = i%2 ;
cout<<sir;
}getch();
}

Salar Ashgi
جمعه 13 فروردین 1389, 10:27 صبح
از تابع بازگشتی زیر استفاده کنید :



#include <iostream>
#include <conio>
void binary(int n){
if(n<2)
cout<<n;
else{
binary(n/2);
cout<<n%2;}
}
//======================
int main(){
int n;
cout<<"Enter a number :\n";
cin>>n;
cout<<"Binary : ";
binary(n);
cout<<endl;
getch();
}


موفق باشید .

hercool
شنبه 14 فروردین 1389, 07:37 صبح
مرسی از لطفت
اما می خوام بدونم کجای تابع نویسی من ایراد داره تا تو بقیه رفعش کنم
من همیشه تو تابع نویسی دچار سر باری می شم و عددم از حد خارج میشه
ممنون میشم راهنمایی کنید

amin1softco
شنبه 14 فروردین 1389, 09:10 صبح
مشکل از پایه است والا قدیما که ما عدد رو می بردیم به مبنای 2 تقسیم بر خود 2 می کردیم نه تقسیم بر 10 و باقی مانده رو بر اساس اون بدست می آوردیم شما تقسیم بر 10 کردی باقی مانده رو بر اساس 2 بدست آوردی خوب معلومه دیگه که اشتباهه این میشه تصحیحش


# include <iostream>
# include <conio.h>
using namespace std;
int mabna(int);
int main()
{int i,c,num,s;
cout<<" please enter name:";
cin>>i;
c=mabna(i);

getch();
}
int mabna (int i){int s,num;
for (int k = i; k > 0; k = k/2)
{
s = k%2 ;
cout<<s;

}
return 0;
}

sadegh-hut
شنبه 14 فروردین 1389, 10:29 صبح
:متعجب::متعجب:
قبلا گفتم بازم می گم این برنامه ی شما فقط یکی یکی اعداد به دست اومده رو چاپ می کنه یعنی اگه یه روزی بخوای با ان اعداد کار کنی (مثلا یه عدد در مبنای 2 رو با یه عدد دیگه در مبنای 2 جمع کنی ) تو اصلا عددی نداری!!!!!!!!!
بهش فکر کن!

amin1softco
شنبه 14 فروردین 1389, 10:40 صبح
سوال گفته فقط چاپ کند در ضمن پست های قبلی من رو ببینی من این سوال رو به چهار روش گوناگون حل کردم و خودم می دونم این عدد برعکسه ولی هدف الان چیزه دیگه ایی هست...........

orkideh07
شنبه 14 فروردین 1389, 11:01 صبح
بالاخره متوجه شدی چرا با تابع مشکل داره ولی بدون اون نه ؟
یه نگاه بنداز به اینا:
در تعریف در بدنه تابع مبنا :


for (int k = i; k > 0; k = k/10 )
ولی در تعریف بدون تابع نوشتی :


for (int k = i; k > 0; k = k/2)

Salar Ashgi
شنبه 14 فروردین 1389, 18:02 عصر
دوستان یه نکته ظریفی تو محاسبه مبنا وجود داره ، اونم اینکه ما در محاسبه هر مبنایی ، مثلا

اینجا مبنای 2 ، با انجام تقسیمهای متوالی بر 2 ، عدد نهایی همیشه ، باقیمانده ها از

آخر به اول میباشند و فکر نکنم بشه تنها با for حلش کرد ؛ به همین دلیل من از تابع بازگشتی

استفاده کردم چون از ساختار stack استفاده میکنه .

پس اگه از تابع بازگشتی استفاده نکنیم بهتره از یه ساختار داده ای هم استفاده بشه برای

درج کردن هر بار باقیمانده بر 2 ، که در آخر باید reverse بشه .

یه مثال با vector ها :



#include <iostream>
#include <conio>
#include <vector>
using namespace std;
//===================
void binary(int n){
vector<int> v;
while(n!=0){
v.push_back(n%2);
n/=2;}
for(int i=v.size()-1;i>=0;i--)
cout<<v[i];
cout<<endl;
}
//====================
int main(){
int n;
cout<<"Enter a number : \n";
cin>>n;
binary(n);
getch();
}

ebrahim1988
پنج شنبه 19 فروردین 1389, 21:34 عصر
سلام
اكه ميشه كد من رو هم ببينيد
فكر كنم جواب رو كاملا درست بده
درسته؟

#include<conio.h>
#include<iostream.h>
int mabna(int n)
{

int temp=0,remain;
while(n!=0)
{
remain=n%2;
temp=temp*10+remain;
n=n/2;
}
cout<<temp;
return 0;
}
main()
{
clrscr();
int n;

cout<<"lotfan adad ra vared konid: ";
cin>>n;

mabna(n);
getch();
}

amin1softco
پنج شنبه 19 فروردین 1389, 22:02 عصر
جالبه اینم یک راهی برای خودش :چشمک: فکر کنم الان 7-8 تا راه برای این کار وجود داشته باشه یکی از یکی جالب تر