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

تطوير : خوارزمية قيصر للتشفير في C

بدأه tantie L في 1 نوفمبر 2013 · 19 رد · 18,356 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

 /index.php/topic/282202-%D9%85%D8%A7-%D8%B1%D8%A3%D9%8A%D9%83%D9%85-%D8%A8%D9%87%D8%B0%D8%A7-%D8%A7%D9%84%D8%A7%D9%82%D8%AA%D8%B1%D8%A7%D8%AD%D8%9F/?view=getnewpost

 

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

حسنا لنبدأ مع الشيفرة الأولى :

 

1- شيفرة قيصر :

 

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

لدينا الكلمة التالية : Hello World

و الانتقال الذي سنختاره مثلا هو 6 أحرف

و بالتالي سيكون نص التشفير كالآتي : Nkrru Duxrj 

و بهذا نجد أننا حصلنا على نص مشفر مفتاح حله يكمن في معرفة الانتقال الذي اخترناه ،و القيصر كان يستخدم الانتقال ب 13 حرفا فوجدت تسمية أخرى لها هي Rot 13 

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

عند فك شيفرة النص المرسل ستجد نصا آخر غير مفهوم أي شيفرة أخرى و لحلها عليك أن تقوم بكتابة العدد الذي يقابل كل حرف في كلمات تلك الرسالة من الأبجدية أي :

A : 1

B : 2

و هكذا دواليك فتنتج عندك رسالة أرقام...حلها يكمن في أن تقوم بانقاص قيمة الانتقال من كل عدد حصلت عليه فنحصل على سلسلة جديدة من الأرقام هي التي ستوصلنا الى النص الأصلي و ذلك باستبدال كل رقم بالحرف الذي يقابله في الأبجدية و لكن ابتداءا من الأسفل أي Z = 1 ...لا بأس بالمثال يتضح المقال :

لدينا كلمة : Hello World

أرقام الأحرف من الأسفل هي

H = 19 , e = 22 , l = 15 , l = 15 , o = 12

W = 4 , o = 12 , r = 9 , l = 15 , d = 23 

نقوم الآن باضافة الانتقال 6 للأرقام فنحصل على مجموعة جديدة هي :

18 ، 21 ، 21 ، 28 ، 25 

29 ، 21 ، 15 ، 18 ، 10 

 

ملاحظة : الأعداد التي تزيد عن 26 نحتسبها من البداية أي اذا كان عندنا 27 فالحرف هو A لأننا نفترض أن الأحرف في حلقة دائرية و كذلك الأمر ان قل الرقم عن 1 نحتسبها من النهاية مثلا ان كان عندنا 0 فالحرف هو Z 

 

و الآن سنضع الأحرف التي تقابلها : 

Y , b, u , u , r

J , r , o , n , c

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

و الآن الى المرحلة النهائية من التشفير و هي أن نشفر الأحرف الجديدة باستخدام شيفرة قيصر

Fhbbx Pxubi

 

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

 

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

 

و يتبع باذن الله في موضوع آخر تابع لاقتراحي

 

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

 

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

TP 1 2 3 4.rar 

تم تعديل هذه المشاركة بواسطة tantie L في 1 نوفمبر 2013 في 18:04

2

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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#2

السلام عليكم .. درس رائع بارك الله فيك ..

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

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

#include <stdio.h>#include <ctype.h>int main() {		char text[1000];	int key,i;	char offset;	printf("Enter The text\n");	gets(text);	printf("Enter the key (positive to encrypt negative to decypt zero to exit)\n");	scanf("%i",&key);		if(!key)		return 0;	for(i=0;text;i++)	{		if(text==' ')			continue;		offset='a';		if(isupper(text))			offset='A';		text-=offset;		text=(26+text+key)%26;		text+=offset;	}	puts(text);	return 0;}

الكود يطلب النص أولاً , ثم إدخال المفتاح ,

مثلاً لو قمنا بتشفير العبارة ArabTeam  باستخدام المفتاح 4 ستنتج :EvefXieq

ولفك تشفيرها ندخل العبارة EvefXieq ونضع المفتاح -4 فينتج :ArabTeam

 

الرابط التالي يبين الكود مع مثال على استخدامه .

أرجو أن تتابعي فالفكرة مثيرة للاهتمام ..  ( ملاحظة : أرجو تعديل العنوان إلى ما يدل على محتوى الموضوع )

 

بالتوفيق ,ثابري

:)

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 1 نوفمبر 2013 في 19:46

#3

