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

سؤال : عن اختبار نوع المدخلات

بدأه Nada.21 في 22 فبراير 2012 · 18 رد · 827 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اريد مساعدتكم

برنامج يدخل المستخدم نص ثم يقوم البرنامج بالتشييك ع النص المدخل هل هو نص او رقم

في c++ التشييك راح يكون ع كل حرف كيف يتم ذلك ؟؟

#2
اقتباس
برنامج يدخل المستخدم نص ثم يقوم البرنامج بالتشييك ع النص المدخل هل هو نص او رقم

في c++ التشييك راح يكون ع كل حرف كيف يتم ذلك ؟؟

من فضلك, اكتب الكلمات بلغتها الأم ! :happy:

أرنا محاولتك و سنساعك :)

#3

يدخل المستخدم نص على عدة سطور قد احد السطور المدخل : نص (string) او رقم (int , flot, .....ets)

يتم التاكد من المدخل هل هو نص او رقم وليكن مثلا اذا كان رقم يطبع رقم واذا كان نص يطبع نص

اتمنا ان يكون الان اوضح

#4

هذة محاوﻻتى اﻻولى أتمنى ان تفيدكم وان كان لكم تعقيب أو استفسار فيمكنك أضافتة.

كيف يعمل البرنامج: تدخل اى عدد من النصوص واﻻرقام وعندما تريد ان تنتهى فقط أكتب $ ثم علامة النجمة

/*
 * File:   main.cpp
 * Author: Mohammed Abu Zayed
 *
 * Created on February .....
 */

#include <iostream>
#include <string>

using namespace std;
int main()
{
    string MyText;
    // get text form user untile user enter $ to stop.
    getline(cin,MyText,'$');

    // chech user input ..
    int length = MyText.length();
    int i = 0;
    while(i < length)
    {
        if(isdigit(MyText.at(i)))
            cout << MyText.at(i) << " : Is Digit." << endl;
        else if ((isalpha(MyText.at(i))))
            cout << MyText.at(i) << " : Is Alph." << endl;
        i++;
    }
    cout << endl;

    return 0;
}

المخرجات:

Mohamemd 120 2000 Ali  
wow new 100 lin$
M : Is Alph.
o : Is Alph.
h : Is Alph.
a : Is Alph.
m : Is Alph.
e : Is Alph.
m : Is Alph.
d : Is Alph.
1 : Is Digit.
2 : Is Digit.
0 : Is Digit.
2 : Is Digit.
0 : Is Digit.
0 : Is Digit.
0 : Is Digit.
A : Is Alph.
l : Is Alph.
i : Is Alph.
w : Is Alph.
o : Is Alph.
w : Is Alph.
n : Is Alph.
e : Is Alph.
w : Is Alph.
1 : Is Digit.
0 : Is Digit.
0 : Is Digit.
l : Is Alph.
i : Is Alph.
n : Is Alph.


RUN SUCCESSFUL (total time: 32s)

تم تعديل هذه المشاركة بواسطة محمد ابوزايد في 23 فبراير 2012 في 11:07

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#5

شكراً جزيلا اخي محمد ابوزايد

getline(cin,MyText,'$');

سوف يدخل ويحفظ المدخل في المتغير MyText

الى ان يدخل المستخدم علامة $

اذا كنت اريد حساب عدد الاسطر التي ادخلها المستخدم كيف يتم ذلك ؟

#6

مرحبا :)

هل تريد فحص كل سطر ؟ أو محتويات السطر نفسه ؟ (كما فعل الأخ محمد أبو زايد)

عموما, إذا كنت تريد فحص السطر كاملا, هل هو عدد صحيح أم حقيقي أم حرف أم ... فيمكنك كتابة دالة تتحقق من صحة كل سطر, مثلا هذه الدالة تتحقق من صحة إدخال الأعداد الصحيحة, إذا كان السطر عبارة عن عدد صحيح ستعيد true و إلا فستعيد false :

#include <iostream>
#include <cstdlib>
using namespace std;

bool isNumber(char* str) {
    char *pMove = str;
    while (*pMove) {
        if (*pMove < 0x30 || *pMove > 0x39) return false;
        else pMove++;
    }
    return true;
}

