ساختار چند انتخابی switch

در دو مبحث قبلی ساختارهای if و if/else را بررسی کرديم. در برنامه نويسی گاهی به الگوريتمی نياز پيدا می کنيم که در آن متغيری به ازای هر مقدار صحيح ثابتی، باعث اجرای يک دستور خاص شود و به ازای هر مقدار اعمال مختلف انجام پذيرد. برای نيل به اين هدف ++C ساختار چند انتخابی switch را که به صورت زير می باشد در اختيار ما قرار داده است:

switch (عبارتی که بايد مورد بررسی قرار گيرد )

   {

      case مقدار ثابت 1 :

                مجموعه دستورات 1

                break;

      case مقدار ثابت 2 :

                مجموعه دستورات 2

                break;

 

      .

      .

      .

 

      case  n مقدار ثابت :

                n مجموعه دستورات

                break;

      default :

          مجموعه دستورات حالت پيش فرض

 }

ساختار switch به شيوه زير عمل می کند:

switch ابتدا عبارت داخل پرانتز را مورد ارزيابی قرار می هد و سپس آن را با مقدار ثابت 1 مورد مقايسه قرار می دهد. اگر برابر بودند مجموعه دستورات 1 را اجرا خواهد شد، تا هنگامی که برنامه به دستور break برسد، هنگامی که برنامه به دستور break رسيد از ساختار چند انتخابی switch خارج می شود. اگر عبارت داخل پرانتز با مقدار ثابت 1 برابر نبود ساختار switch عبارت داخل پرانتز را با مقدار ثابت 2 مورد مقايسه قرار می دهد، در صورت برابر بودن مجموعه دستورات 2 اجرا می گردد. اين روال همينطور ادامه پيدا می کند. در صورتی که عبارت داخل پرانتز با هيچ يک از مقادير ثابت برابر نباشد، مجموعه دستورات حالت default (پيش فرض) اجرا می گردد. به برنامه زير توجه کنيد:

#include

int main( )

{

  int x;

  cout << "Please enter a number:";

  cin >> x;

 

  switch (x) {

    case 1:

      cout << "x is 1";

      break;

    case 2:

      cout << "x is 2";

      break;

    default:

      cout << "Unknown value";

  }

  return 0;

}

برنامه فوق را سه بار با سه عدد مختلف اجرا می کنيم. خروجی ها به صورت زير می باشند:

Please enter a number:1

x is 1

Please enter a number:2

x is 2

Please enter a number:5

Unknown value

توجه داشته باشيد که ساختار switch را می توان با ساختار if/else نيز پياده سازی کرد. به عنوان مثال ساختار switch به کار رفته در مثال فوف معادل ساختار if/else زير می باشد:

if (x == 1)

    cout << "x is 1";

else

    if (x == 2)

        cout << "x is 2";

    else

       cout << Unknown value";

ما الزامی به استفاده از حالت default در ساختار switch نداريم ولی توصيه می شود که حالت پيش فرض را به کار ببريم چون معمولاً امکان دارد که عبارت برابر با هيچ يک از مقادير ثابت نباشد و با به کار بردن حالت پيش فرض می توانيد پيغام مناسبی در اين رابطه به صفحه نمايش بفرستيد.

توجه داشته باشيد اگر دستور break بعد از هر مجموعه از دستورات استفاده نکنيم برنامه از ساختار switch خارج نخواهد شد و مجموعه دستورات بعدی اجرا می گردد تا به اولين دستور break برسد. اين مورد به ما امکان ايجاد حالتهای ترکيبی را می دهد. البته در به کار بردن اين تکنيک دقت لازم را بکنيد.

#include

int main( )

{

  int x;

  cout << "Please enter a number:";

  cin >> x;

 

  switch (x) {

    case 1:

    case 2:

    case 3:

      cout << "x is (1 or 2 or 3)";

      break;

    default:

      cout << "x is not (1 or 2 or 3)";

    }

  return 0;

}

برنامه فوق را سه بار با سه عدد مختلف اجرا می کنيم. خروجی ها به صورت زير می باشند:

Please enter a number:1

x is (1 or 2 or 3)

Please enter a number:2

x is (1 or 2 or 3)

Please enter a number:5

x is not (1 or 2 or 3)

 

ساختار تکرار while

ساختار تکرار (حلقه تکرار) به برنامه نويس اين امکان را می دهد که برنامه ، قسمتی از دستورات را تا هنگامی که شرط خاصی برقرار است، را تکرار کند. به عنوان مثال :

تا وقتی که مورد ديگری در ليست خريد من هست.

آن را بخر و از ليست خريد حذفش کن.

