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

تصحيح للكود رجاءا ...

بدأه نبولي في 26 أكتوبر 2010 · 13 رد · 703 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم احبائي

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

حيث يقوم بفحص الجملة حرفا حرفا

واذا كانت متكونة جميعها من حروف سوف تكون مقبولة

واذا احتوت على ررقم او رمز خاص سوف تكون خاطئة

انا طبقت الكود التالي

#include<iostream.h>
void main()
{
char a[5];
int i,b=0;
for(i=0;i<5;i++)
cin>>a;
for(i=0;i<5;i++)
{
if(a>='a' && a<='z' || a>='A' && a<='Z')
b++
}
if(b==5)
cout<<"IDENTIFIER";
else
cout<<"NOT IDENTIFIER";
}

المطلوب الان هو تحويل المصفوة ذات الحجم 5 الى مصفوفة غير منتهية او غير محدد بحجم معين

على سبيل المثال

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

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

بصراحة حاولت كثير ان اعرف مصفوفة غير معلومة الحجم وشرط للتوقف في For ولكني لم افلح

فعسا ان يساعدني احدكم مع جزيل الشكر

تحياتي

#2

السلام عليكم

يمكنك كتابة دالة تتحقق من الأمر فتعيد false إذا كانت المُدخلات لا تحقق الشرط و تعيد true في حالة العكس :

bool is_str(char* ptr)
{
        while(*ptr)
        {
                if(!std::isalpha(*ptr++))
                        return false;
        }
        return true;
}

هذه الدالة تستقبل مؤشر سيشير إلى أول عنصر من عناصر المصفوفة و الشرط التالي :

 while(*ptr)// while(*ptr != 0)

يعني "ما دامت المصفوفة لم تنتهي بعد" لأن المصفوفة تنتهي بالرمز\0 و الذي تقابله القيمة صفر في الأعداد الصحيحة.

هذا السطر :

if(!std::isalpha(*ptr++))//if(!std::isalpha(*ptr++) == 0)

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

أرجو أن تكون الفكرة واضحة, هذا مثال لتجربة الدالة :

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

bool is_str(char* ptr)
{
        while(*ptr)
        {
                if(!std::isalpha(*ptr++))
                        return false;
        }
        return true;
}

int main()
{
    char String[20] ;
    cin.getline(cbuf,'\n');
    if(is_str(String)) cout<<cbuf<<endl;
    else cout<<"ERROR !\a"<<endl;
    system("pause");
    return 0;
}

==============

بالمناسبة, إذا كان بإمكانك مساعدتي في هذا الموضوع فأنا أنتظر ردك و لك جزيل الشكر :)

/index.php?showtopic=230939

تم تعديل هذه المشاركة بواسطة khaled_prg في 26 أكتوبر 2010 في 17:44

1
#3

سلمت يداك اخي الكريم

ولكن المطلوب هو فقط كيفية تعريف مصفوفة غير منتهية (غير معلومة الحجم) ووضع الشرط في الـ For الخاصة بها في البرنامج

#4
اقتباس
المطلوب هو فقط كيفية تعريف مصفوفة غير منتهية (غير معلومة الحجم) ووضع الشرط في الـ For الخاصة بها في البرنامج

إذن أنت تسأل عن كيفية إنشاء مصفوفة ديناميكية عن طريق المؤشرات طبعا :)

الفكرة تعتمد على استخدام المعامل new مع عدد الخانات التي نريد حجزها ثم نقوم بتحرير المؤشر بعد أن ننتهي من استخام المصفوفة :

#include<iostream>
using namespace std;
int main()
{
    char *arr_ptr;
    int n,i;
	cout<<"Enter number of Array elements : ";
	cin>>n;
	arr_ptr = new char[n];
    ...
    delete arr_ptr;
    system("pause");
    return 0;
}

لم تجب عن هذه النقطة :

اقتباس
بالمناسبة, إذا كان بإمكانك مساعدتي في هذا الموضوع فأنا أنتظر ردك و لك جزيل الشكر

أعرف أن قد تعرف/لا تعرف الجواب و لكنني أريد الإجابة فقط !

تم تعديل هذه المشاركة بواسطة khaled_prg في 26 أكتوبر 2010 في 19:08

#5

السلام عليكم

اخي الكريم اشكرك جدا على تعاونك

والكود الثاني اسهل بالفعل

ولكني مازلت ابحث عن طريقة اخرى فهل يوجد طريقة اخرى ؟؟

بالنسبة لسؤالك فأعتذر جدا جدا لأني لا اعرف

تحياتي لك

#6

الأخ نبولي ,

اذا كنت لا تريد إستخدام المؤشرات , فلابد من تحديد حجم المصفوفة ..

اجعل حجم المصفوفة كبير مثلاً 100 , اجعل المستخدم يدخل الجملة , و بعدها اعمل Loop , لإختبار المدخل إن كان يحتوي ع غير الحروف ..

الكود :