هذه صفحة الويكيبيديا الخاصة بهذه الطريقة في التشفير ..

 

ملاحظات على الخوارزمية :
كما رأيتم في الخوارزمية فهناك 26 قيمة لمفتاح التشفير على الأكثر .. وأي قيمة أكبر من ذلك مثلا 27 هي نفسها 1 كما ذكرت الأخت كاتبة الموضوع ,
ولذلك يمكننا كسر تشفير هذه الطريقة باستخدام BruteForce ( أي طريقة تجريب جميع الاحتمالات )
والآن ما رأيكم بمحاولة كسر تشفير العبارة التالية :

اقتباس

 

Xklqebo yorqb clozb xmmolxze fp ql jxqze rm qeb cobnrbkzv afpqofyrqflk lc qeb ibqqbop

وما رأيكم في تطوير الكود ليتعامل مع :

1- الأرقام وعلامات الترقيم

2- الحروف العربية (يونيكود )

 

بالتوفيق

1
#4
مصطفى 36a2 كتب:

هذه صفحة الويكيبيديا الخاصة بهذه الطريقة في التشفير ..

 

ملاحظات على الخوارزمية :

كما رأيتم في الخوارزمية فهناك 26 قيمة لمفتاح التشفير على الأكثر .. وأي قيمة أكبر من ذلك مثلا 27 هي نفسها 1 كما ذكرت الأخت كاتبة الموضوع ,

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

والآن ما رأيكم بمحاولة كسر تشفير العبارة التالية :

وما رأيكم في تطوير الكود ليتعامل مع :

1- الأرقام وعلامات الترقيم

2- الحروف العربية (يونيكود )

 

بالتوفيق

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

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

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

 

مشكووووووووووووووووووووووور كثيرا أستاذ مصطفى

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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#5

تم تعديل العنوان.

 

تنبيه : يُرجى اختيار عنوان مناسب لمحتوى الموضوع في المرات القادمة.

#6
Snack3r كتب:

تم تعديل العنوان.

 

تنبيه : يُرجى اختيار عنوان مناسب لمحتوى الموضوع في المرات القادمة.

عنوان جميل 

شكرا لك يا أستاذ و سأراعي الأمر في المستقبل

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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#7
مصطفى 36a2 كتب:

السلام عليكم .. درس رائع بارك الله فيك ..

 

و عليكم السلام و رحمة الله و بركاته ....و فيك بارك الله أستاذ مصطفى و أشكرك على تشجيعك المستمر

 

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

 

لقد رأيته و جربت تشغيله و فعلا سارت الأمور بشكل جيد و ممتاز لولا ملاحظة صغيرة و هي أن البرنامج يقوم أيضا بتشفير الرموز الخاصة مثل ( ; . , / ) أليس من الأفضل أن لو أنك تعدل فيه قليلا حتى لا يحتسبها 

 

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

 

كنت سأفعل ذلك و لكنني عندما رأيت أن الكتابة في المحرر تبدو غير مرتبة خفت أن تكون بنفس الشكل فلم أفعل و الآن سأقوم بارفاق الكود مع المشاركة شكرااااااااااااااااااااااااااااا  :lol:

#include <stdio.h>#include <ctype.h>int main() {		char text[1000];	int key,i;	char offset;	printf("Enter The text\n");	scanf("%s",text);	printf("Enter the key (positive to encrypt negative to decypt zero to exit)\n");	scanf("%i",&key);		if(!key)		return 0;	for(i=0;text;i++)	{                if(text==' ')                      {                 putchar(' ');                 continue;                       }		offset='a';		if(isupper(text))			offset='A';		text-=offset;		text=(26+text+key)%26;		text+=offset;	}	printf("%s\n",text);	return 0;}

الكود يطلب النص أولاً , ثم إدخال المفتاح ,

مثلاً لو قمنا بتشفير العبارة ArabTeam  باستخدام المفتاح 4 ستنتج :EvefXieq

ولفك تشفيرها ندخل العبارة EvefXieq ونضع المفتاح -4 فينتج :ArabTeam

 

أستاذ مصطفى اليك صورة لتطبيق البرنامج S81yy.jpg

 

و أيضا هناك أمر آخر عندما تكون هناك نقطة في نهاية  الجملة و هذه صورة توضح ذلك UtNgB.jpg

 

الرابط التالي يبين الكود مع مثال على استخدامه .

أرجو أن تتابعي فالفكرة مثيرة للاهتمام ..  ( ملاحظة : أرجو تعديل العنوان إلى ما يدل على محتوى الموضوع )

 

