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

سؤال بلغة سي عن مصفوفة سلاسل

رائج
بدأه حامي الحمى في 15 يناير 2009 · 55 رد · 3,239 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم

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

السؤال ممتع لكنه صعب التطبيق نوعا ما.

بدأت به وسأكتب ما بدات به في ردي التالي

الآن اعرض على حضراتكم السؤال مع مثال عند تشغيل البرنامج:

معطى ملف تكست باسم stockWord.txt الذي يحتوي على الأكثر على 50 كلمة.

ترتيب الكلمات في الملف غير معروف، كل كلمة تظهر في سطر منفرد وكل كلمة تحتوي على الأكثر 12 حرف.

عليك كتابة برنامج الذي يدير مخزن الكلمات الذي يتم حفظه في مصفوفة ملائمة ثنائية الأبعاد، البرنامج يجب ان يُدخل الكلمات هذه الى المصفوفة عند بداية تشغيل البرنامج ويحفظها بشكل مصنّف (حسب ترتيب الحروف).

في كل سطر في المصفوفة يجب ان تُحفظ كلمة واحدة فقط من مخزن الكلمات الموجود في الملف.

وعلى البرنامج ان يمكّن المستخدم من ادخال جمل بطول حتى 100 رمز على الأكثر لكل جملة (ليس بالضرورة ان تكون الجملة صحيحة لغوياً) ويفحص البرنامج اذا ما كانت الجملة قانونية حسب مخزن الكلمات في ملف التكست (جملة قانونية هي جملة جميع كلماتها موجودة في مخزن الكلمات).

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

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

معالجة الكلمة الغير صحيحة تتم بالشكل التالي: البرنامج يقوم بعرض الكلمة الغير صحيحة ويعرض للمستخدم 5 كلمات بديلة على الأكثر وهي الأقرب للكلمة التي يريد استبدالها. الكلمة الأكثر قرباَ هي الكلمة التي لها اكثر احرف مشتركة بالترتيب للكلمة الغير صحيحة (من بداية الكلمة). بالاضافة للكلمة الأكثر قرباً يتم عرض حتى 4 كلمات اخرى بديلة حسب التصنيف وبشرط ان الكلمات تبدأ بنفس الترتيب الموجود للكلمة الغير صحيحة. عرض الكلمات البديلة يكون بشكل مرقّم بشكل تصاعدي.

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

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

في نهاية عملية الفحص على البرنامج ان يقوم بطباعة الجملة المحتلنة (الجديدة) والانتقال الى الجملة التالية في حالة رغب بذلك المستخدم

ملاحظة: يمكن الفرض بأن كل الأحرف التي يتم ادخالها هي احرف صغيرة في اللغة الانجليزية.

مثال على محتوى ملف التكست:

fatness

to

maybeagain

favorite

more

favorable

extern

yes

making

father

extension

fatling

good

favorer

and

lest

for

extinction

favoritism

extend

fatly

favorably

tomorrow

something

favored

late

later

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

again

and

extend

extension

extern

extinction

father

fatling

fatly

fatness

favorable

favorably

favored

favorer

favorite

favoritism

for

good

late

later

lest

more

making

maybe

something

to

tomorrow

yes

مثال لتشغيل البرنامج:

على فرض انه تم ادخال هذه الجملة

again and favorcy making less extention

لكل كلمة غير صحيحة يجدها البرنامج (وهي الكلمة الغير موجودة في مخزن الكلمات) تظهر الرسالة التالية للمستخدم واقتراحات لاستبدال الكلمة بكلمات اخرى موجودة في مخزن الكلمات:

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

Would you like to switch this word? Y

To which substitute? 2

extention is not a word in our vocabulary, you may want to switch this word to the following

substitutes:

1. extend

2. extension

Would you like to switch this word? Y

To which substitute? 5

No such substitute, choose again!

To which substitute? 2

less is not a word in our vocabulary, you may want to switch this word to the following

substitutes:

1. lest

Would you like to switch this word? N

Your sentence after checking is:

again and favorably making less extention

Would you like to enter another sentence? N

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#2

السلام عليكم

اولا قررت ان اقوم بعمل التالي:

1) ادخال الكلمات الى مصفوفة ثنائية الأبعاد

