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

أرجوا المساعدة

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

السلام عليكم و رحمة الله و بركاته

بداية .. أُهنئكم على هذا المنتدى الجميل .. الذي جمع العديد من عمالقة البرمجة في العالم العربي .. وأسأل الله سبحانه و تعالى أن يديم عليكم نعمه يوما بعد يوم .. و أن يزيدكم من فضله .. إنه على كل شيء قدير ...

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

أريد كتابة برنامج بسيـــط جدا .. كالآتي:

1-اطلبُ من المستخدم إدخال اسمه.

2-إذا كان اسم المستخدم هو ali سيظهر البرنامج الحرف A.

3- إذاكان اسم المستخدم هو brahim سيظهر البرنامج الحرف B.

4-إذا كان اسم المستخدم يختلف عن الاسمين السابقين فسيظهر البرنامج : erreur.

هذه محاولتي في التمرين:

#include<iostream>
using namespace std;
int main()
{
        char nom[10];
        cout<<"entrez votre nom:";
        cin.get(nom,9);
        if(nom=="ali")
        cout<<"A "<<endl;
        if(nom=="brahim")
        cout<<"B "<<endl;
        if(nom!="ali" && nom!="brahim")
        cout<<"erreur"<<endl;
        system("pause");
        return 0;
}

أرجوا المساعدة .. والله في عون العبد ما كان العبد في عون أخيه.

#2

أخي الكريم ... المشكلة في برنامجك بسيطة جداً و ما أخطأتَ فيه هو استخدامك تقنية المصفوفات لأنه لا يمكنك أن تقول للكومبايلر أن يقارن لك مصفوفة من عشرة عناصر وكأنها كتلة واحد عندما قلت

if(nom=="ali")

لذلك في هذه الحالة فقط استخدم نوع متغيرات اسمهstring ,i وهو عبارة عن سلسلة محارف و يحتاج إيضاً لمكتبة string و هذا البرنامج شغال إن شاء الله .

#include<iostream>
#include <string>
using namespace std;
int main()
{
        string nom;
        cout<<"entrez votre nom:";
        cin>>nom;
        if(nom=="ali")
        cout<<"A "<<endl;
        if(nom=="brahim")
        cout<<"B "<<endl;
        if(nom!="ali" && nom!="brahim")
        cout<<"erreur"<<endl;
        system("pause");
        return 0;
}
#3
اقتباس
أخي الكريم ... المشكلة في برنامجك بسيطة جداً و ما أخطأتَ فيه هو استخدامك تقنية المصفوفات لأنه لا يمكنك أن تقول للكومبايلر أن يقارن لك مصفوفة من عشرة عناصر وكأنها كتلة واحد

جزاك الله خيرا أخي الكريم .. باين عليك إنك خبير وذو أخلاق عالية .. ماشاء اله فتبارك الله ..

إذا أردنا تحويل البرنامج السابق إلى لغة السي .. كيف سيعمل ؟؟؟ لا أسأل عن ما يقابل الكائن cout أو الكائن cin في لغة السي .. لالالا أعرف ما يقابلهما .. ولكن سؤالي هو ماذا يقابل الصنف string في لغة السي ؟؟

سؤال آخر (مستقل):

عندما نكتب دالة تستقبل مصفوفة و لا تعيد شيء (بغض النظر عن عمل الدالة):

void fonc (char str[])

لماذا لا نكتب عدد حروف المصفوفة بداخل تعريف الدالة ؟؟؟

أنتظر إجابتك يا أستاذي الغالي.

دمت بود

#4

السلام عليكم:

استخدم الدالة strcmp من أجل المقارنة ولا تنسى إدراج ملف الراس <cstring>

tvquran_6.gif

#5
اقتباس
جزاك الله خيرا أخي الكريم .. باين عليك إنك خبير

أكرمك الله ولكني لست أكثر من مبتدئ و لا أقولها تواضعاً و لكنها حقيقة .

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

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

اقتباس
ماذا يقابل الصنف string في لغة السي

حسب ما فهمت من مقالة عن الصنف string في اللغة سي و الذي هو على هذا الرابط .

http://www.cprogramming.com/tutorial/lesson9.html

فهو لا يتعدى عن كونه مصفوفة محارف

و هي من الشكل

char string[50];

وهذا برنامج في لغة سي يستخدم هذه التقنية

#include <iostream>

using namespace std;

int main()
{
  char string[256];                               // A nice long string

  cout<<"Please enter a long string: ";
  cin.getline ( string, 256, '\n' );              // Input goes into string
  cout<<"Your long string was: "<< string <<endl;
  cin.get();
}
#6
اقتباس
استخدم الدالة strcmp من أجل المقارنة ولا تنسى إدراج ملف الراس <cstring>

استخدمت الدالة من قبل .. ولكن لا فائدة ...

#include<iostream>
#include<string> 
using namespace std;
int main()
{
        char nom[10];
        cout<<"entrez votre nom:";
        cin.get(nom,9);
        if(strcmp(nom,"ali")==0)
        cout<<"A "<<endl;
        if(strcmp(nom,"brahim")==0)
        cout<<"B "<<endl;
        if(nom!="ali" && nom!="brahim")
        cout<<"erreur"<<endl;
        system("pause");
        return 0;
}

