
المشاركة الأصلية كتبت بواسطة Night_3
السلام عليكم
أخي Wolf Sniper
لقد قمت بتحقيق الشرط الأول و هو كتابة كل ما شاء المستخدم من النصوص (مصفوفة سجلات)
و لا أستطع تحقيق الشرط الثاني وهو كسر حلقة فور ..
هل يمكنك أن تعطيني الكود
و لم تجبني عن
اذا أدخل المستخدم كلمة سيئة مثل 6
ألا تطبع في نهاية البرنامج
و هذا ما قصدته بكلمة right
هل يمكن تحقيق هذا ؟
و شكرا لك على اضافة درس المؤشرات
رغم أني لم أفهم أهميتهم حتى الآن
و السلام
بالنسبة للحل أخي Night_3 :
هذا هو الحل الذي كتبته و الموجود في الصورة في الرد الذي شرحت لك الإجابة فيه .. و لكنه كما قلت أنت أنه لم يعالج مشكلة عدم كتابة الرموز و الأشكال و الأرقام .. لذلك سأضع هذا الحل و سأشرحه ثم سأعطيك الحل الآخر و الذي يعالج تلك المشكلة :
كود:
#include <iostream.h>
#include <string.h>
void main()
{
char s[100];
cout << "Enter a Sentence :\n";
cin.getline(s, 100);
for(int i=0; i<strlen(s); i++)
{
if( s[i]==100 && s[i+1]==111 && s[i+2]==105 && s[i+3]==116 )
{
for(int j=0; j<i; j++)
cout << s[j];
cout << endl;
break;
}
}
}
شرح الحل :
1 – المكتبة ( string.h ) من أجل الدالة ( strlen ) و التي سنستخدمها لكي نحدد عدد المحارف المكتوبة و الموجودة في المصفوفة ( s ) .. و لقد شرحت هذه الدالة أكثر في درس المصفوفات لذلك أنصحك بالرجوع إليه .
2 – في التابع main : قمنا بتعريف المصفوفة ( s ) و هي تتسع لمائة محرف .. و هذه المصفوفة سيتم تخزين فيها الأحرف المدخلة من قبل المستخدم .. و من ثم استخدمنا cin.getline لكي نخزن جميع السطر المكتوب داخل المصفوفة ( s ) .. و أيضاً شرحت هذه الفقرة في درس المصفوفات .
3 – الأن نحن نريد اختبار وجود الكلمة ( doit ) داخل المصفوفة .. لذلك علينا اختبار جميع الأحرف الموجودة بداخل تلك المصفوفة .. و بالتالي سنحتاج إلى حلقة for للتنقل بين قيم المصفوفة ( s ) .. إذا عرفنا الأن فائدة الحلقة الأولى .. و لاحظ أيضاً كيف استخدمنا الدالة ( strlen ) لتحديد القيمة النهائية في هذه الحلقة .. حيث أننا نريد فقط القيم المدخلة و لا نريد حجم المصفوفة كله ( 100 ) .
4 – داخل الحلقة for : قلنا أننا سنختبر وجود الكلمة ( doit ) لذلك علينا وضع شرط ( if ) .. و لكن ماذا سيكون ذلك الشرط ؟ سنستخدم جدول الآسكي كما قلت لك من أجل التسهيل .. بحيث يمكن ذلك عن طريق معرفة الرمز المقابل في الآسكي لكل حرف من أحرف الكلمة ( doit ) .. و هي كالتالي :
الحرف ( d ) يقابله في الآسكي العدد 100 .
الحرف ( o ) يقابله في الآسكي العدد 111 .
الحرف ( i ) يقابله في الآسكي العدد 105 .
الحرف ( t ) يقابله في الآسكي العدد 116 .
ملاحظة / راجع مفهوم نظام الترميز ASCII و كيفية استخدامه لحل الكثير من المسائل في درس المصفوفات أيضاً .
الأن أصبح الشرط سهلاً مع ملاحظة استخدام الأدلة ( i ) و ( i+1 ) و ( i+2 ) و ( i+3 ) من أجل تحديد أماكن وجود تلك الأحرف في المصفوفة ( s ) .
5 – الأن إذا تحقق الشرط نكون قد وجدنا الكلمة ( doit ) .. لذلك كل معلينا الأن هو طباعة جميع الأحرف التي تسبق تلك الكلمة .. لذلك سنحتاج إلى حلقة for أخرى لكي تطبع لنا تلك الأحرف .. و سيكون دليل البداية لتلك الحلقة هو الصفر و النهاية سيكون الدليل ( i ) !!! لماذا ؟ لأننا من خلال الشرط السابق اكتشفنا أن الكلمة ( doit ) موجودة عند الدليل ( i ) .. و نحن نريد طباعة الأحرف إلى أن نجد تلك الكلمة .. و داخل الحلقة طبعاً سنطبع الأحرف المطلوبة ..
6 – ما زلنا الأن داخل الشرط ( أي أننا حددنا موقع الكلمة doit ) .. لذلك سنقوم بالنزول سطراً جديداً ثم سنخرج من الحلقة عن طريق ( break ) و ذلك لأننا لا نريد اختبار باقي القيم حيث أننا وجدنا الكلمة المطلوبة .
:: تطوير الحل ::
الأن بالنسبة لتطوير هذا الحل إلى حل أفضل يقوم بطباعة الأحرف الأبجدية فقط و التي تسبق الكلمة ( doit ) .. سنستخدم لذلك الدالة ( isalpha ) و أيضاً شرحت استخدامها في درس المصفوفات و هي تستخدم لاختبار فيما إذا كان الوسيط المرسل لها حرفاً أبجدياً أم لا .. و هذه الدالة تحتاج إلى المكتبة ( ctype.h ) .. شاهد الحل و من ثم سأشرحه ( فقط أضفنا شيئاً صغيراً على الحل السابق ) :
كود:
#include <iostream.h>
#include <ctype.h>
#include <string.h>
void main()
{
char s[100];
cout << "Enter a Sentence :\n";
cin.getline(s, 100);
for(int i=0; i<strlen(s); i++)
{
if( s[i]==100 && s[i+1]==111 && s[i+2]==105 && s[i+3]==116 )
{
for(int j=0; j<i; j++)
if( isalpha(s[j]) )
cout << s[j];
else
cout << " ";
cout << endl;
break;
}
}
}
شرح الحل :
1 – لاحظ أن مشكلتنا هي أثناء الطباعة حيث أننا نريد طباعة الأحرف الأبجدية فقط .. لذلك سنتجه فوراً إلى الكود الخاص بذلك و هو موجود في داخل الحلقة الثانية .
2 – هنا سنطور الكود إلى التالي : إذا كانت القيمة حرفاً أبجدياً فسنطبعه و إلا فسنطبع بدلاً منه الفراغ .. و بهذه الطريقة ستظهر الجملة خالية تماماً من أي رموز أو أرقام .
أرجو أن يكون الحل واضح و آمل أن يكون هو الذي تريد .. بالتوفيق
و أرحب بجميع المشتركين الجدد ..
القائمة :
1- son of Qatar .
2 - habash1986 .
3 - Son Of UAE .
4 - SONIC4ANIME .
5 - asf4ever .
6 - ^عبدالعزيز..ع^ .
7 - kokekemo .
8 - UAE Naruto .
9 - عنان 2005 .
10- ستو كايبا .
11 - Imaj .
12 - banan 86 .
13 - عبدالله..ع .
14 - the unforgiven .
15 - الرقمي .
16 - رنجوجيت .
17 - BoWalaaad .
18 - IWANTYOURHELP .
19 - yaser_xp .
20 - Night_3 .
21 - SomeABD .
22 - هاني الفقي .
23 - XxmanX .
24 - drbmsh .
25 - flent10 .
26 - ThE* DaRk *SiDe .
27 - TheMafia .
28 - samate .
29 - ماارياا .
30 - xdetective90 .
31 - IGI2000 .