PDA

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



adineh67
یک شنبه 24 خرداد 1394, 17:23 عصر
سلام
دوستان من باید تعدادی رشته ی بیتی تصادفی که دارای فرمت اعشاری هست رو تولید کنم.چیزی شبیه: 110.0101
رشته ای مثل 100110 رو براحتی با تابع رندوم و نوع داده ی اینتیجر تولید کردم ولی رشته با فرمت اعشاریو نمیدونم چطور باید ایجاد کنم
ممنون میشم راهنمایی بفرمایید

rahnema1
یک شنبه 24 خرداد 1394, 20:05 عصر
سلام
شما همون رشته ای که قبلا تولید کردید به طور تصادفی در قسمتی از رشته کاراکتر '.' را قرار بدید

ehsan_faal
یک شنبه 24 خرداد 1394, 20:59 عصر
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <cstring>
using namespace std;
char *GenerateRandomString(char *);
int main()
{
int Length=6;
char BinaryString[Length+1];
for(int i=0;i<Length;i++)
BinaryString[i]='n';
BinaryString[Length]=0;
cout<<GenerateRandomString(BinaryString)<<endl;
return 0;
}
char* GenerateRandomString(char *input)
{
int Length=strlen(input);
srand(time(0));
int PointPlace=1+rand()%(Length-2);
char *inputHolder=input;
while(*input!=0)
{
if(input==(inputHolder+PointPlace))
{
*input='.';
}else{
*input=((rand()%2)?'1':'0');
}
input++;
}
return inputHolder;
}

amirtork
یک شنبه 24 خرداد 1394, 21:03 عصر
#include<iostream> #include<stdlib.h> #include<time.h> #include<cstring> usingnamespacestd; char*GenerateRandomString(char*); intmain() { intLength=30; charBinaryString[Length+1]; for(inti=0;i<Length;i++) BinaryString[i]='n'; BinaryString[Length]=0; cout<<GenerateRandomString(BinaryString)<<endl; } char*GenerateRandomString(char*input) { intLength=strlen(input); srand(time(0)); intPointPlace=1+rand()%(Length-1); char*inputHolder=input; while(*input) { if(input==(inputHolder+PointPlace)) { *input='.'; input++; }else{ *input=((rand()%2)?'1':'0'); input++; } } returninputHolder; }

کد ناخوانا هست.
اگر امکانش هست تصحیح کنید.
(end-line ها نمایش داده نمیشه.)

adineh67
دوشنبه 25 خرداد 1394, 14:12 عصر
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <cstring>
using namespace std;
char *GenerateRandomString(char *);
int main()
{
int Length=6;
char BinaryString[Length+1];
for(int i=0;i<Length;i++)
BinaryString[i]='n';
BinaryString[Length]=0;
cout<<GenerateRandomString(BinaryString)<<endl;
return 0;
}
char* GenerateRandomString(char *input)
{
int Length=strlen(input);
srand(time(0));
int PointPlace=1+rand()%(Length-2);
char *inputHolder=input;
while(*input!=0)
{
if(input==(inputHolder+PointPlace))
{
*input='.';
}else{
*input=((rand()%2)?'1':'0');
}
input++;
}
return inputHolder;
}


دوست عزیز لطف میکنین یه توضیحی در مورد کد بدین؟

ehsan_faal
دوشنبه 25 خرداد 1394, 17:02 عصر
شما اول مشخص میکنید که رشته نهاییتون قراره چه طولی داشته باشه(طول اعداد + نقطه) بعدیک آرایه از کاراکترها رو به اندازه طولی که خودتون مشخص کردید ایجاد میکنید و بهش یه مقدار اولیه ای میدید تا یه وقت کاراکتر پوچ غیر از آخرین خونه جای دیگه ای ظاهر نشده باشه.
بعد آخرین خونه رو برابر کاراکتر پوچ قرار میدید و الان تابع رو صدا میزنید.
توی این تابع اول طول رشته رو لازم دارید که با strlen به دستش آوردیم(تعداد کاراکترهای قبل از کاراکتر پوچ رو میده و واسه همین روی مقدار دهی اولیه رشته تاکید کردیم)
بعد واسه اینکه اعداد رندومی که قصد تولیدش رو دارید از srand استفاده میکنید و زمان جاری سیستم رو به عنوان پارامتر ورودی بهش میدید.
محل قرار گیری نقطه رو با استفاده از rand توی رنج خونه با اندیس یک تا خونه یکی مونده به آخر تعیین میکنید.
آدرس شروع رشته رو توی inputHolder نگه میدارید(بعدا لازم میشه)
حالا یه دور توی رشته میچرخید و اگه اشاره گر ی که هی داره زیاد میشه تا کل رشته رو پیمایش کنه برابر با مقدار اولش + محل قرار گیری نقطه شده بود پس اونجا یه نقطه قرار میدید اگه نشده بود باز با استفاده از rand یا '0' یا '1' قرار میدید. در آخر هم اشاره گری که گفته بودم بعدا لازم میشه رو برمیگردونید.

