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

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

بدأه شموخ انثي في 31 يناير 2012 · 21 رد · 1,870 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

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

مطلوب تنفيذ برنامج للتالي ::

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

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

بحيث تتم عملية النقل بشكل مأمون .

يجب علي برنامجك قراءة الخانات الاربعه ثم تشفيرها علي الشكل التالي :

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

ثم يتم التبديل بين موضعي الخانتين الاولي والثاله وبين الثانيه والرابعه .ثم يقوم بطباعة الشفره.

ثم أكتب برنامج اخر يأخذ الشفره ويفككها ليعيد القيمه الاصليه ."

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

\\\\ وهذا برنامج الشفره :::

code(18).cpp

شاكره لكم تعاونكم

#2

هذا البرنامج لن يعمل إلا إذا كان حاصل ضرب الرقم فى 7 يقبل القسمة على 10! لأن, خلال عملية التشفير, لو فى باقى للقسمة على 10 سيعتبر "معلومة مفقودة" و لن تستطيعى إسترجاعها خلال عملية فك التشفير.

#3
Blueteeth كتب:

هذا البرنامج لن يعمل إلا إذا كان حاصل ضرب الرقم فى 7 يقبل القسمة على 10! لأن, خلال عملية التشفير, لو فى باقى للقسمة على 10 سيعتبر "معلومة مفقودة" و لن تستطيعى إسترجاعها خلال عملية فك التشفير.

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

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

هذه محاوله بتفكيك الشفره بس معايا مشكله لما رقم من الارقام = صفر يطلع قيمه غلط

lssl.cpp

ارجووو الاجابه بسرررعه

تم تعديل هذه المشاركة بواسطة شموخ انثي في 31 يناير 2012 في 18:47

#4

متحاوليش! طريقة التشفير أساسا غير سليمة. يعنى لو حاولتى تشفرى 3333 أو 4444 حيطلع نفس الناتج و هو 2222، طيب لما تيجى تفكى تشفير 2222 المفروض حتبقى 3333 ولا 4444؟!

#5

يعني هنا الخطأ من السؤال نفسه وكيفية الطلب

او انه في غلط ببرنامج الكود

لانه لو غلط بالسؤال ما بتعب نفسي

بس لو غلط بالبرنامج بحاول من جديد

بليييز صح تعبتك معايا بس ايش نسوي سنه اولي تعب ^_^

#6

..................... .

انا فهمت من سؤال ما يلى وعلى اساسة كتبت خوارزم خطوات حل البرنامج:

  1. ضرب كل خانة على حدا فى القيمة 7.
  2. قسمة كل خانة على حدا على 10.
  3. ابدال موضع الخانة اﻻولى مع الثالثة.
  4. ابدال الخانة الثانية مع الرابعة.
  5. طباعة الشفرة

وبعد ذلك كود فك الشفرة ويتم بعكس ترتيب الخطوات السابقة.

فكرة الحل:

نحن بدلا من ان نستخدم اداة الضرب * فى سي++ سوف نستخدم اداة الضرب على مستوى البت أى Bitwise operator multiplication وبنفس الطريقة مع القسمة.

وبالنسبة للخطوة الثالثة والرابعة نستخدم فكرة المتمم الحسابى ومايسمى بالمسك mask .

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

اﻵن هذة فكرة الحل وخوارزم خطواتة انا سأحاول وضع كود وكل من قرأ المشاركة يمكنة وضع كود حول حل هذة اﻻفكار.

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

تم تعديل هذه المشاركة بواسطة محمد ابوزايد في 1 فبراير 2012 في 21:16

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#7

و إزاى طيب مش حتفقد معلومات عند القسمة على 10؟

#8

السلام عليكم

هذه هي محاولتي لتشفير

#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char * argv[]){
    const int size = 4;
    long double swap = 0.0;
	long double data[size];
	// get data and encode 
	for(int i = 0; i < size; i++){
		cout << "Enter data for case: " << i + 1 << endl;
		cin >> data;
		data *= 7 ;
		data /= 10;
		cout << data << endl;
	}
	// change position
	swap = data[0];
	data[0] = data[2];
	data[2] = swap;
	swap = data[1];
	data[1] = data[3];
	data[3] = swap;
	// display data
	for(int i = 0; i < size; i++){
	    cout << "Your data encoded case: " << i + 1<< "\t" << data << endl;

	}
	system("pause");
	return 0;
}