سأحاول شكرا لاهتمامك و العنوان عدل بالفعل

 

بالتوفيق ,ثابري

:)

 

مشكووووووووووووووووووووووور أستاذ

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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#8

شكرا لك  Sn3cker .

أختي الكريمة شكرا لملاحظاتك على الكود ,

الملاحظة التي ذكرت بالنسبة للنقطة بنهاية السطر ليست لهذا السبب ,بل لأنني استخدمت scanf بدلا من gets والتي تتوقف عن القراءة عند الوصول للفراغ , وقد عدلت الكود قبل ان تكتبي ردك :)

( أرجو أن تتوقفي عن كتابة أستاذ , فهي تستهلك كثيرا في قاعدة بيانات المنتدى :D  يكفي مناداة العضو باسمه فكلنا هنا سواء )

 

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

#include <stdio.h>#include <ctype.h>int main() {        char text[1000];    int key,i;    char offset;    printf("Enter The text\n");    gets(text);    printf("Enter the key (positive to encrypt negative to decypt zero to exit)\n");    scanf("%i",&key);        if(!key)        return 0;    for(i=0;text;i++)    {        if(!isalpha(text))            continue;        offset='a';        if(isupper(text))            offset='A';        text-=offset;        text=(26+text+key)%26;        text+=offset;    }    puts(text);    return 0;}

عندما تريدين كتابة رد , فقط انزلي لأسفل الصفحة واستخدمي المحرر ولا داعي لاقتباس كل المشاركة , من أجل المظهر لا أكثر ,

بانتظار كسر تشفير العبارة في الرد السابق ,

بالتوفيق

1
#9

بل الشكر لك أنت...

أرجو المعذرة هل يمكنك أن تبين لي الفرق أكثر بين scanf و gets  فأنا لا أعرف ان كانت scanf تتوقف عند الفراغ ؟

 

و سأقول لك يا أستاذ مصطفى كما قلت للأستاذ Sn3cker فأنا أعتبر كل من أفادني و أعطاني أية معلومة مهما كان سنه أستاذا و معلما لي و سأضل أناديكم بأساتذتي حتى لو كانت هذه الكلمة تستهلك كثيرا في قاعدة بيانات المنتدى  :lol: 

 

سأجرب الكود الآن لأرى نتيجة التعديلات...

 

شكرا شكرا ها أنا ذي نفذت النصيحة  :lol: يا أستاذ مصطفى

 

هي أمامي الآن و أنا أحاول حللها  :thinking:

 

وفقك و ايانا

تم تعديل هذه المشاركة بواسطة tantie L في 1 نوفمبر 2013 في 20:54

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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#10

بالنسبة لـكتابة ما يلي :

char x[1000];scanf("%s",x);

فستتم قراءة سلسلة محارف وستتوقف عن القراءة عند أول فراغ , سواء كان space أو tab  أو new line

أما الدالة gets فهي تقرأ سطرا كاملا وتضعه كما هو في الوسيط الممرر .

 

بالنسبة لكسر التشفير فانتبهي أستاذة إلى العبارة :

اقتباس

 

كما رأيتم في الخوارزمية فهناك 26 قيمة لمفتاح التشفير على الأكثر .. وأي قيمة أكبر من ذلك مثلا 27 هي نفسها 1 كما ذكرت الأخت كاتبة الموضوع ,
ولذلك يمكننا كسر تشفير هذه الطريقة باستخدام BruteForce ( أي طريقة تجريب جميع الاحتمالات )

أي عليك القيام بفك التشفير بتجربة جميع المفاتيح من 1 إلى 26 ثم أن تنتبهي للخرج والخرج الذي تجدينه يعطي كلمات مفهومة وجملة مفيدة فهذا هو الخرج المطلوب .

___________________

ماذا يجدث لو قمنا بالتشفير باستخدام هذه الطريقة عدة مرات ؟

مثلاً استخدمنا المفتاح 6 ثم أخذنا الخرج وشفرناه بالمفتاح 12 ثم شفرنا الخرج مرة أخرى بالمفتاح 20 .. هل سنحصل على طريقة تشفير أفضل يا ترى ؟ أترك لكم التفكير في الإجابة :)

 

بالتوفيق

#11

هكذا الأمر اذن شكرا لك يا أستاذ مصطفى على هذا الشرح الماتع


 


نعم فأنا انطلقت منها و يبدو أنني سأستغرق وقتا لحلها..... 26 محاولة  :wacko:


 


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


 