مورد فوق روال يک خريد را انجام می دهد. شرط مورد نظر " مورد ديگری در ليست خريد من هست" می باشد، که ممکن است درست يا نادرست باشد. اگر شرط برقرار باشد (يعنی مورد ديگری در ليست خريد باشد) عمل "خريد آن و حذفش از ليست" انجام می گيرد. اين عمل تا وقتی که شرط برقرار باشد ادامه می يابد. هنگامی که شرط برقرار نباشد (يعنی تمام موارد ليست خريد حذف شده باشند)، ساختار تکرار به پايان می رسد و اولين دستور بعد از حلقه تکرار، اجرا می گردد. ساختار تکرار while به صورت زير می باشد.

while (شرط مورد نظر )

      { 

         مجموعه دستورات

      }

تا وقتی که شرط داخل پرانتز برقرار باشد مجموعه دستورات اجرا خواهند شد. برای درک بهتر شيوه کاربرد حلقه های تکرار فرض کنيد می خواهيم اولين توانی از عدد 2 که بزرگتر از 1000 می باشد را بيابيم. برنامه به صورت زير خواهد بود.

#include

int main( )

 {

  int product = 2;

  while (product <= 1000)

       product = 2 * product;

   

  cout << "The first power of 2 larger than 1000 is "

       <

  return 0;

 }

در برنامه فوق ابتدا متغيری به نام product را با مقدار اوليه 2 مقدار دهی کرديم. در حلقه تکرار while با هر بار اجرای دستور product=2*product مقدار متغير product دو برابر می شود بدين ترتيب با پايان يافتن حلقه متغير product حاوی عدد 1024 يعنی اولين توانی از 2 که بزرگتر از 1000 می باشد، خواهد بود.

The first power of 2 larger than 1000 is 1024

نکته : در مثال فوق در حلقه while چون تنها از يک دستور استفاده شده بود از {} استفاده نشد، ولی اگر بيش از يک دستور داشتيم ملزم به استفاده از {} بوديم.

مثال : برنامه ای بنويسيد تا مجموع اعداد يک تا صد را محاسبه کند.

#include

int main( )

  { 

    int n=1, sum=0;

    while (n <= 100)

      {

        sum += n;       // sum = sum + n;

        ++n;            // n = n + 1;

      }

    cout << "1 + 2 + ... + 100 =" <

    return 0;

  }

در مثال فوق حلقه 100 بار اجرا می گردد و هر بار عدد n به متغير sum اضافه می گردد و عدد n نيز يک واحد افزايش می يابد تا در يکصدمين بار اجرای  حلقه  مقدار  متغير  n برابر 101 می شود  و هنگام  بررسی  شرط  (n <=100) توسط حلقه while شرط نادرست می شود و اولين دستور بعد از حلقه يعنی دستور خروجی cout اجرا می گردد.

1 + 2 + ... + 100 =5050

نکته :

·       در مثال فوق متغير n به عنوان شمارنده دفعات تکرار حلقه بکار گرفته شد. برحسب مورد شمارنده ها معمولاً با يک يا صفر مقدار دهی اوليه می شوند.

·       متغير sum حاوی مجموع حاصلجمع بود. چنين متغيرهايی که برای محاسبه يک حصلجمع به کار می روند معمولاً با صفر مقدار دهی اوليه می شوند.

مثال : برنامه ای بنويسيد که تعداد نامشخصی عدد مثبت را از ورودی دريافت نمايد و ميانگين آنها را محاسبه نمايد. عدد 1- را برای مشخص کردن انتهای ليست اعداد در نظر بگيريد.

#include

int main( )

{ int num, counter = 0;

  float average, sum = 0;

 

  cout << "Enter a number (-1 to end):";

  cin >>num;

 

  while (num != -1){

    sum += num ; // sum = sum + sum;

    ++counter;

    cout << "Enter a number (-1 to end):";

    cin >> num;

  }

 

  if (counter != 0){

    average = sum / counter;

    cout << "The average is " << average << endl;

  }

  else

    cout << "No numbers were entered." << endl;

 

  return 0;

}

خروجی برنامه به صورت زير خواهد بود.

Enter a number (-1 to end):20

Enter a number (-1 to end):50

Enter a number (-1 to end):65

Enter a number (-1 to end):70

Enter a number (-1 to end):90

Enter a number (-1 to end):100

Enter a number (-1 to end):1

Enter a number (-1 to end):6

Enter a number (-1 to end):-1

The average is 50.25

