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

كتابة دالة للتحقق من أن النص المدخل هو عدد حقيقي .

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

السلام عليكم

الموضوع الأصلي

سبق و أن كتب الأستاذ خالد الشايع الدالة التالية :

#include <cctype>

bool is_number(const char* number_string)
{
        while(*number_string)
        {
                if(!std::isdigit(*number_string++))
                        return false;
        }
        return true;
}

و التي تتحقق من صحة الإدخال بالنسبة للأعداد الصحيحة int و الآن نريد تطوير هذه الدالة حتى تدعم التحقق من صحة الإدخال بالنسبة للأعداد الحقيقية (أي التي تحتوي على فاصلة).

بانتظاركم يا أبطال البرمجة :)

#2

وعليكم السلام ،

معلش أخي ،

الرجاء كتابة عنوان واضح خالياً من نسبته لأعضاء معينين ( مهما كان وزنهم في المنتدى ) .. هذه ثانية مرة تكتب العنوان بنفس الأسلوب :

/index.php?showtopic=229969

العنوان الصحيح سيكون على سبيل المثال :

كتابة دالة للتحقق من أن العدد المدخل هو عدد حقيقي .

أسئلتك جميلة ، لكن العنوان مش ولا بد ،

==

الإجابة ممكن أن تكون بهذا الشكل :

bool is_number(const char* number_string)
{
		int counter = 0;
        while(*number_string)
        {
			char c = *number_string++;
			if(c == '.')
				counter++;
            if(!std::isdigit(c)  || counter > 1 )
                return false;
        }
        return true;
}
2

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3
اقتباس
الرجاء كتابة عنوان واضح خالياً من نسبته لأعضاء معينين ( مهما كان وزنهم في المنتدى ) .. هذه ثانية مرة تكتب العنوان بنفس الأسلوب

عفوا, في المرات القادمة سألتزم بهذا الأمر :blush:

اقتباس
العنوان الصحيح سيكون على سبيل المثال :

كتابة دالة للتحقق من أن العدد المدخل هو عدد حقيقي .

أرجو منك تغيير عنوان الموصوع إلى العنوان الجديد ليكون مناسبا :)

اقتباس
الإجابة ممكن أن تكون بهذا الشكل :

bool is_number(const char* number_string)
{
                int counter = 0;
        while(*number_string)
        {
                        char c = *number_string++;
                        if(c == '.')
                                counter++;
            if(!std::isdigit(c)  || counter > 1 )
                return false;
        }
        return true;
}

قمت بتجربة الدالة و ذلك بإرفاقها في الكود التالي :

#include <iostream>
using namespace std;
bool is_number(const char* number_string)
{
     int counter = 0;
     while(*number_string)
     {
          char c = *number_string++;
          if(c == '.')
           counter++;
          if(!std::isdigit(c)  || counter > 1 )
           return false;
     }
    return true;
}
int main()
{
    char cbuf[20] = {0};
    cin.getline(cbuf,'\n');
    float num;
    if(is_number(cbuf))
    {
      num = atoi(cbuf);
      cout<<num<<endl;
    }
    else cout<<"ERROR !\a"<<endl;
    system("pause");
    return 0;
}

عندما أُدخل العدد 1.5 يُظهر البرنامج الكلمة ERROR مما يعني أن الدالة لا تعمل بالشكل المطلوب !

#4

المعذرة ، لم أطبقها ، لكن بالتعديل هذا رح تعمل ( مجرد أنك تعد عدد النقاط ( . ) ، لو كان هناك أكثر من نقطة ، فيعني أن هناك مشكلة ) ، فمثلاً هذا النص غير صحيح : 1..2 والصحيح هو 2.1 :

#include <iostream>
#include <cctype>

using namespace std;
bool is_number(const char* number_string)
{
	int counter = 0;
	while(*number_string)
	{
		char c = *number_string++;
		if(c == '.')
		{
			counter++;
			if(counter > 1)
				return false;
		}
		else
		{
			if(!std::isdigit(c))
				return false;
		}
	}
	return true;
}
int main()
{
	char cbuf[20] = {0};
	cin.getline(cbuf,'\n');
	float num;
	if(is_number(cbuf))
	{
		num = atof(cbuf);
		cout<<num<<endl;
	}
	else
	{
		cout<<"ERROR !\a"<<endl;
	}
	system("pause");
	return 0;
}
2

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

الآن أصحبت الدالة تؤدي المطلوب بشكل كااااااااااامل, بارك الله فيك :)

==

أرجو أن تساعدني في هذا الموضوع :

/index.php?showtopic=230170

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