الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استفسار حول cout.precision و cout.fill

بدأه khaled_prg في 18 أكتوبر 2010 · 10 رد · 460 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لاحظت أن القسم جامد و أحببت أن أعيد له النشاط من خلال طرحي لهذا التساؤل على حضراتكم :

عندما نقوم باستخدام أحد التابعين:

cout.precision
cout.fill

هل سيظل يعمل طوال تنفيذ البرنامج أم أنه يؤثر في cout التي تليه مباشرة !؟

مثلا .. عندما نحدد الـ precision بـ 3 ونقوم بإظهار عدد عشري , الآن ستظهر ثلاث أعداد بعد الفاصلة و لكن إذا قمنا يإظهار عدد آخر هل ستؤثر فيه الـ precision السابقة أم لا !؟

إذا كان الجواب "نعم" فكيف يقتصر عملهما على cout الموالية لهما !؟

تحياتي.

#2

لا أعتقد أن هذا ممكن، لكونك تقوم بالتأثير على الـ IO stream مباشرة.

والله أعلم.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3
الرابط الخاص بي

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#4
اقتباس
لا أعتقد أن هذا ممكن، لكونك تقوم بالتأثير على الـ IO stream مباشرة.

لا أعتقد ذلك مع احترامي الكامل لإدارة المنتدى و لك كأستاذنا الفاضل, حتما توجد طريقة لحل المشكلة فلا توجد مشكلة بدون حل إطلاقا ! :wink:

اقتباس
والله أعلم.

:)

اقتباس
الرابط الخاص بي

يعني إشهار مجاني !؟ :lol:

بانتظار من يوضح لنا الرؤية ! :blink: :wacko:

#5

لو كان يوجد اكثر من هذا لكنت وجدته فى شرحى :P

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#6
khaled_prg كتب:

لا أعتقد ذلك مع احترامي الكامل لإدارة المنتدى و لك كأستاذنا الفاضل, حتما توجد طريقة لحل المشكلة فلا توجد مشكلة بدون حل إطلاقا ! :wink:

هذه ليست بمشكلة حتى يكون لها حل.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#7
اقتباس
هذه ليست بمشكلة حتى يكون لها حل.

طيب, شوف يا استاز :

إذا كان عندنا أكثر من متغير من النوع float, بالنسبة للمتغير الأول فنريد إظهار 3 أرقام بعد الفاصلة أما بقية المتغيرات فنريد إظهارها بشكلها الطبيعي, انظر الكود :

#include<iostream>
using namespace std;
int main()
{
    float f = 5.2894,h = 7.4424;
    cout.precision(3);
    cout<<fixed;
    cout<<f<<endl;    
    cout<<h<<endl;
    system("pause");
    return 0;
}

لاحظ أن الـ precision قد أثرت على جميع المُخرجات وهو مالا نريده فنحن نريد أن نقصر تأثيرها على المخرج الأول فقط.

طبعا يمكننا استخدام الـ precision مع العدد 6 و الذي يمثل القيمة العظمى للأرقام التي تقع بعد الفاصلة و لكن إذا كان عدد الأرقام الذي يقع بعد الفاصلة أقل من 6 فسيتم ملأ البقية بأصفار و هو مالا نريده !!!

ألا تُعتبر هذه مشكلة في حد ذاتها !؟ :blink: :wacko:

#8
اقتباس

ألا تُعتبر هذه مشكلة في حد ذاتها !؟ :blink: :wacko:

لا هذه ليست بمشكلة، هكذا تم تصميم وبناء المكتبة وتوابعها.

ليست مشكلة لأنه مسموح لك أن تكتب:

#include<iostream>
using namespace std;
int main()
{
	float f = 5.2894,h = 7.4424;
	cout.precision(3);
	cout<<fixed;
	cout<<f<<endl;   
	cout.precision(5);
	cout<<h<<endl;
	system("pause");
	return 0;
}

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#9
اقتباس
لا هذه ليست بمشكلة، هكذا تم تصميم وبناء المكتبة وتوابعها.

ليست مشكلة لأنه مسموح لك أن تكتب

ماذا لو لم نعرف عدد الأرقام التي تقع بعد الفاصلة !؟, قد يقول البعض أنه بإمكاننا معرفة تلك الأرقام عن طريق طرح العدد الأصلي من العدد بعد تحويله إلى int ,هكذا:

float f= 5.35221;
cout<<f-(int)f<<endl;

ولكن هذه الطريقة تقليدية و لا أريدها !

ما أبحث عنه هو حل للمشكلة عن طريق توابع (يمكن ان تكون موجودة في نفس المكتبة), قال لي بعض الإخوة البارحة انه يوجد تابع لهذه المهمة و لكنني لا أعرف اسمه للأسف !

+

ماذا عن التابع cout.fill الذي لا علاقة لها بالفاصلة !؟

كيف سنتعامل مع المشكلة الناجمة عنه إذا ملئنا الفراغات بحرف # مثلا !؟

تحياتي.

تم تعديل هذه المشاركة بواسطة khaled_prg في 18 أكتوبر 2010 في 16:40

#10

هل هذا ما تبحث عنه

float x = 1.0034958675848392;
x = floor(x * 100000.0f) / 100000.0f;   // If you need only the first six digits

أعتقد أنك تستطيع استخدام sprintf أيضاً لتنفيذ ما تريد.

1

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

مواضيع مشابهة