آموزش میکروبلیز قسمت ششم:آموزش زبان برنامه‌نویسی C

0
33
آموزش زبان برنامه‌نویسی C
آموزش زبان برنامه‌نویسی C

اگر تاکنون این سری از آموزش‌ها را دنبال کرده باشید به مباحثی از زبان برنامه‌نویسی C از جمله متغیر‌ها، کلاس‌های حافظه، عملگر‌ها، رشته‌ها، آرایه‌ها و کاراکتر‌ها پرداختیم که توصیه می‌کنم حتما مقالاتی که نوشته شده‌اند حتی درصورتیکه فکر می‌کنید به این مباحث مسلط هستید مجددا بخوانید(یاداوریش که ضرر نداره). حال در این مقاله می‌خواهیم به مبحث بسیار کاربردی و همینطور خطرناک حلقه‌ها بپردازیم. حالا چرا خطرناک؟ برای جواب به این سوال توصیه می‌کنم که این مقاله را تا انتها بخوانید.

حلقه در زبان برنامه‌نویسی C چیست؟

اجازه‌دهید این قسمت را با ذکر یک مثال توضیح‌دهیم. فرض‌کنید به شما گفته‌شده‌است برنامه‌ای بنویسید که یک عبارت دلخواه را ۱۰۰۰بار در خروجی چاپ کند. یکی‌از روش‌ها این است که عبارت موردنظر را هزاربار در برنامه بنویسیم که این عمل، بسیار حجم کد را بالا می‌برد و همچنین خوانایی برنامه را به‌شدت پایین می‌آورد. روش‌دیگر استفاده‌از دستور goto است (دقت کنید قبل‌از اینکه از حلقه‌ها در برنامه‌ استفاده‌کنند از goto استفاده می‌شده و البته همچنان هم می‌توان از این دستور استفاده‌کرد البته به‌شرط استفاده روبه‌جلو یعنی اینکه رو به عقب پرش انجام ندهیم که شرایط خاص خودش رو داره که اینجا بحث ما نیست.) به این ترتیب که در برنامه بگوییم از خط ۱ به خط ۲۰ پرش را انجام‌دهد و مجددا همین روند صورت گیرد و یا به خط دیگری از برنامه رود که این روش هم اصلا استاندارد نیست و ترجیحا در برنامه‌هایتان درصورتیکه پرش به خطوط قبل می‌خواهید انجام‌دهید اصلا و ابدا این کار را انجام‌ندهید و فقط طبق استاندارد MISRA-C پرش رو به جلو توسط این دستور اشکالی ندارد.(میدونم بخشیش جدید بود و براتون خیلی سوال پیش اومده ولی اینجا اگه بخوام توضیح‌بدم کلا رشته کلام از دستم میره فقط به‌عنوان راهنمایی اگر خیلی کنجکاوید مبحث MISRA-C رو سرچ کنید.) خب طبق توضیحاتی که دادیم از این دستور هم نمی‌توان به‌صورت‌کلی استفاده کرد و در اینجا بود که مفهوم حلقه ایجاد شد. و همچنان هم از این مفهوم به روش‌های متفاوت در برنامه‌نویسی استفاده می‌کنند.

درواقع اگر بخواهیم حلقه را تعریف‌کنیم. باید بگوییم یک گوی را که دارای یک نقطه شروع و پایان است، را درنظر بگیرد وسپس گوی را بچرخانید (با فرض چرخش محدود گوی). چیزی که مشاهد می‌کنید این است که این توپ دائما از نقطه شروع به نقطه پایان می‌رود و این کار به‌صورت‌مداوم درحال‌انجام است تا زمانیکه چرخش به اتمام رسد. در حلقه‌ها هم دقیقا همین امر صدق می‌کند دقیقا از یک نقطه شروع به کار می‌کنند تا زمانیکه به نقطه پایان برسند و مجددا این روند تکرار می‌شود. حال اگر تعداد تکرار در حلقه مشخص‌شده‌باشد که چه مقدار باید از نقطه شروع تا پایان، این تکرار صورت گیرد را، حلقه‌های محدود یا Finite می‌گوییم و اگر این تعداد تکرار در حلقه نامشخص باشد به این معنی که تعداد تکرار شروع و پایان محدود نباشد را حلقه Infinite یا بی‌نهایت(نامحدود) می‌گوییم(امیدوارم که تونسته‌باشیم این مفهوم رو به‌درستی انتقال‌ داده باشیم). خب پس‌از اینکه با مفهوم حلقه و دلیل استفاده‌از آن در برنامه را متوجه‌شدیم نوبت به معرفی حلقه‌ها رسیده است.