int main() {
    char cbuf[20] = {0};
    cin.getline(cbuf, '\n');
    int num = 0;
    if (isNumber(cbuf)) {
        num = atoi(cbuf);
        cout << num << " is number !" << endl;
    } else cout << num << " is'nt number !" << endl;
    system("pause");
    return 0;
}

يمكنك أيضا استخدام الدالة isdigit كما فعل الأخ محمد أبوزايد :

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

يمكنك تطوير الدالة حتى تدعم التحقق من float هكذا :

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;
}

أتمنى أن أكون قد أفدتك.

بالتوفيق.

1
#7

انا اﻵن من الذى الضيف المخفى .... ....

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#8
اقتباس
انا اﻵن من الذى الضيف المخفى .... ....

ليس ضيف مخفي و إنما عضو مخفي :)

خاصية الإخفاء غير متاحة للزوار !

بالنسبة لي, أفضل دائما الدخول بالمخفي :D

تم تعديل هذه المشاركة بواسطة khaled_prg في 23 فبراير 2012 في 12:45

#9

شكرا جزيلا :blush:

#10

فقط نحن بحاجة الى ايجاد عدد \n\r

سأحاول ﻻحقا ..

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#11

علامة انتهاء كل السطر تكمن في وجود \n في الكائن MyText.

لمعرفة عد الأسطر سنمر على محتوى الكائن و كل ما وجدنا \n نقوم بزيادة endLine بواحد, هكذا :

#include <iostream>
#include <string>

using namespace std;
int main()
{
    string MyText;
    // get text form user untile user enter $ to stop.
    getline(cin,MyText,'$');

    // chech user input ..
    int length = MyText.length();
    int i = 0, endLine = 0;
    while(i < length)
    {
        if(MyText.at(i) == '\n') endLine++;
        if(isdigit(MyText.at(i)))
            cout << MyText.at(i) << " : Is Digit." << endl;
        else if ((isalpha(MyText.at(i))))
            cout << MyText.at(i) << " : Is Alph." << endl;

        i++;
    }
    MyText.at(length - 1) != '\n' ? endLine++ : endLine;
    cout <<"EndLine = "<<endLine<<endl;
    return 0;
}

قمنا بالإعلان عن المتغير endLine ليحمل قيمة عدد الأسطر.

هناك حالتان, إما أن يكون الإدخال هكذا :

Mohamemd 120 2000 Ali  
wow new 100 lin$

أو هكذا :

Mohamemd 120 2000 Ali  
wow new 100 lin
$

في الحالة الأولى سيكون عدد الأسطر مساوي لعدد الإدخالات أما في الحالة الثانية فسيكون عدد الأسطر مساوي لعدد الإدخالات ناقص واحد, لأن السطر الأخير يحتوي على علامة التوقف لذا فهو ليس ضمن الأسطر الفعلية.

بالتوفيق.

1
#12

هذة محاوﻻتى

/* 
 * File:   main.cpp
 * Author: Mohammed Abu Zayed
 * * Created on February 23, 2012, 3:22 PM
 */

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string MyText;
    cout << ">";
    getline(cin, MyText, '$');   
    int length = MyText.length();
    int i = 0, endLine = 1;
    while (i < length)
    {
        if (MyText.at(i) == '\n') endLine++;
        if (isdigit(MyText.at(i)))

            cout << MyText.at(i) << " : Is Digit." << endl;
        else if ((isalpha(MyText.at(i))))
            cout << MyText.at(i) << " : Is Alph." << endl;
        i++;
    }
    if(MyText.length())
        cout << " Line Counter: " << endLine << endl;
    return 0;
}

المخرجات فى حالة عدد صفر سطر:

>$

RUN SUCCESSFUL (total time: 3s)

المخرجات فى حالة أكثر من سطر:

>Khaled I love u 100%
100+100 = Tow hds$
K : Is Alph.
h : Is Alph.
a : Is Alph.
l : Is Alph.
e : Is Alph.
d : Is Alph.
I : Is Alph.
l : Is Alph.
o : Is Alph.
v : Is Alph.
e : Is Alph.
u : Is Alph.
1 : Is Digit.
0 : Is Digit.
0 : Is Digit.
1 : Is Digit.
0 : Is Digit.
0 : Is Digit.
1 : Is Digit.
0 : Is Digit.
0 : Is Digit.
T : Is Alph.
o : Is Alph.
w : Is Alph.
h : Is Alph.
d : Is Alph.
s : Is Alph.
 Line Counter: 2