ــــــــــــــــــــــــــــــــــــــــــــــــ


حراااااااااااااااااااااااااااااااااااام سيتعب كثييييييييييرا من سيحاول فك تشفيرها..... :(


لكن بالتفكير في الأمر سنحصل على شيفرة قيصر مضاعفة بشكل لا متناهي.....فكرة جيدة  :clapping: 


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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#12

خطأ .. لن نحصل على شيفرة قيصر مضاعفة بشكل لا متناهي .. فالناتج النهائي هو نفسه الناتج عن التشفير بمفتاح هو مجموع المفاتيح المستخدمة ثم باقي القسمة على 26 ..

مثلا تشفير ب 6 ثم 12 ثم 20 هو نفسه التشفير لمرة واحدة بــ 38 أي 38%26 أي 12 :) وهي ليست فكرة جيدة :) والأستاذ هو من لا يتوقف عن السؤال

______________

اكتبي برنامج يولّد الاحتمالات الــ 26 واقرئيها من الشاية واختاري المفتاح المناسب ...

 

بالتوفيق

#13

خسااااااااااااارة لست تلميذة جيدة يجب علي اكتساب مزيد من التركيز 

 

و أسئلة الأساتذة مستواها أعلى من مستوى أسئلتي و حتى ان سأل فهو يعرف اجابة سؤاله و هذا ما لا ينطبق علي

 

 

و حل سؤالك يا أستاذ مصطفى هو 

Another brute force approach it to mutch up the frequency distribution of the letters 

و المفتاح هو 23 - 

هل إجابتي صحيحة يا أستاذ ؟

1

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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#14

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

إليك عبارة أخرى :

اقتباس

 

Hyhi Alht 2000 pz aol Ilza Wyvnyhttpun Zpal ...

والآن إليك الكود بعد أن قمت بعمل golfing (أي تقصير الكود )

#include <stdio.h>
#include <ctype.h>

int main() {
    
    char t[1000],*T,o;
    int k,i;
    puts("Enter The text");
    gets(t);
    puts("Enter the key (positive to encrypt negative to decypt zero to exit)");
    scanf("%i",&k);
    
    if(k)
        for(T=t,o=isupper(*T)?'A':'a';*T;T++)
            putchar(isalpha(*T)?(26+(*T-o)+k)%26+o:*T);
    return 0;
}

حاولي فهمه الآن , مع العلم أنني لم أغير آلية العمل فهي نفسها ,

 

ننتظر خوارزمية جديدة , أو نتابع تطوير الكود , أو نعمل واجهة مثلاً إن أردت ..

 

بالتوفيق

#15

شكرااااااااااااا لك أستاذ مصطفى  :lol: 

 

سأحاول حلها بالتأكيد و أن أظن أنها جملة مكملة لجمل الأمس من  النقاط الموجودة في بداية الشيفرة  -_- 

 

كود و ﻻ أروع حقا هل أمكنك تقصيره الى هذا الحد !!!!!! مذهل 

 

أكيد سأحاول فهمه....لكن بعد أن أعرف بعض التعليمات الجديدة فكما قلت لكم أنا الآن فقط في خطوتي الأولى في البرمجة لذلك ﻻ تكونوا قساة في طرح الأسئلة  :( و ان طرحتم أسئلة صعبة فحاولوا أن تعطوني بعض الشروحات من فضلكم 

 

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

 

أشكرك كثيييييييييييييييييرا أستاذ مصطفى على أفكارك و مشاركاتك و نصائحك الرائعة

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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#16

السلام عليكم أستاذ مصطفى 

 

لقد قمت بتجريب برنامجك و قد نجح بالفعل

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

بالمناسبة فوجئت حقا عندما رأيت أن برنامجي الذي فيه عدد كبير من الأسطر صار بهذا الحجم الصغير....مازال أمامي مشوار كبير حتى أصبح مثلكم أيها الأساتذة المحترمون

 

و هل يمكنك أن توضح لي التعليمات التي قمت باستخدامها...أرجوك

 

و أما حل السؤال فالعبارة هي  Arab Team2000 is the eest Programming site 

و مفتاح الشيفرة هو -7 و لا أخفيك سرا أنني عندما رأيت الشيفرة و من أول محاولة حللتها و متأكدة من أنك تعلم السبب  ;) 

 

أشكرك كثيرا على كل هاته المعلومات الرائعة :)  :) 

تم تعديل هذه المشاركة بواسطة tantie L في 2 نوفمبر 2013 في 19:08

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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#17