لعكس التشفير

#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char * argv[]){
    const int size = 4;
    long double swap = 0.0;
	long double data[size];
    // change position
	swap = data[2];
	data[2] = data[0];
	data[0] = swap;

	swap = data[3];
	data[3] = data[1];
	data[1] = swap;
    // decode data 
	for(int i = 0; i < size; i++){
		cout << "Enter data to decode  case: " << i + 1 << endl;
		cin >> data;
		data *= 10 ;
		data /= 7;
	}
    // diplay data
	for(int i = 0; i < size; i++){
	    cout << "Your data decoded case: " << i + 1<< "\t" << data << endl;

	}
	system("pause");
	return 0;
}
#9
اقتباس
و إزاى طيب مش حتفقد معلومات عند القسمة على 10؟

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

ولكن سأحاول التفكير فى حل آخر ان شاء الله

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#10

شكرا علي تفاعلكم

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

وشكرا اخ محمد ابو زايد علي البرامج

بس للمعلومه احنا لسا ما أخذنا المصفوفات ان سويت البرنامج بطريقه مفصله

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

واسوي تفكيك الشفره داخل سويتش عشان احدد متي تخرج

أن شاء الله بحاول أكتب البرنامج

وأذا نفع برفعه هنا علي طول عشان الاستفاده

اما اذا ضلت نفس المشكله فبستمر احاول اسوي قانون خاص بالبرنامج ^_^

#11

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

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

وأذا في اي تعديل كلموني

code(18).cpp

#12
اقتباس
اخيييييييييييييرا طلعت برنااامج يسوي الكوود المطلوب في الحالتين

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

وأذا في اي تعديل كلموني

a=m3; // a is intger and m3 is fload data will be loss
m1=a; // same as above but opiste

سوف يحدث فقد للمعلومات ﻻن المتغير a ﻻ يستطيع ان يحمل كل لبيانات الخاصة المتغير m3 وكذلك مع المتغير b

ﻻبد من تحويل كل المتغيرات الى نوع يقبل القسمة بدون فقد مثل float

تم تعديل هذه المشاركة بواسطة محمد ابوزايد في 2 فبراير 2012 في 10:30

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#13

أعتقد إن السؤال طالب بوضوح أن تكون القسمة صحيحة!

اقتباس
القسمة الصحيحة على 10
#14
Blueteeth كتب:

أعتقد إن السؤال طالب بوضوح أن تكون القسمة صحيحة!

لم أفهم قصدك؟

أتعنى علينا استخدام المتغيرات الصحيحة فقط. وﻻ تستخدم المتغيرات ذات الفاصلة العائمة؟

هذا يعنى انة ليس له اﻻ حل واحد وهو استخدام متغير ذو فاصلة عائمة مؤقتا ثم نقلة البتتات المكونة نقلة الى متغير صحيح بدون فقد الكسر عن طريق عمليات الرفع على مستوى البت << و >> اذا كانت البتات الباقية على يسار طول المتغير فارغة وتسمح بذلك اى البتات الفارغة بعد قيمة 9999 وهذا يضيف خطوة اخرى على البرنامج.

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

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#15
اقتباس
لم أفهم قصدك؟

أتعنى علينا استخدام المتغيرات الصحيحة فقط. وﻻ تستخدم المتغيرات ذات الفاصلة العائمة؟

هذا ما أعتقده من واقع نص السؤال.

اقتباس
هذا يعنى انة ليس له اﻻ حل واحد وهو استخدام متغير ذو فاصلة عائمة مؤقتا ثم نقلة البتتات المكونة نقلة الى متغير صحيح بدون فقد الكسر عن طريق عمليات الرفع على مستوى البت << و >> اذا كانت البتات الباقية على يسار طول المتغير فارغة وتسمح بذلك اى البتات الفارغة بعد قيمة 9999 وهذا يضيف خطوة اخرى على البرنامج.

بصراحة أنا مش فاهم حتنقل من غير فقد الكسر إزاى؟

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

لا أعتقد, لأنه لو كان بيتكلم على بت مكانش قال حاصل ضرب الخانة فى 7 و قسمتها على 10.

#16
شموخ انثي كتب:

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

السؤال بهذه الصيغة ﻻحل له ومن وضعه أخطأ , إحذفي كلمة "الصحيحه" وسيصبح له حل, عمل شيء كهذا غير ممكن مع الأعداد الصحيحة int ويتطلب السماح بالأعداد العشرية float