2) كتابة دالة تقوم بالبحث وفحص كلمة معينة اذا كانت موجودة في مخزن الكلمات او لا

قمت بكتابة التالي حتى الآن:

  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define INPUT "stockWord.txt"
  5. #define L 12
  6. #define W 50
  7. int getWord(char dic[W][L]);
  8. void main()
  9. {
  10. char dic[W][L];
  11. getchar();
  12.  
  13. printf("%dn",getWord(dic));
  14.  
  15.  
  16. }
  17.  
  18.  
  19. int getWord(char dic[][L])
  20. {
  21. FILE* file;
  22. file=fopen(INPUT,"r");
  23. int i, j;
  24. if(file==NULL)
  25. return 0;
  26. while(!feof(file))
  27. {
  28. for (i=0;i<W;i++)
  29. for (j=0;j<L&&j!='\0';j++)
  30. fscanf(file,"%s",dic[i][j]);
  31. }
  32. fclose(file);
  33. return 1;
  34. }
  35.  
  36.  

وعند اختبار ما كتبته حتى الآن لم يقم البرنامج بطباعة الرقم 1

ما هي المشكلة برأيكم

بارك الله فيكم

السلام عليكم

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#3

هلا اخوي

اعتقد انه يجب استخدام %c بدل s%

وكذلك تعديل الشرط

j!="\0"

لانه هنا انت تتكلم على العداد ما تتكلم على

dic[j]

تم تعديل هذه المشاركة بواسطة voo في 15 يناير 2009 في 18:32

متغيب

#4

السلام عليكم

حياك الله اخي

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

application crash للبرنامج مما يؤدي الى ايقاف البرنامج

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#5
  1.  
  2. while(!feof(file))
  3. {
  4. for (i=0;i<W;i++)
  5. {
  6. test=1;
  7. j=0;
  8. while(test)
  9. {
  10. fscanf(file,"%c",dic[i][j]);
  11. if(dic[i][j]==" " || dic[i][j]=="t"||dic[i][j]=="n" )
  12. {
  13. dic[i][j]="\0";
  14. test=0;
  15. }
  16. j++;
  17. }
  18. }
  19. }
  20.  

وجرب هذا بدل السطر من 26 الى 31

وبعد تبديل الكود قم بطباعة المصفوفه للتأكد

متغيب

#6

السلام عليكم

بارك الله فيك اخي

لكن ما زالت المشكلة ذاتها

هذا كامل الكود جربه اذا سمحت ستجد انه هناك مشكلة اظن انها خروج عن حدود المصفوفة

  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define INPUT "stockWord.txt"
  5. #define L 12
  6. #define W 50
  7. int getWord(char dic[W][L]);
  8. void main()
  9. {
  10. char dic[W][L];
  11.  
  12.  
  13. printf("%dn",getWord(dic));
  14.  
  15.  
  16. }
  17.  
  18.  
  19. int getWord(char dic[W][L])
  20. {
  21. FILE* file;
  22. file=fopen(INPUT,"r");
  23. int i, j, test;
  24. if(file==NULL)
  25. return 0;
  26.  
  27.  
  28. while(!feof(file))
  29. {
  30. for (i=0;i<W;i++)
  31. {
  32. test=1;
  33. j=0;
  34. while(test)
  35. {
  36. fscanf(file,"%c",dic[i][j]);
  37. if(dic[i][j]==' ' || dic[i][j]=='t'||dic[i][j]=='n' )
  38. {
  39. dic[i][j]='\0';
  40. test=0;
  41. }
  42. j++;
  43. }
  44. }
  45. }
  46.  
  47. fclose(file);
  48. return 1;
  49. }
  50.  
  51.  

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#7
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define INPUT "stockWord.txt"
  4. #define L 12
  5. #define W 50
  6. int getWord(char dic[W][L]);
  7. void main()
  8. {
  9. char dic[W][L];
  10. getchar();
  11.  
  12. printf("%dn",getWord(dic));
  13.  
  14.  
  15. }
  16.  
  17.  
  18. int getWord(char dic[][L])
  19. {
  20. FILE* file;
  21. file=fopen(INPUT,"r");
  22. int i, j;
  23. char oneword[L];
  24.  
  25. if(file==NULL)
  26. return 0;
  27. while(!feof(file))
  28. {
  29. for (i=0;i<W;i++)
  30. {
  31. fgets(oneword,L,file);
  32. for(j=0;j<L;j++)
  33. dic[i][j]=oneword[j];
  34. }
  35. fclose(file);
  36. return 1;
  37. }
  38. }
  39.  
  40.  
  41.  

