سؤال بلغة سي عن مصفوفة سلاسل
السلام عليكم
اخواني عند محاولتي كتابة دالة تقوم بالبحث عن كلمة ما اذا كانت موجودة في المصفوفة ام لا لم افلح في ذلك
اذا ممكن حد يشوفلي الخطأ وين ويرشدني
- int CheckWord (char ch[L])
- {
- int i,j;
- char dic[W][L];
- for (i=0,j=0;j<L;i++)
- if (ch[j]!=dic[i][j])
- i++;
- else if(ch[j]!=dic[i][j])
- j++;
- return 1;
- return 0;
- }
بارك الله فيكم سلف
السلام عليكم
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
هذه الدالة :
- int CheckWord (char ch[])
- {
- int i;char dic[W][L];
- sortarray(dic);
- for(i=0;i<W;i++)
- if(strcmp(ch,dic[i])==0) return 1;
- return 0;
- }
السلام عليكم
اخي الكريم فهد بارك الله فيك
وأكثر الله من امثالك
افضالك كثيرة :)
في الحقيقة انا حتى الآن لم افهم جيدا استعمال الدوال الخاصة بالسلاسل مثل
strcmp
strcpy
الخ..
هل لك اخي ان تعطيني لمحة عنها او رابط من المنتدى او غيره حتى استفيد اكثر
وجزاك الله عني كل خير وبارك الله فيك
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
بارك الله فيك اخي الكريم
اخي الآن انا احاول ان استقبل جملة من المستخدم وافحص ان كانت الكلمات ملائمة لمخزن الكلمات في المصفوفة.
الفكرة التي لدي هي انني اريد استقبل الجملة كاملة وبعدها اخذ كلمة كلمة بواسطة scanf وليس gets
ومن ثم اخذ هذه الكلمة ومقارنتها مع مخزن الكلمات
في حال كانت الكلمة موجودة يعيد لي الرقم 1 وفي حال غير موجودة يعيد لي الكلمة 0.
لكني لم استطع تنفيذها برمجيا وكتبت كود لكنه لم يفي بالطلب، هذه دالة الـ main التي قمت بكتابتها للآن.
ماذا ينقصها وماذا علي ان استعمل (هل هناك دوال معينة علي استعمالها)؟
- void main()
- {
- char dic[W][L]; //array for the dictionary
- char word[L]; //array for the word that the user enter it
- char sen[M]; //array for the sentence that the user will enter it.
- int i;
- char c;
- sortarray(dic);
- printf("enter sentence:n");
- gets(sen);
- while (gets(sen))
- {
- scanf("%s", &sen);
- printf("%d",CheckWord(word));
- }
- }
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
هذ الدالة الرئسية:
- int main()
- {
- char dic[W][L];
- char word [100];
- char *split;
- sortarray(dic);
- printf("enter sentence : ");
- gets(word);
- split=strtok(word," ");
- while(split!=NULL)
- {
- printf("%s %dn",split,CheckWord(split));
- split=strtok(NULL," ");
- }
- return 0;
- }
السلام عليكم
بارك الله فيك اخي الكريم
هذه المرة الأولى التي ارى فيها هذه الدالة (strtok)
فقرأت عنها من الموقع الذي وضعتلي اياه
لكني للأسف لم اعرف حتى الآن كيف اتعامل معها فيما بعد...
بمعنى انني اريد ان آخذ كل كلمة ارجعت لي الرقم صفر بمعنى انها غير موجودة في مهزن الكلمات واكتب للمستخدم رسالة انها غير موجودة
حاولت مراراً ولم اعرف التعامل
هذه آخر محاولة قمت بها
- while (CheckWord(split)==0)
- {
- printf("%s is not a word in our vocabulary, you may want to switch this word to the following
substitutes:n",split); - }
اي الخطأ وكيف تكون تركيبة الكود ؟
جزيتم خيرا اخي
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
هذا الكود يظهر الرسالة اذا كانت الكلمه غير موجوده:
- int main()
- {
- char dic[W][L];
- char word [100];
- char *split;
- sortarray(dic);
- printf("enter sentence : ");
- gets(word);
- split=strtok(word," ");
- while(split!=NULL)
- {
- if(!CheckWord(split))
- printf("%s is not a word in our vocabulary, you may want to switch this word to the follow
ing substitutes:",split); - split=strtok(NULL," ");
- }
- }
السلام عليكم
بارك الله فيك اخي
لكني اريدها خارج حلقة التكرار
لانني اريد ان اعطي للمستخدم خيارات لكلمات شبيهة بحالة اراد تبديل الكلمة
لذلك يجب ان يكون مجال للمستخدم ان يختار ...
هل استطيع عمل كل ذلك في حلقة التكرار while ?
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
نعم فقط ضع متغير تتحقق به من عدم وجود الكلمه ؟.
- int main()
- {
- char dic[W][L];
- int ok=1;
- char word [100];
- char *split;
- sortarray(dic);
- printf("enter sentence : ");
- gets(word);
- split=strtok(word," ");
- while(split!=NULL)
- {
- if(!CheckWord(split)) ok=0;
- split=strtok(NULL," ");
- }
- if(!ok) printf("No");
- }
السلام عليكم
بارك الله فيك
بمعنى اني استمر بباقي البرنامج في حلقة التكرار ؟
انا كنت قد بدات
لكني واجهت مشكلة عن محاولة التشغيل
هذا الكود:
- int main()
- {
- char dic[W][L];
- char word [12];
- char *split;
- int i;
- sortarray(dic);
- printf("enter sentence : ");
- gets(word);
- split=strtok(word," ");
- while(split!=NULL)
- {
- if (!CheckWord(split))
- {
- printf("%s is not a word in our vocabulary, you may want to switch this word to the following
substitutes:n",split); - for (i=0;i<5;i++)
- {
- if(strncmp(word[i],split[i],4)==0)
- printf("%d. %sn",i+1,word[i]);
- }
- }
- split=strtok(NULL," ");
- }
- return 0;
- }
وهذا وصف المشكلة
error C2664: 'strncmp' : cannot convert parameter 1 from 'char' to 'const char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
بهذه الطريقة:
- int main()
- {
- char dic[W][L];
- char word [100];
- char *split;
- char tmp[100];
- int i=0;
- int m=0;
- sortarray(dic);
- printf("enter sentence : ");
- gets(word);
- split=strtok(word," ");
- while(split!=NULL)
- {
- if (!CheckWord(split))
- {
- printf("%s is not a word in our vocabulary, you may want to switch this word to the followi
ng substitutes:n",split); - for (i=0;i<strlen(split);i++)
- {
- memset(tmp,'\0',100);
- strncpy(tmp,split,i);
- if(CheckWord(tmp))
- {
- printf("%d. %sn",m++,tmp);
- }
- }
- }
- split=strtok(NULL," ");
- }
- getchar();
- }
بارك الله فيك اخي الكريم
انا سألتك قبل عن هذا السؤال لكنني اريد ان اتأكد
هل هذا الأمر
- memset(tmp,'\0',100);
مكافئ لهذا الأمر؟
- temp[100]={0};
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
السلام عليكم
بارك الله فيك اخي
لكن اخي الكود الذي قمت بوضعه لا يعمل
هو المفروض يقوم بعمل مقارنة
مثلا المستخدم ادخل الكلمة:
favorcy
تظهرله رسالة بهذا الشكل
favorcy is not a word in our vocabulary, you may want to switch this word to the following
substitutes:
1. favorable
2. favorably
3. favored
4. favorer
5. favorite
بتوقع انه المفروض نستعمل دالة المقارنة حسب الحروف
لكن الكود اللي وضعته حضرتك ما بيوفي بالطلب وكمان ما بيعمل شي
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
طيب جرب هذا الكود :
- int main()
- {
- char dic[W][L];
- char word [100];
- char *split;
- char tmp[100];
- int i=0;
- int m=0;
- sortarray(dic);
- printf("enter sentence : ");
- gets(word);
- split=strtok(word," ");
- while(split!=NULL)
- {
- if (!CheckWord(split))
- {
- printf("%s is not a word in our vocabulary, you may want to switch this word to the followi
ng substitutes:n",split); - for(i=0;i<W;i++)
- {
- if(strncmp(split,dic[i],5)==0 && m++!=5)
- printf("%d %sn",m,dic[i]);
- }
- }
- split=strtok(NULL," ");
- }
- getchar();
- }
- int CheckWord (char ch[])
- {
- int i;char dic[W][L];
- sortarray(dic);
- for(i=0;i<W;i++)
- if(strcmp(ch,dic[i])==0) return 1;
- return 0;
- }
تم تعديل هذه المشاركة بواسطة فهدالشلوي في 19 يناير 2009 في 01:18
السلام عليكم
بارك الله فيك اخي الكريم
نعم بحمد الله هذا الكود قام بالمطلوب
مأجورا ان شاء الله
اذا ممكن كمان سؤال
اريد اعرف اذا كان هناك دالة تقوم بالتبديل بين كلمتين
بمعنى انها تحذف الكلمة الأولى وتقوم بابدالها بالكلمة الثانية
اقصد دالة من دوال str
لاني اريد عندما يقوم المستخدم باختيار كلمة معينة اريد البرنامج ان يستبدل الكلمة التي قام بإدخالها وان يضع مكانها الكلمة التي قام باختيارها
بوركت اخي الكريم وجزيت خيرا على ما قدمته وتقدمه انت والأخوة في هذا الصرح المبارك ان شاء الله
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
السلام عليكم
بارك الله فيك اخي
لكن هذه الدالة كما رأيت في المثال الذي قمت بوضعه مشكورا انها تقوم بعملية دمج
أي تأخذ الكلمة الاولى وقسم من الكلمة الثانية وتقوم بدمجهما بمتغير واحد !!!
وانا المطلوب مني هو ان اقوم بحذف الكلمة نهائياً واضيف مكانها الكلمة التي تم اختيارها
ام انك تقصد ايضاً استعمال الدالة memset قبل استعمال الـ strncat ؟
وايضا سؤال اضافي في نفس المجال
ما هو الفرق بين الدالة strncpy والدالة strncat ?
بوركت اخي الفاضل سلفاً
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
- #include <stdio.h>
- #include <string.h>
- int main(int argc, char *argv[])
- {
- char word[]="he is Mohmmad bin Omer";
- char search[] = "Mohmmad";
- char replace[] = "Ahmed";
- int len = strlen(word);
- int s_len = strlen(search);
- int r_len = strlen(replace);
- char *current = word;
- while (current = strstr(current, search))
- {
- memmove(current + r_len , current + s_len, len - (current - word) - s_len + 1);
- strncpy(current, replace, r_len);
- }
- printf("%s",word);
- getchar();
- return 0;
- }
تم تعديل هذه المشاركة بواسطة فهدالشلوي في 21 يناير 2009 في 13:49
السلام عليكم
بارك الله فيك اخي الكريم
لكني في الحقيقة لم افهم ما كتبته
هل هو مثال ؟
اذا ممكن تشرحه ببعض الكلمات لاني لم افهمه ولم افهم ما مدى علاقته في المطلوب مني في السؤال :(
بوركت اخي
السلام عليكم
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
السلام عليكم
اخي الكريم في الحقيقة لم اصل الى شيء
منذ ساعات احاول فهم الدالة وعلاقتها بالسؤال لكني لم افلح
هل هناك طريقة أخرى ؟
وهل استعمال الدالة STRCPY يفي بالمطلوب
حيث يكون استعمالها مثلا هو اعطاء قيم فارغة للكلمة الخاطئة التي يريد المستخدم ان يستبدلها عن طريق الدالة memset ومن ثم استعمال الدالة strcpy لربط الكلمة التي قام المستخدم باختيارها بالكلمة الخطأ التي "أصبحت" عبارة عن فراغات
هذه محاولتي لكي يكون قصدي مفهوم على الرغم من ان المحاولة لم تنجح
لكن الفكرة كفكرة ممكن تطبيقها ؟
- #include <stdio.h>
- #include <string.h>
- #define INPUT "stockWord.txt"
- #define L 12 // the length of each word
- #define W 50 //the maximum words on the dictionary
- #define M 100 // the maximum letters on the sentence that the user will enter it.
- int getWord(char dic[][L]);
- void sortarray(char dic[][L]);
- int CheckWord (char ch[]);
- void main()
- {
- char dic[W][L];
- char word [M];
- char *split;
- int i=0;
- int m=0;
- int choice;
- char answer;
- sortarray(dic);
- printf("enter sentence : ");
- gets(word);
- split=strtok(word," ");
- while(split!=NULL)
- {
- if (!CheckWord(split))
- {
- printf("%s is not a word in our vocabulary, you may want to switch this word to the followin
g substitutes:n",split); - for(i=0;i<W;i++)
- {
- if(strncmp(split,dic[i],3)==0 && m++!=5)
- printf("%d. %sn",m,dic[i]);
- }
- m=0;
- printf("Would you like to switch this word?n");
- scanf("%c", &answer);
- if(answer=='N' || answer=='n')
- return;
- else
- if (answer=='Y' || answer=='y')
- {
- printf("To which substitute?n");
- scanf("%d", &choice);
- memset (split,' ',L);
- strcpy(split,dic[choice]);
- }
- printf("%sn", split);
- }
- split=strtok(NULL," ");
- }
- getchar();
- }
تم تعديل هذه المشاركة بواسطة حامي الحمى في 22 يناير 2009 في 01:18
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
السلام عليكم
شو يا اخوان ؟
ما في حد عنده مقدرة يجيب على هذا القسم من السؤال :( ؟!!
تعب الجسد
ونعيم الروح
جسد يمشي فوق الأرض
وروح ترفرف حول العرش