RUN SUCCESSFUL (total time: 56s)

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#13

مرحبا إخوتي :)

اقتباس
هذة محاوﻻتى
جميل جدا, لكن اذا أدخل المستخدم :

>Khaled I love u 100%
100+100 = Tow hds
$

ستكون قيمة endLine تساوي 3 !!

بالإضافة إلى ذلك, هناك أخطاء صغيرة وقعت فيها أنا و الأخ محمد أبو زايد ! :blush:

  • عند حساب عدد الأسطر, يجب توخي الحذر !, فإذا قام المستخدم بالضغط على أنتر في أحد السطور .. هل سيتم حساب هذا السطر من ضمن السطور الفعلية ؟, الإجابة هي لا , طبعا ! إذا يجب أخذ هذا الشرط في عين الإعتبار.
  • الأكواد التي كتبناها بالأعلى تتجاهل الرموز مثل % و ! و ما إلى ذلك ...

هذا الكود يحتوي على تصحيح الأخطاء السابقة مع بعض التحسينات :wink: :

#include <iostream>
#include <string>
using namespace std;

int main() {
    string MyText = "", helpMyText;
    int length, i = 0, endLine = 0;
    do {
        cout << ">";
        getline(cin, helpMyText);
        if (helpMyText != "" && helpMyText != " " && helpMyText != "$")
            endLine++;
        MyText += (helpMyText += '\n');
        if (MyText.length() > 2 || helpMyText == "$\n")
            if (MyText.at(MyText.length() - 2) == '$')
                break;
    } while (true);
    if (MyText.length() > 2)
        MyText.at(MyText.length() - 2) = MyText.at(MyText.length() - 1) = '\0';
    length = MyText.length() - 2;
    while (i < length) {
        if (isdigit(MyText.at(i)))
            cout << MyText.at(i) << " : Is Digit." << endl;
        if ((isalpha(MyText.at(i))))
            cout << MyText.at(i) << " : Is Alph." << endl;
        if (!isdigit(MyText.at(i)) & !(isalpha(MyText.at(i))) & !(isspace(MyText.at(i))))
            cout << MyText.at(i) << " : Is Symbol." << endl;
        i++;
    }
    if (endLine)
        cout << endl << "endLine : " << endLine << endl;
    return 0;
}

المخرجات فى حالة الإبتداء بعلامة التوقف :

>$

Process returned 0 (0x0) execution time : 2.297 s

المخرجات فى حالة إدخال المسافة أو الأنتر :

> (espace)

> (entre)

>$

endLine : 2

Process returned 0 (0x0) execution time : 11.826 s

المخرجات فى حالة وجود أكثر من سطر (السطر الأخير يتنهي بعلامة التوقف) :

>khaled_prg

>ArabTeam200 !$

k : Is Alph.

h : Is Alph.

a : Is Alph.

l : Is Alph.

e : Is Alph.

d : Is Alph.

_ : Is Symbol.

p : Is Alph.

r : Is Alph.

g : Is Alph.

A : Is Alph.

r : Is Alph.

a : Is Alph.

b : Is Alph.

T : Is Alph.

e : Is Alph.

a : Is Alph.

m : Is Alph.

2 : Is Digit.

0 : Is Digit.

0 : Is Digit.

! : Is Symbol.

endLine : 2

Process returned 0 (0x0) execution time : 16.094 s

المخرجات فى حالة وجود أكثر من سطر (علامة التوقف في سطر مستقل) :

>"Mohammed Abu Zayed", je vous partage vos sentiments 100 % !

>Je vous dépasse même ; )

>$

" : Is Symbol.

M : Is Alph.

o : Is Alph.

h : Is Alph.

a : Is Alph.

m : Is Alph.

m : Is Alph.

e : Is Alph.

d : Is Alph.

A : Is Alph.

b : Is Alph.

u : Is Alph.

Z : Is Alph.

a : Is Alph.

y : Is Alph.

e : Is Alph.

d : Is Alph.

" : Is Symbol.

, : Is Symbol.

j : Is Alph.

e : Is Alph.

v : Is Alph.

o : Is Alph.

u : Is Alph.

s : Is Alph.

p : Is Alph.

a : Is Alph.

r : Is Alph.

t : Is Alph.

a : Is Alph.

g : Is Alph.

e : Is Alph.

v : Is Alph.