char oneword[L] تقوم بتعريفها

المشكله اخي العزيز لا املك مترجم لكن جرب هذا الكود

تم تعديل هذه المشاركة بواسطة voo في 15 يناير 2009 في 19:37

متغيب

#8

السلام عليكم

بارك الله فيك اخي الكريم

لكني لم افهم مقصدك في

  1.  
  2. char oneword[L]
  3.  

اني اقوم بتعريفها

وانا قمت بنسخ الكود واختبرته وفعلا قام بإرجاع الرقم

اذا ممكن اخي لكي تعم وتكمل الفائدة ان تشرح لي ما هو التغيير الذي قمت به، اي الأمور التي اضفتها ما عملها ؟

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#9

الكود نفس الكود اللي سبق وعملته انت لكن قمت با ضافة

char oneword[L];

وهو عباره عن كلمه واحده

تم نسخها من الملف بالسطر

fgets(oneword,L,file);

بعد ذلك قمنا باضافتها للمصفوفه

for(j=0;j<L;j++)
dic[j]=oneword[j];

يا ريت لو تقوم بطباعة المصفوفه للتأكد من المدخلات

بالنسبه للتعريف اخي انا قمت به لكني نسيت الغاء طلب التعريف

تم تعديل هذه المشاركة بواسطة voo في 15 يناير 2009 في 19:56

متغيب

#10

بارك الله فيك اخي

انا قمت بامر طباعة محتوى الملف

لا أعرف ما المشكلة في الكود

ظهر لي الكلمات التي في الملف لكن بشكل ملخبط

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

لكن قبل ذلك هذا الكود الكامل يشمل أمر الطباعة !!!

  1.  
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #define INPUT "stockWord.txt"
  6. #define L 12
  7. #define W 50
  8. int getWord(char dic[W][L]);
  9. void main()
  10. {
  11. char dic[W][L];
  12. int i,j,k;
  13.  
  14. getWord(dic);
  15. for (i=0; i<W; i++)
  16. for (j=0; j<L; j++)
  17. printf("%c", dic[i][j]);
  18. puts("n");
  19.  
  20. }
  21.  
  22.  
  23. int getWord(char dic[][L])
  24. {
  25. FILE* file;
  26. file=fopen(INPUT,"r");
  27. int i, j;
  28. char oneword[L];
  29.  
  30. if(file==NULL)
  31. return 0;
  32. while(!feof(file))
  33. {
  34. for (i=0;i<W;i++)
  35. {
  36. fgets(oneword,L,file);
  37. for(j=0;j<L;j++)
  38. dic[i][j]=oneword[j];
  39. }
  40.  
  41. }
  42. fclose(file);
  43. return 1;
  44. }
  45.  
  46.  

post-69369-1232039466_thumb.jpg

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#11

المشكله انه تقوم بطباعة كافه المصموفه لديك مع العلم ان بعض الكلمات لا تحتوي على 12 حرف

فيقوم بطباعة امور غير متوقعه

لذلك غير امر الطباعه للتالي

for(i=0;i<w;i++)
for(j=0;j<L;j++)
{
 if(dic[j]=="\0")
 j=L;
else
 printf("%c", dic[j]);
}
puts("\n");

تم تعديل هذه المشاركة بواسطة voo في 15 يناير 2009 في 20:57

متغيب

#12

السلام عليكم

بارك الله فيك اخي

نعم قمت بذلك في حين كنت تضيف مشاركتك

لكني توصلت الى نفس الإخراج الذين تفضلت بكتابته انت