انواع حلقه‌ها در زبان برنامه‌نویسی C

  • حلقه While
  • حلقه For
  • حلقه do_while
  • حلقه‌های تودرتو (nested loops)

حلقه While

از این حلقه زمانی استفاده می‌کنیم که بخواهیم درستی یا نادرستی یک شرط را بررسی کنیم که این عمل هم به‌صورت مقایسه‌ای بااستفاده‌از عملگر‌ها صورت می‌گیرد. برای درک بهتر موضوع به فلوچارت دقت کنید.

فلوچارت حلقه While
استفاده‌از دستور While در زبان برنامه‌نویسی C
استفاده‌از دستور While در زبان برنامه‌نویسی C

 

نحوه اصولی استفاده‌از حلقه while در زبان برنامه‌نویسی C
while(شرط) {
دستورات;
}

همانطورکه مشخص‌است این شرط درصورت درست‌بودن وارد بدنه حلقه می‌شود در غیر این‌صورت از حلقه خارج می‌شود. برای درک بهتر به کد زیر توجه کنید.

#include <stdio.h>

int main () {

/* local variable definition */
int a = 10;

/* while loop execution */
while( a < 20 ) {
printf("value of a: %d\n", a);
a++;
}

return 0;
}

خروجی کد به‌صورت‌زیر است (لطفا اول خودتون تحلیل کنید):

value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19

اگر به کد دقت‌کنید می‌بینید شرطی که نوشته‌شده‌است، گفته‌شده تازمانیکه مقدار اولیه متغیر a کمتر از عدد ۲۰ بود وارد بدنه حلقه شود و درغیر اینصورت از حلقه خارج گردد. حال سوالی که ممکن‌است پیش بیاید این است که اگر بخواهیم این حلقه به‌صورت بی‌نهایت بار کار کند راه‌حل چیست؟ مسلما باید روشی یا کدی را پیدا کنیم که همیشه شرط حلقه را درست یا اصطلاحا True درنظر بگیرد. به کد زیر دقت کنید:

while(1){
مجموعه دستوراتی که باید بی نهایت تکرار شوند
}

اگر طبق دستوربالا عمل کنید هر دستوری را که درون بدنه حلقه قراردهید دقیقا به‌معنای‌واقعی بی‌نهایت، بی‌نهایت بار تکرار می‌شود. برای درک‌بهتر به کد زیر دقت کنید:

#include <stdio.h>

int main () {

/* local variable definition */
int a = 10;

/* while loop execution */
while( 1 ) {
printf("value of a: %d\n", a);
a++;
}

return 0;
}

اگر دقت‌کنید، کدی که نوشته‌شده دقیقا کد قبلی است با این تفاوت که فقط از حلقه بی‌نهایت استفاده‌شده‌است. خروجی کد را به عهده خودتان می‌گذارم فقط به‌عنوان راهنمایی، این حلقه بی‌نهایت بار تکرار می‌شود. کاربرد حلقه while معمولا از این نوع حلقه جهت بررسی درستی یا نادرسی یک شرط و همچنین استفاده‌از آن به‌عنوان اجرای بی‌نهایت دستورات استفاده می‌کنند.

حلقه For

از این حلقه زمانی استفاده می‌کنیم که بخواهیم تعداد گام‌های شمارش را در حلقه مشخص کنیم و همچنین می‌توانیم یک شرط را به همراه مقداردهی اولیه(مثل حلقه while) تعیین‌کنیم. برای درک بهتر به فلوچارت دقت‌کنید.

فلوچارت حلقه For
حلقه For در زبان برنامه‌نویسی C
حلقه For در زبان برنامه‌نویسی C

 

نحوه اصولی استفاده‌از حلقه for در زبان برنامه‌نویسی C
for ( مقدار دهی اولیه; شرط; گام شمارش می‌تواند افزایشی یا کاهشی باشد) {
دستورات;
}

