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

[ تمت الإجابة ]تحسين كود :التحويل من النظام الثنائي للنظام العشري

بدأه مومو (momo) في 19 مايو 2012 · 12 رد · 4,248 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

أفيدونا قليلا بخبرتكم جزاكم الله خيرا

لتكن x ∈ N


#include <math.h>
#define MAX 1000
//Réalisé par MOMO
int main()
{
long s=0,b[MAX]={0}; int i=0,j=0,k=0; char a[MAX]={0};
printf("Entrer un nombre en mode(2):\t");scanf("%s",a);
for(i=0;a!='\0';i++);
for(k=i,j=0;j<i;j++,k--) s+=b[j]=(a[j]-48)*pow(2,k-1);
printf("==>Nombre en mode(10)\t=\t%ld",s);
return 0;
}
#include <stdio.h>

المخرجات

1337435238161.jpg

تم تعديل هذه المشاركة بواسطة مومو (momo) في 19 مايو 2012 في 16:58

i love you mama

#2

طالما ان النص المدخل بالنظام الثنائي لا داعي من استخدام الضرب فقط قم بعمل shift left للرقم الموجود بالخانه و من ثم or it للنتيجه النهائيه واستخدم printf للطباعه.

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

1

مدونتي: C++ Tips and Tricks

#3
Μωάμεθ αλάά كتب:

طالما ان النص المدخل بالنظام الثنائي لا داعي من استخدام الضرب فقط قم بعمل shift left للرقم الموجود بالخانه و من ثم or it للنتيجه النهائيه واستخدم printf للطباعه.

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

سنستبدل هذا الأمر

for(k=i,j=0;j<i;j++,k--)  s+=b[j]=(a[j]-48)*pow(2,k-1);

بهذا الأمر الجديد >> جيد جدا أستاذ Μωάμεθ αλάά

for(k=i,j=0;j<i;j++,k--)  s+=b[j]=(a[j]-48)<<(k-1);

ولكن ماذا تقصد ب or it للنتيجه النهائيه؟؟؟

تم تعديل هذه المشاركة بواسطة مومو (momo) في 19 مايو 2012 في 20:45

i love you mama

#4

قارن هذا الكود بالخاص بك:

#include <stdio.h>
#define MAX 1000

int main()
{
   char a[MAX]={0};
   char *b = (char*)a;
   int i=0;

   printf("Entrer un nombre en mode(2):\t");
   scanf("%s",a);

   while(*b)
   {
      i <<= 1;
      if (!(*b++ - '0')) continue;
      i |= 1;
   }

   printf("==>Nombre en mode(10)\t=\t%d",i);
   return 0;
}

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

تم تعديل هذه المشاركة بواسطة Μωάμεθ αλάά في 19 مايو 2012 في 23:09

2

مدونتي: C++ Tips and Tricks

#5

السلام عليكم

أعتقد أن الأخ محمد علاء الدين قد أجاب على الموضوع.

للفائدة, يمكن كتابة الكود بطريقة أخرى.

بالسي :

#include<stdio.h>
int main() {
	 int n;
	 printf("Entrer un nombre en mode(10) : ");
	 scanf("%d",&n);
	 printf("Le nombre %d dans la base 8 vaut %o\n",n,n);
	 printf("Le nombre %d dans la base 16 vaut %x",n,n);
	 return 0;
}

بالسي++ :

#include<iostream>
using namespace std;
int main() {
	 int n;
	 cout<<"Entrer un nombre en mode(10) : ";
	 cin>>n;
	 cout<<"Le nombre "<<n<<" dans la base 8 vaut "<<oct<<n<<endl;
	 cout<<"Le nombre "<<dec<<n<<" dans la base 16 vaut "<<hex<<n;
	 return 0;
}

بالتوفيق.

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 20 مايو 2012 في 00:11

1 −2
#6
Μωάμεθ αλάά كتب:

قارن هذا الكود بالخاص بك:

#include <stdio.h>
#define MAX 1000

int main()
{
   char a[MAX]={0};
   char *b = (char*)a;
   int i=0;

   printf("Entrer un nombre en mode(2):\t");
   scanf("%s",a);

   while(*b)
   {
      i <<= 1;
      if (!(*b++ - '0')) continue;
      i |= 1;
   }

   printf("==>Nombre en mode(10)\t=\t%d",i);
   return 0;
}

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

وظفت bitwise operators بطريقة جيدة جدا

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

المشكلة بالتحديد في هذا السطر و إذا اعتبرنا أن العدد المراد إدخاله هو 1010

 if (!(*b++ - '0')) continue;

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

 if (0) continue;

و سيتم القفز على الشرط لينجز هذا الأمر الذي يليه

 i |= 1;

ولكن في المرة الثانية سيكون الشرط على هذا النحو

 if (1) continue;