مالفرق بين المكتبتين string و cstring ؟

اقتباس
أكرمك الله ولكني لست أكثر من مبتدئ و لا أقولها تواضعاً و لكنها حقيقة .

ولا يهمك .. المهم أنك قدمت ما عندك من أفكار

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

و هي من الشكل

عفوا أخي الكريم .. ولكن حسب ما أعتقد فإن الصنف string غير موجود في السي .. والكود الذي كتبته ليس بلغة السي .. بل هو بالسي++ !!!

مازلت أنتظر إجابة أسئلتي من أعضاء هذا المنتدى الغالي:

اقتباس

ماذا يقابل الصنف string في لغة السي ؟؟

عندما نكتب دالة تستقبل مصفوفة و لا تعيد شيء (بغض النظر عن عمل الدالة):

void fonc (char str[])

لماذا لا نكتب عدد حروف المصفوفة بداخل تعريف الدالة ؟؟؟

تم تعديل هذه المشاركة بواسطة khaled_prg في 21 مارس 2010 في 21:27

#7
اقتباس
عفوا أخي الكريم .. ولكن حسب ما أعتقد فإن الصنف string غير موجود في السي .. والكود الذي كتبته ليس بلغة السي .. بل هو بالسي++ !!!

كلامك صحيح تماماً و تصحيحاً لكلامي الذي أوردته أعلاه.. و مما اتضح لي أنه للصنف string في السي بلس بلس تأخذ نوعان نوع مصفوفات c و نوع مصفوفات c++ ضمن اللغة نفسها أما النوع الأول وهو صنف c فهو كالشكل التالي وهذا الصنف لا يحتاج إلى مكتبة string

char string[256];                               // A nice long string

  cout<<"Please enter a long string: ";
  cin.getline ( string, 256, '\n' );              // Input goes into string

و الصنف الثاني و هو صنف c++ هو من الشكل

#include<string.h>
.
.
.
string num ;

تم تعديل هذه المشاركة بواسطة yahya91 في 21 مارس 2010 في 22:37

#8

هذا الكود:

#include<iostream>
#include <cstring>
#include <string>
using namespace std;
int main()
{
        string  nom;
        cout<<"entrez votre nom:";
        cin>>nom;
        if(strcmp(nom.c_str(),"ali")==0)
        cout<<"A "<<endl;
        else if(strcmp(nom.c_str(),"brahim")==0)
        cout<<"B "<<endl;
        else
        cout<<"erreur"<<endl;

        return 0;
}
tvquran_6.gif

#9
اقتباس
كلامك صحيح تماماً و تصحيحاً لكلامي الذي أوردته أعلاه.. و مما اتضح لي أنه للصنف string في السي بلس بلس تأخذ نوعان نوع مصفوفات c و نوع مصفوفات c++ ضمن اللغة نفسها أما النوع الأول وهو صنف c فهو كالشكل التالي وهذا الصنف لا يحتاج إلى مكتبة string

كيف يا أخي الحبيب ؟؟؟

على حسب علمي .. فإن الصنف string تنفرد به لغة السي++ عن لغة السي ..

المصفوفات الناتجة عن الصنف string تسمى بالسلاسل الحرفية , أما المصفوفات الأخرى فهي مصفوفات حرفية و الفرق بينهما هو أن المصفوفات الحرفية تخزن في منطقة من الذاكرة (للقراءة و الكتابة) بحيث يمكن التعديل عليها (أي المصفوفة) أو تغيير بياناتها أو مسح بعض حروفها ... إلخ أما السلاسل الحرفية فهي نوع خاص من المصفوفات الحرفية و يطلق عليها لفظ const char array وهذا النوع من المصفوفات ثابت .. لا يمكن التعديل عليه لأنه يخزن في جزء من الذاكرة (للقراءة فقط).

يوجد نوع واحد من الصنف string وفي السي++ فقظ.

أنت قلت أنه يوجد نوعان .. يتم الإعلان عن النوع الأول هكذا:

char string[256];

لاحظ أننا لم نستخدم الصنف string و إنما قمنا بالإعلان عن مصفوفة اسمها string و تتكون من 256 حرف.

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

بالنسبة للمشرف فهد:

أخي الغالي .. أنا لا أريد الكود .. فقد قام الأخ يحي بكتابته سلفا.

عندي بعض الملاحظات على الكود الذي كتبته:

1-لم أفهم استخدامك للعبارة c_str

        if(strcmp(nom.c_str(),"ali")==0)

2-لماذا قمت بتضمين المكتبتين string و cstinrg ؟ ألا تكفينا إحداهما ؟

مازلت أنتظر إجابة أسئلتي من أعضاء هذا المنتدى الغالي:

اقتباس
ماذا يقابل الصنف string في لغة السي ؟؟

عندما نكتب دالة تستقبل مصفوفة و لا تعيد شيء (بغض النظر عن عمل الدالة):

void fonc (char str[])

لماذا لا نكتب عدد حروف المصفوفة بداخل تعريف الدالة ؟؟؟

