PDA

View Full Version : عدد اعشاری و برعکسش...



Warrior
یک شنبه 15 اردیبهشت 1387, 11:55 صبح
سلام به همه ی دوستان.من در ذهنم یک راه و ایده ی جالب دارم که از طریق آن می توان عدد اعشاری را برعکس نمود.ولی مشکلاتی دارم که در زیر آن ها را می نویسم و شما در حل آن ها به من کمک کنید.ممنون :
من می خواهم عددی مثل 12.23 را بر عکی کنم.ایده ی من این است که اول int عدد اعشاری را بگیرم(مثلا b = int(a) و بعد از آن عدد غیر اعشاری را از عدد اعشاری کم کنم تا فقط عدد اعشاری باقی بماند.ولی وقتی این کار را می کنم قسمت اعشاری به صورت منفی در می آید.
لطفا من را برای مثبت کردن قسمت اعشاری راهنمایی کنید تا اگر برای نوشتن خود برنامه مشکلی داشتم باز هم از شما دوستان گرامی بپرسم.
این هم نمونه ی برنامه :

#include <iostream>
#include <conio.h>
int main()
{
float a,d;
int b;
std::cin>>a;
b = int(a);
d = b - a;
std::cout<<d;
getch();
return 0;
}فقط هر چه زودتر من را راهنمایی کنید چون خیلی وقت است گیر این مشکل هستم و برای برعکش کردن عدد اعشاری در حال تمرین کردن راه های متعدد هستم(راهی غیر تبدیل کردن به رشته و استفاده از تابع ها).
باز هم ممنون

A_Salimi
یک شنبه 15 اردیبهشت 1387, 16:02 عصر
شما باید بنویسید d=a-b به همین خاطر خروجی منفی دارید .

Warrior
یک شنبه 15 اردیبهشت 1387, 16:10 عصر
من اشتباهی کرده بودم و حالا درستش کردم.کُد اشتباه بود.
این درستش است :

#include <iostream>
#include <conio.h>
int main()
{
float a,b,c,d;
int e,f,g,h;
std::cin>>a;
e = int(a);
b = a - e;
f =0;
do
{
c = b * 10;
f += 1;
}
while(?????);
getch();
return 0;
}
حالا من یک مشکل دیگر دارم و آن این است که برای شرط While چه چیزی باید ینویسم ؟
من می خواهم عدد اعشاری که در do گذاشتم تا آن را به صحیح تبدیل کند وقتی به صحیح تبدیل شد و دیگر اعشار نداشت از حلقه خارج شود.
متغیرها را هم از عمد زیاد گذاشتم چون در ادامه ی برنامه به آن ها نیاز پیدا خواهم کرد پس تعجب نکنید P:

pars.engineer
یک شنبه 15 اردیبهشت 1387, 16:19 عصر
تقريبا مي شه گفت الگوريتم استاندارد اين كار همين است كه شما كشفش كرده ايد(البته فكر كنم قبل از شما يه چند ميليون دانشجوي ديگر هم اين كشف رو داشته اند).
پاسخ سوال شما:
دليلش اينه كه شما به جاي اينكه a رو از b كم كنيد، b رو از a كم كرده ايد، و چون a از b بزرگتر است طبيعتا پاسخ منفي خواهد شد.
كد صحيح:



#include <iostream>
#include <conio.h>
int main()
{
float a,d;
int b;
std::cin>>a;
b = int(a);
d=a-b;
std::cout<<d;
getch();
return 0;
}


موفق باشيد.

Warrior
یک شنبه 15 اردیبهشت 1387, 16:55 عصر
من خودم متوحه شدم که چه کشف بزرگی کرده ام(lol) ولی جداً برای فهمیدن راه حل درست خیلی زمان گذاشتم چون می خواستم جواب این مسیله ام با بقیه ی دوستانم فرق داشته باشد و در ضمن درست و صحیح باشد.
از شوخی که بگذریم من می خواستم که کمک کنید که اشکال در قسمت While را حل کنم(یا حل کنید).اگر من متوجه شرط این حلقه شوم بقیه ی برنامه را به راحتی خواهم نوشت.

دست همه ی دوستان درد نکند (;

pars.engineer
یک شنبه 15 اردیبهشت 1387, 19:25 عصر
اگر براي متغيير ها از اسم با معني استفاده كنيد خيلي بهتر است.
در هر صورت اگر منظورتون رو درست فهميده باشم(كه حلقه do while را براي تبديل قسمت اعشاري به صحيح مي خواهيد استفاده كنيد) فكر كنم اگر قبل از حلقه متغيير c را برابر b قرار دهيد و كد را به به صورت زير تغيير دهيد مشكلتان حل شود:



#include <iostream>
#include <conio.h>
int main()
{
float a,b,c,d;
int e,f,g,h;
std::cin>>a;
e = int(a);
b = a - e;
f =0;
c=b;

do
{
c = c * 10;
f += 1;
} while(c!=(int)c);
getch();
return 0;
}


شرط while(c!=(int)c) تنها وقتي برقرار مي شود كه c فاقد قسمت اعشار باشد.
البته چون تازه سيستم عامل عوض كردم كامپايلر Cpp رو سيستمم نصب نبود تا چك كنم.

Warrior
یک شنبه 15 اردیبهشت 1387, 19:58 عصر
بله, منظور من را درست متوجه شدید.من جواب شما را تست کردم ولی اگر عددی مثل 0.3219 که قسمت صحیح ندارد زا وارد کنم کار می کند و قسمت اعشار را به صورت صحیح در می آورد ولی اگر عددی مثل 3.234 که قسمت صحیح هم دارد را وارد می کنیم عدد عجیبی را چاپ می کند.مشکلش هم عجیب است!
چرا مه ما در اوایل برنامه قسمت صحیح را جدا می کنیم و فقط با قسمت اعشار آن سر و کار داریم.
کسی می تواند بگوید مشکل در کجاست ؟

Warrior
یک شنبه 15 اردیبهشت 1387, 22:19 عصر
لطفا یکی از این همه متخصص و برنامه نویس خوب که اینجا هستند راهنمایی کنند!
من شدیداً به این شرطِ While نیاز دارم تا برنامه ام را امشب تست کنم و آن را کامل کنم ):

pars.engineer
دوشنبه 16 اردیبهشت 1387, 02:31 صبح
سلام خسته نباشد؛
آره شما درست مي گيد من هم تست كردم جواب درست نداد مثلا وقتي از 12.23 عدد 12 را كم مي كنيم حاصل به جاي 23. مي شود 22999999. كه همين مورد باعث مي شود ديگر نتوان از الگوريتم شما استفاده كرد، اول فكر كردم مشكل از كامپايلره ولي با C# در Visual studio 2008 هم برنامه رو نوشتم ولي همين مشكل دوباره تكرار شد.پس مشكل از ما هست و نه از كامپايلر (حتما دليلي داره كه من حتما اين موضوع را با چند نفر برنامه نويس Cدر ميان مي گذارم. )
ولي چون شما گفتيد كه برنامه رو فوري لازم داريد(البته فكر كنم يه كم دير شد چون الان ساعت 3 صبحه )، روش يه ذره فكر كردم و با يك الگوريتم ديگه حلش كردم.
بدين صورت كه اول عدد رو آنقدر در 10 ضرب مي كنيم تا قسمت اعشار كاملا از بين برود همچنين يك شمارنده Count داريم كه هر بار عدد در 10 ضرب مي شود به مقدار آن يكي اضافه مي شود.
يك متغيير ديگر به نام Div با مقدار اوليه 1 داريم كه به اندازه Count در 10 ضرب مي شود حالا براي بدست آوردن بخش صحيح، عدد كلي را تقسيم بر div مي كنيم و براي بدست آوردن قسمت اعشاري به صورت صحيح، باقيمانده عدد كلي را بر div بدست مي آوريم .
هركدام از اين اعداد را معكوس كرده و علاوه بر آن بخش اعشاري را بر div تقسيم مي كنيم.
در آخر هر دو بخش را با هم جمع مي كنيم.



#include <iostream.h>
#include <conio.h>
void main()
{
float num,endInvFltNum,newFltNum;
int count=0,div=1,p,intNum,invIntNum=0,fltNum,invFltNu m=0;
cout<<"\n Enter a float number: ";
cin>>num;
do
{
num=num*10;
++count;
}while(num!=(int)num);
for(int i=0;i<count;++i)
div*=10;
intNum=(int)num/div;// Acquire Integer part
while(intNum)
{
p=intNum%10;
invIntNum=invIntNum*10+p;
intNum/=10;
} // Inverse Of Integer Part
fltNum=(int)num%div; // Conver Float part to integer
while(fltNum)
{
p=fltNum%10;
invFltNum=invFltNum*10+p;
fltNum/=10;
} // Inverse Of Integer Part
endInvFltNum=(float)invFltNum/div;
newFltNum= invIntNum+endInvFltNum;
cout<<"\n Inverse Your Number is: "<<newFltNum;
cout<<"\n\n Press Any Key For Exit...";
getch();
}


در ضمن فايل اجرايي رو هم گذاشتم.
موفق باشيد.

farhadamin
دوشنبه 16 اردیبهشت 1387, 03:13 صبح
اینم من نوشتم البته به عنوان کمک نه همه برنامه را

#include <iostream>
#include <conio.h>
#include <cmath>

int main()
{
double a,b,c,d=10,g;
int e,f,h;

std::cin>>a;
h=(int)a;
e=(int)a;

int count1=0,count2=0;
double y=a;

while(e>0)
{
e/=10;
count1++;
}
std::cout<<"tedad sahih :"<<count1<<std::endl;

while(int(y)!=y)
{
y*=10;
count2++;
}
std::cout<<"tedad Ashar :"<<count2<<std::endl;


b = a - h;
g=pow(d,count2)*b;
f =0;
c=b;


std::cout<<"raghan sahih:"<<h<<std::endl<<"ragham ashar:"<<g;

_getch();
return 0;

}

موفق باشی

MRHagh
دوشنبه 16 اردیبهشت 1387, 09:09 صبح
بر عکس عدد اعشاری یعنی اینکه به ترتیبی عدد را معکوس کنید که انگار آنرا در یک آینه میبینید (نه اینکه قسمت صحیح را جدا معکوس کنید و قسمت اعشار را جدا ... !!! )
کد زیر کمکتون میکنه :

#include <stdio.h>
#include <conio.h>
#include <math.h>
void main(){
double num,counter=0, ivalue=0;
float FloatPart;
int IntPart, fvalue=0,ValueChecker;
printf("Enter num : ");
scanf("%lf",&num);
IntPart=floor(num);
FloatPart=num-IntPart;
while(1)
{
FloatPart*=10;
ValueChecker=ceil(FloatPart);
counter++;
if (ValueChecker-FloatPart<=0.1)
break;
}
while(IntPart)
{
ivalue=(ivalue*10)+(IntPart%10);
IntPart/=10;
}
while(ValueChecker)
{
fvalue=(fvalue*10)+(ValueChecker%10);
ValueChecker/=10;
}
counter*=-1;
ivalue*=pow(10,counter);
num=ivalue+fvalue;
printf("\nResult ---> %lf",num);
getch();
}
فایل اجرایی به همراه سورس , ضمیمه شده .
موفق باشید ...

Warrior
دوشنبه 16 اردیبهشت 1387, 09:24 صبح
آقا بازم دستت درد نکنه.
خیلی ممنون از کمکت.

pars.engineer
دوشنبه 16 اردیبهشت 1387, 15:34 عصر
سلام؛
دوست عزيز MRHagh مگه شما طراح سوال بوديد كه مي فرماييد منظور فلان چيزه يا چيز ديگري، بنا بر نظر طراح سوال، الگوريتم برنامه مي تونه به چندين شكل تغيير كنه كه يكي از اين الگوريتم ها (ي تقريبا سخت) برعكس سازي قسمت صحيح و اعشاري به صورت جداست.


(نه اینکه قسمت صحیح را جدا معکوس کنید و قسمت اعشار را جدا ... !!! )

پس استفاده از اعلائم تعجب (...!!!) در انتهاي سخنتون كمي عجيبه !!! (چون با توجه به پست هاي مفيدتون انتظارم از شما بيشتر از اينهاست)
در ضمن با يه تغيير كوچك در برنامه مي شود به گفته شما نيز رسيد(چرا كه نكته اصلي حل شده است).



#include <iostream.h>
#include <conio.h>
#include <math.h>
void main()
{
float num,endInvFltNum,newFltNum;
int count=0,div=1,div2=1,p,intNum,invIntNum=0;
int digit=0,invIntNum2,fltNum,invFltNum=0;
cout<<"\n Enter a float number: ";
cin>>num;
do
{
num=num*10;
++count;
}while(num!=(int)num);
for(int i=0;i<count;++i)
div*=10;
intNum=(int)num/div;// Acquire Integer part
while(intNum)
{
p=intNum%10;
invIntNum=invIntNum*10+p;
intNum/=10;
} // Inverse Of Integer Part
invIntNum2=invIntNum;
while(invIntNum2)
{
++digit;
invIntNum2/=10;
}
for(int i=digit;i>0;--i)
div2*=10;
endInvFltNum=(float)invIntNum/div2;
fltNum=(int)num%div; // Conver Float part to integer
while(fltNum)
{
p=fltNum%10;
invFltNum=invFltNum*10+p;
fltNum/=10;
} // Inverse Of Integer Part
newFltNum= invFltNum+endInvFltNum;
cout<<"\n Inverse Your Number is: "<<newFltNum;
cout<<"\n\n Press Any Key For Exit...";
getch();
}



در آخر هم عرض كنم كه گردن ما از مو باريك تره و هدف تنها كمك به دوستان (در حد بضاعت) همچنين كه دوستان من رو در تالارهاي ديگه راهنمايي مي كنند.
يا علي مدد.

MRHagh
دوشنبه 16 اردیبهشت 1387, 20:18 عصر
سط


در آخر هم عرض كنم كه گردن ما از مو باريك تره و هدف تنها كمك به دوستان (در حد بضاعت) همچنين كه دوستان من رو در تالارهاي ديگه راهنمايي مي كنند.


چه خوب ...


افتادگی آموز اگر طالب فیضی ... !


علی یارت !