o : Is Alph.

s : Is Alph.

s : Is Alph.

e : Is Alph.

n : Is Alph.

t : Is Alph.

i : Is Alph.

m : Is Alph.

e : Is Alph.

n : Is Alph.

t : Is Alph.

s : Is Alph.

1 : Is Digit.

0 : Is Digit.

0 : Is Digit.

% : Is Symbol.

! : Is Symbol.

J : Is Alph.

e : Is Alph.

v : Is Alph.

o : Is Alph.

u : Is Alph.

s : Is Alph.

d : Is Alph.

é : Is Symbol.

p : Is Alph.

a : Is Alph.

s : Is Alph.

s : Is Alph.

e : Is Alph.

m : Is Alph.

ê : Is Symbol.

m : Is Alph.

e : Is Alph.

; : Is Symbol.

) : Is Symbol.

endLine : 2

Process returned 0 (0x0) execution time : 54.136 s

بالمناسبة, من يدرس لنا هذه الحالة :

>$$$$$$

بحيث لا يظهر البرنامج رمز التوقف $ :wink:

#14

السلام عليكم ورحمه الله

أنا لست هنا لوضع حل بل قام معلمينا الأخوان "محمد و خالد" :D بالمطلوب

أنا هنا لأسأل الأخ خالد بأى برنامج قمت بإلتقاط تلك الصورة العملاقة :D فى المشاركة السابقة

... تعديل عفواً ظننتها صوره ملتقطة من الجهاز ...

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 23 فبراير 2012 في 23:57

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#15
اقتباس
أنا هنا لأسأل الأخ خالد بأى برنامج قمت بإلتقاط تلك الصورة العملاقة :D فى المشاركة السابقة

بكل بساطة, قمت باستخدام الوسم العملاق console :D هكذا :

[consol3][/consol3]

ضع الحرف e مكان الرقم 3 :)

اقتباس
أنا لست هنا لوضع حل بل قام معلمينا الأخوان "محمد و خالد" :D بالمطلوب

إذا كنت أنا من معلميك فعليك حل هذا الواجب المنزلي :lol: :

اقتباس
من يدرس لنا هذه الحالة :

>$$$$$$

بحيث لا يظهر البرنامج رمز التوقف $ :wink:

تم تعديل هذه المشاركة بواسطة khaled_prg في 24 فبراير 2012 في 00:11

#16

ممكن البرنامج في C من فضلكم

#17
اقتباس
ممكن البرنامج في C من فضلكم

تفضل أخي, الكود الأخير بلغة السي :

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
	 char MyText[1000] = "", helpMyText[100];
	 int length, i = 0, endLine = 0;
    do {
		  printf(">");
		  gets(helpMyText);
		  if ( strcmp(helpMyText,"") != 0 && strcmp(helpMyText," ") != 0 && strcmp(helpMyText,"$") != 0)
				endLine++;
		  strcat(helpMyText, "\n");
		  strcat(MyText, helpMyText);
		  if (strlen(MyText) > 2 || strcmp(helpMyText,"$\n") == 0 )
				if (MyText[strlen(MyText) - 2] == '$')
					 break;
	 } while (1);
	 length = strlen(MyText) - 2;
	 while (i < length) {
		  if ( isdigit(MyText) )
				printf("%c Is Digit.\n",MyText);
		  if ( isalpha(MyText) )
				printf("%c Is Alph.\n",MyText);
		  if ( !isdigit(MyText) & !isalpha(MyText) & !isspace(MyText) )
				printf("%c Is Symbol.\n",MyText);
		  i++;
	 }
	 if (endLine)
		  printf("\nendLine : %d\n",endLine);
	 return 0;
}

و هذه صورة من تنفيذ الكود :

post-225348-099652500 1330081686_thumb.p

مرونة الكود بالسي لا تعادل نصف مرونته بالسي++, لأن الفئة string تحتوي على العديد من الخصائص التي لا تمتلكها مصفوفات char.

بالتوفيق.

المرفقات
Test_prg.png

تم تعديل هذه المشاركة بواسطة khaled_prg في 24 فبراير 2012 في 14:11

#18
اقتباس
جميل جدا, لكن اذا أدخل المستخدم :

expand plain text

>Khaled I love u 100%

100+100 = Tow hds

$

ستكون قيمة endLine تساوي 3 !!