اگر به فلوچارت دقت‌کرده‌باشید برخلاف حلقه while، می‌توان پس‌از اینکه درستی یا نادرستی شرط تعیین شد گام شمارش را مشخص‌کرد برای درک‌بهتر به برنامه زیر دقت‌کنید:

#include <stdio.h>

int main () {

int a;

/* for loop execution */
for( a = 10; a < 20; a = a + 1 ){
printf("value of a: %d\n", a);
}

return 0;
}

اگر به کد دقت‌کنید می‌بینید که پس‌از اینکه در حلقه مقداردهی اولیه به‌همراه شرط تعیین‌شده‌است مقدار گام شمارش هم مشخص‌شده‌است. سوالی که ممکن‌است برای شما پیش آید این است که گام شمارش چیست؟ اجازه‌دهید برای درک بهتر، حلقه For درون برنامه را با یکدیگر بررسی کنیم. ابتدا درون حلقه یک متغیر با مقدار اولیه۱۰ تعریف‌شده‌است. و در مرحله بعد شرط a<۲۰ تعیین‌شده‌است. همچنین در مرحله بعد گفته‌شده‌است که اگر دو مرحله قبلی که توضیح‌داده‌شد، درست اعمال شده باشد آنگاه یک واحد به مقدار a اضافه شود(این همان بخشی است که این حلقه را از while متمایز کرده است) و درصورتیکه شرط درست نباشد از حلقه خارج شود. پس با توضیحاتی که دادیم خروجی باید قاعدتا اعدادی از ۱۰ تا ۱۹ را نمایش‌دهد. دقت‌کنید گام شمارش کاملا دلخواه است و طبق نیاز برنامه‌نویس انعطاف‌پذیر خواهد بود. خروجی کد به‌صورت‌زیر است:

value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19

سوال دیگری که ممکن است برای شما پیش آید این است که آیا این حلقه را هم می‌توان مانند حلقه while به‌صورت بی‌نهایت تعریف کرد؟ برای پاسخ به این سوال به برنامه‌زیر دقت‌کنید:

for(;;){
مجموعه کدی که باید بی نهایت تکرار شوند
}

همانطورکه در خط بالا می‌بینید اگر برنامه‌ای را درون بدنه این حلقه For بنویسیم دقیقا بی‌نهایت بار تکرار خواهد شد. برای درک بهتر به برنامه‌زیر دقت‌کنید:

#include <stdio.h>

int main () {

int a;

/* for loop execution */
for( ; ; ){
printf(" He returns Back to our Life as soon as posssible ");
}

return 0;
}

نکته طلایی: برای زبان برنامه‌نویسی C چندین استاندارد وجود دارد که آخرین استاندارد زبان برنامه‌نویسی C معروف به استاندارد C11 است که در این نوع استاندارد اگر حلقه for در برنامه استفاده می‌کنید باید به این نکته توجه‌کنید که نوع متغیر را باید خارج از حلقه for تعیین کنید. در غیر اینصورت، خطایی با مضمون اینکه این ساختار در استاندارد C11 وجود ندارد روبه‌رو خواهید شد. نکته جالب اینجا است که میکروبلیز هم از این استاندارد پیروی می‌کند(راه‌حل های دیگه ازجمله تنظیمات خود کامپایلر وجود داره که مسله رو حل کرد که در اینجا اصلا مورد بحث ما نیست به‌دلیل‌اینکه هرکدوم از کامپایلر‌ها روند خاص خودشون رو دارند پس بهترین روش اینکه اصولی بریم جلو). برای درک موضوع توصیه می‌کنیم که مجددا به مثالی که زده شد این بار با دقت‌بیشتری توجه‌کنید.

اگر دقت کنید دقیقا کد قبلی است که با ساختار جدیدی که معرفی کردیم نوشته‌شده‌است(خروجی کد با خودتون).

کاربرد حلقه For

از این حلقه بیشتر در مواردی که نیاز باشد گام‌های شمارش را مشخص‌کنیم استفاده می‌کنیم.

حلقه do_while