هذا الكود الذي كتبته بعد التعديل

  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define INPUT "stockWord.txt"
  5. #define L 12
  6. #define W 50
  7. int getWord(char dic[W][L]);
  8. void main()
  9. {
  10. char dic[W][L];
  11. int i,j,k;
  12.  
  13. getWord(dic);
  14. for (i=0; i<W; i++)
  15. for (j=0; (j<L)&&(dic[i][j]!='\0'); j++)
  16. printf("%c", dic[i][j]);
  17. puts("n");
  18.  
  19. }
  20.  
  21.  
  22. int getWord(char dic[][L])
  23. {
  24. FILE* file;
  25. file=fopen(INPUT,"r");
  26. int i, j;
  27. char oneword[L];
  28.  
  29. if(file==NULL)
  30. return 0;
  31. while(!feof(file))
  32. {
  33. for (i=0;i<W;i++)
  34. {
  35. fgets(oneword,L,file);
  36. for(j=0;j<L;j++)
  37. dic[i][j]=oneword[j];
  38. }
  39.  
  40. }
  41. fclose(file);
  42. return 1;
  43. }
  44.  

وحاولت ايضا استبدال الكود بالكود الذي وضعته واعطى نفس النتيجة

وهي طباعة المصفوفة كاملة

لكن آخر كلمة يكررها

واعتقد ان السبب هو في عدم تحديد عدد الأسطر

لانه يقوم بطباعة الكلمة الأخيرة في الملف حتى يكتمل عدد الأسطر المعرف وهو 50

ما هي الطريقة لايقاف هذه العملية عند الوصول الى آخر كلمة ؟

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#13

اوكي لكن المششكله في الكود اللي انت كاتبه يقوم باختبار الداله فقط في حال

dic[j]!='\0'

لكن في با قي المصفوفه لا يوجد

'\0'

لذلك سوف يقوم بكتابة ما هو موجود

لذلك جرب الكود اللي وضعته لك

وايضا جرب وضع القيمه " " في كا فة المصفوفه قبل عمل اي شي ثم قم بكتابة امر الطباعه مثل ما كتبته انت

تم تعديل هذه المشاركة بواسطة voo في 15 يناير 2009 في 21:30

متغيب

#14

جرب هذا الكود:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define INPUT "stockWord.txt"
  4. #define L 12
  5. #define W 50
  6.  
  7. int getWord(char dic[][L]);
  8.  
  9. int main()
  10. {
  11. char dic[W][L];
  12. int i,j;
  13. getWord(dic);
  14. for(i=0;i<W;i++)
  15. {
  16. for(j=0;j<L;j++)
  17. {
  18. if(dic[i][j]=='\0') break;
  19. printf("%c",dic[i][j]);
  20. }
  21. printf("n");
  22. if(dic[i][0]=='\0') break;
  23.  
  24. }
  25. printf("%d ",getWord(dic));
  26.  
  27. getchar();
  28. }
  29.  
  30.  
  31. int getWord(char dic[][L])
  32. {
  33. FILE* file;
  34. int i,j;
  35. char ch;
  36. file=fopen(INPUT,"r");
  37.  
  38. for(i=0;i<W;i++)
  39. for(j=0;j<L;j++)
  40. dic[i][j]='\0';
  41. i=0;j=0;
  42. do{
  43. ch=fgetc(file);
  44. if(ch!='n')
  45. {
  46. dic[i][j]=ch;j++;
  47. }
  48. else if(i<W)
  49. {j=0;i++;}
  50.  
  51. }while(ch!=EOF);
  52.  
  53.  
  54. return 1;
  55.  
  56.  
  57. fclose(file);
  58.  
  59. }
  60.  

tvquran_6.gif

#15

السلام عليكم

بارك الله فيك اخي voo على التوضيح الطيب :)

اخي فهد جزاك الله خيرا

الكود تمام

سبحان الله جربت بالضبط مثل ما كتبت انت لكن الـ break الأخير لم اضفه

جزيتم خيرا اخواني الكرام

سؤال اذا سمحتم

كيف يمكنني ترتيب الكلمات حسب ترتيب الحروف

هل علي ان اقوم بالفحص لكل حرف من الأحرف

ام ان هناك طريقة مختصرة ؟

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#16

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

من الممكن عمل داله للترتيب

فعندك خيارين اما تقوم بترتيب المصفوفه الموجوده

او مصفوفه جديده تكون هي المصفوفه المرتبه

وكل واحده لها طريقه

تم تعديل هذه المشاركة بواسطة voo في 15 يناير 2009 في 22:08

متغيب

#17

استخدم strcmp للمقارنة

تستطيع المقارنة كلمة كلمة

