السلام عليكم
لقد قرأت عن آلية ضغط النصوص و هي طبعاً أكثر من آلية :
* آلية تتبع البتات المتشابهة المتتالية و ترميزها برمز معين و استخدام هذا الرمز بدل عنها
* آلية تتبع الأحرف المتشابهة و ترميز كل حرف مكرر أكثر من مرة برمز معين و استخدامه بدل التكرار
*انشاء آلية تخزين جديدة :مثل تقليل عدد بيتات المحرف و يمكنكم مراجعة الملف الذي أرفقته و الذي تكلم عن ضغط البيانات
الكود الذي أحاول كتابه (و الذي لم ينتهي بعد ) يحاكي الطريقة الثانية :
حيث سأقوم بمقارنة كل حرف مدخل عبر سلسلة مع باقي الأحرف فإن حصل التشابه أكثر من مرة خزنت هذا الحرف في مصفوفة جديدة خاصة بالأحرف المكررة أكثر من مرة ثم سأقوم بعملية delete للعنصر المكرر و الإستعاضة عنده بالرمز الخاص بالحرف المكرر لذلك قمت بتحويل الstring إلى pointers لكي أستطيع الحذف :
المهم هذا الجزء الأول من الكود الخاص بالبحث عن الأحرف المتشابهة (أعلم أنه بسيط و لكن لا أحصل على النتيجة الصحيحة ) فما المشكلة فيه :
#include<iostream>
#include<string>
using namespace std;
int main()
{
std::string text ;
cout<<"enter you text here"<<endl;
cin>>text;
int k=0,n=0;//for 'loops' looks down
char * can_compress;char * str;//can_compress is an array of character that repeated more than one
// str for new
can_compress= new char[text.length()];
str=new char[text.length()];
for(int o=0;o<text.length();o++)
{
str[o]=text[o];
}
for(int i=0;i<text.length();i++)
{ //#.1
for(int j=i+1;j<text.length();j++)
{ //#.2
if(text==text[j])
k++;
} //end of #.2
if(k>1)//if the character is repeated more than one then we will compress it.
{
can_compress[n]=text;
n++;//to next index
}
k=0;
}// end of #.1
cout<<"the characters are"<<endl;
for(int m=0;m<strlen(can_compress);m++)
{
cout<<can_compress[m];
}
for(int h=0;h<strlen(str);h++)
{
for(int p=0;p<strlen(can_compress);p++)
if(str[h]==can_compressبسم الله الرحمن الرحيم)
delete str[h];
}
cout<<"string would bee after compressing"<<str<<endl;
return 0;
}المشكلة في التحديد أن بعض الأحيات يعملو الأخرى لا شاهد هذه المحاولتين(دون فقرة حذف الحرف المكرر) :
المحاولة الأولى(ناجحة):
enter you text here
arabteam-2000
the characters are
a0
المحاولة الثانية (فاشلة):
enter you text here
arabteam is a great forum
the characters are
a═══════²²²²◄‼@
و بعد ما أضفت الجزء المتعلق بحذف العنصر المكرر تمهيدا إلى استبداله بالرمز
قال الكومبايلر:
cannot delete objects that are not pointers
مع أي استخدم الnew و هي من صلب المؤشرات