این حلقه هم دقیقا عملکردی مشابه حلقه while است با این تفاوت که ابتدا دستورات درون بدنه آن چک می‌شوند و در نهایت درستی یا نادرسی حلقه را بررسی می‌کند. به‌عبارت دیگر بزرگترین تفاوت این حلقه با سایر حلقه‌ها این است که اگر بخواهیم یک دستور در برنامه به هردلیلی ابتدا یک‌بار اجرا شود و درنهایت اگر شرط درون حلقه درست بود مجددا این عمل صورت گیرد و درصورتیکه نبود از آن خارج شود یکی از بهترین دستور‌ها که دقیقا این عمل را انجام می‌دهد دستور do_while می‌باشد. برای درک بهتر به فلوچارت زیر دقت کنید.

فلوچارت حلقه do_while

فلوچارت حلقه do_while
فلوچارت حلقه do_while

 

استفاده‌از دستور do-while در زبان C

do {
دستورات;
} while( شرط );

همانطورکه در فلوچارت مشاهده می‌کنید ابتدا وارد بدنه حلقه یا اصطلاحا(do) می‌شود و سپس درستی یا نادرستی شرط را بررسی می‌کند که اگر درست باشد مجددا روند موردنظر تکرار و اگر درست نباشد از حلقه خارج می‌شود. برای درک بهتر، به برنامه‌زیر دقت‌کنید:

#include <stdio.h>

int main () {

/* local variable definition */
int a = 10;

/* do loop execution */
do {
printf("value of a: %d\n", a);
a = a + 1;
}while( a < 20 );

return 0;
}

خروجی برنامه به‌صورت‌زیر است(لطفا اول خودتون طبق توضیحاتی که دادیم خروجی رو تحلیل کنید.)

value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19

کاربرد حلقه do_while

معمولا در زمان‌هایی که حداقل بخواهیم یکبار، یک دستور در برنامه به‌همراه بررسی شرط درستی یا نادرستی اجرا و بررسی شود. از این دستور استفاده می‌کنیم.

توجه : این حلقه دقیقا مشابه دستور while است پس تمامی صحبت‌هایی که برای دستور while گفته‌ایم در اینجا هم صدق می‌کند.

حلقه‌های تودرتو (Nested Loops)

این نوع از حلقه‌ها دقیقا از ترکیب چندین حلقه با یکدیگر به‌وجود می‌آیند که هرکدام در جای خودشان بسیار می‌توانند کاربردی باشند. به‌طورمثال بدست‌آوردن سطر و ستون یک ماتریس و یا بدست‌آوردن پیکسل‌های تصویر یا کشیدن پیکسل‌ها روی یک LCD گرافیکی و… که درواقع تمام مثال‌هایی که زده شد درواقع از ساختار ماتریسی گرفته شده‌اند.(لطفا مباحث ماتریس بلاخص بدست‌آوردن سطر، ستون، مقادیر ویژه و… رو حتما جدی بگیرید). برای درک بهتر اجازه‌دهید که ابتدا ساختار هریک از دستورات را بررسی کنیم.

حلقه تودرتو while

while(condition) {

while(condition) {
statement(s);
}
statement(s);
}

 

حلقه تودرتو for

for ( init; condition; increment ) {

for ( init; condition; increment ) {
statement(s);
}
statement(s);
}

 

حلقه تودرتو do_while

do {
statement(s);

do {
statement(s);
}while( condition );

}while( condition );

برای درک بهتر موضوع به برنامه‌زیر دقت‌کنید:

#include <stdio.h>

int main () {

/* local variable definition */
int i, j;

for(i = 2; i<100; i++) {

for(j = 2; j <= (i/j); j++) 
if(!(i%j)) break; // if factor found, not prime
if(j > (i/j)) printf("%d is prime\n", i);
}

return 0;
}

اگر به برنامه دقت‌کنید، متوجه خواهید شد که از دو حلقه for برای بدست‌آوردن اعداد اول کمتر از ۱۰۰ استفاده‌شده‌است. که اگر این روش را نمی‌دانستیم چه بسا که نوشتن این برنامه برای ما دشوارتر می‌شد. خروجی برنامه به‌صورت‌زیر است: (لطفا قبلش خودتون هم یکبار تحلیلش کنید)

2 is prime
3 is prime
5 is prime
7 is prime
11 is prime
13 is prime
17 is prime
19 is prime
23 is prime
29 is prime
31 is prime
37 is prime
41 is prime
43 is prime
47 is prime
53 is prime
59 is prime
61 is prime
67 is prime
71 is prime
73 is prime
79 is prime
83 is prime
89 is prime
97 is prime

 

