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

[تنبيه - عدم تكرار المخالفة :]كيف اكتب برنامج للتحويل من النظام العشري الى الانظمة الاخرى (الثنائي والثماني والستة عشري) والعكس غير مطلوب

مغلق
بدأه sara_chan في 26 ديسمبر 2007 · 9 رد · 11,083 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كيف اكتب برنامج للتحويل من النظام العشري الى الانظمة الاخرى (الثنائي والثماني والستة عشري) والعكس غير مطلوب؟؟

عندي طلب اخر رجاءا

عندي برنامج كتبته لكن اتضح ان ليس صحيح 100%

1-اكتب برنامج لإيجاد تقدير الطالب باستخدام (switch)

بحيث يمثل الاتي:

0الى 50 مقبول

50 الى 70 ضعيف

70 الى 80 جيد

80 الى 90 جيد جدا

90 الى 100 ممتاز

اظنه لن يصعب على محترفين كالذبن اراهم

هذا ومع الشكر

#2

هذا الموضوع يشتمل على مخالفة أو أكثر لقواعد المشاركة.

الرجاء التنبه وعدم تكرار المخالفة في مواضيعك القادمة، وهذا بمثابة إشعار للأهمية.

وفي حال التكرار سيتعرض موضوعك للإغلاق والحذف!!!

قواعد المشاركة

/index.php?showtopic=29343

يمكنك وضع حلك للأسئلة و سيساعدك الأعضاء فيما يستطيعون عليه إن شاء الله

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 26 ديسمبر 2007 في 01:34

#3

اعتذر سيد خالد فأنا جديدة هنا ولقد قرأت قوانين لكن ليست هذه القوانين ..

وهي قوانين تفيد الاعضاء قبل الادارة وسأحاول التقيد بها مستقبلا..

بالنسبة لـقانون يجب ان يحتوي الموضوع على سؤال واحد

فسأعتمد السؤال الاول ولن اطالب بالسؤال الثاني كما اني ساكتب محاولتي فيه !!


#include<iostream.h>
main()
{ int x;
switch(x)
{case 0 :
cout<<in binary oooo<<endl<<in octal 0<<endl<<in hexidecimal o ;break;
case 1:
cout<<in binary ooo1<<endl<<in octal 1<<endl<<in hexidecimal 1;break;
case 2:
cout<<in binary oo10<<endl<<in octal 2<<endl<<in hexidecimal 2;break;
case 3:
cout<<in binary oo11<<endl<<in octal 3<<endl<<in hexidecimal 3;break;
case 4:
cout<<in binary o1oo<<endl<<in octal 4<<endl<<in hexidecimal 4;break;
case 5:
cout<<in binary o1o1<<endl<<in octal 5<<endl<<in hexidecimal 5;break;
case 6:
cout<<in binary o11o<<endl<<in octal 6<<endl<<in hexidecimal 6;break;
case 7:
cout<<in binary o111<<endl<<in octal 7<<endl<<in hexidecimal 7;break;
case 8:
cout<<in binary 1000<<endl<<in octal 10<<endl<<in hexidecimal 8;break;
case 9:
cout<<in binary 1oo1<<endl<<in octal 11<<endl<<in hexidecimal 9;break;
case 10:
cout<<in binary 1o1o<<endl<<in octal 12<<endl<<in hexidecimal A;break;
case 11:
cout<<in binary 1o11<<endl<<in octal 13<<endl<<in hexidecimal B;break;
case 12:
cout<<in binary 11oo<<endl<<in octal 14<<endl<<in hexidecimal C;break;
case 13:
cout<<in binary 11o1<<endl<<in octal 15<<endl<<in hexidecimal D;break;
case 14:
cout<<in binary 111o<<endl<<in octal 16<<endl<<in hexidecimal E;break;
case 15:
cout<<in binary 1111<<endl<<in octal 17<<endl<<in hexidecimal F;break;

default:cout<<"this numer is not stored yet";
return0
}
}

"لقد نسيت علامات الكتابة في cout "

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

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

