View Full Version : راهنمای در مورد یک قسمت از برنامه
black_shadow
جمعه 04 اردیبهشت 1394, 09:12 صبح
سلام من این کدو نوشتم
نمیدونم چرا تو قسمت ضرب اعشار(for) درست کار نمیکنه و همش 0 نشون میده اگه میشه یه راهنمای بکنید
#include<iostream>
#include<stdio.h>
#include<conio.h>
using namespace std;
int makos(int n);
int main (){
double a,c;
int b,result=0,d=1,temp;
std::cout<<"please enter float number:: \n";
std::cin>>a;
b=a;
c=a-b;
temp=b;
cout<<"INTEGER::\n"<<b<<"\n";
cout<<"float::\n"<<c<<"\n";
///////////////////////////////
while(temp%2==0){
d*=10;
temp/=10;
}
///cde baraye tabdil adade sahih be mabna2
while(b>=2)
{
result=result*10+b%2;
b/=2;
}
result=result*10+b;
cout<<"adade integer:"<<'\t'<<"\n"<<result*d<<"\n";
/////////////////////////////////
for ( int i = 0; i <= 5; i++ ){
if(b*2>1 ){
/////////////////
a = b*2;
////////////////
b=a-int(a);
cout<<"adade float::\n"<<b<<"\n";
}
if(b*2<1){
/////////////
b = b*2;
/////////////
cout<<"adade float::\n"<<b<<"\n";
}
}
getch ();
return 0;
}
int makos(int n)
{
int sum=0;
while(n!=0)
{
sum=sum*10+n%10;
n/=10;
}
return sum;
}
black_shadow
جمعه 04 اردیبهشت 1394, 12:12 عصر
کسی نیست کمکم کنه
raminlich
جمعه 04 اردیبهشت 1394, 15:32 عصر
کسی نیست کمکم کنه
میشه یه توضیحی درباره برنامه تون بدین که این برنامه هدف چیه؟
black_shadow
جمعه 04 اردیبهشت 1394, 20:47 عصر
داداش این برنامه میاد یه عدد اعشار از کاربر میگیره و میبره به مبنا 2 اون عدد رو
من اومدم اعشار رو از هم جدا کردم قسمت صحیح رو میتونم به مبنا ببرم ولی قسمت اعشار که میمونه باید اونو ضرب 2 کنم و قسمت صحیح حاصل رو چاپ کنم
مثلا عدد 97.34 رو به همین برنامه بده قسمت اول که 97 هست رو انجام میده و مبناش میشه 1100001
ولی قسمت دوم که .34 هست رو باید ضرب 2 کنه 5بار
که به این صورت میشه
.34*2=0.68
که باید 0رو برداره
0.68*2=1.36
که 1 رو بر میداره
.36*2=0.72
که 0رو بر میداره
.72*2=1.44
1رو بر میداره
.44*2=0.88
0رو بر میداره
ولی من تو قسمت حلفه for که باید این عمل انجام بشه اشتباه کردم و جواب همش یا 0 یا 1 میشه در صورتی که باید بشه 01010
حالا میخواستم اونو واسم تصحیح کنین
raminlich
جمعه 04 اردیبهشت 1394, 22:20 عصر
داداش این برنامه میاد یه عدد اعشار از کاربر میگیره و میبره به مبنا 2 اون عدد رو
من اومدم اعشار رو از هم جدا کردم قسمت صحیح رو میتونم به مبنا ببرم ولی قسمت اعشار که میمونه باید اونو ضرب 2 کنم و قسمت صحیح حاصل رو چاپ کنم
مثلا عدد 97.34 رو به همین برنامه بده قسمت اول که 97 هست رو انجام میده و مبناش میشه 1100001
ولی قسمت دوم که .34 هست رو باید ضرب 2 کنه 5بار
که به این صورت میشه
.34*2=0.68
که باید 0رو برداره
0.68*2=1.36
که 1 رو بر میداره
.36*2=0.72
که 0رو بر میداره
.72*2=1.44
1رو بر میداره
.44*2=0.88
0رو بر میداره
ولی من تو قسمت حلفه for که باید این عمل انجام بشه اشتباه کردم و جواب همش یا 0 یا 1 میشه در صورتی که باید بشه 01010
حالا میخواستم اونو واسم تصحیح کنین
سلام
من چون از قدیم تو اینجور مسله ها مشکل داشتم نمی تونم کدتو تغیر بدم ولی یه کمکی می تونم بت بکنم.
لان که می بینم متغیر b وقتی وارد حلقه for میشه مقدارش 1 هست! b باید چه مقداری باشه وقتی وارد میشه؟
و بعد از این خط کد
b=a-int(a);
مقدار b به صفر تغیر پیدا می کنه به همین دلیله جوابی که می گیرید همیشه 0 یا 1.
اگر کدو خودت نوشته باشی می تونی تصحیحش کنی.
یک چیز دیگه اون تابع معکوس کارش چیه گذاشتی؟ کاملا خنثی عمل میکنه و هیچ دخالتی در برنامت نداره چون فرا خوانی نکردیش.
خودت امتحان کن :
تابع معکوس رو کامل پاک کن ببین چی میشه.
موفق باشد
black_shadow
جمعه 04 اردیبهشت 1394, 22:49 عصر
سلام
من چون از قدیم تو اینجور مسله ها مشکل داشتم نمی تونم کدتو تغیر بدم ولی یه کمکی می تونم بت بکنم.
لان که می بینم متغیر b وقتی وارد حلقه for میشه مقدارش 1 هست! b باید چه مقداری باشه وقتی وارد میشه؟
و بعد از این خط کد
b=a-int(a);
مقدار b به صفر تغیر پیدا می کنه به همین دلیله جوابی که می گیرید همیشه 0 یا 1.
اگر کدو خودت نوشته باشی می تونی تصحیحش کنی.
یک چیز دیگه اون تابع معکوس کارش چیه گذاشتی؟ کاملا خنثی عمل میکنه و هیچ دخالتی در برنامت نداره چون فرا خوانی نکردیش.
خودت امتحان کن :
تابع معکوس رو کامل پاک کن ببین چی میشه.
موفق باشد
داداشبا راهنمای دوستان نوشتم
داداش وقتی ذ وارد میشه باید 0 باشه که بتونه مقدار جدید بگیره
raminlich
جمعه 04 اردیبهشت 1394, 23:02 عصر
شما اومدین b رو با مقدار 0 وارد a کردین بعد امدین با همون مقدار توی a یه عملیاتی انجام دادین دوباره همون مقدارو ( 0 ) رو ریختین تو b انتظار دارین چه جوابی به غیر از 0 بده؟
black_shadow
جمعه 04 اردیبهشت 1394, 23:33 عصر
داداش انقد رو این فک کردم دیگه مغز نداشتم نمیکشه خودت بگو چی بذارم چی نذارم راحتم کن
amirtork
شنبه 05 اردیبهشت 1394, 15:39 عصر
#include <iostream>
using namespace std;
int main()
{
double num;
cin>>num;
num = num - (int)num;
//cout<<"Debug -> "<<num<<endl;
for(int i = 0 ; i < 5 ; i++)
{
cout<<(int)(num*2)<<endl;
num *= 2;
num = num - (int)num;
}
return 0;
}
این چیزی بود که فکر کنم لازم داری، چک کن، اگر جاییش اشتباه بود و اون چیزی نبود که لازم داری، یه توضیح بده دوباره، ببینیم چه میشه کرد!
black_shadow
شنبه 05 اردیبهشت 1394, 15:45 عصر
داداش درست کار میکنه ولی مشکلم تو همون فور بود که عدد صحیح رو نمیتونه جدا کنه
شما همین برنامه رو خودت تست کن و .34 رو بهش بدین ببنین چه جوابی میگیرین
c0mmander
شنبه 05 اردیبهشت 1394, 16:31 عصر
عزیز من خیلی وقته که دیگه سی کار نکردم اما با توجه به کد شما باید همیشه 0 رو برگردونه چون ممیز شما c هست نه b من کد رو تست نکردم اما فکر نمیکنم مشکل از جای دیگه باشه
ویرایش:
کدت رو تست کردم همون طور که گفتم مشکلش همون C بود:
for ( int i = 0; i <= 5; i++ ){
if(c*2>1 )
{
/////////////////
c = c*2;
////////////////
b=c;
cout<<"adade float::\n"<<b <<"\t"<<c<<"\n";
c=c-b;
}
else
if(c*2<1){
/////////////
c = c*2;
/////////////
b=0;
cout<<"adade float::\n"<<b <<"\t"<<c<<"\n";
}
}
توضیح:
با توجه به الگوریتمی که باید سورس کد عمل میکرد(حالا میخواد روش درست باشه یا غلط ) یعنی:
مثلا عدد 97.34 رو به همین برنامه بده قسمت اول که 97 هست رو انجام میده و مبناش میشه 1100001
ولی قسمت دوم که .34 هست رو باید ضرب 2 کنه 5بار
که به این صورت میشه
.34*2=0.68
که باید 0رو برداره
0.68*2=1.36
که 1 رو بر میداره
.36*2=0.72
که 0رو بر میداره
.72*2=1.44
1رو بر میداره
.44*2=0.88
0رو بر میداره
باید عدد اعشاری در دو ضرب قسمت صحیح عدد خارج و چاپ این کار باید در 5 بار تکرار بشه.
خوب داخل کدی که شما نوشتید حلقه ای که 5 بار وظیفه تکرار رو داشت یعنی این کد:
for ( int i = 0; i <= 5; i++ ){
if(b*2>1 ){
/////////////////
a = b*2;
////////////////
b=a-int(a);
cout<<"adade float::\n"<<b<<"\n";
}
if(b*2<1){
/////////////
b = b*2;
/////////////
cout<<"adade float::\n"<<b<<"\n";
}
}
متغییر b که یک عدد صحیح هست در دو ضرب میشد!! این اشتباه بود چون باید قسمت اعشاری عدد اصلی (دریافتی از کاربر) در 2 ضرب میشد (شما این عدد رو در متغییر C در بالا نگهداری میکردید) و بررسی ها بر اساس اون انجام میشد. پس کد های : a = b*2 و b=a-int(a با توجه به الگوریتم اصلی کار بلا استفاده ای بود چون B عدد صحیح در 2 ضرب در a ذخیره و مجددا a که حاصل عدد صحیح بود از خودش کم و جواب 0 خروجی صادر میشد.
این در مورد شرط دوم هم هست که فکر کنم خودت توضیحش رو فهمیدی...
روش صحیح (با توجه به الگوریتم) : c که عدد اعشاری عدد اصلی (دریافتی از کاربر) بود در دو ضرب و مقایسه بزرگتر شدن از 1 انجام میشه که حاصل این ضرب یک عدد اعشاری است نه عدد صحیح. در C++ بصورت ضمنی تبدیل های اعشاری به صحیح انجام میشه پس با ریختن متغییر اعشاری C به متغییر صحیح b قسمت صحیح از اعشاری جدا میشه.
در نهایت b چاپ و c=c-b مقدار صیحی رو از c کم میکنه تا c اماده محاسبه در بخش بعدی بشه.
در شرط دوم هم وقتی کمتر از صفر باشه پس خروجی همواره صفره پس تنها یک ضرب در 2 برای تکمیل الگوریتم کافیه.
//-----------------------------------------------------------------
black_shadow
شنبه 05 اردیبهشت 1394, 16:51 عصر
#include<iostream>
#include<stdio.h>
#include<conio.h>
using namespace std;
int makos(int n);
int main (){
double a,c;
int b,result=0,d=1,temp;
std::cout<<"please enter float number:: \n";
std::cin>>a;
b=a;
c=a-b;
temp=b;
cout<<"INTEGER::\n"<<b<<"\n";
cout<<"float::\n"<<c<<"\n";
///////////////////////////////
while(temp%2==0){
d*=10;
temp/=10;
}
///cde baraye tabdil adade sahih be mabna2
while(b>=2)
{
result=result*10+b%2;
b/=2;
}
result=result*10+b;
cout<<"adade integer:"<<'\t'<<"\n"<<result*d<<"\n";
/////////////////////////////////
for(int i = 0 ; i < 5 ; i++)
{
cout<<"\n"<<(int)(a*2)<<endl<<"\n";
a *= 2;
a = a - (int)a;
}
getch ();
return 0;
}
همه چیزش درسته ولی قسمت اولو اشتبا محاسبه میکنه که باید به جای 194 عدد 0 میومد
http://8pic.ir/images/88phngfaw95emzvc8owb.jpg (http://8pic.ir/)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.