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

مشروع برنامج ضغط الملفات النصية بدون تغيي

بدأه fatimah في 26 نوفمبر 2008 · 17 رد · 1,686 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

الحمد لله نجحت في مادة السي++1

والان ادرس سي++2

اليوم لدي مشروع واحتاج المساعدة في فكرة المشروع

مشروع ضغط "تقليل حجم" ملف نصي بدون تغيير صيغته

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

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

البرنامج باستبدال هذه الارقام بالكلمات المكررة التي وضعناها في index file

مثال:

انا ادرس برمجة

انا ادرس رياضيات

انا ادرس في الجامعة

انا احب السي++

انا احب البرمجة

بعد الضغط يكون لدينا txt file

1 برمجة

1 رياضيات

1 في الجامعة

2 السي++

2 البرمجة

index file

1 = انا ادرس

2 =انا احب

وهذه المطلوب من البرنامج

• Able to compress a text file and generate an index file

• Able to decompress the file

• Able to show the time taken for compressing and decompressing

• Able to show the file size before and after compressed

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

يعني واضح اني راح استخدم الملفات

ولكن كيف البرنامج يكتشف الكلمات المكررة؟؟؟؟؟؟؟

وكيف اظهر للمستخدم الوقت للعملية؟؟؟؟؟؟؟

بصراحة احس ان هالمشروع مقلب

انا ما عندي اي فكرة نهائي عن كيفية اظهار الوقت المستغرق لعملية الضغط

والنقطة الاخيرة انا نفسي مو فاهمتها بسأل استاذتي

شي يجيب الضغط

الله يعين

ومشكورييييييين

تم تعديل هذه المشاركة بواسطة fatimah في 26 نوفمبر 2008 في 04:13

#2

اقرئي الملف كلمة بكلمة و قارني

ابحثي عن خوارزمية COMPRESSION و طبقيها هناك الكثير

العمل كثير و الوقت قليل أعاننا الله

seo zen SEO Enlightment amazon danbo

#3

والله لا اعلم ان كآن ردي مفيدآ او ولآ ..

لكن انظر هنآ

http://www.google.com/codesearch

وكتبت :

lang:c compress txtfile

وظهر لي الاتي :

http://www.google.com/codesearch?hl=en&amp...1.2.3/deflate.c

http://www.google.com/codesearch?hl=en&amp...ress/compress.c

http://www.google.com/codesearch?hl=en&amp...e_compression.c

http://www.google.com/codesearch?hl=en&amp...=src/compress.c

واذا لم يكن هو جرب البحث بدقة اكثر او انتظر آرآء الخبرآء

#4

شكرا لك اخي fkugd2003

انا لم ادرس الخوارزميات ولكن لم اعرف ان هناك حوارزمية للضغط

بحاول ابحث عنها شكرا لك اخي

شكرا اخي redfalcon464 لم اعرف ببحث في جوجل بهذه الطريقة علمتني شيء جديد

بالفعل انا اقدر هذا المنتدى الرائع

سبحان الله الاعضاء بيحاولو يساعدو الشخص قد مايقدرو

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

واقدر مشاركاتكم واهتمامكم بالمساعدة

#5

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

ستطيع استخدام خوازمية gzipوهي مفتوحة المصدر

كما ان ضغط الملفات بناء على مقارنة تكرار الكلمات غير فعال

و الافضل ضغط البيانات اعتمادا على crc

تحياتي

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#6

شكرا لك اخي haty على المشاركة

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

وكذلك الخوارزمية انا لم ادرس خوارزميات ولا اعرفهم للاسف

واضح انك محترف برمجة كلامك كبير علي

انا اعرف ان الطريقة اللي ذكرتها بدائية وغير فعالة

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

وكذلك المطلوب ضغط الملفات النصية وليس الملفات بشكل عام

وممنوع تحويل صيغة الملف

اشكرك اخي واقدر اهتمامك ومشاركتك

#7

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

و الله انا مثلك مبتدي في الس بلس بلس اخي الكريم

وبالنسبة ل CRC ببساطة هي حاصل جمع بيتات الملف

اما ما تبحث عنه انت هو ايجاد الكلمات المتكررة بالملف

وهذا لا يعتبر ضغط . لان ضغط الملف يستلزم تغيير بنيته

على كلا اعتقد يجب ان تقرا الملف سطر سطر مع عمل spilt للاسطر

باستخدام الفراغ space كـ ديلامتر

ثم مقارنة الكلمات وايجاد الكلمات المتكررة

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

عمله بالس بلس بلس لاني لازلت مبتدي فيها

تحياتي

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#8

شكرا لك اخي haty

اذا انت مبتدئ فاذا انا لا اعرف شيء في البرمجة

 اتفق معاك اخي هذا لا يعتبر ضغط لانهم مانعينا من تغيير الصيغة ولكن قالو لنا ضغط بس عشان يخرعونا يجيبولنا الضغط

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