نکته : دقت‌کنید حلقه‌ها را هم می‌توانید با یکدیگر ترکیب کنید یعنی اینکه حلقه for را می‌توانید با حلقه while و یا do_while و… ترکیب‌کنید کاملا این عمل بستگی به نیاز شما دارد.

کاربرد حلقه‌های تودرتو

کاربردی نمی‌توان به‌صورت دقیق برای این نوع از حلقه‌ها بیان‌کرد به‌دلیل‌اینکه بسته به نیاز کاربر می‌تواند از این روش‌ها استفاده‌کند یااینکه استفاده‌نکند. به‌عبارت کلی‌تر کاربرد این نوع از حلقه‌ها کاملا وابسته به کاربر می‌باشد.

حالت‌های کنترل حلقه

اگر به مفهوم حلقه که در چند بخش قبل به توضیح آن پرداختیم مراجعه‌کنید خواهید دید که حلقه را به یک گوی که دارای یک نقطه شروع و پایان است تشبیه‌کردیم و گفتیم که این گوی بسته به اینکه چه مقداری بچرخد می‌تواند به همان مقدار از نقطه شروع به نقطه پایان برسد و این روند را تکرار کند. حالا همین گوی را مجددا درنظر بگیرید البته این بار، با این تفاوت که می‌خواهیم مسیری که گوی از نقطه شروع تا نقطه پایان سپری می‌کند را سریعتر سپری کنیم و یا اینکه جهش‌هایی را در حین حرکت گوی انجام‌دهیم. که بعضی‌از این جهش‌ها سبب شروع مجدد و یا توقف حرکت و شروع مجدد و… می‌شوند که می‌خواهیم به توضیح تک‌تک این عوامل در زبان برنامه‌نویسی C بپردازیم.

دستور continue

این دستور برخلاف اسمی که دارد درواقع کاری که درحلقه انجام می‌دهد این است که از روند تکرار خطی و یا عبارتی در حلقه جلوگیری می‌کند به‌عبارت‌دیگر اگر در برنامه خطی یا عبارتی را خواستیم متوقف‌کنیم کافی‌است که از دستور countinue استفاده‌کنیم. برای درک بهتر موضوع به فلوچارتی که در ادامه قرار می‌دهیم دقت‌کنید.

فلوچارت continue

فلوچارت continue
فلوچارت continue

 

استفاده‌از دستور continue در زبان برنامه‌نویسی C

اگر به فلوچارت دقت‌کنید کاملا مشخص‌شده‌است، هنگامیکه cpu درحال اجرای خط به خط برنامه است، قادریم خطوطی را که نمی‌خواهیم cpu آن‌ها را اجرا کند در برنامه متوقف‌کنیم برای این‌کار کافی‌است کافیه‌که از این دستور continue استفاده‌کنیم. برای درک بهتر به کدی که در ادامه قرار می‌دهیم دقت کنید:

#include <stdio.h>

int main () {

/* local variable definition */
int a = 10;

/* do loop execution */
do {

if( a == 15) {
/* skip the iteration */
a = a + 1;
continue;
}

printf("value of a: %d\n", a);
a++;

} while( a < 20 );

return 0;
}

اگر به برنامه دقت‌کنید درون حلقه do_while یک شرط نوشته‌شده‌است و درون شرط دستور continue. به‌عبارت‌دیگر زمانیکه شرط برقرار شود چه اتفاقی خواهد افتاد به نظرتان؟ طبق صحبتی که باهم کردیم مسلما باید دستوری که درون شرط قرار دارد اجرا نشود به‌عبارت ساده‌تر در خروجی نباید عدد ۱۵ را مشاهده‌کنیم. و اعدادی بین ۱۰ تا ۱۹ را البته بدون عدد ۱۵ را باید مشاهده‌کنیم. اجازه‌دهید خروجی را ببینیم(لطفا قبلش خودتون هم تحلیل‌کنید).

خروجی کد:

value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 16
value of a: 17
value of a: 18
value of a: 19

