مشاهدة النسخة كاملة : فكر معانا وبرمج ويانا(فكرة برنامج )
minosoft 24-07-2006, 09:24 PM السلام عليكم ورحمة الله
معايا فكرة برنامج ياريت نشارك فى حلها مع بعض .
البرنامج يرتب مجموعة من الاسماء ترتيب ابجدى مع العلم ان عدد الاسماء عدد عشوائى يدخله المستخدم وبعدها يدخل الاسماء .
وكمان الاسم يكون ثلاثى يعنى يرتب الاسم الثلاثى ترتيب ابجدى .
ياريت الفكرة دى تنال اهتمامكم وشكرا
صديقكم minosoft >
منطلق بطموحي 24-07-2006, 10:08 PM فكرة ممتازة...
اتمنى ان ارى تفاعل الاعضاء فيها
هممم طيب نبدا بالتفكير ....
ما هي التقنيات التي سنستعملها لحل المشكلة؟
هل هي المصفوفات ؟ ام string ؟ ام المؤشرات pointers ام خليط بين هذا و ذاك ؟
هممم
فكروا معنا ... rahe#@
منطلق بطموحي 24-07-2006, 10:21 PM بعا هناك الكثير من الحلول
ساحاول اعطاء بعض التلميحات
ساعطي فكرتين و الباقي على الاعضاء :
فكرة رقم (1) :
1. تصميم برنامج مقسم الى دوال يحوي على دالة بها احد انواع الترتيب sorting بحسب قدرة الفرد و معرفته ..مثلا ال bubble sort
2.تصميم دالة اخرى وظيفتها هي ترتيب الاسماء و هنا نستعمل المؤشرات ومن الدوال المهمة بالمؤشرات التي تسهل الحل كالتالي:
strcmp() التي تاخذ 2 arguments عبارة عن strings للمقارنة من هي الاكبر من الاخرى
3.تصميم دالة تعرض النتيجة ( طباعة )
في الرد التالي ساعرض امثلة على strcmp عملها و تمهيد و تمهيد بسيط للمؤشرات
منطلق بطموحي 24-07-2006, 10:38 PM دوال المكتبة #include<cstring> الجاهزة :
هناك العديد منها strcmp و strcpy و strncpy و strlen و strcat الخ...
ساتطرق الان الى strcpy و strcmp
مثال على strcpy :
#include<iostream>
#include<cstring>
using namespace std;
int main()**
char x[] ="I love C++";
char y[20];
strcpy(y,x); //copying x content into y
cout<<"string x = "<<x<<endl;
cout<<"string y = "<<y<<endl;
return 0;
}
سيكون هنا محتوى x نفس محتوى ال Y حيث قمنا بعملية النسخ عن طريق الدالة
مثال على strcmp :
#include<iostream>
#include<cstring>
using namespace std;
int main()**
char *x ="I love C++";
char *y=" Nice ";
cout<<strcmp(x,y)<<endl;
return 0;
}
النتيجة تكون سالبة اذا كان ال string لاول اصغر من الثاني
و موجبة اذا كان الاول اكبر من الثاني
و تساوي الصفر اذا تساوى ال strings
بعد هذه القصه يمكن الاستعانة بها في تصميم البرنامج المطلوب
فكرة ثانية :
1.تصميم دالة fun(char *name); تاخذ الاسم من المستخدم عن طريق الامر cin.getline
2.تصميم دالة تقوم بقراءة الاسماء و هنا يمكن الاستعانة بالدالة strlen التي تعطي طول الكلمة
3.تصميم دالة ل swap حيث تبدل اماكن الاسماء بناء على المطلوب
نبراس cs 25-07-2006, 12:06 AM اخي العزيز : minosoft
بصراحه فكره جميله ولكن يوجد عدد لا نهائي من الطرق لحلها زي ما ذكر اخي (منطلق بطموحي)
هل من الممكن لكل شخص ان يحلها بطريقته ومن ثم نشوف افضل حل ويشر ح شكل كامل
او هناك قيود على حل البرنامج
ارجو الإفاده
جاري الحل ...........
انتضرونا ...............
نبراس cs 26-07-2006, 02:55 AM مساء الخير .....
بصراحه مثل ما ذكرت سابقاً هناك عدد لا نهائي من الحلول ولكن حاولت ان اجد اسهلها للفهم
لتعم الفائده
حيث استخدمت seletction sort واتوقع انه سهل جدأ ومفهوم وهو يبحث عن اصغر عنصر ويضعه في الأول وهكذا
يوجد عدد لا نهائي من انواع sort ومن افضلها للبيانات الكبيره هو marge sort واحذر من استخدام
buble sort حيث انه بطئ جداً وسرعته O(n^2) a
هذا هو الكود ارجو ان يكون واضحاً للجميع ....
// Uncomment the next line to turn OFF asserts.
// #define NDEBUG
#include <iostream>
#include<cstring>
#include<string>
using namespace std;
void sortingFunction();
void selectionSort(string *stringArray,int numberOfPersons);
void print(string* stringArray,int numbreOfPersons);
//********************************
int main()
**
string *nameArray,temp;
int numberOfPersons;
cout<<"How many Persons do you have ?"<<endl;
cin>>numberOfPersons;
nameArray=new string[numberOfPersons];
for(int i=0;i<numberOfPersons;i++)
**
cout<<"Plese enter the name of this Person\n e.g firstName-midName-LastName"<<endl;
cin>>nameArray[i];
}
cout<<"the array befor sorting "<<endl;
print(nameArray,numberOfPersons);
selectionSort(nameArray,numberOfPersons);
cout<<"the array befor sorting "<<endl;
print(nameArray,numberOfPersons);
return 0;
}
void selectionSort(string *stringArray,int numberOfPersons)
**
string smallestData;// temp;
int smallestIndex,i,j;
for( i=0;i<numberOfPersons ;i++)
**
smallestData=stringArray[i];
smallestIndex=i;
for( j=i;j<numberOfPersons;j++)
if(smallestData>stringArray[j])
** smallestData=stringArray[j];
smallestIndex=j;
}
if(smallestIndex!=i)
//temp=stringArray[i];
//stringArray[i]=stringArray[smallestIndex];
//stringArray[smallestIndex]=temp;
// we will use the swap function ...
stringArray[i].swap(stringArray[smallestIndex]);
}
}
void print(string* stringArray,int numberOfPersons)
**
for(int i=0;i<numberOfPersons;i++)
cout<<"Person number "<<i+1<<" "<<stringArray[i]<<endl;
cout<<"the total is "<<numberOfPersons<<endl;
}
يمكنك استخدام داله getline إذا رغبت بتغيير الفواصل
وشكراً
angel83 30-07-2006, 05:31 PM رائع ... أخوتي ...
فأنا أجد بينكم الجديد والمفيد دوماً ....
وهي فكرة رائعه .... أن نرتب الأسماء ترتيب أبجدي ...
على ما اظن تبدأ فكرة الحل بقراءة المحرف الأول من كل أسم وترتيبه ابجديا .. فأن تساول المحرفان في الطول ..
ننتقل للمحرف الثاني من هذه الأسماء ونرتبها ,, لإان تساوة ننتقل للمحارف الثالثة لهذه الأسماء .....وهكذا دواليك ..
وبصراحه لم أفهم الطريقه التي اتبعا أخي نبراس في برنامجه ...فأرجوا ان تعطيني نبذة عن الحل الذي سلكته ...
وأرجو من المهندس منطلق بطموحي ... أن يحدثني أكثر عن دوال المكتبات وما أستخدام كل داله ...
وشكرا ....
نبراس cs 02-08-2006, 05:58 PM اخي العزيز: angel83
معذرة على التأخر في الرد (مشغول مع الإختبارات )
ما هو الغير مفهوم في الكود وسوف اشرحه لك ....
angel83 02-08-2006, 06:47 PM أنا فتاة أخي نبراس ... أسمي رانيا ..
طريقة عمل البرنامج هذا ما أردت أن أعرفه ...
أننا سوف ندخل عدد الأسماء ومن ثم نرتب البرنامج على هذا الأساس ..
وأرجوا أن تشرح لي عن الكود الذي كتبته أكثر
وألاحظ أسماء مكتبات جديدة بالنسبه لي .. لإأرجوا أن تعطيني فكره أكثر عنها ...
string هل نقصد بها مكتبه لسلسلة محارف
وأيضا cstring ....
ولك جزيل الشكر ...
نبراس cs 03-08-2006, 02:21 AM اختي العزيزه: angel83
بصراحه انا ليس من عادتي اني اكتب برنامج بدون تعليقات ولكن هنا عند اضافه كود في المشاركه ينقلب رأساَ على عقب
والأحرف العربيه ما تطلع لكن راح ارفق لك الملف ويكون فيه كل التعليقات اللازمه
واللي ما يوضح ارجو كتابته هنا ليتم الإجابه عليه ولتعم الفائده ....
فكره مبسطه:
تم تقسم الكود إلى 3 دوال مع الداله الأساسيه main
هذ الداله تقوم بفرز الأسماء وتستدعي الداله التي تحتهاvoid sortingFunction();
void selectionSort(string *stringArray,int numberOfPersons);هذه الداله هي اللتي ترتب الأسماء فعلياً بطريقهselection
void print(string* stringArray,int numbreOfPersons); هذه الداله للطباعه
والباقي تجدينه في الملف ...
angel83 03-08-2006, 05:50 PM tknk@@
شكرا لك الأن أتضحت الصورة عندي ....
ولكن كيف أستطيع أن أجد المكتبات وأستخدامات كل منها ...
وشكرا
رانيا .....
نبراس cs 03-08-2006, 06:39 PM http://www.msdn.com
Mr.Time1 04-08-2006, 06:28 AM في الواقع فكرة رائعه
وكنت اتمنى لو اشارك فيها لكن لا اعتقد انه يوجد الوقت الكافي
في الحقيقة ربما يشكل الامر على من يدخل الموضوع ويعتقد الامر معقد بالعكس الأمر بسيط للغاية
وكما قال الاستاذ نبراس sc
بصراحه فكره جميله ولكن يوجد عدد لا نهائي من الطرق لحله
ايضا يوجد عدد من التقنيات وربما تستعمل احداها او خليط بينها
كما قال الأستاذ منطلق بطموحي
هناك العديد منها strcmp و strcpy و strncpy و strlen و strcat الخ...
ساتطرق الان الى strcpy و strcmp
لذلك تتعدد الأجابات وتتعدد الحلول وربما تتعدد الطرق
لذلك قررت ان اشترك لأوضح مفهوم لدى الاعضاء الزوار لهذا الموضوع
اخواني الفكرة جميلة جدا ً ورائعه وتستحق الثناء والشكر لصاحبها وايضا تستحق التفكير وهدر قليلا من الوقت من اجلها فربما نستفيد منها لاحقا
اخواني : لا يعني تعاملنا مع الحروف صعوبة اكثر من الارقام , فنحن نستطيع ان نتعامل مع الحروف كأرقام لانها اصلا ارقام
فكما تعلمون أنه بأمكاننا تعريف
char x='a'
وعندما نطبع x ستكون النتيجه a
ونستطيع ايضا ان نعرف x بطريقة الارقام
char x=97;
اعلم تمام ان هذه المعلومات قديمة بالنسبة لكم , لكن مالفائدة من طرحي لها ؟!
الفائدة طبعا بواسطة التكرار نستطيع ان نقارن مثلا بين سلسة نصوص ونعرف من ستحتل الترتيب الاول عن الاخرى
يوجد مشكلة .
لو اردنا المقارنه بين Ali و ali من هو الاول؟ !
طبعا في لغة الحاسب Ali هو الاول
ولكن هذا مرفوض بلغة البشر لان Ali هو نفسه ali
لذلك نستطيع ان نتغلب على هذه المشكلة بواسطة التابعان toupper و islower الموجودان بالمكتبة cctype
كما تشاهدون المسألة بدأت تحل
لذلك انا ادعوا كل من له علم في لغة السي ++ إلى المشاركة الفعالة بهذه المسألة , ثم ان الموضوع موضوع نقاش (تقبل آراء ورفض آخرى)
احببت من خلال طرحي لهذه الاسطر ان اوضح مدى سهولة الامر , وبأنه ليس بالمسألة المعقدة التي تدعوا إلى الهروب وترك المجال مفتوح فقط لكبار الاساتذه , فانا اعلم ان اغلب من شارك بهذا الموضوع يعلم كيفية حل المسألة ولكن يحاول النقاش فقط, وانا استغل هذه الفرصة لادعوكم بالمشاركة , ولولا ضيق الوقت لدي لكنت عضو فعال في هذه المسألة ولكن ادعو كل من مر على ردي بالمشاركة , وانا سأكون متواجد لاقدم المساعدة للبعض , المساعده وليس الحل
اي اقدم مفاهيم متعلقة بالموضوع , افكار , لكن حل مباشر سأكون بذلك كما قال احد الاساتذه بهذا المنتدى " أضحك عليك"
سأقدم فيما يلي دالة تقوم بالمقارنه بين مجموعة اسماء , سأحاول اعتبارها تسهيل للحل ,لذلك فستجدون الدالة تقارن بين اسماء تحتوي كل منها على اسم واحد فقط وليس ثلاثي ! ايضا عدد الاسماء معروف مسبقا
وهي بطريقة الترتيب الفقاعي bubble sort
void change(char *x[])
**
char *s;
for(int j=0;j<3;j++)
**
for(int i=0;i<3;i++)
if (strcmp(x[i],x[i+1])==1)
**
s=x[i];
x[i]=x[i+1];
x[i+1]=s;
}
}
}
تستطيعوا تجريبها من خلال اربع اسماء مكون كل واحد منها من اسم وحيد
main()
**
char *x[4]=**"Naser","Khalid","Ali","Ahmad"};
change(x);
for(int i=0;i<4;i++)
cout<<x[i]<<endl;
return 0;
}
عرضت من خلال ذلك احد الافكار والتي تبين سهولة الامر وتركت مجال التفكير محصور بين طريقة ادخال الاسم ثلاثيا وطريقة تحديد عدد الاسماء
اتمنى مشاركة الجميع مشاركة فعليه وانا سأقوم بالمساعده التي تبين الفكرة دون الحل
هذا واتمنى التوفيق للجيمع
نبراس cs 04-08-2006, 08:29 PM اخي العزيز: Mr.Time1
بصراحه رد فيه هذه المشاركه اثلج صدري واتمنتى ان الأعضاء يتحمسون ويشاركون
انا وضعت الحل ليس لأجل ان اضهر اني فاهم ولكن لأجل ان ابين ان المسألة بسيطه
واتمنى من الأعضاء تطوير الكود ليصبح بشكل افضل (قد تركت بعض الأشياء عمداً لترك مجال للتطوير)
اشكرك اخي على المشاركه ......
minosoft 07-08-2006, 04:38 PM ياجماعة كل واحد يحل الحل اللى عايزه ومش مهم نوصل للهدف باظبط لكن نلقى حلول قريبة لان البرنامج فيه كذا طريقة وداخلة فيه الدوال والاسترنج واستخدام البوينتر وياريت كمان اى حد يكون عنده شرح لمسائل محلولة تستخدم البوينتر او الكلاس او اى حاجة يعرضها علشان اللى معندهوش فكرة يقدر كمان يشارك معانا . وشكرا لحسن اهتمامكم قريب جدا هعرض حل لجزء من الفكرة .
فاطمه العمري 20-08-2006, 12:39 AM موضوع جيد وحلول كثيرة بس انا بفضل حل المسأله
بطريقة الترتيب الفقاعي
bubble sort
طريقه سهلة الفهم والكتابه وبتستطيع من خلالها تحل برامج مشابهه
|