#include<iostream>
using namespace std;
int main()
{
char a[100];
int  b=0;
gets(a);
for(int i=0;i<strlen(a);i++)
{
if(a>='a' && a<='z' || a>='A' && a<='Z')
b++;
}
if(b==strlen(a))
cout<<"IDENTIFIER";
else
cout<<"NOT IDENTIFIER";
return 0 ;
}

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#7
اقتباس
اجعل حجم المصفوفة كبير مثلاً 100

الأخت إشراقة ما قصرت :) و لكن هذه الطريقة تقليدية :happy:

ماذا لو أدخل المستخدم أكثر من 100 حرف !؟ ممكن تقول راح اعمل مصفوفة بتتكون من 1000 حرف !, ولكنك كلما زدت حجم المصفوفة كلما زاد استهلاك الذاكرة خصوصا إذا كانت المصفوفة غير مُستعملة كليا !, من هنا تأتي فائدة المؤشرات :cool:

#8

صحيح يا استاذ خالد ,

لكن الأخ يبدو مبتدأ , و بعدهم ما درسوا المؤشرات :wink: ..

كيف بيحلها ؟

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#9
اقتباس
صحيح يا استاذ خالد

أنا تلميذك :happy:

اقتباس
لكن الأخ يبدو مبتدأ , و بعدهم ما درسوا المؤشرات :wink: ..

كيف بيحلها ؟

تركه لهذه المسألة حتى يدرس المؤشرات أفضل من تبذير الذاكرة :)

#10
اقتباس
   char *arr_ptr; 
    int n,i; 
        cout<<"Enter number of Array elements : "; 
        cin>>n; 
        arr_ptr = new char[n]; 
    ... 
    delete arr_ptr

هنا راح تكون لنا dangilling pointer

??

#11
إشراقة فجر كتب:

صحيح يا استاذ خالد ,

لكن الأخ يبدو مبتدأ , و بعدهم ما درسوا المؤشرات :wink: ..

كيف بيحلها ؟

السلام عليكم اختي الكريمة

بالفعل كما قلتي فأنا لست بمبتدأ ولكن مستواي بالبرمجة متوسط

بالنسبة للمؤشرات اخذناها ولكن ليس بعمق

وطريقتكِ جيدة واشكركِ جدا جدا على مشاركتكِ

تحياتي

#12

بقي لي استفسار بسيط بشأن تصحيح اختي اشراقة الفجر

اعتقد اني الكود بلغة C والمطلوب منا الكود بلغة C++

لم افهم هذه الخطوات

1- ماعمل هذه الدالة

gets(a);

2-ما معنى هذا الشرط

i<strlen(a)

اعرف اني مصختها كثير بس اتحملوني اخوكم الصغير انا

تحياتي

#13

السلام عليكم ,

الكود بلغة ++C , و بالنسبة لإستفساراتك .. راجع هالروابط ..

http://www.cplusplus.com/reference/clibrary/cstdio/gets/

http://www.cplusplus.com/reference/clibrary/cstring/strlen/

يشرحها بوضوح مع امثلة .. المعذرة لا املك وقت لشرحها :wink: ..

بالتوفيق يارب :happy:

تم تعديل هذه المشاركة بواسطة إشراقة فجر في 30 أكتوبر 2010 في 13:52

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#14
اقتباس
اعتقد اني الكود بلغة C والمطلوب منا الكود بلغة C++

الكود بلغة C++ على طريقة Old style, هذا الكود بلغة السي++ (مع بعض التعديلات الخفيفة) :

#include<iostream>
using namespace std;
int main()
{
    char a[100];
    int  b = 0,i = 0;
    cin.get(a,'\n');
    while(a)
    if(isalpha(a[i++])) b++;
    if(b == strlen(a))
      cout<<"IDENTIFIER"<<endl;
    else
        cout<<"NOT IDENTIFIER"<<endl;
    system("pause");    
    return 0 ;
}

اقتباس
1- ماعمل هذه الدالة

gets(a);

الدالة gets تقوم بقراءة جملة تحتوي على مسافة على عكس الدالة scanf التي تعتبر حرف المسافة space حرف إنهاء للمُدخلات و بالتالي لن تسطيع تخزين جملة بأكملها, جرب هذا السطر و ضعه بدل gets :

scanf("%s",a)

عندما تقوم بإدخال جملة (تحتوي على أكثر من space) فسيتم تخزين الكلمة الأولى فقط لذلك وجب استخدام gets في هذه الحالة.

اقتباس
2-ما معنى هذا الشرط

i<strlen(a)

الدالة strlen تستقبل جملة و تعيد عدد صحيح يحتوي على عدد حروف تلك الجملة, و الشرط هنا يعني :

"ما دام i أقل من طول الجملة", أي مادامت الجملة لم تنتهي بعد.

اقتباس
اعرف اني مصختها كثير بس اتحملوني اخوكم الصغير انا

هذا من واجبنا, لا تتردد في أي استشكال يجول في خاطرك و ستجدني أول من يرد عليك إن كنت أعرف الإجابة :)

1

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