در برنامه مثال قبل عدد 1- به عنوان يک مقدار کنترلی به کار می رود و با وارد کردن اين عدد اجرای برنامه به پايان می رسد و ميانگين اعداد در خروجی به نمايش در می آيد. متغير num اعداد را از ورودی دريافت می کند. متغير counter وظيفه شمارش تعداد اعداد وارد شده را دارا می باشد و متغير sum مجموع حاصلجمع اعداد را در خود قرار می دهد و در نهايت متغير average، ميانگين را در خود قرار می دهد. ساختار کنترلی if به کار رفته در برنامه، جلوی بروز خطای زمان اجرای تقسيم بر صفر را می گيرد ، يعنی اگر در اولين دستور cin به کار رفته عدد 1- وارد شود خروجی برنامه به صورت زير خواهد بود :

Enter a number (-1 to end): -1

No numbers were entered.

 

 

  

ساختار تکرار do/while

ساختار تکرار do/while مشابه ساختار تکرار while می باشد. در ساختار تکرار while شرط حلقه در ابتدا بررسی می شود ولی در ساختار تکرار do/while شرط در انتهای حلقه مورد بررسی قرار می گيرد، بدين ترتيب در ساختار تکرار do/while دستورات حلقه حداقل يکبار اجرا خواهند شد. ساختار تکرار do/while به صورت زير می باشد:

   do {

        مجموعه دستورات  

      }while ( شرط مورد نظر );

     

به عنوان مثال به برنامه زير توجه نماييد:

#include

 

int main()

{

   int counter = 1;

   do {

       cout << counter << " ";

      }while ( ++counter <= 10 );

   cout << endl;

 

   return 0;

}

در اين برنامه اعداد 1 تا 10 با فاصله بر روی صفحه نمايش چاپ خواهند شد. دقت کنيد که متغير counter در قسمت شرط حلقه ، يک واحد اضافه می گردد سپس مقدارش با عدد 10 مقايسه می گردد.

1 2 3 4 5 6 7 8 9 10

مثال: برنامه ای بنويسيد که ليست نمرات يک کلاس را دريافت کرده و تعداد قبولی ها و مردودی ها را مشخص کند. ضمنا در ابتدای برنامه تعداد نمرات ليست پرسيده شود.

#include

int main( )

{

  float mark;

  int howmany,counter=1;

  int passes=0,failures=0;

 

  cout << "How many marks : ";

  cin >> howmany;

 

  do {

      cout << "Enter mark "<      cin>>mark;

      if (mark>=10)

         ++passes;

      else

         ++failures;

     }while (++counter <= howmany);

 

  cout<<"Passed : "<

  cout<<"Failed : "<

 

  return 0;

}

خروجی برنامه به صورت زير می باشد :

How many marks : 10

Enter mark 1 : 18

Enter mark 2 : 15

Enter mark 3 : 9

Enter mark 4 : 17.5

Enter mark 5 : 9.75

Enter mark 6 : 8

Enter mark 7 : 11

Enter mark 8 : 13

Enter mark 9 : 5

Enter mark 10 : 13

Passed : 6

Failed : 4

 

 

 

 

ساختار تکرار for

ساختار تکرار for نيز مانند دو ساختار قبلی يک حلقه تکرار می سازد. از ساختار تکرار for معمولاً هنگامی که دفعات تکرار حلقه براساس يک شمارنده می باشد استفاده می شود. ساختار تکرار for به صورت زير می باشد:

for (  افزايش يا کاهش   ; شرط حلقه ;    تعريف متغير )

      مقدار شمارنده                 شمارنده و تعيين

       مقدار اوليه

     {

           مجموعه دستورات

     }

ساختار تکرار for را با ساختار تکرار while نيز می توان پياده سازی کرد به عنوان مثال دو برنامه زير اعداد 1 تا 5 را بر روی صفحه نمايش چاپ می کنند:

#include

 

int main()

{

  int counter = 1;

 

  while ( counter <= 5 ) {

     cout << counter << endl;

     ++counter;

  }

  return 0;

}

برنامه فوق با حلقه while نوشته شده بود. در برنامه زير معادل حلقه while فوق را با حلقه for پياده سازی می کنيم:

#include

 

int main()

{

 

  for ( int counter = 1; counter <= 5; counter++ )

     cout << counter << endl;

 

return 0;

}