#17
اقتباس
بصراحة أنا مش فاهم حتنقل من غير فقد الكسر إزاى؟

انا اقصد بالنقل بدون فقد الكسركما يلى:

اﻻعلان عن متغير floatله نفس حجم int من الذاكرة 4 بايت لكل منهما.

نقل الجزء الصحيح الى متغير صحيح intvar1.

نقل الكسر الى متغير من نوع صحيح عن طريق.

-تحويل جزء الكسر الى كود ثنائى بطول 16 بت كحد أقصى .

-تحويل الكود الثنائى الى متغير صحيح intvar2.

دمج intvar1 و intvar2 فى متغير صحيح اخر intmarg

لماذا فكرة الدمج مقبولة؟ ﻻن هنك شرط بالبرنامج بأن القيمة المدخلة ﻻتقل عن 1000 وﻻ تزيد عن 9999 اى فى تمثيلها الثنائى لن تزيد بأى شكل عن 0x0000 FFFF.

وان جزء الكسر سوف يعد بحيث ﻻيزيد عن 16 بت بتمثيلة الثنائى كــ 0x0000 FFFF.

كيف يتم الدمج ؟

ترحيل البتات 16 بت الى اليسار intvar2 <<= 16; ليصبح فى الصورة 0xFFFF 0000

دمج المتغير intvar2 مع int var1 كما يلى intmarg = intvar1 | intvar2; ليصبح فى صورة 0xFFFF FFFF

كيف يتم فك الدمج ? بعكس الخطوات السابقة

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

لذا انا سأكتفى بهذا فى هذة المشاركة

والله يعينا على ما ينفعنا وينفع غيرنا

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#18

أخ محمد

اصلا يوم تضيف قيمة المتغير m 3 الي المتغير a

بتنضاف فلوت الي انتجر عادي بيتم ازاله ما بعد الفواصل

والخطوه الثانيه نفس الحاله

وفي البرنامج عند التنفيذ بيتنفذ عادي

بس اذا تريد تسوي المتغيرين a,b فلوت سويهن ما يأثر ابدا

بس انا كنت اسوي مجموعة متغيرات فما اهتميت وين تنحط

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

لو في شئ او غلط في الكود اتمني تكلموني

او اي استفسار من شان الكود انا موجوده

يلا اتعبتكم معايا

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

واتمني لكم التوفيق

#19
اقتباس
بتنضاف فلوت الي انتجر عادي بيتم ازاله ما بعد الفواصل

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

واليك ما قالة اخى بلوتوث فى ذلك

اقتباس
متحاوليش! طريقة التشفير أساسا غير سليمة. يعنى لو حاولتى تشفرى 3333 أو 4444 حيطلع نفس الناتج و هو 2222، طيب لما تيجى تفكى تشفير 2222 المفروض حتبقى 3333 ولا 4444؟!

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#20

لا يوم سويت برنامج فك الشفره في البرنامج نفسه

استخدمت المتغيرات الاوليه عشان ما افقد القيم والاعداد العشريه

ويوم تنفيذ البرنامج بيأخذ قيم المتغيرات من القيم الاوله

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

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

#21

ممم فهمت طريقتك يا محمد, هى بس لافة شوية, ممم أقصد أقول غير مباشرة, و علشان تحول الكسر إلى عدد صحيح, لعمل النقل (shift), لازم تضرب فى 10, و بالتالى من الأسهل أن تضرب العدد من الأول فى 10 و لا تضطر لعمل نقل أساسا, و لكن فى نفس الوقت كأنك تلغى آخر خطوة فى عملية التشفير و هى القسمة على 10.

#22
اقتباس
ممم فهمت طريقتك يا محمد, هى بس لافة شوية, ممم أقصد أقول غير مباشرة, و علشان تحول الكسر إلى عدد صحيح, لعمل النقل (shift), لازم تضرب فى 10, و بالتالى من الأسهل أن تضرب العدد من الأول فى 10 و لا تضطر لعمل نقل أساسا, و لكن فى نفس الوقت كأنك تلغى آخر خطوة فى عملية التشفير و هى القسمة على 10.

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

شكرا على أضافك المميزة التى جدد وسهلت على فكرة التشفيير ان شاء الله فى وقت ﻻحقا ساحاول تحويلها الى كود بلغة سي++

تقبل مرورى تحياتى العطرة والله الموفق .... .

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

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