adineh67
دوشنبه 25 خرداد 1394, 22:52 عصر
دوست عزیز rahnema1 (http://barnamenevis.org/member.php?305905-rahnema1) این کارو انجام دادم یه رشته ی 5 بیتی تعریف کردم و بیت سوم اونرو "." گذاشتم به این شکل "10.11" بعد اومدم قسمت اعشار و قسمت صحیحشو بصورت جداگانه به مبنای ده بردم حالا موندم این دو قسمت رو چجوری تو یه متغیر اعشاری بگنجونم.
در حال حاضر یه متغیر اینتیجر (قسمت صحیح) دارم با مقدار 2 و یه متغیر اینتیجر(قسمت اعشاری) با مقدار 0.75 نمیدونم چجوری به شکل 2.75 در قالب یه عدد اعشاری ذخیرش کنم.
ممنون میشم راهنمایی بفرمایید.

Mahdi.lpr
دوشنبه 25 خرداد 1394, 23:32 عصر
دوست عزیز rahnema1 (http://barnamenevis.org/member.php?305905-rahnema1) این کارو انجام دادم یه رشته ی 5 بیتی تعریف کردم و بیت سوم اونرو "." گذاشتم به این شکل "10.11" بعد اومدم قسمت اعشار و قسمت صحیحشو بصورت جداگانه به مبنای ده بردم حالا موندم این دو قسمت رو چجوری تو یه متغیر اعشاری بگنجونم.
در حال حاضر یه متغیر اینتیجر (قسمت صحیح) دارم با مقدار 2 و یه متغیر اینتیجر(قسمت اعشاری) با مقدار 0.75 نمیدونم چجوری به شکل 2.75 در قالب یه عدد اعشاری ذخیرش کنم.
ممنون میشم راهنمایی بفرمایید.

سلام
معمولا اعدادت با چند رقم اعشار هست ؟!
باsetprecision (http://www.cplusplus.com/reference/iomanip/setprecision/) دقت اعدادت رو مشخص کن
بعدش میتونی با هم جمعشون کنی دیگه
مثلا عدد 2 با 0.75 که گفتی با دقت 2 رقم اعشار، به این صورت با هم جمع میشن
2.75 = 0.75 + 2.00
[چیز ساده ای بود !شاید هم من دقیق سوالت رو متوجه نشده باشم !! ]

rahnema1
دوشنبه 25 خرداد 1394, 23:36 عصر
خب الان می خواهید این دو تا را با هم جمع کنید؟ یا به صورت رشته چاپ کنید؟

#include <stdio.h>
int main()
{
float a = 2.75;
printf("%.2f", a);
}

یا

#include <stdio.h>
int main()
{
float a = 2.75;
char str[20] = {};
sprintf(str, "%.2f", a);
printf("%s", str);
}

adineh67
سه شنبه 26 خرداد 1394, 08:11 صبح
ممنون از همگی
فقط یه سوال میپرسم به عنوان سوال آخر
رشته ای مثل 101.01 رو چطوری باید چاپ کنم؟
من به این شکل چاپش کردم اما به جای نمایش کراکتر"." کداسکی اونرو که 46 هست نمایش میده:


printf("\n popcurrent[%d]=%d%d%d%d%d%d", popcurrent[j].bit[5],popcurrent[j].bit[4],popcurrent[j].bit[3],popcurrent[j].bit[2],popcurrent[j].bit[1],popcurrent[j].bit[0])

rahnema1
سه شنبه 26 خرداد 1394, 08:35 صبح
popcurrent چیه و اعداد به چه صورت داخلش ذخیره شدند و متغیر bit هم بگید چیه
اگه bit از نوع int هست شاید بهتر بود به جای 0 و 1 کد اسکی اونها یعنی '0' و '1' ذخیره می شد و به جای d% از c% استفاده می کردید

char str[] = "101.01";
puts(str);
printf("%s\n", str);
printf(str);

adineh67
سه شنبه 26 خرداد 1394, 10:26 صبح
typedef struct str
{
char bit[6];
float fit;
}str;
str popcurrent[4];


یه استراکچر تعریف کردم که یه رشته ی شش بیتی و معادل اعشاری اون رشته رو برام نگه داره،popcurrent یک نمونه از استراکچر هست که 4 رشته ی 6بیتی و معادل اعشاریشونو نگهداری میکنه
حالا با این دستور میخوام یه رشته رو چاپ کنم که مشکلی که گفتم خدمتتون پیش میاد.




printf("\n popcurrent[%d]=%d%d%d%d%d%d", popcurrent[j].bit[5],popcurrent[j].bit[4],popcurrent[j].bit[3],popcurrent[j].bit[2],popcurrent[j].bit[1],popcurrent[j].bit[0])

rahnema1
سه شنبه 26 خرداد 1394, 11:02 صبح
همون طور که اشاره کردم بهتره 0 و 1 را هم به صورت '0' و '1' داخل آرایه bit بذارید


popcurrent[0].bit[0] = '1';
popcurrent[0].bit[1] = '0';
popcurrent[0].bit[2] = '1';
popcurrent[0].bit[3] = '0';
popcurrent[0].bit[4] = '.';
popcurrent[0].bit[5] = '1';
printf("%.6s\n", popcurrent[j].bit);

یعنی معادل اسکی اونها را بذارید
مثلا یک و صفر را بخواهیم به معادل اسکی تبدیل کنیم به این صورت:

popcurrent[j].bit[0] = 0 + '0';
popcurrent[j].bit[0] = 1 + '0';

adineh67
سه شنبه 26 خرداد 1394, 11:09 صبح
دوست عزیز این صفر و یکها با متغیر اینتیجر و بصورت تصادفی دارن ایجاد میشن چجوری به شکل '0' یا '1' داخل bitقرارشون بدم؟

rahnema1
سه شنبه 26 خرداد 1394, 11:13 صبح
تو پست قبلی اشاره کردم مثلا رندم هم باشه به صورت زیر

popcurrent[j].bit[0] = rand() % 2 + '0';
popcurrent[j].bit[0] = rand() % 2 + '0';