کاربرد دستور continue زمانیکه بخواهیم خطوطی از برنامه را متوقف‌کنیم بدون‌اینکه کل برنامه متوقف شود می‌توان از این دستور استفاده کرد.

دستور break

این دستور دقیقا مطابق اسمی که دارد عمل می‌کند یا به‌عبارتی اگر هر زمانی خواستیم که عملکرد بخشی از برنامه را طبق شرایطی متوقف‌کنیم از این دستور استفاده می‌کنیم. برای درک بهتر موضوع به فلوچارت دقت‌کنید.

فلوچارت break

فلوچارت break
فلوچارت break

 

استفاده‌از دستور break در زبان C

همانطورکه از فلوچارت مشخص است این دستور برخلاف دستور continue، کل شرط و یا دستوراتی( دقت‌کنید نگفتیم صرفا یک خط رو می‌تونیم کاری کنیم که در برنامه یه خط رو متوقف کنه یا چندین خط رو) که بعداز آن‌ها دستور Break قرار گرفته است را متوقف می‌کند برای درک بهتر به برنامه‌زیر توجه‌کنید:

#include <stdio.h>

int main () {

/* local variable definition */
int a = 10;

/* while loop execution */
while( a < 20 ) {

printf("value of a: %d\n", a);
a++;

if( a > 15) {
/* terminate the loop using break statement */
break;
}
}

return 0;
}

اگر به برنامه دقت‌کنید، یک شرط نوشته‌‌شده‌است که درون شرط از دستور Break استفاده‌شده‌است به نظر شما چه اتفاقی خواهد افتاد؟ همانطوریکه گفتیم زمانیکه شرط صدق کند تمامی دستوراتی که درون شرط نوشته شده‌اند متوقف می‌شوند و این بخش از برنامه درصورتیکه که مجددا فراخوانی نشود تکرار نخواهد شد. به‌عبارت‌دیگر در خروجی باید اعداد ۱۰ تا ۱۵ را مشاهده‌کنیم.

خروجی کد:

value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15

کاربرد دستور break زمانیکه بخواهیم بخشی یا کل برنامه را پس‌از انجام یک کار خاص متوقف‌کنیم و درجای دیگری از برنامه بخواهیم استفاده‌کنیم، از این دستور استفاده می‌کنیم.( یکی از مثال‌های کاربردیش استفاده‌از ساختار Switch_Case که در ادامه به این دستور هم خواهیم پرداخت)

دستور goto

این دستور در بین برنامه‌نویسان به دستور پرش معروف است که البته با اسم آن هم بی‌ربط نیست. دلیل‌اینکه به این دستور، دستور پرش کردن می‌گویند این است که شما را قادر می‌سازد از هر خطی از برنامه به خط دیگر بروید(پرش کنید).

نکته طلایی: این دستور در صورتیکه ندانید چطور از آن استفاده کنید به حدی خطرناک است که عملا می‌تواند پروژه شما را با خاک یکسان کند.

برای استفاده‌از این دستور باید یک شرط اساسی را به‌خاطرداشته‌باشید: “حتما و حتما و باید از این دستور به‌صورت پرش رو به جلو استفاده‌کنید به‌هیچ‌وجه از پرش رو به عقب استفاده‌نکنید.” یعنی اینکه اگر در برنامه خواستید از این دستور استفاده‌کنید سعی‌کنید از خط ۲ به خط ۵ بروید نه اینکه از خط ۵ به خط ۲ بروید. درصورتیکه بیشتر علاقمند به درک این موضوع هستید توصیه می‌کنیم حتما استاندارد MISRA_C را مطالعه کنید(من خودم شخصا از این دستور توی برنامه‌هام استفاده نمی‌کنم یکی‌از بزرگترین دلیل‌ها خالی‌شدن Pipline نه اون چیزی که اکثریت تصور میکنن، ولی گفتم که اگر درصورتی هم که خواستید استفاده‌کنید با شرطی که گفته‌شد مشکلی نداره).

برای درک بهتر موضوع به فلوچارت این دستور دقت‌کنید.

فلوچارت goto

استفاده‌از دستور goto در زبان C
استفاده‌از دستور goto در زبان C

 