در برنامه فوق هنگامی که دستور for اجرا می شود متغير کنترلی counter تعريف می گردد و عدد 1 در آن قرار می گيرد. سپس شرط حلقه مورد بررسی قرار می گيرد (counter<=5) چون مقدار counter ، عدد 1 می باشد پس شرط درست است و دستور حلقه، يعنی دستور cout اجرا می گردد و اولين عدد يعنی 1 نمايش داده می شود. پس از آن دستور ++counter اجرا می گردد و مقدار متغير counter يک واحد اضافه می شود. سپس مجدداً شرط حلقه بررسی و در صورت برقرار بودن شرط دستور cout اجرا می گردد. اين روال تا وقتی که شرط برقرار باشد ادامه می يابد و به محض برقرار نبودن شرط يعنی هنگامی که counter حاوی عدد 6 شود خاتمه می يابد و برنامه به پايان می رسد.

1 2 3 4 5

در برنامه قبلی اگر حلقه for را به صورت زير بازنويسی کنيم:

for(int counter=10; counter>=1; counter=counter-2)

خروجی برنامه اعداد زوج 10 تا 1 به صورت معکوس می باشد، يعنی :

10 8 6 4 2

توجه داشته باشيد که در حلقه فوق به جای استفاده از دستور counter=counter-1 می توانستيم از دستور counter -= 2 استفاده کنيم.

مثال : برنامه ای بنويسيد که مجموع اعداد زوج 1 تا 100 را محاسبه کند.

#include

 

int main ( )

{ int sum = 0;

 

  for (int num = 2; num <= 100; num += 2)

     sum += num;

  cout << "2 + 4 + 6 + ... + 100 =" <

 

  return 0;

}

2 + 4 + 6 + ... + 100 =2550

توجه داشته باشيد که حلقه for در برنامه فوق را با کمک عملگر کاما ( , ) می توانيم به صورت زير نيز بنويسيم:

for (int num = 2;

     num <= 100;

     sum += num, num +=2);

ضمناً شکستن حلقه به چند خط نيز مشکلی ايجاد نمی کند. البته دو مورد اخير توصيه نمی شوند، چون از خوانايی برنامه می کاهند.

مثال : برنامه ای بنويسيد که عددی را از ورودی دريافت کرده و 2 به توان آن عدد را محاسبه و در خروجی چاپ نمايد.

#include

int main( )

{

  unsigned long int x=1;

  int power;

 

  cout << "Enter power:";

  cin >>power;

 

  for (int counter=1;counter<=power;counter++)

    x*=2;

 

  cout << "2 ^ " << power << " = " << x <

 

return 0;

}

Enter power:25

2 ^ 25 = 33554432

در مثال های فوق، دستورات حلقه for را داخل { } قرار نداديم چون حلقه for تنها شامل يک دستور بود، توجه داشته باشيد که اگر بيش از يک دستور در حلقه به کار رود ملزم به استفاده از { } می باشيم.

مثال : برنامه ای بنويسيد که جدول ضرب 5X5 را ايجاد کند.

#include

int main( )

{

 

  for (int x=1;x<=5;x++)

   {

     for (int y=1;y<=5;y++)

        cout <

     cout<

   }

 

  return 0;

}

خروجی برنامه به صورت زير خواهد بود:

1     2     3     4     5

2     4     6     8     10

3     6     9     12    15

4     8     12    16    20

5     10    15    20    25

در برنامه فوق حلقه شامل متغير x ، دارای دو دستور for و cout بود، به همين علت از { } استفاده شد. اما حلقه شامل متغير y تنها دارای يک دستور cout بود. اگر دقت کرده باشيد دستور ;"cout<<x*y<<"\t دارای علامت t\ بود. به کار بردن t\ باعث جدول بندی و مرتب شدن خروجی می شود. در حقيقت مکان نمای صفحه نمايش را در محل جدول بندی قرار می دهد. ضمناً در مثال فوق يک ساختار for در دل ساختار for ديگری استفاده شد به اين شيوه استفاده حلقه های تودرتو گفته می شود که در برنامه نويسی ها به کرات از آنها استفاده می شود. در ضمن توجه داشته باشيد که اگر از دستور ;cout <<endl استفاده نشود، خروجی به صورت نا مرتب زير خواهد بود:

1    2     3     4     5     2     4     6     8     10

3    6     9     12    15    4     8     12    16    20

5    10    15    20    25

نکته : در حلقه های تکرار ممکن است شرط حلقه را به اشتباه بنويسيم يا به عنوان مثال شمارنده حلقه را افزايش ندهيم در چنين حالاتی ممکن است پس از اجرای برنامه، برنامه به اتمام نرسد و حلقه همچنان تکرار شود. در صورت بروز چنين مشکلی با فشردن کليد Ctrl همراه با  Break    (Ctrl+Break) اجرای برنامه به صورت ناگهانی قطع می شود و به محيط ويرايشگر ++C باز می گرديد و می توانيد کد اشتباه را درست کنيد. سپس برنامه را مجدداً اجرا کنيد.