حسناً بالنسبة للكود ..سأقوم بشرحه , ولكن قبل ذلك أحب أن أنوه إلى وجود خطأ يجعل البرنامج كله عديم الفائدة ..

سأكتب عن الخطأ اليوم وسأعدل المشاركة وأشرح الكود غداً .. ( أرجو عدم كتابة رد على هذا الرد )

الخطأ Bug

for(T=t,o=isupper(*T)?'A':'a';*T;T++)
            putchar(isalpha(*T)?(26+(*T-o)+k)%26+o:*T);

هو تخزين قيمة وحيدة للـ offset والذي رمزته o  .. والصحيح أن تتم تحديث قيمته كل دورة للحلقة وليس أول دورة فقط ...

for(T=t;*T;T++)
            o=isupper(*T)?'A':'a',putchar(isalpha(*T)?(26+(*T-o)+k)%26+o:*T);

وغداً سأشرح الكود إن شاء الله ولكن بعد تطويل الكود قليلاً ... فأحد أهداف تقصير الكود هو جعله غير مفهوم ..

بالتوفيق

1
#18

السلام عليكم
هذا هو شرح الكود السابق , سأشرح الحلقة فقط لأن الباقي معروف
لدينا مؤشّر T والمصفوفة التي احتفظت بالدخل اسمها t
والآن سنتبع الخوارزمية التالية :

  1. نسند T إلى أول حرف في t
  2. طالما لم تنته سلسلة الدخل فقم بالخطوة 3 وإلا انه البرنامج
  3.  إذا كان الحرف كبيراً :أسند 'A' إلى المتغير o وأعني به offset , وإلا أسند 'a'
    (فائدة الخطوة السابقة هي أننا عندما نريد تحويل الحرف إلى رقم فسنطرح منه offset وعندما نريد تحويل الرقم إلى حرف فسنزيد له offset)
  4.  إذا كان المحرف ليس من الحروف الانكليزية (رمز أو رقم) فاطبعه كما هو وانتقل إلى الخطوة 7
  5.  قم بطرح الoffset من المحرف ثم شفّره عن طريق إزاحة بمقدار المفتاح k وخذ باقي القسمة على 26 (لأننا نعتبر الحروف تشكل حلقة أي بعد z يأتي a )
  6.  قم بإضافة الoffset إلى الناتج ليرجع حرفاً ثم اطبع الناتج
  7.  انتقل إلى المحرف التالي واذهب إلى الخطوة 2

والآن سأضع رقم الخطوة وبعده الكود مباشرة

1-    T=t
2-    *T اختبار محتوى المؤشر وهو قيمة المحرف إذا كانت صفر أي نهاية السلسلة نخرج من الحلقة
3-  o=isupper(*T)?'A':'a'; تعليمة الشرط الثلاثية إذا تحقق الشرط نأخذ القيمة اليسرى وإن لم يتحقق نأخذ اليمنى
4-  putchar(isalpha(*T)?X:*T); تعليمة  الشرط الثلاثية مرة أخرى إذا لم يتحقق شرط كونه حرفاً فسنطبعه كما هو
X تعني الجزء في الخطوة 5 و 6
5-6- العمليات الرياضية واضحة نحول الحرف إلى رقم ونشفّره ثم نحوله ثانية إلى حرف ثم نطبعه
7- T++ تنتقل للخانة التالية في الذاكرة أي المحرف التالي

طبعا الكود السابق كله داخل حلقة for
انتهى الشرح ..

والله ولي التوفيق

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 4 نوفمبر 2013 في 18:00 — السبب: التنسيق

#19

شكرا لك أستاذ مصطفى ... :lol: 

درس رائع بارك الله فيك كله معلومات لم أكن أعرفها خاصة تعليمة الشرط الثلاثية ... ^_^ 

مفاجئة حقا هي البرمجة ... :o 

 

بورك فيك يا أستاذ

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


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#20

إذا فاجأتك تعليمة الشرط الثلاثية فعليك دراسة اللغة جيّداً لأنها من الأمور الأساسية في C ..

ننتظر الموضوع القادم عن خوارزمية جديدة ..

 

(بالمناسبة : للحفاظ على تنسيق الموضوع لا داعي لردود الشكر فهي لن تفيد الأعضاء الذين يقرؤون المشاركة . وحاولي ترتيب التنسيق بدون (تثخين الخط , وتكبير الخط ) فهي غير مريحة للعين .. وشكرا لك .. )

 

بالتوفيق ثابري :)

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