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

عودا على بدء !, تساؤلات عدة حول الآنسة switch !

بدأه khaled_prg في 28 أكتوبر 2010 · 9 رد · 463 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

دائما ما يشتكي بعض الإخوة في الماسنجر من صعوبة الأسئلة التي أطرحها في المنتدى و التي تتعلق بإدارة أمور الذاكرة و الحجز و التحرير و التصفير و ما إلى ذلك و يقولون لي بأنها تحتاج إلى معرفة بالأسمبلي و دراسة معمقة (بعض الشيء) لأنظمة التشغيل :wink:, في هذه المرة وجدت استشكالا لا يتعلق بالأسبملي لا من قريب و لا من بعيد لذا فأنا أنتظر من المساعدة من جميع الأعضاء :happy:

  • عندما نريد كتابة كود يحتوي على عدة خيارات متتالية فمثلا : المستخدم سيضغط على 1 أو 2 أو 3 او 4 أو 5 أو .... أو 100, يعني أن الخيارات المتاحة هي الأعداد المحصورة بين 1 و 100, طبعا الكود باستخدام if سيكون هكذا :
    if(n > 0 && n <= 100) cout<<"yes";
    else cout<<"no";


    و لكن ماذا لو أردنا كتابة الكود بـ switch !؟ هل سيكون من المنطقي كتابة :

    switch(n)
        {
                  case 1:
                  case 2:
                  case 3:
                  case 4:
                  case 5:
                  case 7:
                  case 8:
                  ...
                  case 100:
                       cout<<"yes";
                  default : cout<<"no";
        }


    ما أريده هو الطريقة المختصرة لـ swtich في هذه الحالة :)

  • سبق و أن رأيت استشكالا لأحد الأعضاء يريد فيه حل معادلة من الدرجة الثانية بـ if-else-if و قد فكرتُ في الطريقة باستخدام switch !,كيف سيكون ذلك !؟

سلامي.

تم تعديل هذه المشاركة بواسطة khaled_prg في 28 أكتوبر 2010 في 17:43

#2

هناك extension للمترجم gcc للكتابة بذلك الشكل

switch (a)
{
case 1 ... 10:
// code
break;

case 11 ... 50:
// code
break;

case 800:
// code
break;

default:
// code
break;
}

ولكنها ليست standard لذلك يفضل مشتقات if .

وان كنت مصر على switch

#include <stdio.h>
#include <stdbool.h>


int 
main (int argc, char *argv[])
{
	int n = 105;
	switch ((n<=100 && n > 0)){
		case true:
			printf("yes \n");
			break;
		case false:
			printf("no \n");
			break;
		default:
			printf("default \n");
			break;
		}

	return 0;
}

name : mohamedyosry

#3

فى المثال السابق لن ينجح الامر الا على 2 من الcases (الى جانب الdefault )

يمكنك زيادة الاحتمالات ببعض الmacro وليكن MAP

#include <stdio.h>

#define MAP(N) (N <= 100 && n >= 0 ) ? 1 : 2
#define MAP(N) (another case ) ? 3 : 2
int 
main (int argc, char *argv[])
{
	int n = 105;
	switch (MAP(n)){
		case 1:
			printf("yes \n");
			break;
		case 2:
			printf("no \n");
			break;
		default:
			printf("default \n");
			break;
		}

	return 0;
}

ويمكنك جعلها مقروئة اكثر اذا استخدمت قيم enum بدل من constant ك 1 و 2

تم تعديل هذه المشاركة بواسطة apex في 28 أكتوبر 2010 في 17:55

name : mohamedyosry

#4
اقتباس
هناك extension للمترجم gcc

كنت أظن أنه لا يوجد من المترجمات سوى gcc و g++ !, هل هذا صحيح !؟

إذا كان الجواب لا فما هي تلك المترجمات الأخرى و هل هي مُستخدمة في بيئات تطوير شهيرة مثل VC و DEV و code::blocks و BORland !؟