#4

الاخت الفاضله ..

البرنامج يقسم الى اكثر من جزء ..

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

#include <iostream.h>


void bin(int n) {


	while (n>0) {

		cout << n << " (decimal) = ";

		while (n > 0) {
		cout << n%2;
		n = n/2;
		}

		cout << " (binary) in reverse order" << endl;
	}
			if(n<=0) {
		cout << "Please enter a number greater than zero." << endl;
	}
	}


int main(){

int f;
cin >> f;
 bin(f);

return 0;}

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

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

/index.php?showtopic=141561

ولكن لو كنتي مستعجله للحل هذا الكود خاص بالتحويل ..

#include <iostream.h>

main()
{
int i;
char s[20];

cout << "HEXADECIMAL TO BINARY\n"<< endl;
cout << "Enter A Hexadecimal Number:";

cin >> s;
cout << "Binary= " << endl;
for(i=0;s!=NULL;i++)
{
switch(s)
{
case '0':
cout <<"0000";
break;
case '1':
cout <<"0001";
break;
case '2':
cout <<"0010";
break;
case '3':
cout <<"0011";
break;
case '4':
cout <<"0100";
break;
case '5':
cout <<"0101";
break;
case '6':
cout <<"0110";
break;
case '7':
cout <<"0111";
break;
case '8':
cout <<"1000";
break;
case '9':
cout <<"1001";
break;
case 'a':
case 'A':
cout <<"1010";
break;
case 'b':
case 'B':
cout <<"1011";
break;
case 'c':
case 'C':
cout <<"1100";
break;
case 'd':
case 'D':
cout <<"1101";
break;
case 'e':
case 'E':
cout <<"1110";
break;
case 'f':
case 'F':
cout <<"1111";
break;
default:
cout <<"Number Is Not Hexadecimal";
break;
}
}

}

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

هذا ما اقدمه فقط والباقي عليك ..

كنصيحة قومي بوضع كل عملية تحويل من نظام الى نظام بدالة واستدعيها وقت الحاجه ..

اتمنى ان اكون قد وصلت ما اردتيه .. وانا حاضر لاي استفسار..

تحياتي العطرة ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#5

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

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

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

/index.php?showtopic=141561

هل هناك تظن ان هناك طريقة اخرى لحلها؟؟

#6

اختي سارة .. لاشكر على واجب ...

واجبنا المساعده وكلنا طلاب ..

بالنسبة للبرنامج ..

اولا .. تعتبر مشكله عدم معرفتك للمصفوفات في مثل هذا السؤال ...

سافهمك ما فائدة المصفوفة في البرنامج الثاني ..

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

مثلا الموقع الاول من المصفوفه ماهي قيمته .. اذا كانت صفر يطبع صفر ويخرج من جملة switch .. واذا كان مثلا 10 يطبع a .. وهكذا ..

لينتقل بعدها الى الموقع الثاني ليختبره ايضا وتجري العمليه الى ان ينتهي الرقم .

بالنسبه لمسألة تجاوز المصفوفة في مثل هذا السؤال ..

رأيتي فائدة المصفوفة اعلاه فكيف يمكننا تجاوزها

المصفوفة لها فائده اخرى في التحويل بين الانظمة الثلاثه الاخرى العشري والثنائي والثماني ..

الفائده من المصفوفه الرقميه في هذه الانظمة هي التالي ...

ناخذ مثلا التحويل من العشري الى الثنائي ..

الكود الخاص بالعملية هو التالي ..

#include <iostream.h>


void bin(int n) {


	while (n>0) {

		cout << n << " (decimal) = ";

		while (n > 0) {
		cout << n%2;
		n = n/2;
		}

		cout << " (binary) in reverse order" << endl;
	}
			if(n<=0) {
		cout << "Please enter a number greater than zero." << endl;
	}
	}


int main(){

int f;
cin >> f;
bin(f);

return 0;}

لاحظي السطر الذي فيه ..

اقتباس
cout << " (binary) in reverse order" << endl;

