|
| قسم لغات البرمجة php java c++ جافا Visual Basic فيجوال بيسك c# Delphi دلفي API PERL HTML و TML JavaScript ASP XML Oracle اوركال MySql sql server Access |
|
|
| F.Abdelaziz |
| مشاهدة ملفه الشخصي |
| زيارة موقع F.Abdelaziz المفضل |
| البحث عن كافة المشاركات المكتوبة بواسطة F.Abdelaziz |
| اعلانات |
|
||||||
|
التدريب 21 : برنامج للتحقق ما إذا كان العدد متناظر Palindrome أم لا . هذا البرنامج يعكس reverses عددًا صحيحًا (أدخله المستخدم) باستخدام حلقة while . ثم ، يتم استخدام عبارة if للتحقق مما إذا كان العدد المعكوس يساوي العدد الأصلي أم لا. يأخذ هذا البرنامج عددًا صحيحًا من المستخدم ويتم عكس ذلك العدد الصحيح. إذا كان العدد الصحيح المعكوس يساوي العدد الصحيح الذي أدخله المستخدم ، فسيكون هذا العدد متناظر palindrome إن لم يكن هذا العدد يساوى العدد الذى أدخله المستخدم فإن العدد ليس متناظر. كود:
// Check Palindrome Number
#include <iostream>
using namespace std;
int main()
{
int n, num, digit, rev = 0;
cout << "Enter a positive number: ";
cin >> num;
n = num;
do
{
digit = num % 10;
rev = (rev * 10) + digit;
num = num / 10;
} while (num != 0);
cout << " The reverse of the number is: " << rev << endl;
if (n == rev)
cout << " The number is a palindrome." << endl;
else
cout << " The number is not a palindrome." << endl;
return 0;
}
كود:
Output Enter a positive number: 12321 The reverse of the number is: 12321 The number is a palindrome. Enter a positive number: 12331 The reverse of the number is: 13321 The number is not a palindrome. في البرنامج أعلاه ، يُطلب من المستخدم إدخال عدد موجب يتم تخزينه بالمتغير num . ثم يتم حفظ العدد في متغير آخر n للتحقق منه عند عكس العدد الأصلي. داخل حلقة do...while ، يتم فصل الرقم الأخير last digit من العدد باستخدام رقم الكود كود:
digit = num % 10; ثم يتم إضافة هذا الرقم إلى المتغير rev. قبل إضافة الرقم digit إلى rev ، نحتاج أولاً إلى ضرب البيانات الحالية في المتغير revفى 10 من أجل إضافة الرقم إلى المكان النونى في العدد . التدريب 22 : برنامج للتحقق مما إذا كان الرقم أولى Prime أم لا . مثال للتحقق مما إذا كان عدد صحيح (تم إدخاله من قبل المستخدم) هو رقم أولي أم لا يستخدم حلقة for وعبارة if...else . العدد الصحيح الموجب الذى يقبل القسمة فقط على 1 وعلى نفسه يعرف بالعدد الأولي prime number . على سبيل المثال: 13 هو عدد أولي لأنه قابل للقسمة فقط على 1 وعلى نفسه 13 ولكن 15 ليس عدد أولي لأنه قابل للقسمة على 1 و 3 و 5 و 15. كود:
// Check Prime Number
#include <iostream>
using namespace std;
int main()
{
int n, i;
bool isPrime = true;
cout << "Enter a positive integer: ";
cin >> n;
for(i = 2; i <= n / 2; ++i)
{
if(n % i == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
cout << "This is a prime number" <<endl;
else
cout << "This is not a prime number" <<endl;
return 0;
}
كود:
Output Enter a positive integer: 29 This is a prime number. 1- يأخذ هذا البرنامج عددًا صحيحًا موجبًا من المستخدم ويخزنه في متغير n. كود:
cout << "Enter a positive integer: "; cin >> n; 2- بعد ذلك ، يتم تنفيذ حلقة for التي تتحقق مما إذا كان العدد الذي أدخله المستخدم n قابلاً للقسمة تمامًا على i أم لا. كود:
for(i = 2; i <= n / 2; ++i)
{
if(n % i == 0)
{
isPrime = false;
break;
}
}
• تبدأ الحلقة for بقيمة أولية i تساوي 2 وتزيد قيمة i في كل تكرار. • إذا كان العدد الذي أدخله المستخدم n قابلاً للقسمة تمامًا على i ، if(n % i == 0) ، فسيتم ضبط isPrime على "false" ولن يكون العدد عددًا أوليًا. 3- ولكن ، إذا لم يكن الرقم قابلاً للقسمة تمامًا على i حتى يكون شرط الاختبار i <= n / 2 صحيحًا true وهذا يعنى أنه سيكون فقط قابلاً للقسمة على 1 وعلى هذا الرقم نفسه. لذلك ، العدد المحدد هو عدد أولي. برنامج آخر للتحقق مما إذا كان العدد هو عدد أولى Prime الوصف يتحقق البرنامج إذا كان العدد أوليًا. يحتوي العدد الأولي على عاملين فقط الواحد 1 والعدد نفسه. الحل 1. يتم إدخال العدد المراد التحقق منه. 2. إذا كان قابلاً للقسمة على أي عدد طبيعي بدأ من 2 ، فعندئذ فهو ليس عددًا أوليًا. 3.وإلا فهو عدد أولي. 4. يتم طباعة النتيجة . 5. الخروج. كود:
#include<iostream>
using namespace std;
int main ()
{
int num, i, count = 0;
cout << "Enter the number to be checked : ";
cin >> num;
if (num == 0)
{
cout << "\n" << num << " is not prime";
exit(1);
}
else
{
for(i=2; i < num; i++)
if (num % i == 0)
count++;
}
if (count > 1)
cout << "\n" << num << " is not prime.";
else
cout << "\n" << num << " is prime.";
return 0;
}
شرح البرنامج 1- يُطلب من المستخدم إدخال العدد المراد التحقق منه وتخزينه في المتغير 'num'. 2- تتم تهيئة المتغير ‘count’بصفر 0. كود:
count = 0; 3- إذا كان num هو 0 ، فهو ليس عددا أوليًا. كود:
if (num == 0)
{
cout << "\n" << num << " is not prime";
exit(1);
}
4- تتم طباعة النتيجة ويتم إنهاء البرنامج exit(1); . 5- وإن لم يكن num بصفر else ، تستخدم حلقة for تبدأ من 2 ، يتم التحقق من num إذا كان قابلاً للقسمة على أي عدد طبيعي. كود:
else
{
for(i=2; i < num; i++)
if (num % i == 0)
count++;
}
6- إذا كان العدد num قابلاً للقسمة على أى عدد طبيعى i(2,3,4,…) ، فسيتم زيادة count . 7- يتم إنهاء الحلقة عندما يكون الشرط غير صحيح not true . 8- إذا كان count أكبر من 1 ، فهو ليس عدد أولي ، وإلا فإنه عدد أولي. 9- ثم تتم طباعة النتيجة. كود:
if (count > 1)
cout << "\n" << num << " is not prime.";
else
cout << "\n" << num << " is prime.";
كود:
Runtime Test Cases Case 1 : Enter the number to be checked : 5 5 is prime. Case 2 : Enter the number to be checked : 0 0 is not prime. Case 3 : Enter the number to be checked : 28 28 is not prime. التدريب رقم 23 : برنامج لعرض الأعداد الأولية بين فترتين (رقمين) . مثال لطباعة جميع الأعداد الأولية بين رقمين (أدخلهما المستخدم) . يتم حل هذه المشكلة باستخدام حلقة for المتداخلة وعبارة if...else . كود:
//1: Display Prime Numbers Between two Intervals
#include <iostream>
using namespace std;
int main()
{
int low, high, i, flag;
cout << "Enter two numbers(intervals): ";
cin >> low >> high;
cout << "Prime numbers between " << low << " and " << high << " are: ";
while (low < high)
{
flag = 0;
for(i = 2; i <= low/2; ++i)
{
if(low % i == 0)
{
flag = 1;
break;
}
}
if (flag == 0)
cout << low << " ";
++low;
}
cout<<endl;
return 0;
}
في هذا البرنامج ، يتم تكرار حلقة while (عالية - منخفضة - 1) مرات. في كل تكرار ، يتم تحديد ما إذا كان الرقم المنخفض هو عدد أولي أم لا ويتم زيادة قيمة القيمة المنخفضة بمقدار 1 حتى يكون المستوى الأدنى مساويًا للقيمة المرتفعة. تفضل بزيارة هذه الصفحة لمعرفة المزيد حول كيفية التحقق مما إذا كان الرقم أوليًا أم لا. إذا قام المستخدم بإدخال رقم أكبر أولاً ، فإن هذا البرنامج لا يعمل بالشكل المطلوب. يمكنك حل هذه المشكلة عن طريق تبديل الأرقام إذا أدخل المستخدم أكبر عدد أولاً. كود:
//2: Display Prime Numbers When Larger Number is Entered first
#include <iostream>
using namespace std;
int main()
{
int low, high, flag, temp;
cout << "Enter two numbers(intevals): ";
cin >> low >> high;
//swapping numbers if low is greater than high
if (low > high) {
temp = low;
low = high;
high = temp;
}
cout << "Prime numbers between " << low << " and " << high << " are: ";
while (low < high)
{
flag = 0;
for(int i = 2; i <= low/2; ++i)
{
if(low % i == 0)
{
flag = 1;
break;
}
}
if (flag == 0)
cout << low << " ";
++low;
}
return 0;
}
التدريب رقم 24 : برنامج للتحقق من عدد ارمسترونغ Armstrong Number مثال للتحقق مما إذا كان عدد صحيح (تم إدخاله من قبل المستخدم) هو رقم Armstrong من عدمه باستخدام حلقة while وعبارة if...else . يُطلق على الأعداد الصحيحة الموجبة رقم Armstrong إذا كان مجموع مكعبات الأرقام الفردية individual digit يساوي هذا العدد نفسه. فمثلا: 153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3 // 153 is an Armstrong number. 12 is not equal to 1 * 1 * 1 + 2 * 2 * 2 // 12 is not an Armstrong number. كود:
// Check Armstrong Number
#include <iostream>
using namespace std;
int main()
{
int origNum, num, rem, sum = 0;
cout << "Enter a positive integer: ";
cin >> origNum;
num = origNum;
while(num != 0)
{
rem = num % 10;
sum += rem * rem * rem;
num /= 10;
}
if(sum == origNum)
cout << origNum << " is an Armstrong number." <<endl ;
else
cout << origNum << " is not an Armstrong number." <<endl ;
return 0;
}
كود:
Output Enter a positive integer: 371 371 is an Armstrong number. 1- في البرنامج أعلاه ، يطلب من المستخدم إدخال عددًا صحيحًا موجبًا والذى يتم تخزينه فى المتغير origNum . 2- بعد ذلك ، يتم نسخ العدد إلى متغير آخر num . يتم ذلك لأننا بحاجة إلى التحقق من origNum في النهاية. 3- داخل حلقة while ، يتم فصل الرقم الاخير last digit عن num بالعملية digit = num % 10 وهى rem = num % 10; . هذا الرقم يتم تكعيبه وإضافته (جمعه) إلى المتغير sum . 4- الآن ، يتم تجاهل الرقم الأخير last digit باستخدام العبارة num /= 10; . 5- في الدورة التالية من حلقة while ، يتم فصل الرقم الأخير ، وتكعيبه إضافته إلى sum . 6- يستمر هذا حتى لا يتم ترك أي أرقام في num . 7- الآن ، تتم مقارنة مجموع sum بالعدد الأصلي origNum . 8- إذا كانت الأعداد متساوية ، فإن العدد الذي تم إدخاله هو عدد Armstrong. إذا لم يكن الأمر كذلك ، فالعدد ليس عدد Armstrong. التدريب رقم 25 : برنامج لعرض عدد ارمسترونغ بين فترتين Intervals مثال للإيجاد جميع أرقام Armstrong بين عددين صحيحين (أدخلهما المستخدم) باستخدام الحلقات وعبارة if...else . يطلب هذا البرنامج من المستخدم إدخال رقمين صحيحين ويعرض جميع أرقام Armstrong بين الفترة المعطاة (المحددة). إذا كنت لا تعرف كيفية التحقق مما إذا كان الرقم هو Armstrong أم لا في البرمجة عندئذ ، فقد يبدو هذا البرنامج معقدًا قليلًا. كود:
// Display Armstrong Number Between Intervals
#include <iostream>
using namespace std;
int main()
{
int num1, num2, i, num, digit, sum;
cout << "Enter first number: ";
cin >> num1;
cout << "Enter second number: ";
cin >> num2;
cout << "Armstrong numbers between " << num1 << " and " << num2 << " are: " << endl;
for(i = num1; i <= num2; i++)
{
sum = 0;
num = i;
for(; num > 0; num /= 10)
{
digit = num % 10;
sum = sum + digit * digit * digit;
}
if(sum == i)
{
cout << i << endl;
}
}
return 0;
}
كود:
Output Enter first number: 100 Enter second number: 400 Armstrong numbers between 100 and 400 are: 153 370 371 في هذا البرنامج ، من المفترض أن يقوم المستخدم دائمًا بإدخال العدد الأصغر أولاً. لن يؤدي هذا البرنامج المهمة المقصودة إذا قام المستخدم بإدخال العدد رقم الأكبر أولاً. يمكنك إضافة الكود لمبادلة عددين تم إدخالهما بواسطة المستخدم إذا قام المستخدم بإدخال العدد الأكبر أولاً لجعل هذا البرنامج يعمل بشكل صحيح. في هذا البرنامج ، يتم أخذ كل عدد بين الفترة وتخزينه في المتغير num . ثم ، يتم استرداد كل رقم digit من العدد في المتغير digit وتكعيبه (رفعه للأس 3 ) (^3) . تتم جمع النتيجة المكعبة إلى النتيجة المكعبة لآخر رقم sum . أخيرًا ، عند تنفيذ كل رقم ، تتم مقارنة sum مع العدد الأصلي i. إذا كانوا متساوون ، فإن العدد يكون عدد ارمسترونغ. |
| F.Abdelaziz |
| مشاهدة ملفه الشخصي |
| زيارة موقع F.Abdelaziz المفضل |
| البحث عن كافة المشاركات المكتوبة بواسطة F.Abdelaziz |
| اعلانات اضافية ( قم بتسجيل الدخول لاخفائها ) | |
|
|
|
||||||
|
التدريب رقم 26 : برنامج لعرض عوامل Factors العدد مثال لإيجاد جميع العوامل لعدد صحيح (أدخل من قبل المستخدم) باستخدام حلقة for ( عدد مرات التكرار معروف مسبقا) وعبارة if . يأخذ هذا البرنامج عددًا صحيحًا موجبًا من المستخدم ويعرض جميع عوامل هذا العدد . كود:
// Display all Factors of a Number
#include <iostream>
using namespace std;
int main()
{
int n, i;
cout << "Enter a positive integer: ";
cin >> n;
cout << "Factors of " << n << " are: " << endl;
for(i = 1; i <= n; ++i)
{
if(n % i == 0)
cout << i << endl;
}
return 0;
}
كود:
Output Enter a positive integer: 60 Factors of 60 are: 1 2 3 4 5 6 10 12 15 20 30 60 في هذا البرنامج ، يتم تخزين عدد صحيح يدخله المستخدم في المتغير n . بعد ذلك ، يتم تنفيذ حلقة for مع تهيئة أولية i = 1 والتحقق مما إذا كانت n قابلة للقسمة تمامًا على i أم لا. إذا كانت n قابلة للقسمة تمامًا على i ، فأنها تكون عامل من عوامل n. في كل تكرار ، يتم تحديث قيمة i (زيادة بقيمة 1). تستمر هذه العملية حتى يصبح شرط الاختبار i <= n خاطئًا ، بمعنى أن هذا البرنامج يتحقق مما إذا كان العدد الذي أدخله المستخدم n قابلًا للقسمة تمامًا على جميع الأرقام من 1 إلى n ويتم عرض كل عوامل هذا العدد . التدريب رقم 27 : برنامج لعمل آلة حاسبة بسيطة للجمع أو الطرح أو الضرب أو القسمة باستخدام عبارات switch...case و break . يأخذ هذا البرنامج عامل حسابي (+ ، - ، * ، /) واثنين من المعاملات operands من المستخدم ويقوم بتنفيذ العملية على هذه المعاملات بناءً على العامل الذي أدخله المستخدم. كود:
// Simple Calculator using switch statement
# include <iostream>
using namespace std;
int main()
{
char op;
float num1, num2;
cout << "Enter operator either + or - or * or /: ";
cin >> op;
cout << "Enter two operands: ";
cin >> num1 >> num2;
switch(op)
{
case '+':
cout << num1+num2;
break;
case '-':
cout << num1-num2;
break;
case '*':
cout << num1*num2;
break;
case '/':
cout << num1/num2;
break;
default:
// If the operator is other than +, -, * or /, error message is shown
cout << "Error! operator is not correct";
break;
}
return 0;
}
كود:
Output Enter operator either + or - or * or divide : - Enter two operands: 3.4 8.4 3.4 - 8.4 = -5.0 هذا البرنامج يأخذ مشغل واثنين من المعاملات من المستخدم. يتم تخزين العامل في المتغير op ويتم تخزين اثنين من المعاملات في Num1 و Num2 على التوالي. بعد ذلك ، يتم استخدام عبارة switch…case للتحقق من العامل الذي أدخله المستخدم. إذا قام المستخدم بإدخال + ، فسيتم تنفيذ عبارات الحالة : '+' ويتم إنهاء البرنامج. إذا أدخل المستخدم - إذن ، يتم تنفيذ عبارات الحالة: '-' ويتم إنهاء البرنامج. يعمل هذا البرنامج بشكل مشابه لـعوامل * و /. ولكن ، إذا كان العامل لا يتطابق مع أي من الأحرف الأربعة [+ ، - ، * و /] ، فسيتم تنفيذ عبارة الافتراضي default التى تعرض رسالة خطأ. برنامج آخر لعمل آلة حاسبة بسيطة للجمع أو الطرح أو الضرب أو القسمة أو التربيع باستخدام عبارات switch...case و break . كود:
/* C++ program to implement simple functions of a calculator*/
#include<iostream>
using namespace std;
int main()
{
int choice;
long num1, num2, x;
//displaying different options
cout << "Please choose your option:"
"\n1 = Addition"
"\n2 = Subtraction"
"\n3 = Multiplication"
"\n4 = Division"
"\n5 = Squares"
"\n6 = exit"
"\n\nChoice: ";
cin >> choice;
//while loop check whether the choice is in the given range
while(choice < 1 || choice > 6)
{
cout << "\nPlease choose the above mentioned option."
"\nChoice: ";
cin >> choice;
}
switch (choice)
{
//Addition
case 1:
cout << "Enter two numbers: \n";
cin >> num1 >> num2;
x = num1 + num2;
cout << "Sum = " << x;
break;
//Subtraction
case 2:
cout << "Enter two numbers: \n";
cin >> num1 >> num2;
x = num1 - num2;
cout << "Subtraction = " << x;
break;
//Multiplication
case 3:
cout << "Enter two numbers: \n";
cin >> num1 >> num2;
x = num1 * num2;
cout << "Product = " << x;
break;
//Division
case 4:
cout << "Enter Dividend: ";
cin >> num1;
cout << "Enter Divisor: ";
cin >> num2;
//while loop checks for divisor whether it is zero or not
while(num2 == 0)
{
cout << "\nDivisor cannot be zero."
"\nEnter divisor once again: ";
cin >> num2;
}
x = num1 / num2;
cout << "\nQuotient = " << x;
break;
//Square
case 5:
cout << "Enter any number: \n";
cin >> num1;
x = num1 * num1;
cout << "Square = " << x;
break;
case 6:
return 0;
default: cout << "\nError";
}
cout<<endl;
return 0;
}
|
|
||||||
|
التدريب رقم 28 : برامج لإنشاء هرم Pyramid ونمط Pattern أمثلة لطباعة نصف هرم ، وهرم ، وهرم مقلوب ، ومثلث باسكال Pascal's Triangle ومثلث فلويد Floyd's triangle باستخدام عبارات التحكم . كود:
//1: Program to print half pyramid using *
#include <iostream>
using namespace std;
int main()
{
int rows;
cout << "Enter number of rows: ";
cin >> rows;
for(int i = 1; i <= rows; ++i) // outer loop is responsible for row;
{
//print * equal to row number
for(int j = 1; j <= i; ++j) //inner loop is responsible for column
{
cout << "* ";
}
cout << "\n"; // give line breaks after ending every rows
}
return 0;
}
هذا البرنامج يأخذ عدد الصفوف rows من المستخدم ويستخدم حلقات for المتداخلة لطباعة نصف الهرم . • لطباعة أنماط هرمية نجمية ، نستخدم حلقتى for متداخلين . • حلقة for الخارجية مسؤولة عن عدد الصفوف في مثلث النجمة (*) الهرمية أو النماذج (النقوش) ، في حين أن حلقة for الداخلية سوف يطبع العدد المطلوب من النجوم * في كل صف أى الأعمدة ، عدد النجوم يساوى رقم الصف ، الصف الأول نجمة واحدة ، الصف الثانى نجمتين ، وهكذا إلى الصف رقم rows يحتوى على rows نجمة . كود:
//2: Program to print half pyramid a using numbers
#include <iostream>
using namespace std;
int main()
{
int rows;
cout << "Enter number of rows: ";
cin >> rows;
for(int i = 1; i <= rows; ++i) // outer loop is responsible for row
{
for(int j = 1; j <= i; ++j) //inner loop is responsible for columns
{
cout << j << " ";
}
cout << "\n"; // give line breaks after ending every row
}
return 0;
}
كود:
//3: Program to print half pyramid using alphabets
#include <iostream>
using namespace std;
int main()
{
char input, alphabet = 'A';
cout << "Enter the uppercase character you want to print in the last row: ";
cin >> input;
for(int i = 1; i <= (input-'A'+1); ++i)
{
for(int j = 1; j <= i; ++j)
{
cout << alphabet << " ";
}
++alphabet;
cout << endl;
}
return 0;
}
كود:
//4: Inverted half pyramid using *
#include <iostream>
using namespace std;
int main()
{
int rows;
cout << "Enter number of rows: ";
cin >> rows;
for(int i = rows; i >= 1; --i)
{
for(int j = 1; j <= i; ++j)
{
cout << "* ";
}
cout << endl;
}
return 0;
}
كود:
//5: Inverted half pyramid using numbers
#include <iostream>
using namespace std;
int main()
{
int rows;
cout << "Enter number of rows: ";
cin >> rows;
for(int i = rows; i >= 1; --i)
{
for(int j = 1; j <= i; ++j)
{
cout << j << " ";
}
cout << endl;
}
return 0;
}
كود:
//6: Program to print full pyramid using *
int main()
{
int rows, i, j, space;
cout << "Enter number of rows: ";
cin >> rows;
for(i = 1; i <= rows; i++) //i=1,2,3,…..rows
{
//for loop for displaying space
for(space = i; space < rows; space++)
{
cout << " "; //spaces=rows-1,rows-2,rows-3,….,0
}
//for loop to display stars
for(j = 1; j <= (2 * i - 1); j++) //
{
cout << "*";//stars=1,3,5,…,2*row-1
}
cout << "\n";
}
return 0;
}
كود:
//7 : C++ program to display inverted full star pyramid
#include<iostream>
using namespace std;
int main()
{
int rows, i, j, space;
cout << "Enter number of rows: ";
cin >> rows;
for(i = rows; i >= 1; i--)
{
//for loop to put space
for(space = i; space < rows; space++)
cout << " ";
//for loop for displaying star
for(j = 1; j <= (2 * i - 1); j++)
cout << "* ";
cout << "\n";
}
return 0;
}
كود:
//8 : C++ program to display hollow star pyramid
#include<iostream>
using namespace std;
int main()
{
int rows, i, j, space;
cout << "Enter number of rows: ";
cin >> rows;
for(i = 1; i <= rows; i++)
{
//for loop to put space in pyramid
for (space = i; space < rows; space++)
cout << " ";
//for loop to print star
for(j = 1; j <= (2 * rows - 1); j++)
{
if(i == rows || j == 1 || j == 2*i - 1)
cout << "*";
else
cout << " ";
}
cout << "\n";
}
return 0;
}
كود:
//9 : C++ program to display inverted hollow star pyramid
#include<iostream>
using namespace std;
int main()
{
int rows, i, j, space;
cout << "Enter number of rows: ";
cin >> rows;
for(i = rows; i >= 1; i--)
{
//for loop to put space in pyramid
for (space = i; space < rows; space++)
cout << " ";
//for loop to print star in pyramid
for(j = 1; j <= 2 * i - 1; j++)
{
if(i == rows || j == 1 || j == 2*i - 1)
cout << "*";
else
cout << " ";
}
cout << "\n";
}
return 0;
}
كود:
//10: Program to print pyramid using numbers
#include <iostream>
using namespace std;
int main()
{
int rows, count = 0, count1 = 0, k = 0;
cout << "Enter number of rows: ";
cin >> rows;
for(int i = 1; i <= rows; ++i)
{
for(int space = 1; space <= rows-i; ++space)
{
cout << " ";
++count;
}
while(k != 2*i-1)
{
if (count <= rows-1)
{
cout << i+k << " ";
++count;
}
else
{
++count1;
cout << i+k-2*count1 << " ";
}
++k;
}
count1 = count = k = 0;
cout << endl;
}
return 0;
}
كود:
//11: Print Pascal's triangle
#include <iostream>
using namespace std;
int main()
{
int rows, coef = 1;
cout << "Enter number of rows: ";
cin >> rows;
//for loop continues till the number of rows entered by the user
for(int i = 0; i < rows; i++)
{
//for loop to print required number of space
for(int space = 1; space <= rows-i; space++)
cout <<" ";
//for loop to print number in triangle
for(int j = 0; j <= i; j++)
{
//first and last value of every row is 1
if (j == 0 || i == 0)
coef = 1;
else
coef = coef*(i-j+1)/j;
cout << coef << " ";
}
cout << endl;
}
return 0;
}
مثلث باسكال هو مجموعة مثلثية من معاملات ذات الحدين سميت على اسم عالم الرياضيات الفرنسي بليز باسكال. هذا البرنامج يطبع مثلث باسكال . يأخذ البرنامج عدد الصفوف كمدخلات ويستخدم حلقات متداخلة لطباعة مثلث باسكال. • الحلقة الداخلية الأولى : كود:
for(int space = 1; space <= rows-i; space++)
cout <<" ";
تخلق فراغ space المسافة البادئة > • والحلقة الداخلية الثانية : كود:
for(int j = 0; j <= i; j++)
{
if (j == 0 || i == 0)
coef = 1;
else
coef = coef*(i-j+1)/j;
cout << coef << " ";
}
تحسب قيمة معامل ذي الحدين ، وتخلق فراغ المسافة البادئة وتطبع معامل ذي الحدين لهذا العمود المعين. كود:
//12: Print Floyd's Triangle.
#include <iostream>
using namespace std;
int main()
{
int rows, number = 1;
//number of rows to print
cout << "Enter number of rows: ";
cin >> rows;
//for loop responsible for number of rows
for(int i = 1; i <= rows; i++)
{
//for loop responsible for number of columns
for(int j = 1; j <= i; ++j)
{
cout << number << " "; //print number starting from 1
++number;
}
cout << endl;
}
return 0;
}
|
|
||||||
|
الدرس الرابع الهياكل Structures لقد رأينا متغيرات من أنواع البيانات البسيطة ، مثل float و char و int. تمثل المتغيرات من هذه الأنواع عنصرًا واحدًا من المعلومات : الارتفاع ، والكمية ، والعد، وما إلى ذلك. ولكن كما يتم تنظيم سلع البقالة في حقائب ، والموظفين في الإدارات ، والكلمات في جمل ، فمن المريح في كثير من الأحيان تنظيم المتغيرات البسيطة في كيانات أكثر تعقيدًا. بناء C++ المسمى "البنية" أو الهيكل structure هوالطريقة للقيام بذلك. الهيكل structure عبارة عن مجموعة من المتغيرات البسيطة. يمكن أن تكون المتغيرات في الهيكل من أنواع مختلفة : بعضها يمكن أن يكون int ، والبعض يمكن أن يكون float ، وهكذا. (هذا على عكس المصفوفة ، التي سنلتقى بها لاحقًا ، والتي يجب أن تكون فيها جميع المتغيرات من نفس النوع .) تسمى عناصر البيانات data items في الهيكل أعضاء members الهيكل. في الكتب التي تتناول البرمجة بلغة C ، غالبًا ما تُعتبر الهياكل ميزة متقدمة ويتم تقديمها في نهاية الكتاب. ومع ذلك ، بالنسبة للمبرمجين بلغة C++ ، تعتبر الهياكل واحدة من لبنات البناء المهمة في فهم الكائنات objects والفئات classes . في الواقع ، يكون بناء جملة الهيكلstructure مطابقًا تقريبًا لهيكل الفئة class . الهيكل structure (كما هو مستخدم عادة) عبارة عن مجموعة من البيانات ، في حين أن الفئة class عبارة عن مجموعة من البيانات data والدوال functions. لذلك من خلال تعلم الهياكل structures ، سنعمل على تمهيد الطريق لفهم الفئات والكائنات. تخدم الهياكل في C++ (و C) غرضًا مماثلًا للسجلات records في بعض اللغات الأخرى مثل Pascal. الهيكل البسيط A Simple Structure دعنا نبدأ بهيكل يحتوي على ثلاثة متغيرات : عددان صحيحان integers وعدد الفاصلة العائمة floating-point . يمثل هذا الهيكل عنصرًا item في مخزون شركة لقطع widget من أجزاء parts (حاجيات). الهيكل عبارة عن نوع من المخطط blueprint (النسخة الأصلية التى يتم منها الاستنساخ ) الذى يحدد المعلومات الضرورية لجزء واحد single part . تقوم الشركة بعمل عدة أنواع من القطع ، وبالتالي فإن رقم طراز القطعة modelnumber هو العضو الأول first member في الهيكل. ورقم الجزء نفسه partnumber هو العضو التالي next member ، والعضو النهائي final member هو تكلفة cost الجزء. البرنامج PARTS • يعرف الهيكل structure part ، • ويعرف متغير الهيكل structure variable من هذا النوع يسمى part1 ، • ويعين (يخصص) القيم لأعضائه ، • ثم يعرض هذه القيم. كود:
// parts.cpp
// uses parts inventory to demonstrate structures
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
struct part //1- declare a structure
{
int modelnumber; //ID number of widget
int partnumber; //ID number of widget part
float cost; //cost of part
};
////////////////////////////////////////////////////////////////
int main()
{
part part1; //2- define a structure variable
part1.modelnumber = 6244; //3- give values to structure members
part1.partnumber = 373;
part1.cost = 217.55F;
//4- display structure members
cout << “Model “ << part1.modelnumber;
cout << “, part “ << part1.partnumber;
cout << “, costs $” << part1.cost << endl;
return 0;
}
خرج البرنامج يبدو كما يلي: كود:
Model 6244, part 373, costs $217.55 يحتوي برنامج PARTS على ثلاثة جوانب رئيسية : تعريف defining الهيكل وتعريف متغير الهيكل والوصول إلى أعضاء الهيكل. دعونا ننظر إلى كل من هذه الجوانب . 1- تعريف الهيكل Defining the Structure يوضح تعريف الهيكل structure كيفية تنظيم الهيكل structure : فهو يعرف الأعضاء members الذين سيكونون لدى الهيكل . ها هو التعريف : كود:
struct part
{
int modelnumber;
int partnumber;
float cost;
};
• بناء جملة تعريف الهيكل Syntax of the Structure Definition فى البداية تتقدم الكلمة المفتاحية struct تعريف الهيكل structure . بعدها يأتي اسم الهيكل أو الوسم tag ، وهو هنا part . ثم يتم تضمين الإعلانات الخاصة بأعضاء الهيكل - modelnumber رقم الطراز و partnumber رقم الجزء و cost التكلفة - في أقواس {} . يتبع قوس الإغلاق فاصلة منقوطة ; ، كعلامة على إنهاء الهيكل بأكمله. لاحظ أن هذا الاستخدام للفاصلة المنقوطة للهيكل لا يشبه الاستخدام لكتلة من الكود . كما رأينا ، يتم أيضًا تعيين كتل الكود ، والتي يتم استخدامها في الحلقات والقرارات والدوال ، بواسطة الأقواس {} . ومع ذلك ، لا يستخدمون فاصلة منقوطة بعد قوس النهائية. يوضح الشكل 4-1 بناء جملة إعلان الهيكل. ![]() الشكل 4-1 بناء جملة تعريف الهيكل Syntax of the structure definition. . • استخدام تعريف الهيكل Use of the Structure Definition يساعد تعريف الهيكل فقط كمخطط blueprint (النسخة الأصلية) لإنشاء متغيرات نوع part (نسخ من الهيكل) . لا يقوم التعريف بنفسه بإنشاء أي متغيرات هيكل ؛ أي أنه لا يقوم بتخصيص أي مساحة في الذاكرة أو حتى تسمية أي متغيرات. هذا على خلاف تعريف المتغير البسيط ، الذي بخصص ذاكرة (يحجزها). تعريف الهيكل هو مجرد مواصفات specification لكيفية ظهور متغيرات الهيكل عندما يتم تعريفها. هذا مبين في الشكل 4-2 . ![]() الشكل 4-2 الهياكل والمتغيرات الهيكلية Structures and structure variables 2- تعريف متغير الهيكل Defining a Structure Variable العبارة الأولى في الدالة main() كود:
part part1; تعرّف متغير ، يسمى part1 ، من نوع الهيكل part . هذا التعريف يحجز مساحة في الذاكرة من أجل part1. كم المساحة؟ مساحة تكفي أن تحفظ جميع أعضاء part1 - أي رقم الطراز modelnumber ، ورقم الجزء partnumber ، والتكلفة cost . في هذه الحالة ، سيكون هناك 4 بايت لكل من العدد الصحيح int (بافتراض نظام 32 بت) ، و 4 بايت من أجل float . يوضح الشكل 4-3 كيف يبدو part1 في الذاكرة. (يوضح الشكل أعداد صحيحة 2 بايت.) ![]() الشكل 4-3 أعضاء الهيكل في الذاكرة Structure members in memory يمكننا التفكير في الهيكل part كمواصفات specification لنوع بيانات جديد. سيصبح هذا أكثر وضوحًا مع تقدمنا ، لكن لاحظ أن التنسيق الخاص بتعريف متغير الهيكل هو نفسه بالنسبة لتعريف نوع بيانات مضمن أساسي مثل int: كود:
part part1; int var1; هذا التشابه ليس عرضي . أحد أهداف C++ هو جعل بناء الجملة وتشغيل أنواع البيانات المعرفة من قبل المستخدم مماثلة قدر الإمكان لتلك الخاصة بأنواع البيانات المضمنة. (في C ، تحتاج إلى تضمين الكلمة المفتاحية struct في تعريفات الهيكل ، كما هو الحال في struct part part1; . في C++ ، الكلمة المفتاحية ليست ضرورية.) 3- الوصول إلى أعضاء الهيكل Accessing Structure Members بمجرد تعريف متغير الهيكل ، يمكن الوصول إلى أعضائه باستخدام شيء يسمى عامل النقطة dot operator . إليك كيفية إعطاء العضو الأول قيمة : كود:
part1.modelnumber = 6244; تتم كتابة عضو الهيكل في ثلاثة أجزاء : اسم متغير الهيكل (part1) ؛ وعامل النقطة dot operator ، الذي يتكون من period (.) ؛ واسم العضو (modelnumber). هذا يعني "العضو modelnumber في part1 ." الاسم الحقيقي لعامل النقطة هو عامل الوصول للعضو member access operator ، ولكن بالطبع لا أحد يريد استخدام مثل هذا المصطلح الطويل. تذكر أن المكون الأول من تعبير يتضمن عامل النقطة هو اسم متغير الهيكل المحدد (part1 في هذه الحالة) ، وليس اسم تعريف البنية (part). يجب استخدام اسم المتغير لتمييز أحد المتغيرات عن الآخر ، مثل part1 و part2 وما إلى ذلك ، كما هو موضح في الشكل 4.4. ![]() الشكل 4-4 عامل النقطة The dot operator يتم التعامل مع أعضاء الهيكل تمامًا مثل المتغيرات الأخرى. في العبارة part1.modelnumber = 6244; ، يتم إعطاء العضو القيمة 6244 باستخدام عامل التعيين العادي . يعرض البرنامج أيضًا الأعضاء المستخدمة في عبارات cout مثل كود:
cout << “\nModel “ << part1.modelnumber; هذه العبارات تخرج قيم أعضاء الهيكل. ميزات Structure الأخرى Other Structure Features الهياكل متعددة الاستخدامات بشكل مدهش . دعنا نلقي نظرة على بعض الميزات الإضافية لبناء الجملة والاستخدام. تهيئة أعضاء الهيكل Initializing Structure Members يوضح المثال التالي كيف يمكن تهيئة أعضاء الهيكل عندما يتم تعريف متغير الهيكل. إنه يوضح أيضًا أنه يمكن أن يكون لديك أكثر من متغير من نوع هيكل معين. إليك قائمة PARTINIT: كود:
// partinit.cpp
// shows initialization of structure variables
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
struct part //specify a structure
{
int modelnumber; //ID number of widget
int partnumber; //ID number of widget part
float cost; //cost of part
};
////////////////////////////////////////////////////////////////
int main()
{
//initialize variable
part part1 = { 6244, 373, 217.55F };
part part2; //define variable
//display first variable
cout << “Model “ << part1.modelnumber;
cout << “, part “ << part1.partnumber;
cout << “, costs $” << part1.cost << endl;
part2 = part1; //assign first variable to second
//display second variable
cout << “Model “ << part2.modelnumber;
cout << “, part “ << part2.partnumber;
cout << “, costs $” << part2.cost << endl;
return 0;
}
يعرف هذا البرنامج متغيرين من نوع part : part1 و part2. يقوم بتهيئة part1 ، ويطبع قيم أعضائه ، ويعين part1 إلى part2 ، ويطبع أعضاءه. فيما يلى الخرج : كود:
Model 6244, part 373, costs $217.55 Model 6244, part 373, costs $217.55 ليس من المستغرب أن تتكرر نفس الناتج لأن متغيرًا يساوي الآخر. تتم تهيئة أعضاء المتغير part1 من الهيكل عندما يتم تعريف المتغير: كود:
part part1 = { 6244, 373, 217.55 };
القيم التي يتم تعيينها لأعضاء الهيكل محاطة بأقواس {}ومفصولة بفواصل ( , ) . يتم تعيين القيمة الأولى في القائمة للعضو الأول ، والثانية للعضو الثاني ، وهكذا. متغيرات الهيكل في عبارات التعيين Structure Variables in Assignment Statements كما يمكن رؤيته في PARTINIT ، يمكن تعيين متغير هيكل إلى آخر: كود:
part2 = part1; يتم تعيين قيمة كل عضو في part1 للعضو المقابل في part2 . نظرًا لأن الهيكل الكبير يمكن أن يضم العشرات من الأعضاء ، فإن عبارة التعيين هذه قد يتطلب من الكمبيوتر القيام بقدر كبير من العمل. لاحظ أنه يمكن تعيين متغير بهيكل إلى آخر فقط عندما يكونون من نفس نوع الهيكل. إذا حاولت تعيين متغير من نوع هيكل إلى متغير من نوع هيكل آخر ، فسوف يشتكي المترجم. مثال القياس A Measurement Example دعونا نرى كيف يمكن استخدام هيكل structure لتجميع نوع مختلف من المعلومات. إذا نظرت إلى أي رسم معماري ، فأنت تعلم أنه (على الأقل في الولايات المتحدة) تقاس المسافات بالأقدام والبوصات. (كما تعلمون ، هناك 12 بوصة في القدم). قد يتم تحديد طول غرفة المعيشة ، على سبيل المثال ، 15’–8” ، وهذا يعني 15 قدمًا و 8 بوصات. الواصلة ليست علامة السالب ؛ إنها تفصل الأقدام عن البوصات. هذا جزء من نظام القياس الإنجليزى . يوضح الشكل 4.5 قياسات الطول المعتادة في النظام الإنجليزى . ![]() الشكل 4-5 القياسات فى النظام الإنجليزى Measurements in the English system افترض أنك تريد إنشاء برنامج رسم أو معماري يستخدم النظام الإنجليزى . سيكون من المناسب تخزين المسافات كعددين ، يمثلان القدم والبوصة. المثال التالي ، ENGLSTRC ، يعطي فكرة عن كيفية القيام بذلك باستخدام الهيكل structure . سيوضح هذا البرنامج كيف يمكن إضافة قياسين من نوع Distance معًا. كود:
// englstrc.cpp
// demonstrates structures using English measurements
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
struct Distance //English distance
{
int feet;
float inches;
};
////////////////////////////////////////////////////////////////
int main()
{
Distance d1, d3; //define two lengths
Distance d2 = { 11, 6.25 }; //define & initialize one length
//get length d1 from user
cout << “\nEnter feet: “; cin >> d1.feet;
cout << “Enter inches: “; cin >> d1.inches;
//add lengths d1 and d2 to get d3
d3.inches = d1.inches + d2.inches; //add the inches
d3.feet = 0; //(for possible carry)
if(d3.inches >= 12.0) //if total exceeds 12.0,
{ //then decrease inches by 12.0
d3.inches -= 12.0; //and
d3.feet++; //increase feet by 1
}
d3.feet += d1.feet + d2.feet; //add the feet
//display all lengths
cout << d1.feet << “\’-” << d1.inches << “\” + “;
cout << d2.feet << “\’-” << d2.inches << “\” = “;
cout << d3.feet << “\’-” << d3.inches << “\”\n”;
return 0;
}
هنا الهيكل Distance لديه عضوين : feet و inches . قد يكون للمتغير inches جزءًا كسريًا ، لذلك سنستخدم النوع float له. المتغير feet هو دائمًا أعداد صحيحة ، لذلك سنستخدم النوع int له. نعرف بعدين من هذه المسافات ، d1 و d3 ، دون تهيئتهما ، بينما نهيئ مسافة أخرى ، d2 ، إلى 11'–6.25'' . يطلب البرنامج من المستخدم إدخال مسافة بالقدم والبوصة ، ويقوم بتعيين هذه المسافة إلى d1. (يجب أن تكون قيمة البوصات أصغر من 12.0.) ثم تضيف المسافة d1 إلى d2 ، للحصول على المسافة الإجمالية d3. أخيرًا ، يعرض البرنامج المسافات الأولية والمسافة الإجمالية المحسوبة حديثًا. إليك بعض الإخراج: كود:
Enter feet: 10 Enter inches: 6.75 10’-6.75” + 11’-6.25” = 22’-1” لاحظ أنه لا يمكننا إضافة مسافتين بعبارة برنامج مثل كود:
d3 = d1 + d2; // can’t do this in ENGLSTRC لما لا ؟ لأنه لا يوجد روتين مضمّن في C++ يعرف كيفية إضافة متغيرات من نوع Distance . يعمل العامل + مع أنواع مدمجة مثل float ، ولكن ليس مع أنواع نعرّفها بأنفسنا ، مثل Distance. الهياكل داخل الهياكل Structures Within Structures يمكنك تداخل الهياكل داخل الهياكل الأخرى. إليك صيغة مختلفة في برنامج ENGLSTRC توضح كيف يبدو ذلك. في هذا البرنامج ، نريد إنشاء هيكل بيانات تخزن أبعاد غرفة نموذجية : طولها وعرضها. نظرًا لأننا نعمل مع مسافات إنجليزية ، فسوف نستخدم متغيرين من نوع Distance وهما المتغيرين length و width . كود:
struct Room
{
Distance length;
Distance width;
};
إليك برنامج ، ENGLAREA ، يستخدم الهيكل Room لتمثيل الغرفة. كود:
// englarea.cpp
// demonstrates nested structures
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
struct Distance //English distance
{
int feet;
float inches;
};
////////////////////////////////////////////////////////////////
struct Room //rectangular area
{
Distance length; //length of rectangle
Distance width; //width of rectangle
};
////////////////////////////////////////////////////////////////
int main()
{
Room dining; //define a room
dining.length.feet = 13; //assign values to room
dining.length.inches = 6.5;
dining.width.feet = 10;
dining.width.inches = 0.0;
//convert length & width
float l = dining.length.feet + dining.length.inches/12;
float w = dining.width.feet + dining.width.inches/12;
//find area and display it
cout << “Dining room area is “ << l * w
<< “ square feet\n” ;
return 0;
}
يعرف هذا البرنامج متغير واحد - dining - من النوع Room ، في السطر كود:
Room dining; // variable dining of type Room ثم يعين القيم لمختلف أعضاء هذا الهيكل. الوصول إلى أعضاء هيكل متداخل Accessing Nested Structure Members نظرًا لأن هناك هيكل متداخل داخل آخر ، يجب علينا تطبيق عامل النقطة مرتين للوصول إلى أعضاء الهيكل. كود:
dining.length.feet = 13; في هذه العبارة ، dining هو اسم متغير الهيكل ، كما كان من قبل ؛ و length هو اسم العضو في الهيكل الخارجي (Room) ؛ و feet هو اسم عضو في الهيكل الداخلي (Distance). تعني العبارة "خذ العضو feet من العضو length للمتغير dining وخصص له القيمة 13." يوضح الشكل 4.6 كيف يعمل هذا. ![]() الشكل 4-6 عامل النقطة والهياكل المتداخلة Dot operator and nested structures بمجرد تخصيص القيم لأعضاء dining ، يقوم البرنامج بحساب مساحة أرضية الغرفة ، كما هو موضح في الشكل 4-7 . لإيجاد المساحة ، يقوم البرنامج بتحويل الطول والعرض من متغيرات من نوع Distance إلى متغيرات من نوع float و l و w ، تمثل المسافات بالأقدام. يتم إيجاد قيم l و w عن طريق جمع العضو feet في Distance إلى العضو inches مقسومًا على 12. يتم تحويل العضو feet إلى نوع float تلقائيًا قبل تنفيذ الجمع ، وتكون النتيجة نوع float . ثم يتم ضرب المتغيرات l و w معًا للحصول على المساحة area . ![]() الشكل 4-7 المساحة بالأقدام والبوصات Area in feet and inches تحويلات نوع المعرف من قبل المستخدم User-Defined Type Conversions لاحظ أن البرنامج يحول مسافتين من النوع Distanceإلى مسافتين من النوع float : المتغيرات l و w. في الواقع ، تقوم أيضًا بتحويل مساحة الغرفة ، التي يتم تخزينها على أنها هيكل من النوع Room (والتي يتم تعريفها على أنها هيكلين من نوع Distance ) ، إلى عدد floating-point واحد يمثل المساحة بالأقدام المربعة. إليك الإخراج: كود:
Dining room area is 135.416672 square feet يعد تحويل قيمة نوع ما إلى قيمة نوع آخر جانبًا مهمًا في البرامج التي تستخدم أنواع البيانات المعرفة من قبل المستخدم . تهيئة الهياكل المتداخلة Initializing Nested Structures كيف يمكنك تهيئة متغير هيكل يحتوي في حد ذاته على هياكل ؟ العبارة التالية تهىء المتغير dining إلى نفس القيم المعطاة في برنامج ENGLAREA : كود:
Room dining = { {13, 6.5}, {10, 0.0} };
يتم تهيئة كل هيكل من نوع Distance ، المضمن في Room ، بشكل منفصل. تذكر أن هذا ينطوي على تطويق القيم بالأقواس وفصلها بفواصل. تتم تهيئة Distance الأولى إلى : كود:
{13, 6.5}
والثانية إلى : كود:
{10, 0.0}
ثم يتم استخدام قيمتي المسافة هذه لتهيئة المتغير Room ؛ مرة أخرى ، فهي محاطة بالأقواس ومفصولة بفواصل. عمق التداخل Depth of Nesting من الناحية النظرية ، يمكن تداخل الهياكل إلى أي عمق. في برنامج يصمم المباني السكنية ، قد تجد نفسك مع عبارات مثل هذا: كود:
apartment1.laundry_room.washing_machine.width.feet أسئلة : س1 : الهيكل structure يجمع مجموعة من ا. عناصر من نفس نوع البيانات. ب. عناصر البيانات ذات الصلة. ج. أعداد صحيحة مع أسماء المعرفة من قبل المستخدم. د. المتغيرات. ج1 : ب و د س2 : صواب أو خطأ : الهيكل structure والفئة class تسنخدم بناء جملة مماثل. ج2 : صواب س3 : يتبع قوس إغلاق الهيكل .... ج2 : فاصلة منقوطة semicolon ( س4 : اكتب مواصفات هيكل تتضمن ثلاثة متغيرات - جميعها من النوع int – تسمى hrs و mins و secs . وسمى هذا الهيكل time . ج4 : كود:
struct time
{
int hrs;
int mins;
int secs;
};
س5 : صواب أو خطأ: تعريف الهيكل يخلق مساحة في الذاكرة لمتغير. ج5 : خطأ ، فقط تعريف متغير يخلق مساحة في الذاكرة . س6 : عند الوصول إلى عضو هيكل ، يكون المعرف الموجود على يسار عامل النقطة هو اسم ا. عضو الهيكل structure member . ب. علامة هيكل structure tag . ج. متغير هيكل structure variable . د. الكلمة المفتاحية keyword struct . ج6 : ج س7 : اكتب عبارة تعيّن العضو hrs لمتغير الهيكل time2 ليساوي 11 ج7 : كود:
time2.hrs = 11; س8 : إذا كان لديك ثلاثة متغيرات تم تعريفها على أنها من نوع الهيكل time ، وكان هذا الهيكل يحتوي على ثلاثة أعضاء int ، كم عدد بايتات الذاكرة التي تستخدمها المتغيرات معًا؟ ج8 : 18 بايت في أنظمة 16 بت (3 هياكل فى 3 أعداد صحيحة فى 2 بايت) أو 36 في أنظمة 32 بت . س9 : اكتب تعريفًا يهيئ أعضاء time1 - وهو متغير من نوع struct time ، كما هو محدد في السؤال 4 – إلى hrs = 11 و mins = 10 و secs = 59 . ج9 : كود:
time time1 = { 11, 10, 59 };
س10 : صواب أو خطأ: يمكنك تعيين متغير هيكل لآخر ، بشرط أن يكون من نفس النوع . ج10 صواب . تمارين : التمرين رقم 1 : يمكن اعتبار أن رقم الهاتف ، مثل (212) 767-8900 ، يحتوي على ثلاثة أجزاء : كود المنطقة (212) area code ، والسنترال (767) ، والرقم (8900). اكتب برنامجًا يستخدم هيكلًا لتخزين هذه الأجزاء الثلاثة من رقم الهاتف بشكل منفصل. سمى الهيكل phone . قم بإنشاء متغيرين هيكل اثنين من نوع phone . قم بتهيئة واحد ، واطلب من المستخدم إدخال رقم للآخر. ثم أعرض كلا الرقمين. قد يبدو التفاعل كما يلي: كود:
Enter your area code, exchange, and number: 415 555 1212 My number is (212) 767-8900 Your number is (415) 555-1212 الحل : كود:
// ex4_1.cpp
// uses structure to store phone number
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
struct phone
{
int area; //area code (3 digits)
int exchange; //exchange (3 digits)
int number; //number (4 digits)
};
////////////////////////////////////////////////////////////////
int main()
{
phone ph1 = { 212, 767, 8900 }; //initialize phone number
phone ph2; //define phone number
// get phone no from user
cout << “\nEnter your area code, exchange, and number”;
cout << “\n(Don’t use leading zeros): “;
cin >> ph2.area >> ph2.exchange >> ph2.number;
cout << “\nMy number is “ //display numbers
<< ‘(‘ << ph1.area << “) “
<< ph1.exchange << ‘-’ << ph1.number;
cout << “\nYour number is “
<< ‘(‘ << ph2.area << “) “
<< ph2.exchange << ‘-’ << ph2.number << endl;
return 0;
}
التمرين رقم 2 : يمكن تمثيل نقطة على المستوى ثنائي الأبعاد بعددين : الإحداثي x والإحداثي y. على سبيل المثال ، (4،5) يمثل نقطة 4 وحدات على يمين المحور العمودي ، و 5 وحدات صعودا من المحور الأفقي . يمكن تعريف مجموع نقطتين كنقطة جديدة يكون إحداثي x فيها هو مجموع إحداثيات x للنقطتين ، وإحداثي y هو مجموع إحداثيات y. اكتب برنامجًا يستخدم هيكل يسمى point كنموذج نقطة. عرف ثلاث نقاط ، وقم بإدخال قيم إدخال المستخدم على اثنتين منها. ثم حدد النقطة الثالثة لتكون مساوية لمجموع النقطتين الأخريين ، واعرض قيمة النقطة الجديدة. قد يبدو التفاعل مع البرنامج كما يلي: كود:
Enter coordinates for p1: 3 4 Enter coordinates for p2: 5 7 Coordinates of p1+p2 are: 8, 11 الحل : كود:
// ex4_2.cpp
// structure models point on the plane
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
struct point
{
int xCo; //X coordinate
int yCo; //Y coordinate
};
////////////////////////////////////////////////////////////////
int main()
{
point p1, p2, p3; //define 3 points
cout << “\nEnter coordinates for p1: “; //get 2 points
cin >> p1.xCo >> p1.yCo; //from user
cout << “Enter coordinates for p2: “;
cin >> p2.xCo >> p2.yCo;
p3.xCo = p1.xCo + p2.xCo; //find sum of
p3.yCo = p1.yCo + p2.yCo; //p1 and p2
cout << “Coordinates of p1+p2 are: “ //display the sum
<< p3.xCo << “, “ << p3.yCo << endl;
return 0;
}
التمرين رقم 3 : إنشىء هيكل يسمى Volume والذى يستخدم ثلاثة متغيرات من نوع Distance (من مثال ENGLSTRC) لنمذجة حجم الغرفة. قم بتهيئة متغير من النوع Volume إلى أبعاد محددة ، ثم احسب الحجم الذى يمثله ، واطبع النتيجة. لحساب الحجم ، قم بتحويل كل بُعد من متغير Distance إلى متغير من النوع float الذي يمثل الأقدام والكسور من القدم ، ثم اضرب الأعداد الثلاثة الناتجة. الحل : كود:
// ex4_3.cpp
// uses structure to model volume of room
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
struct Distance
{
int feet;
float inches;
};
////////////////////////////////////////////////////////////////
struct Volume
{
Distance length;
Distance width;
Distance height;
};
////////////////////////////////////////////////////////////////
int main()
{
float l, w, h;
Volume room1 = { { 16, 3.5 }, { 12, 6.25 }, { 8, 1.75 } };
l = room1.length.feet + room1.length.inches/12.0;
w = room1.width.feet + room1.width.inches /12.0;
h = room1.height.feet + room1.height.inches/12.0;
cout << “Volume = “ << l*w*h << “ cubic feet\n”;
return 0;
}
|
|
||||||
|
الدرس الخامس الدوال Functions تقوم الدالة بتجميع عدد من عبارات البرنامج في وحدة وتمنحها (تعطيها) اسمًا. يمكن بعد ذلك استدعاء هذه الوحدة من أجزاء أخرى من البرنامج. السبب الأكثر أهمية لاستخدام الدوال هو المساعدة في تنظيم البرنامج. تقسيم البرنامج إلى دوال هو أحد المبادئ الرئيسية للبرمجة المنظمة (المهيكلة). (ومع ذلك ، توفر البرمجة الموجهة للكائنات طرقًا أكثر قوة لتنظيم البرامج.) سبب آخر لاستخدام الدوال (والسبب في اختراعها ، منذ فترة طويلة) هو تقليل حجم البرنامج. أي تسلسل من التعليمات التي تظهر في برنامج أكثر من مرة هو مرشح ليصبح في دالة . يتم تخزين كود الدالة في مكان واحد فقط في الذاكرة ، على الرغم من أن الدالة يتم تنفيذها عدة مرات في سياق البرنامج. يوضح الشكل 5-1 كيف يتم استدعاء دالة من أقسام مختلفة من البرنامج. ![]() الشكل 5-1 تدفق التحكم للدالة Flow of control to a function الدوال في C++ (و C) تشبه الإجراءات الفرعية subroutines والإجراءات procedures بلغات أخرى مختلفة. الدوال البسيطة Simple Functions يوضح مثالنا الأول دالة بسيطة تهدف إلى طباعة سطر من 45 من النجوم asterisks . ينشئ برنامج المثال جدولًا ، ويتم استخدام أسطرالنجوم لجعل الجدول أكثر قابلية للقراءة. إليك القائمة TABLE: كود:
// table.cpp
// demonstrates simple function
#include <iostream>
using namespace std;
void starline(); //function declaration
// (prototype)
int main()
{
starline(); //call to function
cout << “Data type Range” << endl;
starline(); //call to function
cout << “char -128 to 127” << endl
<< “short -32,768 to 32,767” << endl
<< “int System dependent” << endl
<< “long -2,147,483,648 to 2,147,483,647” << endl;
starline(); //call to function
return 0;
}
//--------------------------------------------------------------
// starline()
// function definition
void starline() //function declarator
{
for(int j=0; j<45; j++) //function body
cout << ‘*’;
cout << endl;
}
الإخراج من البرنامج يشبه ما يلى : كود:
********************************************* Data type Range ********************************************* char -128 to 127 short -32,768 to 32,767 int System dependent long -2,147,483,648 to 2,147,483,647 ********************************************* يتكون البرنامج من دالتين : main() و starline() . لقد شاهدت بالفعل العديد من البرامج التي تستخدم main() بمفردها . ما المكونات الأخرى الضرورية لإضافة دالة إلى البرنامج؟ هناك ثلاثة مكونات : • إعلان declaration الدالة ، • إستدعاءات calls الدالة • وتعريف definition الدالة . 1- إعلان الدالة The Function Declaration تمامًا كما لا يمكنك استخدام متغير دون إخبار المترجم أولاً بما هو عليه ، لا يمكنك أيضًا استخدام دالة دون إخبار المترجم عنها. هناك طريقتان للقيام بذلك . الطريقة (النهج) التي نظهرها هنا هي إعلان declare الدالة قبل أن يتم استدعاؤها. (الطريقة الأخرى هي تعريفها define قبل أن يتم استدعاؤها ، وسوف ندرس ذلك بعد ذلك.) في البرنامج TABLE ، يتم الإعلان عن الدالة starline() في السطر : كود:
void starline(); يخبر الإعلان declaration المترجم أننا في مرحلة لاحقة نخطط لتقديم دالة تسمى starline. تحدد الكلمة المفتاحية void أن الدالة لا تحتوي على (ليس لها) قيمة إرجاع ، وأن الأقواس الفارغة () تشير إلى أنها لا تأخذ أي وسائط arguments. (يمكنك أيضًا استخدام الكلمة المفتاحية void بين القوسين للإشارة إلى أن الدالة لا تحتوي على أي وسائط ، كما هو الحال غالبًا في لغة C ، ولكن تركها فارغة هو الممارسة الأكثر شيوعًا في C++ ) سيكون لدينا المزيد لنقوله حول الوسائط وإرجاع القيم قريبا. لاحظ أنه يتم إنهاء إعلان declaration الدالة بفاصلة منقوطة . إنه عبارة كاملة في حد ذاتها. تسمى أيضًا إعلانات الدالة النماذج الأولية prototypes ، لأنها توفر نموذجًا model أو مخططًا blueprint لهذه الدالة . وهى تخبر المترجم ، "الدالة التي تبدو مثل هذه تظهر في وقت لاحق في البرنامج ، لذلك كل شيء على ما يرام إذا رأيت إشارات (مرجعيات) إليها قبل أن ترى الدالة نفسها." المعلومات الواردة في الإعلان (نوع الإرجاع وعدد وأنواع الوسائط) يشار إليها أيضًا في بعض الأحيان باسم توقيع signature الدالة . 2- استدعاء الدالة Calling the Function يتم إستدعاء called الدالة (أو يتم استحضارها invoked أو تنفيذها executed ) ثلاث مرات من الدالة main() . يبدو كل استدعاء من الإستدعاءات الثلاثة كما يلي: كود:
starline(); هذا هو كل ما نحتاجه لاستدعاء الدالة : اسم الدالة ، متبوعة بالأقواس . يشبه بناء جملة الاستدعاء تلك الموجودة في الإعلان ، باستثناء أنه لا يتم استخدام نوع الإرجاع. يتم إنهاء الإستدعاء بفاصلة منقوطة. يؤدي تنفيذ عبارة الاستدعاء إلى تنفيذ الدالة ؛ بمعنى ، يتم نقل التحكم إلى الدالة ، ويتم تنفيذ العبارات في تعريف الدالة (التي سنقوم بفحصها بعد لحظة) ، ثم يتم عودة التحكم إلى العبارة التالية لاستدعاء الدالة . 3- تعريف الدالة The Function Definition أخيرًا ، نأتي إلى الدالة نفسها ، والتي يشار إليها باسم تعريف definition الدالة . يحتوي التعريف على الكود الفعلي للدالة . إليك تعريف الدالة starline() : كود:
void starline() //declarator
{
for(int j=0; j<45; j++) / /function body
cout << ‘*’;
cout << endl;
}
يتكون التعريف من سطر المُعلن declarator ، متبوعًا بجسم body الدالة . يتكون جسم الدالة من العبارات التي تشكل الدالة ، وتحددها الأقواس {} . يجب أن يتوافق المُعلن مع الإعلان declaration : يجب أن يستخدم نفس اسم الدالة ، وأن يكون له نفس أنواع الوسائط بنفس الترتيب (إذا كانت هناك وسائط ) ، وأن يكون له نفس نوع الإرجاع. لاحظ أن المُعلن لا يُنهي بفاصلة منقوطة. يوضح الشكل 5-2 صيغة جملة syntax إعلان declaration الدالة واستدعاء call الدالة وتعريف definition الدالة . الشكل 5-2 بناء جملة الدالة Function syntax عند استدعاء الدالة ، يتم نقل التحكم إلى العبارة الأولى في جسم الدالة . ثم يتم تنفيذ العبارات الأخرى في جسم الدالة ، وعندما تتم مواجهة قوس الإغلاق ، يعود التحكم إلى برنامج الاستدعاء. يلخص الجدول المكونات المختلفة للدالة : ![]() مقارنة مع دوال المكتبة Comparison with Library Functions لقد رأينا بالفعل بعض دوال المكتبة قيد الاستخدام. لدينا إستدعاءات مدمجة إلى دوال المكتبة ، مثل كود:
ch = getche(); في كود برنامجنا. أين الإعلان وتعريف دالة المكتبة هذه ؟ الإعلان declaration موجود في ملف الرأس المحدد في بداية البرنامج (CONIO.H ، من أجل getche() ). التعريف definition (يترجم إلى كود قابل للتنفيذ) موجود في ملف مكتبة والذى يرتبط linked تلقائيًا بالبرنامج عند إنشائه (بنائه) build . عندما نستخدم دالة مكتبة ، لا نحتاج إلى كتابة الإعلان أو التعريف. ولكن عندما نكتب دوالنا الخاصة ، يعد الإعلان والتعريف جزءًا من الملف المصدر ، كما هو موضح في مثال TABLE. إزالة الإعلان Eliminating the Declaration تتمثل الطريقة (النهج) الثانية لإدراج دالة في برنامج ما في إزالة إعلان الدالة ووضع تعريف الدالة (الدالة نفسها) في القائمة قبل الاستدعاء الأول للدالة . على سبيل المثال ، يمكننا إعادة كتابة TABLE لإنتاج TABLE2 ، حيث يظهر تعريف starline() أولاً. كود:
// table2.cpp
// demonstrates function definition preceding function calls
#include <iostream>
using namespace std; //no function declaration
//--------------------------------------------------------------
// starline() //function definition
void starline()
{
for(int j=0; j<45; j++)
cout << ‘*’;
cout << endl;
}
//--------------------------------------------------------------
int main() //main() follows function
{
starline(); //call to function
cout << “Data type Range” << endl;
starline(); //call to function
cout << “char -128 to 127” << endl
<< “short -32,768 to 32,767” << endl
<< “int System dependent” << endl
<< “long -2,147,483,648 to 2,147,483,647” << endl;
starline(); //call to function
return 0;
}
هذا النهج أبسط بالنسبة للبرامج القصيرة ، لأنه يزيل الإعلان ، لكنه أقل مرونة. لاستخدام هذه التقنية عندما يكون هناك عدد غير قليل من الدوال ، يجب على المبرمج التفكير ملياً في ترتيب الدوال بحيث تظهر كل واحدة قبل أن يتم استدعاؤها بواسطة أي دالة أخرى. في بعض الأحيان يكون هذا مستحيل. أيضًا ، يفضل العديد من المبرمجين وضع main() أولاً في القائمة ، حيث يبدأ التنفيذ. بشكل عام ، سوف نتمسك بالنهج الأول ، باستخدام الإعلانات وبدء القائمة باستخدام main() . |
|
||||||
|
تمرير الوسائط إلى الدوال Passing Arguments to Functions الوسيط argument هو جزء من البيانات (قيمة int ، على سبيل المثال) يتم تمريرها passed من برنامج إلى الدالة . تتيح الوسائط للدالة أن تعمل بقيم مختلفة ، أو حتى القيام بأشياء مختلفة ، حسب متطلبات البرنامج الذي يستدعيها . تمرير الثوابت Passing Constants على سبيل المثال ، لنفترض أننا قررنا أن الدالة starline() في المثال الأخير جامدة للغاية. بدلاً من دالة تطبع دومًا 45 نجمة ، نريد دالة تطبع أي حرف بأي عدد من المرات. إليك البرنامج ، TABLEARG ، يتضمن مثل هذه الدالة فقط. نستخدم الوسائط لتمرير الحرف المراد طباعته وعدد مرات طباعته. كود:
// tablearg.cpp
// demonstrates function arguments
#include <iostream>
using namespace std;
void repchar(char, int); //function declaration
int main()
{
repchar(‘-’, 43); //call to function
cout << “Data type Range” << endl;
repchar(‘=’, 23); //call to function
cout << “char -128 to 127” << endl
<< “short -32,768 to 32,767” << endl
<< “int System dependent” << endl
<< “double -2,147,483,648 to 2,147,483,647” << endl;
repchar(‘-’, 43); //call to function
return 0;
}
//--------------------------------------------------------------
// repchar()
// function definition
void repchar(char ch, int n) //function declarator
{
for(int j=0; j<n; j++) //function body
cout << ch;
cout << endl;
}
• الدالة الجديدة تسمى repchar() . إعلانها يكون بالشكل التالى : كود:
void repchar(char, int); // declaration specifies data types العناصر الموجودة في الأقواس هي أنواع بيانات الوسائط التي سيتم إرسالها إلى repchar() : char و int. • في استدعاء الدالة ، يتم إدراج قيم محددة - ثوابت في هذه الحالة - في المكان المناسب بين الأقواس: كود:
repchar(‘-’, 43); // function call specifies actual values تعطى هذه العبارة تعليمات للدالة repchar() لطباعة سطر من 43 شرطة (-) . يجب أن تكون القيم الواردة في الاستدعاء من الأنواع المحددة في الإعلان declaration : الوسيط الأول ، الحرف - ، يجب أن تكون من النوع char ؛ والوسيط الثانى ، العدد 43 ، يجب أن يكون من النوع int. يجب أن تتفق الأنواع فى الإعلان والتعريف أيضًا. الاستدعاء التالى للدالة repchar() : كود:
repchar(‘=’, 23); يخبرها بطباعة سطر من 23 علامات التساوى . الاستدعاء الثالث يطبع 43 شرطة مرة أخرى. وإليك الإخراج من TABLEARG: كود:
------------------------------------------- Data type Range ======================= char -128 to 127 short -32,768 to 32,767 int System dependent long -2,147,483,648 to 2,147,483,647 ------------------------------------------- • يوفر برنامج الاستدعاء الوسائط ، مثل ‘- ' و 43 ، للدالة. تسمى المتغيرات المستخدمة داخل الدالة للاحتفاظ بقيم الوسيط "البارامترات" parameters ؛ في الدالة repchar() البارامترات هى ch و n. (يجب أن نلاحظ أن العديد من المبرمجين يستخدمون مصطلحي الوسيط argument والبارامتر parameter كبدائل إلى حد ما.) • يحدد المُعلن في تعريف الدالة كل من أنواع البيانات وأسماء البارامترات : كود:
void repchar(char ch, int n) //declarator specifies parameter //names and data types يتم استخدام أسماء البارامترات ch و n ، في الدالة كما لو كانت متغيرات عادية. وضعهم في المُعلن يعادل تعريفهم بعبارات مثل كود:
char ch; int n; عند استدعاء الدالة ، تتم تهيئة بارامتراتها تلقائيًا للقيم التي تم تمريرها بواسطة برنامج الاستدعاء . تمرير المتغيرات Passing Variables في مثال TABLEARG ، كانت الوسائط ثوابت : ‘- '، 43 ، وهكذا. دعنا ننظر إلى مثال حيث يتم تمرير المتغيرات ، بدلاً من الثوابت ، كوسائط . يشتمل هذا البرنامج ، VARARG ، على نفس الدالة repchar() مثلما فى TABLEARG ، لكنه يتيح للمستخدم تحديد الحرف وعدد المرات التي يجب أن يتكرر فيها. كود:
// vararg.cpp
// demonstrates variable arguments
#include <iostream>
using namespace std;
void repchar(char, int); //function declaration
int main()
{
char chin;
int nin;
cout << “Enter a character: “;
cin >> chin;
cout << “Enter number of times to repeat it: “;
cin >> nin;
repchar(chin, nin);
return 0;
}
//--------------------------------------------------------------
// repchar()
// function definition
void repchar(char ch, int n) //function declarator
{
for(int j=0; j<n; j++) //function body
cout << ch;
cout << endl;
}
إليك بعض نماذج التفاعل مع VARARG: كود:
Enter a character: + Enter number of times to repeat it: 20 ++++++++++++++++++++ هنا ، عند استدعاء الدالة ، يتم استخدام chin و nin في الدالة main() كوسائط للدالة repchar() : كود:
repchar(chin, nin); // function call يجب أن تتطابق أنواع بيانات المتغيرات المستخدمة كوسائط مع تلك المحددة في إعلان وتعريف الدالة ، تمامًا كما يجب بالنسبة للثوابت. وهذا يعنى ، يجب أن تكون chin من نوع char ، ويجب أن تكون nin من نوع int. التمرير عن طريق (حسب) القيمة Passing by Value في البرنامج VARARG ، سيتم تمرير القيم الخاصة التي يمتلكها chin و nin ،عند تنفيذ استدعاء الدالة ، إلى الدالة . كما فعلت عندما تم تمرير الثوابت إليها ، تقوم الدالة بإنشاء متغيرات جديدة للاحتفاظ بقيم هذه الوسائط المتغيرة. تعطي الدالة هذه المتغيرات الجديدة أسماء وأنواع بيانات البارامترات المحددة في المُعلن : ch من نوع char و n من نوع int . فهى تهىء هذه البارامترات إلى القيم values التي تم تمريرها. ثم يتم الوصول إليها مثل المتغيرات الأخرى بواسطة عبارات في جسم الدالة. تمرير الوسائط بهذه الطريقة ، حيث تقوم الدالة بإنشاء نسخ من الوسائط التي تم تمريرها إليها ، تسمى "التمرير عن طريق (حسب) القيمة" passing by value . سنستكشف طريقة (نهج) أخرى ، "التمرير عن طريق (حسب) المرجع " passing by reference ، لاحقًا في هذا الدرس . يوضح الشكل 5-3 كيفية إنشاء متغيرات جديدة في الدالة عندما يتم تمرير الوسائط حسب القيمة. ![]() الشكل 5-3 التمرير حسب القيمة Passing by value |
|
||||||
|
إرجاع (إعادة) القيم من الدوال Returning Values from Functions عندما تكمل دالة تنفيذها ، يمكنها إرجاع قيمة واحدة إلى برنامج الاستدعاء. تتكون قيمة الإرجاع عادةً من إجابة للمشكلة التي حلتها الدالة . يوضح المثال التالي دالة تقوم بإرجاع وزن بالكيلوغرام بعد إعطاء وزن بالباوند (رطل) pounds . إليك القائمة CONVERT: كود:
// convert.cpp
// demonstrates return values, converts pounds to kg
#include <iostream>
using namespace std;
float lbstokg(float); //declaration
int main()
{
float lbs, kgs;
cout << “\nEnter your weight in pounds: “;
cin >> lbs;
kgs = lbstokg(lbs);
cout << “Your weight in kilograms is “ << kgs << endl;
return 0;
}
//--------------------------------------------------------------
// lbstokg()
// converts pounds to kilograms
float lbstokg(float pounds)
{
float kilograms = 0.453592 * pounds;
return kilograms;
}
إليك بعض نماذج التفاعل مع هذا البرنامج: كود:
Enter your weight in pounds: 182 Your weight in kilograms is 82.553741 عندما تقوم دالة بإرجاع قيمة ، يجب تحديد نوع بيانات هذه القيمة. يقوم إعلان الدالة بذلك عن طريق وضع نوع البيانات ، float في هذه الحالة ، قبل اسم الدالة في الإعلان والتعريف. لم تُرجع الدالات في أمثلة البرامج السابقة أي قيمة ، لذلك كان نوع الإرجاع void (فارغ) . في برنامج CONVERT ، ترجع الدالة lbstokg() (رطل إلى كيلوغرام ، حيث lbs تعني رطل) نوع float ، لذلك يكون الإعلان كود:
float lbstokg(float); أول float تحدد نوع الإرجاع. وتحدد float بين القوسين أن وسيط يتم تمريره إلى lbstokg() هو أيضًا من النوع float. عندما تقوم دالة بإرجاع قيمة ، فإن استدعاء الدالة lbstokg(lbs) يعتبر تعبيرًا يأخذ القيمة التي تم إرجاعها بواسطة الدالة. يمكننا التعامل مع هذا التعبير مثل أي متغير آخر ؛ في هذه الحالة ، نستخدمه في عبارة التخصيص : كود:
kgs = lbstokg(lbs); وهذه تتسبب في أن يتم تعيين (تخصيص) المتغير kgs بالقيمة التي يتم إرجاعها بواسطة الدالة lbstokg() . عبارة الإرجاع The return Statement تمرر الدالة lbstokg() وسيط يمثل الوزن بالباوندات pounds ، والذى يتم تخزينه في البارامتر pounds . وتحسب الوزن المقابل بالكيلوغرام بضرب قيمة الباوند هذه في ثابت ؛ يتم تخزين النتيجة فى المتغير kilograms . ثم يتم إرجاع قيمة هذا المتغير إلى برنامج الاستدعاء باستخدام عبارة الإرجاع: كود:
return kilograms; لاحظ أن كل من main() و lbstokg() لديهما مكان لتخزين تغير الكيلوجرام : kg في main() ، و kilograms في lbstokg() . عند إرجاع الدالة ، يتم نسخ القيمة kilograms إلى kgs . لا يقوم برنامج الاستدعاء بالوصول إلى المتغير kilograms في الدالة ؛ يتم إرجاع القيمة فقط . تظهر هذه العملية في الشكل 5-6 . ![]() الشكل 5-4 إرجاع (إعادة) قيمة Returning a value على الرغم من أنه قد يتم إرسال العديد من الوسائط إلى دالة ، إلا أنه قد يتم إرجاع وسيط واحدة منها فقط . هذا هو القيد عندما تحتاج إلى إرجاع مزيد من المعلومات. ومع ذلك ، هناك طرق أخرى لإرجاع متغيرات متعددة من الدالات. الأول هو تمرير الوسائط بالرجوع إليها (حب المرجع by reference ) ، والتي سننظر فيها لاحقًا. الطريقة الأخرى هى إرجاع هيكل structure مع القيم المتعددة كأعضاء. يجب عليك دائمًا تضمين نوع إرجاع دالة في إعلان الدالة . إذا لم تُرجع الدالة أي شيء ، فاستخدم الكلمة المفتاحية void للإشارة إلى هذه الحقيقة. إذا لم تستخدم نوع الإرجاع في الإعلان ، فسوف يفترض المترجم أن الدالة تُرجع قيمة int. على سبيل المثال ، الإعلان كود:
somefunc(); // declaration -- assumes return type is int يخبر المترجم أن somefunc() لديها نوع إرجاع int. سبب ذلك تاريخي ، استنادًا إلى الاستخدام في الإصدارات القديمة من لغة C. في الممارسة ، يجب ألا تستفيد من هذا النوع الافتراضي. قم دائمًا بتحديد نوع الإرجاع بشكل صريح ، حتى إذا كان في الحقيقة int. هذا يبقي القائمة متسقة وقابلة للقراءة. إزالة (التخلص من ) المتغيرات غير الضرورية Eliminating Unnecessary Variables يحتوي برنامج CONVERT على العديد من المتغيرات التي يتم استخدامها بغرض الوضوح ولكنها ليست ضرورية حقًا. البرنامج CONVERT2 يُظهر شكل مختلف من هذا البرنامج ، ، فهو يوضح كيف يمكن غالبًا استخدام التعبيرات التي تحتوي على دوال بدلاً من المتغيرات. كود:
// convert2.cpp
// eliminates unnecessary variables
#include <iostream>
using namespace std;
float lbstokg(float); //declaration
int main()
{
float lbs;
cout << “\nEnter your weight in pounds: “;
cin >> lbs;
cout << “Your weight in kilograms is “ << lbstokg(lbs)
<< endl;
return 0;
}
//--------------------------------------------------------------
// lbstokg()
// converts pounds to kilograms
float lbstokg(float pounds)
{
return 0.453592 * pounds;
}
في main() تم التخلص من المتغير kgs من برنامج CONVERT. بدلاً من ذلك ، يتم إدخال الدالة lbstokg(lbs) مباشرةً في عبارة cout: كود:
cout << “Your weight in kilograms is “ << lbstokg(lbs) << endl; أيضًا في الدالة lbstokg() ، لم يعد يتم استخدام المتغير kilograms . يتم إدراج التعبير 0.453592*pounds مباشرة في عبارة الإرجاع: كود:
return 0.453592 * pounds; يتم تنفيذ الحساب ويتم إرجاع القيمة الناتجة إلى برنامج الاستدعاء ، تمامًا كما ستكون قيمة المتغير. للتوضيح ، غالبًا ما يضع المبرمجون أقواس حول التعبير المستخدم في عبارة الإرجاع: كود:
return (0.453592 * pounds); حتى إذا لم يكن مطلوبًا بواسطة المترجم ، فإن الأقواس الزائدة في التعبير لا تسبب أي ضرر ، وقد تساعد في جعل القائمة أسهل لنا نحن البشر في القراءة. ربما يفضل مبرمجو C++ (و C) ذوو الخبرة النموذج المختصر CONVERT2 على CONVERT المطوَّل أكثر. ومع ذلك ، CONVERT2 ليس من السهل فهمه ، خاصة بالنسبة لغير الخبراء. مسألة الإيجاز مقابل الوضوح هي مسألة أسلوب ، اعتمادًا على تفضيلاتك الشخصية وتوقعات أولئك الذين سيقرأون الكود. |
|
جميع الحقوق محفوظة 2026
|