هل هذا معناه أننا سنقفز على الشرط مثلما فعلنا في المرة الأولى وننجز الأمر الذي يلي الشرط أم أننا لن نقفز على الشرط و لن ننجز الأمر ؟

هذا هو الجزء الذي لا زلت محتارا فيه؟؟؟

أما باقي الكود مفهوم

وفقك الله

i love you mama

#7
أحمد الشنقيطي كتب:

السلام عليكم

أعتقد أن الأخ محمد علاء الدين قد أجاب على الموضوع.

للفائدة, يمكن كتابة الكود بطريقة أخرى.

بالسي :

#include<stdio.h>
int main() {
     int n;
     printf("Entrer un nombre en mode(10) : ");
     scanf("%d",&n);
     printf("Le nombre %d dans la base 8 vaut %o\n",n,n);
     printf("Le nombre %d dans la base 16 vaut %x",n,n);
     return 0;
}

بالسي++ :

#include<iostream>
using namespace std;
int main() {
     int n;
     cout<<"Entrer un nombre en mode(10) : ";
     cin>>n;
     cout<<"Le nombre "<<n<<" dans la base 8 vaut "<<oct<<n<<endl;
     cout<<"Le nombre "<<dec<<n<<" dans la base 16 vaut "<<hex<<n;
     return 0;
}

بالتوفيق.

أخ أحمد السؤال يتكلم عن تحويل النظام الثنائي للنظام العشري و ليس العكس

وهذا الطريقة

 printf("Le nombre %d dans la base 8 vaut %o\n",n,n);

أعتقد أنها معروفة منذ سنة 1969 أي منذ عام تصميم لغة c يعني ليست بالجديدة

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

و هذه فقط تبقى ملاحظات أبديها لا أكثر و لا أقل تحتمل الصواب و الخطأ

وفقك الله و رعاك و مشكور على تقديم المساعدة

i love you mama

#8
if (!(*b++ - '0')) continue;

يتم الحصول على الحرف الحالي من b و يتم طرحه من قيمة الحرف '0' و الناتج يتم تنفيذ المعامل not عليه و بالتالي إذا كان ناتج الطرح صفر فالنتيجه بعد المعامل not ستكون واحد، ايضا إذا كان الناتج بعد الطرح واحد فنتيجة المعامل not ستكون صفر.

بعد الحصول على القيمه بعد المعامل not يتم اختبار القيمه لمعرفة هل سيتم تنفيذ الجمله continue ام لا، فإذا كان الناتج النهائي صفر فهذا يعنى ان قيمة b هى 1 و بهذا نحتاج لإضافته للقيمه النهائيه أما إذا كان الناتج النهائي 1 فهذا يعنى ان قيمة b هى 0 و لا داعى لإضافتها لان عملية الـ shift الموجوده فى السطر الذى يسبق الحالي تكفلت بهذا الأمر.

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

2

مدونتي: C++ Tips and Tricks

#9

إنظر أيضاً لهذا الكود , أبسط قليلاً:

#include<stdio.h>

int main(void) {

    char input[256];
    char *input_ref = input;
    unsigned int i  = 0;

    printf("Enter a binary number: ");
    scanf("%255s", input_ref);

    while(*input_ref != '\0')
        i   = i * 2 + (*input_ref++ - '0');

    printf("%d\n", i);
    return(0);
}

الطرح من '0' سببه تحويل عدد من '2' إلى 2 . الـ'0' تقابل في جدول الـascii الرقم 48 و تقابل '2' الرقم 50. ستلاحظ أن طرح قيمة '0',المقابلة لـ 48 , من '2', المقابلة لـ 50, سيعطي 2 رقمي :

'0' - '0' = 48 - 48 = 0
'1' - '0' = 49 - 48 = 1
'2' - '0' = 50 - 48 = 2
'3' - '0' = 51 - 48 = 3
'4' - '0' = 52 - 48 = 4
...
#11
أحمد الشنقيطي كتب:

أخي مومو, شكرا على -1 :)

لا شكر على واجب laugh.gif

هناك -2 و ليس -1 ؟؟

ليس مهما كم حصلت من النقاط المهم أن تستفيد من أخطاءك يا أخ أحمد؟؟

أضفت لك نقطة في ردك الأخير حتى لا أكون سارقا لنقاطك التي تعبت عليهاwink.gif

تم تعديل هذه المشاركة بواسطة مومو (momo) في 20 مايو 2012 في 20:59

i love you mama

#12
اقتباس
ليس مهما كم حصلت من النقاط المهم أن تستفيد من أخطاءك يا أخ أحمد؟؟

لستُ مُخطئا أخي مومو :)

.. أتيتُ بعد الإجابة على الموضوع و أحببت أن أضع "فائدة عامة" قد تفيد القارئ المبتدئ.

احترامي لك.

#13

يعطيكم العافية 

 

ممكن حد يشرح الي كيف ممكن اعمل العكس

 

 

من عشري لبناري (ثنائي)

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…