تم تعديل هذه المشاركة بواسطة فهدالشلوي في 15 يناير 2009 في 22:10

tvquran_6.gif

#18

السلام عليكم

بارك الله فيك اخي voo

نعم اريد عمل ذلك في دالة مستقلة

وكذلك في مصفوفة جديدة

اخي فهد بارك الله فيك

ما هو الأفضل والأقصر برأيك

استعمال strcmp ام استعمال strncmp ؟

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#19

السلام عليكم

اخواني هذه محاولتي في كتابة الكود

لا اعرف مدى صحتها لإنني لم اكتب ابدا كود باستعمال هذه الدوال (دوال السلاسل)

  1.  
  2. int compareWords(char arr[][L])
  3. {
  4. int i, j;
  5. char temp;
  6. getWord(arr);
  7. for (i=0; i<W; i++)
  8. for (j=0;j<L;j++)
  9. {
  10. if (strcmp(arr[i][j],arr[i+1][j]==0)
  11. j++;
  12. if (strcmp(arr[i][j],arr[i+1][j]<0)
  13. {
  14. temp=arr[i+1][j];
  15. arr[i+1][j]=arr[i][j];
  16. arr[i][j]=temp;
  17. }
  18. }
  19. }
  20.  

ماذا ينقصها؟ وهل النمط في كتابة الدالة صحيح ام لا ؟

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#20

الملف كما هو معطي في المثال مرتب ! اليس كذلك ؟

tvquran_6.gif

#21

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

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define INPUT "stockWord.txt"
  4. #define L 12
  5. #define W 50
  6.  
  7. int getWord(char dic[][L]);
  8. void sortarray(char dic[][L]);
  9.  
  10. int main()
  11. {
  12. char dic[W][L];
  13. int i;
  14. sortarray(dic);
  15. for(i=0;i<W;i++)
  16. {
  17. if(dic[i][0]!='\0')
  18. printf("%sn",dic[i]);
  19. }
  20. }
  21.  
  22.  
  23.  
  24.  
  25. void sortarray(char dic[][L])
  26. {
  27.  
  28. int i,j;
  29. char tmp[L];
  30. getWord(dic);
  31. for(i=0;i<W-1;i++)
  32. for(j=1;j<W;j++)
  33. if(strcmp(dic[i],dic[j])<0)
  34. {
  35. strcpy(tmp,dic[i]);
  36. strcpy(dic[i],dic[j]);
  37. strcpy(dic[j],tmp);
  38. }
  39.  
  40.  
  41. }
  42.  
  43.  
  44. int getWord(char dic[][L])
  45. {
  46. FILE* file;
  47. int i=0;
  48. char line[L];
  49. file=fopen(INPUT,"r");
  50. for(i=0;i<W;i++){memset(dic[i],'\0',L);} i=0;
  51. while(!feof(file)){fscanf(file,"%s",&dic[i++][0]);} fclose(file);
  52. return 1;
  53. }
  54.  

tvquran_6.gif

#22

السلام عليكم

الله يجزيك الخير اخي الكريم

لكن اخي هذا الكود ما هي وظيفته

  1. memset(dic[i],'\0',L);
  2.  

وايضا عند الترتيب يقوم بترتيب جميع الكلمات بشكل صحيح

لكن الكلمة الاولى تكون yes ومن ثم باقي الكلمات مرتبة بشكل صحيح

بمعنى ان الكلمة الاولى في المصفوفة تكون هي الكلمة الأخيرة في المصفوفة ومن ثم باقي الكلمات بشكل صحيح

بوركت اخي الفاضل

تم تعديل هذه المشاركة بواسطة حامي الحمى في 16 يناير 2009 في 00:17

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#23

memset دالة تملى النص بحرف واحد.

وهنا عملها تنظف النص بحيث يكون خالي.

tvquran_6.gif

#24

بارك الله فيك اخي على المعلومة الطيبة :)

لكن ما هو سبب ان الكلمة الاولى اي السطر الاول هي الكلمة التي من المفروض ان تكون الأخيرة ؟

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#25

السلام عليكم

بارك الله فيكم اخواني

المشكلة كانت ان الـ j=1 قمت بتغييره الى j=0 وقام بالترتيب بالشكل الصحيح

جزيتم خيراً :)

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

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