تعليمة الإنتقال 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;
}