بس شو قصدك بـ split للاسطر و ديلامتر ؟؟؟

اذا تستطيع توضح اكون شاكرة لك

انا لدي فكرة سطحية عن الفيجوال بيسك فقط

وهذا المشروع مطلوب منا في مادة السي++ لذلك بالطبع لا استطيع استخدام اي لغة اخرى

#9

السلام عليكم

اعتقد ان هذه المسألة يمكن حلها بخطوتين:

1. اعداد الخوارزمية

2. استخدام الاقترانات المناسبة لتنفيذ الخوارزميةز

وقبل البدء بالمساعدة أرجو منك اختي الكريمة ان تحددي لي مدى معرفتك بالامور التالية بلغة سي:

1. strcmp

2. strcat

3. arrays

4. pointers

5. files

كما انني اتوقع أن تكون لديك معرفة جيدة بالتالي:

1. for loop

2. while loop

3. if statement

انتظر ردك حتى أساعدك في حل مسألتك

#10

الأخت قالت أنها نجحت فى أول كورس من مادة السى++ أخى علاء أبو زهرة يعنى أعتقد بنسبة 100% انها تعرف for & while loops & if statement ، و تعرف ايضا المؤشرات pointer و بالتأكيد المصفوفات array ايضاً

أما دوال التعامل مع النصوص ، قأعتقد من السهولة تعملها ، على الروابط التالية :

Input/Output with files

cstring

#11

السلام عليكم

انا اتوقع ان من ينهي سي1 وسي2 متمكن في المفاهيم السابقة، لكن هناك احتمال ان يكون ضعيفاً في بعض هذه المفاهيم لسبب او لآخر، على اي حال نبدأ في الحل:

1. الخوارزمية:

أ-نجهز ذاكرة لتخزين الكلمات.

ب- قراءة الملف كلمة كلمة

ج- كل كلمة نقرؤها نبحث عنها في الذاكرة، ان وجدناها لا نعمل شيئاً، وإن لم نجدها نضيفها الى هذه الذاكرة.

د - نغلق الملف ونفتحه مرة أخرى ونقرأ كلمة كلمة، ونفتح ملفاً آخر للكتابة عليه (الملف المضغوط)

هـ- كل كلمة نقرؤها نبحث عنها في الذاكرة، ونكتب رقمها (ترتيبها في الذاكرة) على الملف المضغوط.

د- نكتب المعلومات الموجودة في الذاكرة في آخر الملف( او اوله او في ملف جديد)، وتعتبر هذه مفتاحاً لقراءة الملف المضغوط.

2- مفاتيح للحل:

أ- نجهز الذاكرة، وهي مصفوفة ببعدين، البعد الاول عدد الكلمات والبعد الثاني طول الكلمة الواحدة

ب- لقراءة الملف كلمة كلمة نستخدم fscanf(fptr,"%d",str)

هذه بعض الارشادات لعمل المطلوب، الرجاء محاولة عملها والاستفسار في حال وجود اي مشكلة

اقتراح: اقترح بداية عمل برنامج يقرأ من الملف ويخزن جميع الكلمات بدون تكرار وطباعتها، ثم بعد ذلك تكملة الحل

#12

اخي ابو زهرة لا اعرف كيف اشكرك صراحة اتعبتك معي

نعم انا درست كل ماذكرت في سي1 ولكني ضعيفة بعض الشيء

يعني ليس لدي مرونة في استخدامهم خاصة المؤشرات اكرههم

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

وانا الان في س2 ادرس كلاس واوبجكت برمجة غرضية بالسي++

وان شاء الله راح اخذ كورس ثالث يتكلم عن الخوارزميات في السي++

فانا لا اتعامل مع الخوارزميات فاي برنامج مطلوب مني بس افهمه وابرمجه بدون اي تخطيط

عشان كذا اتبهدل في مشاريع كبيرة مثل هذا

هذه الدوال لمسح النص انا اول مرة اعرفها فسويت لها بحث اون لاين وعرفت بعض خصائصها

اخي شكرا جزيلا لك

فعلا اوضحت لي الصورة اكثر ولازلت تائهة لكن مع البحث والتدريب ان شاء الله يوفقنا في هالواجب

#13

اخي عمر اشكرك على دخولك لموضوعي وردك

فعلا انا درست هالاشياء بالاضافة الى استخدام ملفات الادخال والاخراج والدوال

ولكني ضعيفة بعض الشيء يعني لا اتعامل معهم بسهولة بسبب التدريب الغير كافي

وشكرا على الروابط اخي الكريم

#14

اختي الكريمة

بالنسبة لموضوع الخوارزمية، بشكل عام تعني طريقة التفكير لحل المشكلة.

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

