
تعليمة الإنتقال goto في لغة C++
تعليمة goto تستخدم للإنتقال غير المشروط من مكان إلى آخر داخل الإجراء. و لكي نستخدمها يجب أن نضع Label عنوان داخل البرنامج لكي نتمكن من الإنتقال إليه, ونختار الإسم للعنوان بشكل عادي مثلما إستخدمنا أسماء المتغيرات و نضع بعده نقطتين :.
الشكل العام لتعليمة goto
goto label; . . label : statement;
إن تعليمة goto تنتقل لعنوان آخر داخل نفس الإجراء الذي توجد به, و لا يمكن أن يكون في إجراء آخر رغم أن goto سهلة الإستخدام لكنها غير محببة لدى الكثير من المبرمجين. و يسبب كثرة إستخدامها يٌصبِح البرنامج غير مفهوم و غير مقروء جيداً و ليس بالسهولة تتبعه. و يكون متداخل ببعضه و الأغلب يشبّهه بـ “السباكيتي” أي المعكرونة لأنه تكون أكواد البرنامج متشابكة ببعضها شبيهة بالمعكرونة الملتفّة ببعضها.
رغم ذلك الأغلب يكتبون برامجهم ويقسّمونها إلى ملفات منفصلة. يكون هذا أفضل بحيث كل ملف يحوي إجراء واحد أو أكثّر و كل إجراء له وظيفة واضحة و محددة لأن بهذا الشكل. سهل الفهم و التتبع و يكون به إجراءات يمكن إعادة إستخدامها لآحقاً في برامج أخرى.
مثال 1
#include <iostream> using namespace std; int main() { int a = 10; LOOP:do { if (a == 15){ a = a + 1; goto LOOP; } cout << "value of a: " << a << endl; a = a + 1; } while (a < 20); return 0; }
لدينا قيمة a تساوي 10 أي بداية حلقة التكرار و وضعنا شرط في حلقة تكرار عندما يصل إلى الرقم 15 يتجاهله. و يضيف في كل دورة رقم 1 إلى ﻷن يكتمل للرقم 20 عندما تكون قيمة a أصغر من 20. عند تشغيل الكود ستكون النتيجة
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
مثال 2
#include <iostream> using namespace std; int main() { int a = 10; MyLabel: do{ if(a==15) { a=a+1; goto MyLabel; } printf("Value is %d\n", a); a++; } while(a<21); return 0; }
عند تشغيل الكود
Value si 10 Value si 11 Value si 12 Value si 13 Value si 14 Value si 16 Value si 17 Value si 18 Value si 19 Value si 20
تمرين عملي 1
أكتب برنامج يقوم بإدخال رقم ما فإن كان الرقم أصغر من 10 فإنه يطبع العبارة : “number less ten”. أما إذا كان الرقم المُدخَل أكبر أو يساوي 10 فيطبع العبارة : “number bigger or equall ten”.
#include <iostream> using namespace std; int main(){ int x; cin>>x; if (x<10) goto one; else goto two; one: cout<<"number less ten"<<endl; two: cout<<"number bigger or equall ten"<<endl; return 0; }
نلاحظ أنه أدخلنا في البرنامج رقم 15 وهو أكبر من 10 فطبع لنا أن الرقم اكبر أو يساوي 10. أما إذا كتبنا رقم أصغَر من 10 فإنه سوف يطبَع لنا العبارتين سوياً. و سبب هذا أن البرنامج ينفذ التعليمات سطر سطر, فإِن العبارة الثانية أتت فوراً بعد العبارة الأولى فإنه يطبعها. عند تشغيل الكود
15 number bigger or equall ten
تمرين عملي 2
أكتب برنامج يقوم المستخدم بإدخال عدة أعداد /n/ ويقوم بجمعها بحيث يحدد المستخدم عدد الأعداد /n/ قبل إدخالها.
#include <iostream> using namespace std; int main(){ int sum = 0,x,i,n; cout<<"enter n"<<endl; cin>>n; for(i=1; i<=n; i++) { cout<<"enter number ="<<endl; cin>>x; sum=sum+x; } cout<<"the sum of number is = "; cout<<sum<<endl; return 0; }