معنى هذا السطر ان الرقم الذي سيطبع على الشاشه هو الرقم الثنائي ولكن معكوس .. يعني لو ادخلنا العدد العشري 8 فان العدد الثنائي له هو 1000 ولكن البرنامج سيطبع 0001 .. لاحظي انه نفس الرقم ولكنه معكوس من اليمين الى اليسار .. لذلك فاننا ندخل العدد لمصفوفة رقميه من بعد واحد قبل ان نطبعه وبعدها نطبع المصفوفة بالعكس فيظهر الرقم بالشكل الصحيح ..

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

لذلك افهميه جيدا وافهمي المصفوفه كما شرحتها لكي..

بالنسبه للتحويل الى النظام الثماني .. التغيير في دالة الثنائي فقط ان تجعلي المود على 8 والقسمه ايضا على 8 .. لانه ثماني ...

اعلم انه شرح متواضع .. واي شئ انا حاظر في الخدمه لكي وللجميع ..

تحياتي العطره ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#7

هناك قاعدة مشتركة للتحويل من ا لديسمل الى الانظمة الاخرى و هي القسمة المتكررة على وزن النظام

  1. فللتحويل من ديسمل الى ثنائي نقسم على 2
  2. وللتحويل من ديسمل الى ثماني نقسم على 8
  3. وللتحويل من ديسمل الى سته عشري نقسم على 16

وهناك مشكلتين امام هذه الطريقة:

  • اذا كان العدد كسري فليس علينا القسمة بل ا لضرب وبالتالي :
    1. فللتحويل من ديسمل الى ثنائي نضرب في 2
    2. وللتحويل من ديسمل الى ثماني نضرب في 8
    3. وللتحويل من ديسمل الى سته عشري نضرب في 16

  • والمشكلة الثانية هي
    كيفية التعبير عن القسمة المتكررة ،يمكننا استخدام جملة for لكن كيف سنعبر عن شرط النهاية الذي سيكون اذا اصبح العدد صحيح توقف ثم قم بجمع نواتج القسمة المتكررة (نفس طريقة جمع السترينج ) يعني 1+1 لايقصد بالناتج 2 بل يقصد 11

أما عيوب الطريقة التي استخدمتها في البداية فهي محدودية الارقام المخزنة >>يال غبائي فوق عنائي..

اعني ماذا لو ادخل المستخدم رقم ديسمل اكبر من 16 عندها لن يكون للبرنامج فائدة ؟؟ ألا اقول الحقيقة >>مقتبسة من مارو من مسلسل ماروكو خخخ

بصراحة ليس لدي رغبة في الضحك خخخخ <_<

#8

طيب اخت ساره ..

البرنامج الذي طلبته كتبته لكي .. وهو يحول الانظمة فيما بينها .. كل ماعليك فعله هو جعل كل جزء في داله ومن ثم استدعي الداله المطلوبه عندما تحتاجينها ..

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

ولكن الكود الذي كتبته يحول الصيغ الصحيحه.. اما اذا اردتي ان يكون التحويل بين رقم ممكن ان يحتوي كسرا ..

ايضا استطيع فعل ذلك وبكل بساطه ..

ولكن لابسط سبب انا لن اكتب الكود لحل هذه المشكله وهو من صالحك انتي لانكي لاتعرفين المصفوفات بعد فكيف ادخل في تفاصيل دوال الرياضيات او غيرها من الامور التي من شأنها ان تعقد عليك المسأله اكثر ..

لذلك هذا الكود افهميه .. اذا استطعتي فهم هذا الكود تستطيعين بعدها ان تغيري فيه او تضيفي اليه ماتشائين من امور ...

اذا احتجتي اي شئ انا في الخدمة..

تحياتي العطرة ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#9

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

