في البداية، دعنا نلقي نظرة على الشيفرة التي قدمتها. الدالة main
تحتوي على حلقة تكرارية for
تقوم بتكرار عملية التشفير لكلمات المرور المخزنة في مصفوفة password
. داخل كل تكرار، يتم استدعاء الدالة keyshanc
لتوليد مفاتيح التشفير باستخدام كلمة المرور الحالية.
ثم يُطلب من المستخدم إدخال الحروف التي يرغب في اختبار تشفيرها، وعندما يقوم المستخدم بإدخال الحرف #
، ينتهي البرنامج. ومع ذلك، هنا يبدو أن هناك مشكلة في التعامل مع الحلقة التي تقوم بالتشفير. الحلقة الداخلية while
تبدو وكأنها تعاني من عدم القدرة على الخروج بشكل صحيح عند إدخال الحرف #
.
لحل هذه المشكلة، يمكنك استخدام بيانة break
للخروج من الحلقة عندما يتم إدخال الحرف #
. ولضمان عملية الخروج بشكل صحيح، يجب وضع بيانة break
في كلا الحلقتين for
و while
للتأكد من أن البرنامج يخرج بشكل صحيح من كلتا الحلقتين.
لنقم بتعديل الشيفرة على النحو التالي:
cppint main()
{
string password[]={"JaneAusten","MarkTwain","CharlesDickens","ArthurConanDoyle"};
for(int i=0;i<4;++i)
{
char keys[95];
keyshanc(keys, password[i]);
char inputChar, trueChar=NULL;
cout << "Enter characters to test the encoding; enter # to quit:\n";
cin>>inputChar;
for (int x=0; x < 95; ++x)
{
if (keys[x] == inputChar)
{
trueChar = char(x+32);
break;
}
}
while (inputChar != '#')
{
cout<>inputChar;
if (inputChar == '#') // إضافة هذا الشرط للخروج من الحلقة
{
break; // استخدام بيانة break للخروج من الحلقة
}
for (int x=0; x < 95; ++x)
{
if (keys[x] == inputChar)
{
trueChar = char(x+32);
break;
}
}
}
} // نقل العودة (return) إلى خارج الحلقة for
return 0;
}
بهذه الطريقة، سيتم الخروج بشكل صحيح من الحلقة while
عند إدخال الحرف #
وسيتم تكرار العملية لكلمات المرور الأربعة التي تم تخزينها في المصفوفة password
.
المزيد من المعلومات
بالطبع، دعنا نواصل استكشاف هذا الموضوع بمزيد من التفاصيل والتحليل.
بمجرد تنفيذ التغييرات المقترحة على الشيفرة، يجب أن يكون البرنامج قادرًا الآن على التعامل بشكل صحيح مع إدخال المستخدم وإنهاء العملية عند إدخال الحرف #
. ومع ذلك، يمكننا أيضًا التفكير في تحسينات إضافية لهذا البرنامج.
واحدة من هذه التحسينات هي جعل البرنامج يتعامل مع مدخلات المستخدم بشكل أكثر ديناميكية ومرونة. بدلاً من استخدام متغير trueChar
لتخزين الحرف المشفر، يمكننا استخدام دالة لتشفير الحرف مباشرة وطباعته دون الحاجة إلى تخزينه مؤقتًا.
هذا هو التعديل المقترح لتحسين الشيفرة:
cpp#include
#include
using namespace std;
// Assume keyshanc function is defined elsewhere
// Function to encrypt a character based on the provided key
char encryptChar(char inputChar, char keys[]) {
for (int x = 0; x < 95; ++x) {
if (keys[x] == inputChar) {
return char(x + 32); // Assuming the offset is constant
}
}
// If the character is not found in the keys array, return it unchanged
return inputChar;
}
int main() {
string password[] = {"JaneAusten", "MarkTwain", "CharlesDickens", "ArthurConanDoyle"};
for (int i = 0; i < 4; ++i) {
char keys[95];
keyshanc(keys, password[i]);
char inputChar;
cout << "Enter characters to test the encoding; enter # to quit:\n";
cin >> inputChar;
while (inputChar != '#') {
cout << encryptChar(inputChar, keys);
cin >> inputChar;
}
}
return 0;
}
من خلال هذا التعديل، تم إضافة دالة encryptChar
التي تأخذ الحرف الذي يقوم المستخدم بإدخاله وتشفيره مباشرة باستخدام مفاتيح التشفير المولدة. هذا يجعل الشيفرة أكثر فعالية وسهولة في الفهم، حيث لا داعي لاستخدام متغيرات إضافية لتخزين الحرف المشفر مؤقتًا.
بهذه الطريقة، يمكن للبرنامج التعامل بشكل أكثر فعالية مع مدخلات المستخدم وتشفيرها بشكل صحيح باستخدام مفاتيح مختلفة تم اختيارها من مصفوفة كلمات المرور.