همانطوریکه در فلوچارت هم نشان‌داده‌شده‌است می‌توان توسط این دستور در بین خطوط، پرش انجام‌داد که به‌نوعی هم خطرناک و هم خوب است که واقعا باید بدانید که چطور از این دستور استفاده‌کنید. برای درک بهتر به برنامه‌ای که در ادامه قرار می‌دهیم دقت کنید:

#include <stdio.h>

int main () {

/* local variable definition */
int a = 10;

/* do loop execution */
LOOP:do {

if( a == 15) {
/* skip the iteration */
a = a + 1;
goto LOOP;
}

printf("value of a: %d\n", a);
a++;

}while( a < 20 );

return 0;
}

به‌عنوان یک تمرین: برنامه بالا را تحلیل کنید.

خروجی کد

value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 16
value of a: 17
value of a: 18
value of a: 19

 

کاربرد دستور goto زمانیکه بخواهیم در برنامه از خطی به خط دیگر پرش انجام‌دهیم البته به‌شرطی‌که گفته‌شد می‌توان از این دستور استفاده‌کرد البته دستورات دیگری هم مثل Long jump و روش‌های دیگری هم وجود دارند که در اینجا موردبحث ما نیست.

حلقه یا شمشیر دو لبه

حلقه را می‌توان به یک شمشیر دو لبه تشبیه کرد. سوالی که هست چرا شمشیر دولبه؟ فرض‌کنید یک شمشیر دو لبه را در دست خود گرفته‌اید درصورتیکه راه و روش استفاده‌از این شمشیر را ندانید اتفاقی که خواهد افتاد این است که اول از همه به خودتان آسیب می‌زنید. و درصورتیکه راه و روش استفاده‌از آن را بلد باشید. بدون‌اینکه به خودتان ضربه بزنید به‌راحتی می‌توانید از خودتان دفاع کنید(خب چه ربطی به حلقه داشت). حال در زبان برنامه‌نویسی C اصلی‌ترین عضو برنامه شما، حلقه شما است، چه می‌خواهد از سیستم‌عامل استفاده‌شود و یا امثال آن و الی… بحثی که بسیار اهمیت دارد این است که چطور از این حلقه‌ها در برنامه‌ها استفاده‌کنیم. یکی‌از راه‌کار‌هایی که برای مدیرت تمامی حلقه‌ها در برنامه می‌توانیم داشته‌باشیم، بحثی به نام مدیریت زمان در حلقه‌ها است. این‌کار به روش‌های مختلف مانند استفاده‌از پریفرال‌های جانبی(تایمر و سگ نگهبان(watch dog) و…) و RTOS(اولویت‌بندی‌کردن دستورات) و… صورت می‌گیرد. اجازه‌دهید برای درک بهتر موضوع یک مثال بزنیم: فرض‌کنید برنامه‌ای را درون میکروبلیز نوشته‌اید که باید زمانیکه حتما دیتا را دریافت‌کرد آنگاه ادامه دستورات را اجرا کند؟ آیا این طرز برنامه‌نویسی درست است؟ پاسخ بزرگترین مشکلی که این برنامه دارد این است که هر وقتی که دیتا آمد برنامه ادامه کار خود را انجام می‌دهد(یعنی فاجعه). خب فرض را بر این بگیریم که دیتایی را اصلا دریافت نکردیم. آیا عاقلانه است که بقیه دستورات را هم به خاطر آن از کار بندازیم. مسلما کاری عاقلانه نیست. راه‌حل چیست؟ راه‌حل استفاده‌از یک زمان‌بندی است که به‌طورمثال بگوییم اگر تا یک ثانیه هیچ دیتایی دریافت نشد ادامه دستورات را اجرا کن (البته روش‌های دیگری هم وجود دارند که بتوان حلقه‌ها را کنترل کرد و هدف از توضیح این بخش، این بود که شما مخاطب عزیز بدونید که با چه دستور مهمی در برنامه‌هاتون مواجه هستید).

امیدواریم که توانسته باشیم اهمیت مبحث حلقه‌ها را به شما مخاطبین عزیز انتقال‌داده‌باشیم. امیدواریم که این آموزش هم برای شما مخاطبین عزیز مفید واقع‌شده‌باشد.

 

منبع:‌سیسوگ

برای این مقاله نظر بگذارید:

لطفا دیدگاه خود را بنویسید
لطفا نام خود را وارد کنید