#15

اخي العزيز ابو زهرة

اشكرك واقدر مساعدتك ي وارشادك لي ولك جزيييييل الشكر

واعتذر كثير لاني تاخرت بالرد فكنت مشغولة ومحرجة بالرد لاني لا استطيع حتى ان انفذ البرنامج اللي سهلته لي

فبدأت اقرأ في المراجع عن functions و fscanf ولكن استصعب علي لاني وجدت اختلاف بعض الشيء في طريقة كتابة الكود عن مادرسته

واستصعب علي الامر جدا حتى في قراءة ملف وتخزينه في ملف اخر

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

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

فانا درست في الكورس الماضي عن الملفات بشكل عام

اعتذر جدا اخي بردي المتاخر

وانا لااعرف كيف اشكرك على مساعدتك لي وارشاداتك و متابعتك للبرنامج وتبسيطه خطوة خطوة

واقدر واهتمامك ووقتك لمساعدتي

الله يوفقك ويبارك لك

#16

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

  1.  
  2. #include <iostream>
  3. #include <string>
  4. #include<fstream>
  5. #include<vector>
  6. #include<algorithm>
  7. #include<sstream>
  8. using namespace std;
  9. string file_name="myfile.txt";
  10. string file_index="index.txt";
  11.  
  12. void compress()
  13. {
  14. vector<string> tmp;
  15. vector<string> ddd;
  16. string word1;
  17.  
  18. int n=0;
  19. ifstream h_file1(file_name.c_str(),ios::in);
  20.  
  21.  
  22. while(h_file1>>word1)
  23. {
  24. tmp.push_back(word1);
  25.  
  26. }h_file1.close();
  27. ddd=tmp;
  28. int mcount;
  29. ofstream h_file3(file_index.c_str());
  30. for(vector<string>::iterator i=tmp.begin();i!=tmp.end();i++)
  31. {
  32. mcount=(int)count(tmp.begin(),tmp.end(),*i);
  33. if(mcount>1 && count(ddd.begin(),ddd.end(),*i)>0)
  34. {
  35. h_file3<<*i<<" ";
  36. stringstream oo;
  37. oo<<n++;
  38. replace(ddd.begin(),ddd.end(),*i,oo.str());
  39. }
  40. }h_file3.close();
  41. ofstream h_file2(file_name.c_str());
  42. for(vector<string>::iterator i=ddd.begin();i!=ddd.end();i++)
  43. {
  44. h_file2<<*i<<" ";
  45. }h_file2.close();
  46.  
  47. }
  48.  
  49.  
  50. int main()
  51. {
  52.  
  53.  
  54. compress();
  55.  
  56.  
  57.  
  58. return 0;
  59. }
  60.  

tvquran_6.gif

#17

شرح الكود :

الدالة التي تريد شرح لها اكثر دبل عليها كلك.

vector<string> tmp;
vector<string> ddd;
string word1;
int n=0;//عداد 

 ifstream h_file1(file_name.c_str(),ios::in);//فتح ملف للقراءة


 while(h_file1>>word1)قراءة الملف  كلمة كلمة
 {
 tmp.push_back(word1);// حفظ الكلمات في مصفوفة

    }h_file1.close();//اعلاق الملف
  ddd=tmp;//نسخه اخرى من المصفوفة
  int mcount;
  ofstream h_file3(file_index.c_str());//فتح ملف من اجل الكتابه فيه
  for(vector<string>::iterator i=tmp.begin();i!=tmp.end();i++)
  {
   mcount=(int)count(tmp.begin(),tmp.end(),*i);
دالة count عملها تعيد كم مرة الكلمة مكررة في المصفوفة.
   if(mcount>1 && count(ddd.begin(),ddd.end(),*i)>0)
شرط من أجل تسجيل الكلمات المكررة فقط.
   {
    h_file3<<*i<<" ";//احفظ الكلمات المكررة في الملف المفتاح
    stringstream oo;
    oo<<n++; تحويل الرقم الي نص
     replace(ddd.begin(),ddd.end(),*i,oo.str());
الدالة replace تبدل كلمة مكان كلمة.
   }
  }h_file3.close();//اغلاق الملف المفتاح

هنا سوف احفظ المصفوفة بعد ان تم تبديل الكلمات بالارقام
  ofstream h_file2(file_name.c_str());
  for(vector<string>::iterator i=ddd.begin();i!=ddd.end();i++)
  {
  h_file2<<*i<<" ";
  }h_file2.close();

}
tvquran_6.gif

#18

كأنك عطيتني الحل مجاني اخوي :eek:

يعني لهالدرجة البرنامج بسيط وانا ماعرف شيء فيه

الله يعوض علينا

اشكرك اخي اقدر اهتمامك لمساعدتي

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…