main()
{
 float x ; string r,u ;
\\ليس لدي ادنى فكرة كيف ساعرف zوyوs ربما يكونون عدد صحيح او كسري 
while(x>0)

for(c=1;ان تكون الناتج عدد صحيح 100%;c=\c)\\خطوة خنفشارية ليس لها علاقة بالبرنامج وكأنك لم تقرأها
z=(x\16)
if (z is integer with fraction)
{r=1
cout<<r;}
if (z is only fraction)
{u=0
cout<<u;}
if (z is only integer&it was fraction at  first  )
 cout<<r+u; \\I'm going to kill my self

if (z is only integer &it was integer at first)
cout<<u+r; 

else 
cout<<"bad Idea";
\\ونفس الخطوات مكررة بالنسبة للنظام الثماني والسته عشري  

y=x\2
s=x\8

\\المصيبة هي في السته عشري وحروفه اظن انه يحتاج الى  تعريف وخصوصا الارقام التالية 10 و11و12و1 و14 و15


getch()
}

حسنا لابد اني رفعت لك الضغط

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

لدي سؤال واحد

هل يفعل برنامجك هذا؟

مثلا سنحول الديسمل التالي الى ثنائي

0.572*2=1.144------->1(MSB)

0.144*2=0.288-------->0

0.288*2=0.576-------->0

0.576*2=1.152-------->1

0.52*2=0.304--------->0

0.304*2=0.608-------->0

0.608*2=1.216-------->1(LSB)

in fraction we don't reverse MSB and LSB

but in the right number(integer) we do

0.572 =0.1001001

اهئ ارجو ان لا اطرد من المنتدى سريعا :D

لم اكن اعرف اني مزعجة بهذا الشكل قبل الان oO

تم تعديل هذه المشاركة بواسطة sara_chan في 3 يناير 2008 في 13:14

#10

اختي ساره ..

اولا ..

اقتباس
لم اكن اعرف اني مزعجة بهذا الشكل قبل الان

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

ثانيا .. بالنسبه للكود الذي كتبتيه ..

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

انا لم افهم اي شئ من الكود الذي كتبتيه بصراحه .. ولكن الذي فهمته بعد الصراع هو ان المتغير u خاص بالثنائي .. والمتغير s خاص بالثماني .. اليس كذلك..؟؟

اذا كان هذا هو المقصود ..

عندما تصلين الى النظام 16 .. تبدأ عملية مقارنة الناتج ... فاذا كان 10 فتحول الى a واذا كان 11 تحول الى b وهكذا .. وهذه الصيغة تكون بالشكل التالي . . .

switch(num)

{

case 10 : cout << 'a';break;

{

ثم تتابعين بعدها ..

عجبني فيكي اصرارك على حل السؤال بطريقة انتي تبتكريها .. وانا اشجع هذا الشئ .. اجمل شي في الدنيا هو ان اكتشف الشئ لوحدي وان يكون مختلف عن الموجود .. لذلك اعتمدي على كل ملاحظه ذكرتها لكي وستتوصلين الى الحل ان شاءالله ..

لانه بالاصرار نصل الى ما نريد .

انا الان لدي امتحانات .. ولكن عند المجال ساحاول كتابة برنامج هل يحول بين الانظمه .. وخاصة النظام الذي اصبح معضلة لكي وهو الهيكس

ثالثا .. بالنسبه لبرنامجي ...

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

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

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

ثم قومي بطباعة الناتج ..

هذه الفكره توضع في دالة غير الدالة التي كتبتها لكي سابقا .. فقبل ادخال الرقم المراد تحويله يجب ان تسألي المستخدم .. ماهي الانظمة التي يريد التحويل منها واليها .؟؟ وهل الرقم يحتوي جزء كسري ام لا ..؟؟ فاذا كان يحتوي تستدعي دالة خاصه بذلك .. واذا كان لا تستدعي دالة اخرى ..

او ان تجعلي الداله عامه لكل شئ وهي ستكون صعبة البرمجة.. ومن الممكن ان تحصل بها اخطاء مستقبليه ..

هذا والله اعلم ..

استمري في كتابة المحاولات وانا معك ان شاءالله ..

في الخدمة ..

تحياتي العطرة ...

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

هذا الموضوع مغلق.

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