بالإضافة إلى ذلك, هناك أخطاء صغيرة وقعت فيها أنا و الأخ محمد أبو زايد ! :blush:

عند حساب عدد الأسطر, يجب توخي الحذر !, فإذا قام المستخدم بالضغط على أنتر في أحد السطور .. هل سيتم حساب هذا السطر من ضمن السطور الفعلية ؟, الإجابة هي لا , طبعا ! إذا يجب أخذ هذا الشرط في عين الإعتبار.

الأكواد التي كتبناها بالأعلى تتجاهل الرموز مثل % و ! و ما إلى ذلك ...

اخوانى اﻻعزاء نحن هندما نساعد أخواننا فى المنتدى بتلبية طلباتهم بخصوص أشياء محددة كـــ:

  1. اصلاح خطأ بكود
  2. معالجة مشكلة يصفها المستخدم

نحن نقدم له الفكرة أو نحن نقول لة يمكنك أن تفعل ذلك بالــ سي++ بكل سهولة

أنما تقديم حل متكامل موجهة للأستخدام فهذا يقع على عاتق طالب الكود نفسة هو يستطيع استكمال الباقى ما دام أصبح يمتلك فكرة الحل

ز

أم بخصوص موضوع عدد اﻻسطر فى النص المدخل يكفى أن يكتب المستخدم فى شكل قائمة متى يحتسب سطر ام ﻻ.

ثم أن اﻻستراتيجية مختلفة ﻻن نحن نحسب عدد اﻻسطر بناء على عدد علامات سطر جديد وهى فى الواقع عدد الفقرات ﻻ عدد اﻻسطر ﻻن الفقرة تنتهى بمفتاح اﻻدخال.

بينما عدد اﻻسطر يتحدد وفقا لعرض الشاشة أى كم حرف مسموح بة بعرض الشاشة وماذا أن كان النص كبير أم صغير الخ .............

نحن نعى تماما كل أحتماﻻت الحل واذا اردنا عملة فبألتأكيد علينا تطوير برنامج معالجة نصوص أو على اﻻحرى نعدل فى gedit أو kedit ..... الخ.

تقبلو مرورى والله ولى التوفيق ..

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#19

مرحبا أخي محمد :)

اقتباس
نحن نقدم له الفكرة أو نحن نقول لة يمكنك أن تفعل ذلك بالــ سي++ بكل سهولة

أنما تقديم حل متكامل موجهة للأستخدام فهذا يقع على عاتق طالب الكود نفسة هو يستطيع استكمال الباقى ما دام أصبح يمتلك فكرة الحل

أرى أن صاحب الموضوع وجد ما يريد :)

و أنا في مشاركتي الثانية لم أضع له الحل كاملا و انما اكتفيت بسرد الأفكار في إطار برمجي.

حسب قوانين المنتدى, عندما يحصل العضو على إجابته يتحول عنوان الموضوع إلى [تمت الإجابة - عنوان الموضوع] و يمكن للأعضاء أن يتحاوروا حول جزئية معينة من الموضوع. و بالتالي, الموضوع لم يعد سؤالا بل صار نقاشا برمجيا مفتوحا :)

اقتباس
أما بخصوص موضوع عدد اﻻسطر فى النص المدخل يكفى أن يكتب المستخدم فى شكل قائمة متى يحتسب سطر ام ﻻ.

ثم أن اﻻستراتيجية مختلفة ﻻن نحن نحسب عدد اﻻسطر بناء على عدد علامات سطر جديد وهى فى الواقع عدد الفقرات ﻻ عدد اﻻسطر ﻻن الفقرة تنتهى بمفتاح اﻻدخال.

بينما عدد اﻻسطر يتحدد وفقا لعرض الشاشة أى كم حرف مسموح بة بعرض الشاشة وماذا أن كان النص كبير أم صغير الخ .............

نحن نعى تماما كل أحتماﻻت الحل واذا اردنا عملة فبألتأكيد علينا تطوير برنامج معالجة نصوص أو على اﻻحرى نعدل فى gedit أو kedit ..... الخ.

أفكار جميلة جدا :wink:

يمكننا فتح موضوع خاص بالعمل على كيفية تطوير حساب عدد الأسطر, ما رأيك ؟ :)

تم تعديل هذه المشاركة بواسطة khaled_prg في 24 فبراير 2012 في 15:13

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