اقتباس
فى المثال السابق لن ينجح الامر الا على 2 من الcases (الى جانب الdefault )

يمكنك زيادة الاحتمالات ببعض الmacro وليكن MAP

جميل جدا :)

===============

ماذا عن سؤالي الثاني المتعلق بحل المعادلة من الدرجة الثانية, أريد كود يقابل هذا و لكن باستخدام switch

if(delta > 0)
    ...
    else
    if(delta < 0)
    ...
    else
    ...

تحياتي.

#5

حسنا . للعلم استخدام الenum بجانب الماكرو فى الحالات الاكبر سيوفر شى لا يذكر من الذاكرة :lol:

بعد النظر مرة ثانية لكود الmacro فهو فاشل بمعنى الكلمة خاصة لانة بشكلة الحالى يعمل redefinition للماكرو وهذا يضيف تعقيد للكود (صعوبة فى التتبع اكثر مما تتخيل) + فشلت فى عمل شكل الماكرو على الهيئة

#define MAP(N) (N <= 100 ) ? 1 : ((N >= 0) ? 2 : 3))

فالمحاولة فاشلة

يمكنك عمل فانكشن مصغرة (ويمكنك عمل inline لها اذا كنت ستسخدمها بكثرة)

#include <stdio.h>
//need some typedef
enum X { bigDelta, smallDelta , zeroDelta };
enum X MAP(int);

int  main (int argc, char *argv[])
{
        int n = 0;
        switch (MAP(n)){
                case bigDelta:
                        printf("bigDelta \n");
                        break;
                case smallDelta:
                        printf("smallDelta \n");
                        break;
		case zeroDelta:
                        printf("zeroDelta \n");
                        break;
                default:
                        printf("default \n");
                        break;
                }

        return 0;
}

enum X MAP(int n){
	if (n > 0)
		return bigDelta;
	else if (n < 0)
		return smallDelta;

	return zeroDelta;
	}

تم تعديل هذه المشاركة بواسطة apex في 28 أكتوبر 2010 في 19:27

name : mohamedyosry

#6

أشكرك على المساعدة :)

لعلك لم تفهم قصدي هذه المرة :blush: , أنا أريد نقل المثال الذي كتبتُه بالأعلى إلى switch و بدون استخدام if-else-if !, لاحظ أنك استخدمت if-else في الدالة !

كل ما أريده هو الكتابة المكافئة لـ if-else-if في switch :)

تم تعديل هذه المشاركة بواسطة khaled_prg في 28 أكتوبر 2010 في 19:30

#7

اذا كان حالتين فقط (بجانب الافتراضية) فالحل فى الرد الثانى يكفى .

اما اذا كان اكثر فلا تحضرنى اجابة الا محاولة ابعاد الif عن الswitch فى كود منفصل لا اكثر .

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

اقتباس
كنت أظن أنه لا يوجد من المترجمات سوى gcc و g++ !, هل هذا صحيح !؟

يوجد مترجم انتل ومايكروسوفت وايضاء لا يوجد شى يلزم بتوفير ال extensions على المنصة . فالافضل كتابة ANSI C

تم تعديل هذه المشاركة بواسطة apex في 28 أكتوبر 2010 في 19:43

name : mohamedyosry

#8

تمام :)

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

ما اسم تلك المترجمات !؟

ما هي أسماء المترجمات التي تعتمدها البرامج DEV و code::blocks و borland !؟

#9

Intel Compilers

ومترجم مايكروسوفت غالبا ما يستخدم مع فيجوال ستديو .

اقتباس
ما هي أسماء المترجمات التي تعتمدها البرامج DEV و code::blocks و borland !؟

اغلب بيئات التطوير لا تعارض تغيير الcompiler المستخدم (فقط بتغيير الاعدادات والمسارات).فgcc يستخدم عن طريق نسخة مخصصة لويندوز تسمىmingw . واعتقد ان تلك البيئات تحاول استخدام المترجم الافتراضى على نظامك .

name : mohamedyosry

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

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

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

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

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