سلام به همگی
من یه سوال برنامه نویسی با زبان ++C دارم کسایی که میتونن کمکم کنن لطفا اعلام کنن
سلام به همگی
من یه سوال برنامه نویسی با زبان ++C دارم کسایی که میتونن کمکم کنن لطفا اعلام کنن
ویرایش توسط sasaa : 07 دی 1396 در ساعت 19:51
سلام ، در رابطه با سوالتون ، ببینید من الان برنامه ای براتون نوشتم که در آن از یک کلاس استفاده شده و تمام عملگر هایی (operators) که گفتین در آن به کار رفته. از عملگر << برای خواندن فایل متنی (txt.) استفاده می کنه و از عملگر >> که گفتین برای نوشتن جمع و ضرب دو عدد حقیقی در فایل استفاده می کنه. همچنین با به کار بردن عملگر های + و * هم جمع و ضرب رو انجام می ده. یعنی تمام کار های عملیاتی رو انجام می ده.
ولی به نظر من بخش سخت سوالتون همون خط آخره که بیان کرده : " از یک آرایه برای نگهداری ارقام و دو متغیر برای مشخص کردن موقعیت اعشار و علامت عدد"
خوب برای پیاده سازی این خواسته ی سوال باید بر روی بیت هایی که وظیفه ی ذخیره کردن عدد اعشاری را دارند به خوبی مسلط بود. بیت های "علامت" ، "علامتِ نما" ، "نما" و "مانتیس" . ولی من شناخت کافی از این بیت ها ندارم به خاطر همین نتونستم متغیر ها رو در قالب آرایه بنویسم. روش فکر کردم به راه حل هایی رسیدم ولی متاسفانه بر روی کامپیوتر من فعلا هیچ کامپایلری نصب نیست(پاکشون کردم) که بخوام این راه حل هایی رو که به ذهنم رسیده امتحان کنم. ( البته این برنامه ای که براتون نوشتم رو با یک کامپایلر آنلاین تست کردم درسته ، ولی امکانات خیلی پیشرفته ای نداره.)
این لینک برنامه ای است که در کامپایلر آنلاین نوشتم : http://cpp.sh/2drg3
( یه توضیح : اون ()getch_ رو که آخر تابع main نوشتم باعث می شه که برنامه در آخر منتظر زدن یه کلید مثلا enter بشه و بعد که دکمه رو زدین به پایان برسه. احیاناً کتابخانه ی conio.h رو اگر کامپایلرتون قدیمی بود نداشت می تونین از کد برنامه حذفش کنین. البته کامپایلر های امروزی همشون دارن.)
این راه حلی ای که من برای اون بخش آخر سوال دارم :
هر عدد اعشاری رو ( یا هر عدد حقیقی) رو می شه به این شکل نوشت : a x 2^b
که a یک عدد اعشاری بزرگتر مساوی 1 و کوچکتر از 2 است که بهش مانتیس می گن. b هم یک عدد صحیحه که بهش نما می گن.
مثلا اگر بخواهیم عدد 40 رو به این شکل بنویسیم می شه : 5^2 * 1.25 = 40 ( که a = 1.25 بعد b = 5 ) بعد اگر بخواهیم این عدد رو در متغیر با نوع float ذخیره کنیم بیت هاش این جوری می شه : 010001001000000000000000000000
بعد از چپ به راست :
اولین بیت (0) بیت علامته چون 40 مثبته صفر شده اگه منفی بود یک می شد.
دومین بیت (1) بیت علامتِ نما است و اینجوری تعیین می شه : چون b-1 = 4 مثبت شده پس بیت علامت 1 می شه. اگر منفی بود صفر می شد. ( درست برعکس بیت علامت)
هفت تا بیت بعدی بیت های نما هستند که در مبنای دو می شن : 100 ( 0000100 )
بقیه ی بیت ها هم بیت های مانتیس هستن. (که اصلا ازشون سر در نمی آرم!! نمی دونم چه جوری به دست میان!!)
حالا به نظر من باید از روی بیت های عدد ، موقعیت اعشار و علامت عدد رو در متغیر ها ذخیره کرد. مثلا برای علامت عدد از یک متغیر با نوع bool استفاده کرد بعد یه if گذاشت که اگر بیت علامت عدد صفر بود مقدار متغیر با نوع bool بشه 1 و یعنی عدد مثبته در غیر اینصورت اگر بیت علامت یک بود مقدار bool بشه صفر.
------------------------------------------
ویرایش :
با این تابع می تونین بیت های یک متغیر را بدست بیارین : http://cpp.sh/9xq2t
این جوری ازش استفاده کنین مثلا : ;(float a = 40.5; Byte(a
بعد خودش بیت ها رو چاپ می کنه.
ویرایش توسط hopluk : 08 دی 1396 در ساعت 04:51
سلام.(فکرم عوض شد) خیر به نظر من بهتر است از دو تابع ()singbit و ()modf که در کتابخانه ی math.h قرار دارند استفاده کنیم ، که اولی علامت عدد را بر می گرداند و دومی بخش صحیح و بخش اعشاری عدد را جدا می کند. ( آره اول نظر من این بود اعداد رو ببریمشون در مبنای 2 بعد با بیت های علامت و مانتیس کار کنیم ولی این کار سخت می شه و از قبل طراحان سی پلاس پلاس این کارها را با بیت ها انجام دادن و به صورت توابع نوشتن. دیگر نیازی نیست برنامه نویس خیلی خودش رو درگیر بیت ها کنه هر چند روش اصولی همون روش کار با بیت هاست.)
براتون دو تا مثال نوشتم :
این لینک روش کار با تابع ()signbit رو نشونتون می ده (علامت عدد اعشار) : C++ Shell
این لینک روش کار با تابع ()modf رو نشونتون می ده (مقدار اعشار) : C++ Shell
دیگه فکر کنم سوالتون حل شد. کافیه این دو تا تابع رو در کلاسی که براتون نوشتم اضافه کنین و بعد از اون ها در << operator که فایل رو می خونه استفاده کنین تا علامت عدد و مقدار اعشار رو بلافاصله در دو متغیر bool و float(یا double) ذخیره کنه.
ویرایش توسط hopluk : 08 دی 1396 در ساعت 18:08
ویرایش توسط S.N.M19 : 09 دی 1396 در ساعت 00:01
صورت سوال گفته که یک متغیر برای مشخص کردن موقعیت اعشار بعد شما در خط آخر گفتین که 324456 رو از فایل بخونه خروجی بده : 0.324456+ ؟ خوب اینکه اعشار زدن عدده موقعیت اعشار رو نشون نمی ده!
به هر حال اینی که پرسیدین خیلی آسونه یه کم ریاضی نیاز داره. براتون نوشتم : C++ Shell
(برنامه ای که به عنوان مثال برای تابع modf براتون نوشته بودم اگر بهش برای مثال عدد 3.141592 رو بدین در یک متغیر به نام fractional اون بخش 0.141592 رو ذخیره می کنه.)
در مورد اون بخش سوالتون که راجع به "نشون دادن(؟ ذخیره کردن؟) مقدار (؟) علامت در آرایه" بود ، کلا یه دونه علامت مثبت یا منفی رو می خواین در آرایه نشون بدین ؟ یه دونه متغیر با نوع bool کافیه.
اگر هم منظورتون اینه که : کل عدد رو که تک تک ارقامش رو در یک آرایه ذخیره کردین و بعد می خواین به اون علامت عدد دسترسی داشته باشین، شما اول باید با استفاده از تابع ()signbit علامت عدد رو در اولین آفست(یا اندیس) آرایه ذخیره کنین و بعد هر موقع خواستین از روی اولین اندیس بتونین بفهمین که عدد مثبت است یا منفی. مثلا یه آرایه از نوع double دارین با استفاده از ()signbit علامت عدد رو بدست بیارین بعد مثلا اگر منفی بود در اولین اندیس (اندیس صفر) عدد 1 در غیر اینصورت عدد 0 ذخیره کنین. بعد با یه if شرط بذارین که اگر اولین اندیس اون آرایه برابر 1 بود عدد منفی و صفر بود عدد مثبته. بعد از اندیس های بعدی(اندیس یک به بعد) آرایه برای ذخیره ی بقیه ی عدد استفاده کنین.
ببخشید که ازتون انقدر سوال میکنم این پروژه خیلی واسم مهمه
ببینین الان من میخوام برنامم اینجوری اجرا بشه:
مثلا کاربر تو فایل وارد کنه 8127_ 1_ -1 (الف و 94328 _ -2 _ 1 (ب(این خط فاصله ها رو میخواستم بین اعدادم فاصله بندازم که نشد)
که 1 و -2 برای موقعیت اعشارند و -1 و 1 برای علامت عددند
اون وقت خروجی فایل ما قسمت های الف و ب رو به شکل زیر نمایش میده
قسمت الف) 8.127- قسمت ب)0.0094328
که در قسمت الف -1 برای علامت منفی و 1 برای موقعیت اعشاره که اعشار رو یه رقم به سمت راست میبره
و در قسمت ب 1 برای علامت مثبت و -2 برای موقعیت اعشاره که اعشار رو 2 رقم به سمت چپ میبره
حالا میخوایم قسمت الف و ب رو از فایل بخونه و جمع و ضرب کنه
من 324456 رو مثال زدم منظورم این نبود که حتما 0.324456+ رو چاپ کنه
امیدوارم متوجه منظورم شده باشید
بازم ممنون و ببخشید
خواهش می کنم.
الان در مثالی که زدین اعشار رو 7 رقم به چپ برده نه دو رقم! 94328.0 => اگر دو رقم به سمت چپ بره که می شه : 943.28
منظورتون اینه در فایل به ترتیب از چپ به راست بخونه 94328 2- 1 (به ازای اون 1 عدد رو مثبت کنه، به ازای اون 2- دو رقم اعشار رو بیاره چپ 943.28)
پس اگر در فایل این بود 8127 1 1- خروجی می شه : 81270- (به ازای اون 1- اولی عدد منفی شد و به ازای اون 1 یک رقم اعشار رفت راست)
درست فهمیدم ؟
(پ.ن. این الان کلاً یه سوال متفاوت با اون چیزی شد که از من پرسیده بودین.)
----------------------------------------------------
ویرایش :
اگر منظورتون اون چیزی بود که من بیان کردم ، بر همین اساس این برنامه رو نوشتم : http://cpp.sh/8ew5r
برنامه ای که نوشتم الان همین کاری رو می کنه که شما گفتین.
ویرایش توسط hopluk : 09 دی 1396 در ساعت 23:17
در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربر و 1 مهمان)