#10

عندما تتعامل مع نص من النوع string يكفيك الدوال الملحقه فيه وتستطيع المقارنه ايضا والايضافه والقص وغير ذلك.

إذا كنت تتعامل مع نوع مصفوفة من char فتحتاج الدوال التي بالمكتبه cstring للمقارنه والنسخ والاضافه وغير ذلك.

استخدمت c_str لان الداله التي استخدمتها للمقارنه هي من التي تتعامل مع مصفوفة حرفيه حولت النوع من string الي char*

tvquran_6.gif

#11

لماذا لا نستطيع مقارنة مصفوفة حرفية مع الكلمتين ali و brahim ؟

أرجوا منك يا فهد الإجابة على أسئلتي:

ماذا يقابل الصنف string في لغة السي ؟؟

عندما نكتب دالة تستقبل مصفوفة و لا تعيد شيء (بغض النظر عن عمل الدالة):

void fonc (char str[])

لماذا لا نكتب عدد حروف المصفوفة بداخل تعريف الدالة ؟؟؟

#12
اقتباس
ماذا يقابل الصنف string في لغة السي ؟؟

في السي نتعامل مع النصوص كمصفوفة حرفيه char*

في السي بلس نستخدم الفئة string

لماذا لا نكتب عدد حروف المصفوفة بداخل تعريف الدالة ؟

فقط مؤشر لموقع اول خانه من المصفوفة يحدد موقعها .

وإذا كانت المصفوفه عباره عن نص وليس رقم فيكون العنصر الاخير مخزن به '0\' ويستدل به على نهاية المصفوفة

tvquran_6.gif

#13
اقتباس
في السي نتعامل مع النصوص كمصفوفة حرفيه char*

عفوا أخي الكريم .. ما علاقة هذا بسؤالي ؟؟؟

اقتباس
فقط مؤشر لموقع اول خانه من المصفوفة يحدد موقعها .

وإذا كانت المصفوفه عباره عن نص وليس رقم فيكون العنصر الاخير مخزن به '0\' ويستدل به على نهاية المصفوفة

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

#14

السلام عليكم:

اقتباس
ماذا يقابل الصنف string في لغة السي ؟؟

كنت أعتقد انك تعني بسؤالك ماهو المقابل في الوضائف والدوال . لكن يظهر ان سؤالك يختلف عن ذلك.

اقتباس

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

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

لكن غير الحرفيه تحتاج الي ذلك .

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

مثلا :

  int wrt(num[],int count_num)
tvquran_6.gif

#15
اقتباس
كنت أعتقد انك تعني بسؤالك ماهو المقابل في الوضائف والدوال . لكن يظهر ان سؤالك يختلف عن ذلك.

سؤالي هو:كيف نكتب هذا الكود بلغة السي ؟؟؟

#include<iostream>
#include <string>
using namespace std;
int main()
{
        string nom;
        cout<<"entrez votre nom:";
        cin>>nom;
        if(nom=="ali")
        cout<<"A "<<endl;
        if(nom=="brahim")
        cout<<"B "<<endl;
        if(nom!="ali" && nom!="brahim")
        cout<<"erreur"<<endl;
        system("pause");
        return 0;
}

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

لكن غير الحرفيه تحتاج الي ذلك .

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

شرح جميل ووافي وكافي .. جزاك ربي الجنة.

#16

هذا الكود. بالسي.

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

main()
{
        char nom[30];
        printf("entrez votre nom:");
        scanf("%s",nom);
        if(strcmp(nom,"ali")==0)
        printf("A \n");
        if(strcmp(nom,"brahim")==0)
        printf("B \n");
        if(strcmp(nom,"ali") && strcmp(nom,"brahim"))
        printf("erreur \n");
        getchar();
        return 0;
}
tvquran_6.gif

#17

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

بالنسبة للكود ..واضح وجميل أيضا .. ولكن مالفرق بين الكتابتين:

if(strcmp(nom,"ali")==0)

if(nom=="ali")

ملاحظة:أرجوا منك يا أستاذي الفاضل أن ترد علي في موضوع "مشكلة .. شيب رأسي !"

جزاك ربي الجنة

#18

الطريقة الاولى لاننا نتعامل مع مصفوفة حرفيه . والمصفوفة لاتقارن بمصفوفه إلا عنصر بعنصر. والدالة تقارن بين المصفوفتين وتعود بالنتيجة

الثانية : اذا كان لدينا نص من النوع string فان الفئه تتعامل مع علامه المساواه لانها معادة التعريف في الفئة

tvquran_6.gif

#19
اقتباس
الطريقة الاولى لاننا نتعامل مع مصفوفة حرفيه . والمصفوفة لاتقارن بمصفوفه إلا عنصر بعنصر. والدالة تقارن بين المصفوفتين وتعود بالنتيجة

الثانية : اذا كان لدينا نص من النوع string فان الفئه تتعامل مع علامه المساواه لانها معادة التعريف في الفئة

شرحت فأوضحت فأبدعت ...

لا أدري ماذا أقول لك .. لا أجد كلمة توفيك حقك

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