بسماللهالرحمنالرحیم
اگر تاکنون این سری از آموزشها را دنبال کرده باشید به مباحثی از زبان برنامهنویسی C از جمله متغیرها، کلاسهای حافظه، عملگرها، رشتهها، آرایهها و کاراکترها پرداختیم که توصیه میکنم حتما مقالاتی که نوشته شدهاند حتی در صورتیکه فکر میکنید به این مباحث مسلط هستید مجددا بخوانید (یاداوریش که ضرر نداره). حال در این مقاله میخواهیم به مبحث بسیار کاربردی و همینطور خطرناک حلقهها بپردازیم. حالا چرا خطرناک؟ برای جواب به این سوال توصیه میکنم که این مقاله را تا انتها بخوانید.
حلقه در زبان برنامهنویسی C چیست؟
اجازه دهید این قسمت را با ذکر یک مثال توضیح دهیم. فرض کنید به شما گفته شده است برنامه ای بنویسید که یک عبارت دلخواه را 1000 بار در خروجی چاپ کند. یکی از روش ها این است که عبارت موردنظر را هزار بار در برنامه بنویسیم که این عمل، بسیار حجم کد را بالا میبرد و همچنین خوانایی برنامه را به شدت پایین میآورد. روش دیگر استفاده از دستور goto است ( دقت کنید قبل از اینکه از حلقهها در برنامه استفاده کنند از goto استفاده میشده و البته همچنان هم میتوان از این دستور استفاده کرد البته به شرط استفاده رو به جلو یعنی اینکه رو به عقب پرش انجام ندهیم که شرایط خاص خودش رو داره که اینجا بحث ما نیست.) به این ترتیب که در برنامه بگوییم از خط 1 به خط 20 پرش را انجام دهد و مجددا همین روند صورت گیرد و یا به خط دیگری از برنامه رود که این روش هم اصلا استاندارد نیست و ترجیحا در برنامههایتان در صورتیکه پرش به خطوط قبل میخواهید انجام دهید اصلا و ابدا این کار را انجام ندهید و فقط طبق استاندارد MISRA-C پرش رو به جلو توسط این دستور اشکالی ندارد.( میدونم بخشیش جدید بود و براتون خیلی سوال پیش اومده ولی اینجا اگه بخوام توضیح بدم کلا رشته کلام از دستم میره فقط به عنوان راهنمایی اگر خیلی کنجکاوید مبحث MISRA-C رو سرچ کنید.) خب طبق توضیحاتی که دادیم از این دستور هم نمیتوان به صورت کلی استفاده کرد و در اینجا بود که مفهوم حلقه ایجاد شد. و همچنان هم از این مفهوم به روش های متفاوت در برنامهنویسی استفاده میکنند.
انواع حلقهها در زبان برنامهنویسی C
- حلقه While
- حلقه For
- حلقه do_while
- حلقههای تودرتو (nested loops)
حلقه While
از این حلقه زمانی استفاده میکنیم که بخواهیم درستی یا نادرستی یک شرط را برسی کنیم که این عمل هم به صورت مقایسهای با استفاده از عملگرها صورت میگیرد. برای درک بهتر موضوع به فلوچارت دقت کنید.
فلوچارت حلقه While
نحوه اصولی استفاده از حلقه while در زبان برنامهنویسی C
1 2 3 | while(شرط) { دستورات; } |
همانطور که مشخص است این شرط در صورت درست بودن وارد بدنه حلقه میشود در غیر این صورت از حلقه خارج میشود.برای درک بهتر به کد زیر توجه کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #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; } |
خروجی کد به صورت است (لطفا اول خودتون تحلیل کنید).
1 2 3 4 5 6 7 8 9 10 | 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 کمتر از عدد 20 بود وارد بدنه حلقه شود و در غیر اینصورت از حلقه خارج گردد.
حال سوالی که ممکن است پیش بیاید این است که اگر بخواهیم این حلقه به صورت بینهایت بار کار کند راهحل چیست؟ مسلما باید روشی یا کدی را پیدا کنیم که همیشه شرط حلقه را درست یا اصطلاحا True در نظر بگیرد. به کد زیر دقت کنید.
1 2 3 | while(1){ مجموعه دستوراتی که باید بی نهایت تکرار شوند } |
اگر طبق دستور بالا عمل کنید هر دستوری را که درون بدنه حلقه قرار دهید دقیقا به معنای واقعی بینهایت، بینهایت بار تکرار میشود. برای درک بهتر به کد زیر دقت کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #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
1 2 3 | for ( مقدار دهی اولیه; شرط; گام شمارش میتواند افزایشی یا کاهشی باشد) { دستورات; } |
اگر به فلوچارت دقت کرده باشید بر خلاف حلقه while، میتوان پس از اینکه درستی یا نادرستی شرط تعیین شد گام شمارش را مشخص کرد برای درک بهتر به برنامه زیر دقت کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 | #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 درون برنامه را با یک دیگر برسی کنیم. ابتدا درون حلقه یک متغیر با مقدار اولیه 10 تعریف شده است. و در مرحله بعد شرط a<20 تعیین شده است. همچنین در مرحله بعد گفته شده است که اگر دو مرحله قبلی که توضیح داده شد، درست اعمال شده باشد آنگاه یک واحد به مقدار a اضافه شود (این همان بخشی است که این حلقه را از while متمایز کرده است) و در صورتیکه شرط درست نباشد از حلقه خارج شود. پس با توضیحاتی که دادیم خروجی باید قاعدتا اعدادی از 10 تا 19 را نمایش دهد. دقت کنید گام شمارش کاملا دلخواه است و طبق نیاز برنامهنویس انعطافپذیر خواهد بود.
خروجی کد به صورت زیر است.
1 2 3 4 5 6 7 8 9 10 | 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 به صورت بینهایت تعریف کرد؟
برای پاسخ به این سوال به برنامه زیر دقت کنید.
1 2 3 | for(;;){ مجموعه کدی که باید بی نهایت تکرار شوند } |
همانطور که در خط بالا میبینید اگر برنامهای را درون بدنه این حلقه For بنویسیم دقیقا بینهایت بار تکرار خواهد شد. برای درک بهتر به برنامه زیر دقت کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int main () { int a; /* for loop execution */ for( ; ; ){ printf(" He returns Back to our Life as soon as posssible "); } return 0; } |
اگر دقت کنید دقیقا کد قبلی است که با ساختار جدیدی که معرفی کردیم نوشته شده است (خروجی کد با خودتون).
کاربرد حلقه For
از این حلقه بیشتر در مواردی که نیاز باشد گامهای شمارش را مشخص کنیم استفاده میکنیم.
حلقه do_while
این حلقه هم دقیقا عملکردی مشابه حلقه while است با این تفاوت که ابتدا دستورات درون بدنه آن چک میشوند و در نهایت درستی یا نادرسی حلقه را برسی میکند. به عبارت دیگر بزرگترین تفاوت این حلقه با سایر حلقه ها این است که اگر بخواهیم یک دستور در برنامه به هر دلیلی ابتدا یکبار اجرا شود و در نهایت اگر شرط درون حلقه درست بود مجددا این عمل صورت گیرد و در صورتیکه نبود از آن خارج شود یکی از بهترین دستورها که دقیقا این عمل را انجام میدهد دستور do_while میباشد. برای درک بهتر به فلوچارت زیر دقت کنید.
فلوچارت حلقه do_while
1 2 3 | do { دستورات; } while( شرط ); |
همانطور که در فلوچارت مشاهده میکنید ابتدا وارد بدنه حلقه یا اصطلاحا (do) میشود و سپس درستی یا نادرستی شرط را بررسی میکند که اگر درست باشد مجددا روند موردنظر تکرار و اگر درست نباشد از حلقه خارج میشود. برای درک بهتر، به برنامه زیر دقت کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #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; } |
خروجی برنامه به صورت زیر است (لطفا اول خودتون طبق توضیحاتی که دادیم خروجی رو تحلیل کنید.)
1 2 3 4 5 6 7 8 9 10 | 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
1 2 3 4 5 6 7 | while(condition) { while(condition) { statement(s); } statement(s); } |
حلقه تودرتو for
1 2 3 4 5 6 7 | for ( init; condition; increment ) { for ( init; condition; increment ) { statement(s); } statement(s); } |
حلقه تودرتو do_while
1 2 3 4 5 6 7 8 | do { statement(s); do { statement(s); }while( condition ); }while( condition ); |
برای درک بهتر موضوع به برنامه زیر دقت کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #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 برای بدست آوردن اعداد اول کمتر از 100 استفاده شده است. که اگر این روش را نمیدانستیم چه بسا که نوشتن این برنامه برای ما دشوارتر میشد.
خروجی برنامه به صورت زیر است (لطفا قبلش خودتون هم یک بار تحلیلش کنید).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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
اگر به فلوچارت دقت کنید کاملا مشخص شده است، هنگامی که cpu در حال اجرای خط به خط برنامه است، قادریم خطوطی را که نمیخواهیم cpu آنها را اجرا کند در برنامه متوقف کنیم برای اینکار کافی است کافیکه از این دستور continue استفاده کنیم. برای درک بهتر به کدی که در ادامه قرار میدهیم دقت کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #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. به عبارت دیگر زمانیکه شرط برقرار شود چه اتفاقی خواهد افتاد به نظرتان؟ طبق صحبتی که با هم کردیم مسلما باید دستوری که درون شرط قرار دارد اجرا نشود به عبارت سادهتر در خروجی نباید عدد 15 را مشاهده کنیم. و اعدادی بین 10 تا 19 را البته بدون عدد 15 را باید مشاهده کنیم. اجازه دهید خروجی را ببینیم(لطفا قبلش خودتون هم تحلیل کنید).
خروجی کد
1 2 3 4 5 6 7 8 9 | 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
همانطور که از فلوچارت مشخص است این دستور بر خلاف دستور continue، کل شرط و یا دستوراتی( دقت کنید نگفتیم صرفا یک خط رو میتونیم کاری کنیم که در برنامه یه خط رو متوقف کنه یا چندین خط رو) که بعد از آنها دستور Break قرار گرفته است را متوقف میکند برای درک بهتر به برنامه زیر توجه کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #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 استفاده شده است به نظر شما چه اتفاقی خواهد افتاد؟
همانطوری که گفتیم زمانیکه شرط صدق کند تمامی دستوراتی که درون شرط نوشته شدهاند متوقف میشوند و این بخش از برنامه درصورتیکه که مجددا فراخوانی نشود تکرار نخواهد شد. به عبارت دیگر در خروجی باید اعداد 10 تا 15 را مشاهده کنیم.
خروجی کد
1 2 3 4 5 6 | 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
این دستور در بین برنامهنویسان به دستور پرش معروف است که البته با اسم آن هم بیربط نیست. دلیل اینکه به این دستور، دستور پرش کردن میگویند این است که شما را قادر میسازد از هر خطی از برنامه به خط دیگر بروید (پرش کنید).
نکته طلایی: این دستور در صورتیکه ندانید چطور از آن استفاده کنید به حدی خطرناک است که عملا میتواند پروژه شما را با خاک یکسان کند.
فلوچارت goto
همانطوری که در فلوچارت هم نشان داده شده است میتوان توسط این دستور در بین خطوط، پرش انجام داد که به نوعی هم خطرناک و هم خوب است که واقعا باید بدانید که چطور از این دستور استفاده کنید. برای درک بهتر به برنامهای که در ادامه قرار میدهیم دقت کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #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; } |
به عنوان یک تمرین: برنامه بالا را تحلیل کنید.
خروجی کد
1 2 3 4 5 6 7 8 9 | 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 و روش های دیگری هم وجود دارند که در اینجا مورد بحث ما نیست.
حلقه یا شمشیر دو لبه
اجازه دهید برای درک بهتر موضوع یک مثال بزنیم. فرض کنید برنامهای را درون میکروبلیز نوشتهاید که باید زمانیکه حتما دیتا را دریافت کرد آنگاه ادامه دستورات را اجرا کند؟ آیا این طرز برنامهنویسی درست است؟
پاسخ
بزرگترین مشکلی که این برنامه دارد این است که هر وقتی که دیتا آمد برنامه ادامه کار خود را انجام میدهد(یعنی فاجعه). خب فرض را بر این بگیریم که دیتایی را اصلا دریافت نکردیم. آیا عاقلانه است که بقیه دستورات را هم به خاطر آن از کار بندازیم. مسلما کاری عاقلانه نیست. راهحل چیست؟ راهحل استفاده از یک زمانبندی است که به طور مثال بگوییم اگر تا یک ثاینه هیچ دیتایی دریافت نشد ادامه دستورات را اجرا کن (البته روشهای دیگری هم وجود دارند که بتوان حلقه ها را کنترل کرد و هدف از توضیح این بخش، این بود که شما مخاطب عزیز بدونید که با چه دستور مهمی در برنامه هاتون مواجه هستید).
امیدواریم که توانسته باشیم اهمیت مبحث حلقهها را به شما مخاطبین عزیز انتقال داده باشیم.
امیدواریم که این آموزش هم برای شما مخاطبین عزیز مفید واقع شده باشد.
ممنون از این مقاله کاربردی
🙂
با تشکر از sisoog ،
نویسنده محترم این مطلب در موارد متعدد در کامنتها اشاره کرده بودن که “اگه عمری باقی باشه”. خدای نکرده بلائی سرشون نیومده؟
اگه امکانش باشه یه رفرنس دیگه برا میکرو بلیز یه نفر پیشنهاد بده.
ممنون
سلام متاسفانه دوست عزیزمون مدت زیادی هست مطلب جدیدی ازسال نکرده اند
سلام
من الان 5 ماهه منتظرم ادامشو بخونم خواهشا ادامشو بذارید خیلی عالی بود
سلام این آخرین فصل آموزش زبان c هستش؟
سلام دوست عزیز
ظاهرا دوست عزیزی که مطلب رو مینوشتن – ادامه ندادنش
سلام وقتتون بخیر، بسیار از این مقاله های آموزش زبان C لذت بردم و امیدوارم ادامه داده شه و یک سوال داشتم به نظرتون زبان برنامه نویسی C رو پیگیری کنم یا C++ رو و اینکه به نظرتون برای رشته ی مهندسی برق مخابرات به جز متلب که بلدم چه نرم افزار ها و زبان برنامه نویسی رو در اولویت یادگیریم بزارم؟ مثلا C و پایتون و DSP و PHP و ….
سلام متاسفانه دوست عزیزمون مدت زیادی هست مطلب جدیدی ازسال نکرده اند
واقعا مقالات خوبی منتشر کردند 🙂
امیدوارم هر کجا که هستند موفق و پیروز باشند.
اما در مورد سوال شما – برای کار روی میکرو کنترلر بهترین گزینه زبان سی است اگر برای مهندسی برق الکترونیک بخوام پیشنهاد دیگه ای بدم حتما پایتون توی گزینه ها هست.
با توجه به رشد روز افزون سیستم های امبدد مبتنی بر لینوکس احتمالا یکی از گزینه های سریع برای پیاده سازی سیستم همین زبانه و البته با توجه به ابزار هایی که در اختیار شما قرار میده قادر خواهید بود اغلب نیازهای درسی پروژه ای خودتون را با این زبان مرتفع کنید.
سلام . بسیااار ممنونم که این بحث عالی رو استارت زدین .
من که تقریبا ۱ سال و نیمه ساله دارم سایت خوب سیسوگ رو دنبال میکنم جزو دسته بندی ها این مقاله رو ندیدم . نمیدونم چرااا. با سرچ در گوگل فهمیدم سایت سیسوگ این مقاله رو هم داره .
ازتون خواهش دارم این مقاله رو پیش ببرین . واقعا عالیه . خیلی ممنون
سلام این مقاله البته خیلی قدیمی هست و متاسفانه ادامه داده نشده مقاله , البته در دسته بندی ها هم موجود هست
ما سعی خودمون را برای ادامه این مقاله خواهیم کرد
خیلی لطف میکنین.
من بیصبرانه منتظر ادامه این آموزش میمونم
تشکر
سلام . ممنون از سایت خوبتون اما چرا دقیقا به جای اصلی که رسد دیگه ادامه شو نمیذارید ؟
سلام دوست عزیز
مطالب این سایت توسط دوستان خودتون نوشته میشند که البته لطف میکنند و البته گاهی وقتها هم ادامه نمیدند
و این انتقاد بر ما روا هست که برخی مطالب بدون سرانجام هستند
سعیمون این هست برخی از این مطالب که درخواست بیشتری داشته باشند را یه جورایی ادامه بدیم و امیدوارم این مطلب را هم بتونیم ادامه بدیم