منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings

اذهب الى الأسفل

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings Empty الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings

مُساهمة من طرف Admin الإثنين يوليو 15, 2019 9:38 pm

الدرس السادس
المصفوفات والسلاسل النصية Arrays and Strings


تمهيد :
في الحياة اليومية نجمع الأشياء المتشابهة في وحدات. نشتري البازلاء بالعبوة والبيض بالكرتونة . نحتاج أيضًا فى لغات الكمبيوتر إلى تجميع عناصر البيانات من نفس النوع معًا. الآلية الأساسية التي تنجز هذا في لغة C++ هي المصفوفة array . يمكن أن تحتوي المصفوفات على بعض عناصر البيانات أو عشرات الآلاف. يمكن أن تكون عناصر البيانات التي تم تجميعها في المصفوفة أنواعًا بسيطة مثل int أو float ، أو يمكن أن تكون أنواعًا معرّفة من قِبل المستخدم مثل الهياكل والكائنات.

تشبه المصفوفات الهياكل structures حيث يجمعان عددًا من العناصر في وحدة أكبر. ولكن في حين أن الهيكل يجمع عادة عناصر من أنواع مختلفة ، فإن المصفوفة تجمع عناصر من نفس النوع. الأهم من ذلك ، يتم الوصول إلى العناصر الموجودة في هيكل بالاسم ، في حين يتم الوصول إلى العناصر الموجودة في مصفوفة من خلال رقم الفهرس index number . يتيح استخدام رقم فهرس لتحديد عنصر سهولة الوصول إلى عدد كبير من العناصر.

توجد المصفوفات في كل لغة كمبيوتر تقريبًا. تتشابه المصفوفات في لغة C++ مع تلك الموجودة باللغات الأخرى ، وهي مماثلة لتلك الموجودة في لغة C.

في هذا الدرس ، سننظر أولاً في مصفوفة أنواع البيانات الأساسية مثل int و char. بعد ذلك سنقوم بفحص المصفوفات المستخدمة كأعضاء بيانات في الفئات ، والمصفوفات المستخدمة للاحتفاظ بالكائنات. وبالتالي ، لا يهدف هذا الدرس إلى تقديم المصفوفات فحسب ، بل لزيادة فهمك للبرمجة الموجهة للكائنات.

في لغة C++ القياسية ، المصفوفة ليست هى الطريقة الوحيدة لتجميع عناصر من نفس النوع. المتجه vector ، الذي يعد جزءًا من مكتبة القوالب القياسية Standard Template library ، يعد طريقة أخرى.

في هذا الدرس ، سننظر أيضًا في طريقتين (نهجين) مختلفتين للسلاسل النصية strings ، والتي تُستخدم لتخزين النصوص ومعالجتها. النوع الأول من السلسلة هو مصفوفة من النوع char ، والثاني هو عضو في فئة سلسلة C++ القياسية.

أساسيات المصفوفة Array Fundamentals
مثال بسيط لبرنامج بسيط سيعمل على تقديم (التعرف على ) المصفوفات. ينشئ هذا البرنامج ، REPLAY ، مصفوفة لمجموعة من أربعة أعداد صحيحة تمثل أعمار أربعة أشخاص. ثم يطلب من المستخدم إدخال أربع قيم ، والتي يضعها في المصفوفة. أخيرًا ، يعرض القيم الأربعة.

الكود:

// replay.cpp
// gets four ages from user, displays them
#include <iostream>
using namespace std;

int main()
{
int age[4];          //array ‘age’ of 4 ints

for(int j=0; j<4; j++)    //get 4 ages
{
cout << “Enter an age: “;
cin >> age[j];       //access array element
}

for(j=0; j<4; j++)       //display 4 ages
cout << “You entered “ << age[j] << endl;
return 0;
}

إليك نموذج تفاعلي مع البرنامج:

الكود:
Enter an age: 44
Enter an age: 16
Enter an age: 23
Enter an age: 68

You entered 44
You entered 16
You entered 23
You entered 68
 

تحصل أول حلقة for على الأعمار ages من المستخدم وتضعها في المصفوفة ، بينما حلقة for الثانية تقرأها من المصفوفة وتعرضها.

• تعريف المصفوفات Defining Arrays
مثل المتغيرات الأخرى في لغة C++ ، يجب تعريف المصفوفة قبل استخدامها لتخزين المعلومات.
ومثل التعريفات الأخرى ، يحدد تعريف المصفوفة نوعًا المتغيرً واسمًا له. لكنه يتضمن ميزة أخرى: الحجم size . يحدد الحجم عدد عناصر البيانات التي ستحتويها المصفوفة . وهو يتبع الاسم مباشرةً ، وتحيط به أقواس مربعة [ ] . يوضح الشكل بناء جملة تعريف المصفوفة .

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings 2AFEB61C5035492AAC180EB36FFEB56B

الشكل يبين بناء جملة تعريف المصفوفة.

في المثال REPLAY ، المصفوفة هى من نوع int. يأتي اسم المصفوفة بعد ذلك ، يليه مباشرةً قوس الفتح وحجم المصفوفة وقوس الإغلاق. يجب أن يكون الرقم بين الأقواس ثابتًا أو تعبيرًا يتم تقييمه إلى ثابت ، ويجب أن يكون أيضًا عددًا صحيحًا.
في المثال نستخدم القيمة 4.


• عناصر المصفوفة الصفيف Array Elements
تسمى البنود items الموجودة في المصفوفة عناصر elements (على عكس البنود items الموجودة في هيكل ، والتي تسمى أعضاء members ). كما لاحظنا ، جميع العناصر في المصفوفة هي من نفس النوع ، فقط القيم تختلف. يوضح الشكل عناصر المصفوفة age .

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings BC1E80935E6642FBA431285524A2C893

الشكل يبين عناصر المصفوفة Array elements

باتباع النهج التقليدي ، الذاكرة تكون كما في الشكل. أى يكون ، أول عناصر المصفوفة في الجزء العلوي ؛ العناصر الاحقة تمتد لأسفل. كما هو محدد في التعريف ، المصفوفة تحتوى على أربعة عناصر بالضبط.

لاحظ أن عنصر المصفوفة الأول مُرقّم 0. وبالتالي ، نظرًا لوجود أربعة عناصر ، يكون العنصر الأخير هو رقم 3. وهذا الوض محتمل أن يكون مربكا ؛ قد تعتقد أن العنصر الأخير في مصفوفة مكونة من أربعة عناصر سيكون رقم 4 ، لكنه ليس كذلك.

• الوصول إلى عناصر المصفوفة Accessing Array Elements
في مثال REPLAY ، نصل إلى كل عنصر مصفوفة مرتين. في المرة الأولى ، نقوم بإدخال (إدراج) قيمة في المصفوفة ، بالسطر

الكود:
 cin >> age[j];

في المرة الثانية ، نقرأه بالسطر

الكود:
 cout << “\nYou entered “ << age[j];

في كلتا الحالتين التعبير عن عنصر المصفوفة يكون بالصيغة

الكود:
age[j]

يتكون هذا التعبير من اسم المصفوفة ، متبوعًا بأقواس تحدد delimiting متغيرًا j . أي من عناصر المصفوفة الأربعة المحددة بواسطة هذا التعبير يعتمد على قيمة j ؛ يشير age[0] إلى العنصر الأول ، و age[1] إلى العنصر الثاني ، و age[2] إلى العنصر الثالث ، و age[3] إلى العنصرالرابع. يُطلق على المتغير (أو الثابت) في الأقواس فهرس (مؤشر – دليل – رقم تسلسلى ) المصفوفة array index .

نظرًا لأن j هو متغير الحلقة في كلا من حلقتى for الحلقات ، فإنه يبدأ عند 0 ويتزايد حتى يصل إلى 3 ، وبالتالي الوصول إلى كل عنصر من عناصر المصفوفة كل فى دوره.

• متوسطات عناصر المصفوفة Averaging Array Elements
إليك مثال آخر على المصفوفة . البرنامج ، SALES ، يدعو المستخدم لإدخال سلسلة من ستة قيم تمثل مبيعات قطعة لكل يوم من أيام الأسبوع (باستثناء الأحد) ، ثم يحسب متوسط هذه القيم. نحن نستخدم مصفوفة من النوع double بحيث يمكن إدخال القيم النقدية .


الكود:
// sales.cpp
// averages a weeks’s widget sales (6 days)
#include <iostream>
using namespace std;

int main()
{
const int SIZE = 6;          //size of array
double sales[SIZE];          //array of 6 variables

cout << “Enter widget sales for 6 days\n”;

for(int j=0; j<SIZE; j++)       //put figures in array
cin >> sales[j];

double total = 0;

for(j=0; j<SIZE; j++)          //read figures from array
total += sales[j];       //to find total
double average = total / SIZE;    // find average
cout << “Average = “ << average << endl;
return 0;
}

إليك بعض نماذج التفاعل مع SALES :


الكود:
 Enter widget sales for 6 days
352.64
867.70
781.32
867.35
746.21
189.45
Average = 634.11

تفصيل جديد في هذا البرنامج هو استخدام متغير const لحجم المصفوفة وحدود الحلقة.
يتم تعريف هذا المتغير في بداية القائمة:

الكود:
const int SIZE = 6;

استخدام متغير (بدلاً من رقم ، مثل الرقم 4 المستخدم في المثال الأخير) يسهل تغيير حجم المصفوفة : يتم تغيير سطر برنامج واحد فقط لتغيير حجم المصفوفة وحدود الحلقة وفي أي مكان آخر يظهر حجم المصفوفة . يذكرنا اسم الأحرف الكبيرة SIZE بأنه لا يمكن تعديل المتغير في البرنامج.

• تهيئة المصفوفات Initializing Arrays
يمكنك إعطاء قيم لكل عنصر مصفوفة عند تعريف المصفوفة لأول مرة. إليك مثال ، DAYS ، يقوم بتعيين 12 عنصر مصفوفة في المصفوفة days_per_month إلى عدد الأيام في كل شهر.



الكود:
 // days.cpp
// shows days from start of year to date specified
#include <iostream>
using namespace std;

int main()
{
int month, day, total_days;
int days_per_month[12] = { 31, 28, 31, 30, 31, 30,
          31, 31, 30, 31, 30, 31 };

cout << “\nEnter month (1 to 12): “; //get date
cin >> month;

cout << “Enter day (1 to 31): “;
cin >> day;

total_days = day; //separate days

for(int j=0; j<month-1; j++) //add days each month
total_days += days_per_month[j];

cout << “Total days from start of year is: “ << total_days
        << endl;
return 0;
}

يقوم البرنامج بحساب عدد الأيام من بداية السنة إلى تاريخ يحدده المستخدم. (احذر: إنه لا يعمل للسنوات الكبيسة leap years ). إليك بعض نماذج التفاعل:

الكود:
Enter month (1 to 12): 3
Enter day (1 to 31): 11
Total days from start of year is: 70

بمجرد حصوله على قيم الشهر واليوم ، يقوم البرنامج أولاً بتعيين القيمة اليوم للمتغير total_days. ثم ينتقل عبر حلقة ، حيث يضيف قيمًا من المصفوفة days_per_month إلى total_days. عدد هذه القيم المراد إضافتها واحد أقل من عدد الأشهر. على سبيل المثال ، إذا أدخل المستخدم الشهر 5 ، تتم إضافة قيم عناصر المصفوفة الأربعة الأولى (31 و 28 و 31 و 30) إلى الإجمالي.

القيم التي تتم تهيئة days_per_month محاطة بأقواس ومفصولة بفواصل. ترتبط بتعبير المصفوفة بواسطة علامة المساواة. يوضح الشكل بناء الجملة.

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings 89D7742B0F8B499D893D7EFB31DA1F94

الشكل يبين بناء جملة تهيئة المصفوفة Syntax of array initialization
في الواقع ، لا نحتاج إلى استخدام حجم المصفوفة عندما نقوم بتهيئة جميع عناصر المصفوفة ، نظرًا لأن المترجم يمكنه تحديد ذلك عن طريق حساب متغيرات التهيئة. هكذا يمكننا كتابة

الكود:
 int days_per_month[] = { 31, 28, 31, 30, 31, 30,
      31, 31, 30, 31, 30, 31 };


ماذا يحدث إذا استخدمت حجم مصفوفة صريحًا ، لكنه لا يتفق مع عدد المُهيئات؟ إذا كان هناك عدد قليل جدًا من المهيئات ، فسيتم تعيين العناصر المفقودة على 0. إذا كان هناك الكثير ، فسيتم الإشارة إلى حدوث خطأ.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings Empty رد: الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings

مُساهمة من طرف Admin الأربعاء يوليو 17, 2019 11:32 am

المصفوفات متعددة الأبعاد Multidimensional Arrays
حتى الآن فحصنا المصفوفات ذات البعد الواحد : يحدد متغير واحد كل عنصر من عناصر المصفوفة .
لكن المصفوفات يمكن أن يكون لها أبعاد أعلى. إليك برنامج ، SALEMON ، يستخدم مصفوفة ثنائية الأبعاد two-dimensional لتخزين أرقام المبيعات للعديد من المناطق DISTRICTS ولعدة أشهر MONTHS:



الكود:
// salemon.cpp
// displays sales chart using 2-d array
#include <iostream>
#include <iomanip> //for setprecision, etc.
using namespace std;

const int DISTRICTS = 4;    //array dimensions
const int MONTHS = 3;

int main()
{
int d, m;
double sales[DISTRICTS][MONTHS];       //two-dimensional array
//definition
cout << endl;
for(d=0; d<DISTRICTS; d++)          //get array values
for(m=0; m<MONTHS; m++)
{
cout << “Enter sales for district “ << d+1;
cout << “, month “ << m+1 << “: “;
cin >> sales[d][m];          //put number in array
}

cout << “\n\n”;
cout << “                Month\n”;
cout << “       1       2       3”;

for(d=0; d<DISTRICTS; d++)
{
cout <<”\nDistrict “ << d+1;
for(m=0; m<MONTHS; m++)       //display array values
cout << setiosflags(ios::fixed)    //not exponential
        << setiosflags(ios::showpoint)    //always use point
        << setprecision(2)       //digits to right
        << setw(10)          //field width
        << sales[d][m];          //get number from array
} //end for(d)

cout << endl;
return 0;
} //end main

يقبل هذا البرنامج أرقام المبيعات من المستخدم ثم يعرضها في جدول.

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings A5039D2E21B44CE7B406AF8A590DECDA


• تعريف المصفوفات متعددة الأبعاد Defining Multidimensional Arrays
يتم تعريف المصفوفة بمحددي حجم size specifiers ، كل منهما محاط بأقواس:

الكود:
double sales[DISTRICTS][MONTHS];

يمكنك أن تفكر في sales (المبيعات) كمصفوفة ثنائية الأبعاد ، تم وضعها مثل لوحة الشطرنج. هناك طريقة أخرى للتفكير في الأمر وهي أن sales عبارة عن مصفوفة من المصفوفات. إنها مصفوفة من عناصر DISTRICTS ، كل عنصر منها عبارة عن مصفوفة من عناصر MONTHS. يوضح الشكل كيف يبدو هذا.

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings E41A7301C9394B1FBF4FE40B7C6963F4

الشكل يبين مصفوفة ثنائية الأبعاد Two-dimensional array


بالطبع يمكن أن يكون هناك مصفوفات بأكثر من بعدين. المصفوفة ثلاثية الأبعاد هي مصفوفة من مصفوفات المصفوفات . يتم الوصول إليها accessed بثلاثة فهارس indexes :

الكود:
 elem = dimen3[x][y][z];

هذا مشابه تمامًا للمصفوفات أحادية وثنائية الأبعاد.


• الوصول إلى عناصر المصفوفة متعددة الأبعاد Accessing Multidimensional Array Elements
تتطلب عناصر المصفوفة في المصفوفات ثنائية الأبعاد فهرسين indexes :

الكود:
sales[d][m]


لاحظ أن كل فهرس له مجموعتة من الأقواس. لا تستخدم الفواصل. لا تكتب sales[d,m]; هذا يعمل في بعض اللغات ، ولكن ليس في C++ .

• تنسيق الأرقام Formatting Numbers
يعرض برنامج SALEMON جدول للقيم بالدولار. من المهم أن يتم تنسيق هذه القيم بشكل صحيح ، لذلك دعونا نستكشف كيف يتم ذلك في C++ . مع قيم الدولار ، عادة ما تريد أن يكون لديك رقمان بالضبط على يمين العلامة العشرية ، وتريد أن تصطف النقاط العشرية لجميع الأرقام الموجودة في العمود. من الجيد أيضًا عرض الأصفار الزائدة ؛ تريد 79.50 ، وليس 79.5.

يتطلب جعل تدفقات الإدخال / الإخراج I/O streams فى لغة C++ القيام بكل هذا القليل من العمل . لقد شاهدت بالفعل المناور setw() ، واستخدمته لتعيين عرض حقل الإخراج. تنسيق الأرقام العشرية يتطلب عدة معالجات إضافية.

إليك عبارة تطبع العدد ذو الفاصلة العائمة يسمى fpn في حقل بعرض 10 أحرف ، مع رقمين digits على يمين العلامة العشرية:

الكود:
 cout << setiosflags(ios::fixed)       //fixed (not exponential)
      << setiosflags(ios::showpoint)       //always show decimal point
      << setprecision(2)          //two decimal places
      << setw(10)             //field width 10
      << fpn;                //finally, the number

تحدد مجموعة من أعلام (إشارات) flags التنسيق ذات البت الواحد في long int في الفئة ios كيفية تنفيذ التنسيق. في هذه المرحلة ، لا نحتاج إلى معرفة ماهية الفئة ios أو أسباب بناء الجملة الدقيقة المستخدمة مع هذه الفئة ، لجعل المناورين manipulators يعملون.

نحن مهتمون باثنين من أعلام ios: fixed و showpoint . لتعيين الأعلام ، استخدم المناور setiosflags ، مع اسم العلم كوسيط. يجب أن يسبق الاسم اسم الفئة ios وعامل دقة النطاق scope resolution operator (: Smile.

تعين أول سطرين من عبارة cout أعلام ios. (إذا كنت بحاجة إلى إلغاء تعيين - أي ، مسح clear - الأعلام في وقت لاحق من البرنامج ، يمكنك استخدام المعالج (المناور) resetiosflags ) يمنع العلم fixed من طباعة الأرقام بالتنسيق الأسي exponential ، مثل 3.45e3 . يحدد العلم showpoint أنه ستكون هناك دائمًا علامة عشرية ، حتى إذا كان الرقم لا يحتوي على جزء كسري : 123.00 بدلاً من 123.

لتعيين الدقة على رقمين على يمين المكان العشري ، استخدم المناور setprecision ، مع عدد الأرقام كوسيط. لقد رأينا بالفعل كيفية ضبط عرض الحقل باستخدام المناور setw. بمجرد أن يتم إرسال جميع هذه المعالجات إلى cout ، يمكنك إرسال الرقم نفسه ؛ سيتم عرضه بالتنسيق المطلوب.

سنتحدث أكثر عن إشارات (أعلام) تنسيق ios لاحقا .

• تهيئة المصفوفات متعددة الأبعاد Initializing Multidimensional Arrays
كما قد تتوقع ، يمكنك تهيئة المصفوفات متعددة الأبعاد. الشرط الوحيد الوحيد هو الاستعداد لكتابة الكثير من الأقواس والفواصل. إليك صيغة مختلفة من برنامج SALEMON يستخدم مصفوفة مُهيأة بدلاً من طلب إدخال من المستخدم. هذا البرنامج يسمى SALEINIT.


الكود:
// saleinit.cpp
// displays sales chart, initializes 2-d array
#include <iostream>
#include <iomanip> //for setprecision, etc.
using namespace std;

const int DISTRICTS = 4; //array dimensions
const int MONTHS = 3;

int main()
{
int d, m;

//initialize array elements
double sales[DISTRICTS][MONTHS]
= { {  1432.07,      234.50,      654.01 },
      {    322.00,  13838.32,  17589.88 },
      {  9328.34,      934.00,    4492.30 },
      { 12838.29,    2332.63,        32.93 } };
cout << “\n\n”;
cout << “ Month\n”;
cout << “ 1 2 3”;

for(d=0; d<DISTRICTS; d++)
{
cout <<”\nDistrict “ << d+1;

for(m=0; m<MONTHS; m++)
cout << setw(10) << setiosflags(ios::fixed)
      << setiosflags(ios::showpoint) << setprecision(2)
      << sales[d][m]; //access array element
}
cout << endl;
return 0;
}


تذكر أن المصفوفة ثنائية الأبعاد هي بالفعل مصفوفة من المصفوفات. يعتمد تنسيق تهيئة مثل هذه المصفوفة على هذه الحقيقة. يتم إحاطة قيم التهيئة لكل مصفوفة فرعية بأقواس ومفصولة بفواصل

الكود:
{ 1432.07, 234.50, 654.01 }

وبعد ذلك ، يتم ربط جميع هذه المصفوفات الفرعية الأربعة ، والتي يعد كل منها عنصرًا في المصفوفة الرئيسية ، بالأقواس وتكون مفصولة بفواصل ، كما هو موضح في القائمة.

تمرير المصفوفات إلى الدوال Passing Arrays to Functions
يمكن استخدام المصفوفات كوسائط للدوال . في ما يلي مثال ، صيغة مختلفة لبرنامج SALEINIT ، يمرر مصفوفة أرقام المبيعات إلى دالة تهدف إلى عرض البيانات كجدول. فيما يلي قائمة SALEFUNC:



الكود:
// salefunc.cpp
// passes array as argument
#include <iostream>
#include <iomanip> //for setprecision, etc.
using namespace std;

const int DISTRICTS = 4; //array dimensions
const int MONTHS = 3;

void display( double[DISTRICTS][MONTHS] ); //declaration
//--------------------------------------------------------------
int main()
{ //initialize two-dimensional array
double sales[DISTRICTS][MONTHS]
= { {  1432.07,    234.50,    654.01 },
      {    322.00, 13838.32, 17589.88 },
      {  9328.34,    934.00,  4492.30 },
      { 12838.29,  2332.63,    32.93 } };
display(sales); //call function; array as argument
cout << endl;
return 0;
} //end main
//--------------------------------------------------------------
//display()
//function to display 2-d array passed as argument
void display( double funsales[DISTRICTS][MONTHS] )
{
int d, m;
cout << “\n\n”;
cout << “ Month\n”;
cout << “ 1 2 3”;
for(d=0; d<DISTRICTS; d++)
{
cout <<”\nDistrict “ << d+1;

for(m=0; m<MONTHS; m++)
cout << setiosflags(ios::fixed) << setw(10)
        << setiosflags(ios::showpoint) << setprecision(2)
        << funsales[d][m]; //array element
} //end for(d)
} //end display


• إعلان دالة بوسائط مصفوفة Function Declaration with Array Arguments
في إعلان الدالة ، يتم تمثيل وسائط المصفوفة بنوع البيانات وحجم المصفوفة إليك إعلان الدالة display() :

void display( float[DISTRICTS][MONTHS] ); // declaration

في الواقع ، هناك قطعة واحدة غير ضرورية من المعلومات هنا. العبارة التالية تعمل كذلك:

الكود:
void display( float[][MONTHS] ); // declaration

لماذا لا تحتاج الدالة إلى حجم البعد الأول؟ مرة أخرى ، تذكر أن المصفوفة ثنائية الأبعاد عبارة عن مصفوفة من المصفوفات. تفكر الدالة أولاً في الوسيط كمصفوفة المناطق districts . فهى لا تحتاج الأمر إلى معرفة عدد المناطق الموجودة هناك ، لكنها تحتاج إلى معرفة حجم كل عنصر من عناصر كل منطقة ، بحيث يمكنها حساب مكان عنصر معين (بضرب البايتات لكل عنصر في الفهرس). لذلك يجب أن نقول لها حجم كل عنصر ، وهو MONTHS ، ولكن ليس كم عددهم ، وهو DISTRICTS .
يترتب على ذلك أنه إذا كنا نعلن عن دالة تستخدم مصفوفة أحادية البعد كوسيط ، فلن نحتاج إلى استخدام حجم المصفوفة :

الكود:
 void somefunc( int elem[] ); // declaration

• استدعاء دالة بوسائط مصفوفة Function Call with Array Arguments
عند استدعاء الدالة ، يتم استخدام اسم المصفوفة فقط كوسيط.


الكود:
display(sales); // function call

يمثل هذا الاسم (sales في هذه الحالة) بالفعل عنوان ذاكرة المصفوفة . لن نستكشف العناوين بالتفصيل حتى ندرس ، "المؤشرات" Pointers .

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings Empty رد: الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings

مُساهمة من طرف Admin الخميس يوليو 18, 2019 8:00 pm

مراجعة المصفوفات Arrays

سوف تتعرف على :
• إعلان declare المصفوفة .
• تهيئة initialize المصفوفة .
• الوصول access إلى عناصر المصفوفة array elements.

في البرمجة ، واحدة من المشاكل التى تنشأ في كثير من الأحيان هي التعامل مع العديد من البيانات من نفس النوع.
بوضع هذا الموقف في اعتبارك ، إفترض أنك تقوم بإجراء استطلاع على 100 شخص وعليك تخزين عمرهم age.. لحل هذه المشكلة في C++ ، يمكنك إنشاء مصفوفة array أعداد صحيحة تحتوي على 100 عنصر elements.
المصفوفة عبارة عن مجموعة collection من البيانات تحتوي (تحتفظ) على عدد ثابت من القيم من نفس النوع . فمثلا:

الكود:
int age[100];

هنا ، يمكن أن تحتوي المصفوفة المسماة age على 100 عنصر من نوع العدد الصحيح.
لا يمكن تغيير حجم [100] ونوع int المصفوفات بعد الإعلان عنها.

كيف تعلن عن مصفوفة ؟

الكود:
 dataType arrayName[arraySize];

على سبيل المثال :

الكود:
float mark[5];


هنا ، أعلنا عن مصفوفة اسمها ، mark ، بنوع float ، وحجمها 5. بمعنى أنها يمكن أن تحتوي على 5 قيم float .

عناصر المصفوفة وكيفية الوصول إليها ؟
يمكنك الوصول إلى عناصر المصفوفة باستخدام الفهارس indices .
افترض أنك أعلنت المصفوفة المسماة mark كما هو موضح أعلاه . العنصر الأول هو mark[0] ، والعنصر الثاني هو mark[1] وهكذا.

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings 2B3A59494FFC46979CFCC1882DCA7EE5


بعض الملاحظات الأساسية:
• أول عنصر فى المصفوفات يكون مؤشره (فهرسه) index صفر 0 وليس 1. في هذا المثال ، يعد mark[0] هو العنصر الأول.
• إذا كان حجم المصفوفة هو n ، للوصول إلى العنصر الأخير ، فسيتم استخدام الفهرس (n-1). في هذا المثال ، يعد mark[4] هو العنصر الأخير.
• افترض أن عنوان address البداية للعنصر mark[0] هو 2120d . عندئذ ، سيكون العنوان التالي ، mark[1] ، هو 2124d ، وسيكون عنوان mark[2] هو 2128d وهكذا . ذلك لأن حجم float 4 بايت.

كيفية تهيئة مصفوفة ؟
من الممكن تهيئة المصفوفة أثناء الإعلان. فمثلا،

الكود:
int mark[5] = {19, 10, 8, 17, 9};

هناك طريقة أخرى لتهيئة المصفوفة أثناء الإعلان:

الكود:
int mark[] = {19, 10, 8, 17, 9};


الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings 8CAF48720A92466BA731C3C354F52EF4

هنا ،

الكود:
 mark[0] is equal to 19
mark[1] is equal to 10
mark[2] is equal to 8
mark[3] is equal to 17
mark[4] is equal to 9


كيفية إدراج وطباعة عناصر مصفوفة ؟


الكود:
int mark[5] = {19, 10, 8, 17, 9}
   
   // change 4th element to 9
   mark[3] = 9;
   
   // take input from the user and insert in third element
   cin >> mark[2];
      
   // take input from the user and insert in (i+1)th element
   cin >> mark[i];
   
   // print first element of the array
   cout << mark[0];
   
   // print ith element of the array
   cout >> mark[i-1];
 


مثال :
برنامج لتخزين وحساب مجموع 5 أرقام أدخلها المستخدم باستخدام المصفوفات.


الكود:
#include <iostream>
using namespace std;
   
int main()
   {
       int numbers[5], sum = 0;
       cout << "Enter 5 numbers: ";
      
       //  Storing 5 number entered by user in an array
       //  Finding the sum of numbers entered
       for (int i = 0; i < 5; ++i)
       {
           cin >> numbers[i];
           sum += numbers[i];
       }
      
       cout << "Sum = " << sum << endl; 
      
       return 0;
   }

الخرج :

الكود:
Enter 5 numbers: 3
4
5
4
2
Sum = 18

ملاحظة :
افترض أنك أعلنت مصفوفة من 10 عناصر مثل :

الكود:
int testArray[10];

يمكنك استخدام أعضاء المصفوفة من testArray[0] إلى testArray[9] .
إذا حاولت الوصول إلى عناصر المصفوفة خارج حدودها ، دعنا نقول testArray[14] ، قد لا يظهر المترجم أي خطأ. ومع ذلك ، قد يؤدي هذا إلى إخراج غير متوقع (سلوك غير محدد).

تمرين 1 :
برنامج لحساب متوسط أعداد باستخدام المصفوفات .
يأخذ هذا البرنامج n عدد العناصر من المستخدم (حيث يتم تحديد n بواسطة المستخدم) ، ويخزن البيانات في مصفوفة ويحسب متوسط هذه الأعداد .

الكود:
 //Calculate Average of Numbers Using Arrays
   #include <iostream>
   using namespace std;
   
   int main()
   {
       int n, i;
       float num[100], sum=0.0, average;
   
       cout << "Enter the numbers of data: ";
       cin >> n;
   
       while (n > 100 || n <= 0)
       {
           cout << "Error! number should in range of (1 to 100)." << endl;
           cout << "Enter the number again: ";
           cin >> n;
       }
   
       for(i = 0; i < n; ++i)
       {
           cout << i + 1 << ". Enter number: ";
           cin >> num[i];
           sum += num[i];
       }
   
       average = sum / n;
       cout << "Average = " << average;
   
       return 0;
   }


الخرج :

الكود:
Enter the numbers of data: 6
1. Enter number: 45.3
2. Enter number: 67.5
3. Enter number: -45.6
4. Enter number: 20.34
5. Enter number: 33
6. Enter number: 45.6
Average = 27.69

يحسب هذا البرنامج المتوسط إذا كان عدد البيانات من 1 إلى 100.
إذا قام المستخدم بإدخال قيمة n أعلى من 100 أو أقل من 1 ، يتم تنفيذ حلقة while ، والتي تطلب من المستخدم إدخال قيمة n حتى تكون بين 1 و 100.
عندما يتم إدخال الأعداد من قبل المستخدم ، يتم حساب sum بالتتابع وتخزينه في المتغير sum.
بعد تخزين جميع الأعداد ، يتم حساب المتوسط وعرضه.


تمرين 2 :
برنامج لإيجاد أكبر عنصر فى المصفوفة :
يأخذ هذا البرنامج n عدد العناصر من المستخدم (حيث يتم تحديد n بواسطة المستخدم) ويخزن البيانات في مصفوفة . ثم ، يعرض هذا البرنامج أكبر عنصر في هذه المصفوفة باستخدام الحلقات.


الكود:
// Display Largest Element of an array
   #include <iostream>
   using namespace std;
   
   int main()
   {
       int i, n;
       float arr[100];
   
       cout << "Enter total number of elements(1 to 100): ";
       cin >> n;
       cout << endl;
   
       // Store number entered by the user
       for(i = 0; i < n; ++i)
       {
         cout << "Enter Number " << i + 1 << " : ";
         cin >> arr[i];
       }
   
       // Loop to store largest number to arr[0]
       for(i = 1;i < n; ++i)
       {
         // Change < to > if you want to find the smallest element
         if(arr[0] < arr[i])
             arr[0] = arr[i];
       }
       cout << "Largest element = " << arr[0];
   
       return 0;
   }



الخرج :

الكود:
Enter total number of elements: 8

Enter Number 1: 23.4
Enter Number 2: -34.5
Enter Number 3: 50
Enter Number 4: 33.5
Enter Number 5: 55.5
Enter Number 6: 43.7
Enter Number 7: 5.7
Enter Number 8: -66.5

Largest element = 55.5


• يأخذ هذا البرنامج عددًا من العناصر من المستخدم ويخزنها في المصفوفة arr[] .
• لإيجاد أكبر عنصر ، يتم تحديد أول عنصرين من المصفوفة ويتم وضع أكبر عنصر من هذين العنصرين في arr[0] . ثم ، يتم التحقق من العنصرين الأول والثالث ويوضع أكبر هذين العنصرين في arr[0] .
• تستمر هذه العملية حتى يتم التحقق من العنصرين الأول والأخير.
• بعد هذه العملية ، سيكون أكبر عنصر في المصفوفة في وضع [0] arr.

مراجعة المصفوفات متعددة الأبعاد :
سنتعرف على المصفوفات متعددة الأبعاد . بشكل أكثر تحديدًا ، كيفية الإعلان عنها declare والوصول إليها access واستخدامها بكفاءة في البرنامج.
يمكنك إنشاء مصفوفة مصفوفة وهو ما يعرف باسم المصفوفة متعدد الأبعاد multi-dimensional array . فمثلا:

الكود:
int x[3][4];

هنا ، x عبارة عن مصفوفة ثنائية الأبعاد. يمكن أن تحتفظ بما يصل إلى 12 عنصرا كحد أقصى.
يمكنك التفكير في هذه المصفوفة كجدول يحتوي على 3 صفوف rows ولكل صف 4 أعمدة columns كما هو موضح أدناه.

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings 6B3CD4D27FAD4313858A22483A30FF4A

المصفوفة ثلاثية الأبعاد تعمل أيضا بطريقة مماثلة. فمثلا:

الكود:
float x[2][4][3];

يمكن أن تحتوي هذه المصفوفة x على 24 عنصرًا بحد أقصى. يمكنك التفكير في هذا المثال على النحو التالي : يمكن لكل العنصرين 2 أن يضم 4 عناصر ، مما يصنع 8 عناصر ويمكن لكل عنصر من هذه العناصر الـثمانية 8 أن يضم 3 عناصر. وبالتالي ، إجمالي عدد العناصر التي يمكن أن تحتوي عليها هذه المصفوفة هو 24.

تهيئة المصفوفة متعددة الأبعاد :
يمكنك تهيئة المصفوفة متعددة الأبعاد بأكثر من طريقة.


• تهيئة المصفوفة ثنائية الأبعاد :

الكود:
 int test[2][3] = {2, 4, 5, 9, 0, 0};

أفضل طريقة لتهيئة هذه المصفوفة مع نفس عناصر المصفوفة أعلاه

الكود:
int  test[2][3] = { {2, 4, 5}, {9, 0 0}};

• تهيئة المصفوفة ثلاثية الأبعاد :

الكود:
int test[2][3][4] = {3, 4, 2, 3, 0, -3, 9, 11, 23, 12, 23,
                2, 13, 4, 56, 3, 5, 9, 3, 5, 5, 1, 4, 9};

أفضل طريقة لتهيئة هذه المصفوفة مع نفس عناصر المصفوفة أعلاه :

الكود:
int test[2][3][4] = {
                          { {3, 4, 2, 3}, {0, -3, 9, 11}, {23, 12, 23, 2} },
                          { {13, 4, 56, 3}, {5, 9, 3, 5}, {5, 1, 4, 9} }
                         };

مثال 1 :
برنامج عرض جميع عناصر مصفوفة مهيئة ثنائية الأبعاد :


الكود:
 // Two Dimensional Array
//display all elements of an  nitialized two dimensional array.
   
#include <iostream>
using namespace std;
   
int main()
   {
       int test[3][2] =
       {
           {2, -5},
           {4, 0},
           {9, 1}
       };
   
       // Accessing two dimensional array using
       // nested for loops
       for(int i = 0; i < 3; ++i)
       {
           for(int j = 0; j < 2; ++j)
           {
               cout<< “test[“ << i << “][“ << j << “] = “ << test[i][j] << endl;
           }
       }
   
       return 0;
   }

الخرج :

الكود:
test[0][0] = 2
test[0][1] = -5
test[1][0] = 4
test[1][1] = 0
test[2][0] = 9
test[2][1] = 1

مثال 2 :
برنامج لتخزين درجة حرارة مدينتين مختلفتين لمدة اسبوع وعرضها :

الكود:
 // Two Dimensional Array
// store temperature of two different cities for a week and display it.
#include <iostream>
using namespace std;
   
const int CITY = 2;
const int WEEK = 7;
   
int main()
{
  int temperature[CITY][WEEK];
   
  cout << "Enter all temperature for a week of first city and then second city. \n";

  // Inserting the values into the temperature array
  for (int i = 0; i < CITY; ++i)
  {
    for(int j = 0; j < WEEK; ++j)
    {
    cout << "City " << i + 1 << ", Day " << j + 1 << " : ";
    cin >> temperature[i][j];
  }
}
   
cout << "\n\nDisplaying Values:\n";
   
// Accessing the values from the temperature array
for (int i = 0; i < CITY; ++i)
{
  for(int j = 0; j < WEEK; ++j)
  {
  cout << "City " << i + 1 << ", Day " << j + 1 << " = " << temperature[i][j] << endl;
  }
}
   
return 0;
}



الخرج :

الكود:
Enter all temperature for a week of first city and then second city.
City 1, Day 1 : 32
City 1, Day 2 : 33
City 1, Day 3 : 32
City 1, Day 4 : 34
City 1, Day 5 : 35
City 1, Day 6 : 36
City 1, Day 7 : 38
City 2, Day 1 : 23
City 2, Day 2 : 24
City 2, Day 3 : 26
City 2, Day 4 : 22
City 2, Day 5 : 29
City 2, Day 6 : 27
City 2, Day 7 : 23


Displaying Values:
City 1, Day 1 = 32
City 1, Day 2 = 33
City 1, Day 3 = 32
City 1, Day 4 = 34
City 1, Day 5 = 35
City 1, Day 6 = 36
City 1, Day 7 = 38
City 2, Day 1 = 23
City 2, Day 2 = 24
City 2, Day 3 = 26
City 2, Day 4 = 22
City 2, Day 5 = 29
City 2, Day 6 = 27
City 2, Day 7 = 23


مثال 3 :
برنامج لتخزين قيمة مدخلة بمعرفة المستخدم فى مصفوفة ثلاثية الأبعاد وعرضها :



الكود:
// Three Dimensional Array
// Store value entered by user in three dimensional array and display it.
   #include <iostream>
   using namespace std;
   
   int main()
   {
       // This array can store upto 12 elements (2x3x2)
       int test[2][3][2];
   
       cout << "Enter 12 values: \n";
      
       // Inserting the values into the test array
       // using 3 nested for loops.
       for(int i = 0; i < 2; ++i)
       {
           for (int j = 0; j < 3; ++j)
           {
               for(int k = 0; k < 2; ++k )
               {
                   cin >> test[i][j][k];
               }
           }
       }
   
       cout<<"\nDisplaying Value stored:"<<endl;
   
       // Displaying the values with proper index.
       for(int i = 0; i < 2; ++i)
       {
           for (int j = 0; j < 3; ++j)
           {
               for(int k = 0; k < 2; ++k)
               {
                   cout << "test[" << i << "][" << j << "][" << k << "] = " << test[i][j][k] << endl;
               }
           }
       }
   
       return 0;
   }

الخرج :

الكود:
 Enter 12 values:
1
2
3
4
5
6
7
8
9
10
11
12

Displaying Value stored:
test[0][0][0] = 1
test[0][0][1] = 2
test[0][1][0] = 3
test[0][1][1] = 4
test[0][2][0] = 5
test[0][2][1] = 6
test[1][0][0] = 7
test[1][0][1] = 8
test[1][1][0] = 9
test[1][1][1] = 10
test[1][2][0] = 11
test[1][2][1] = 12

مع زيادة عدد الأبعاد ، يزداد التعقيد بشكل كبير على الرغم من أن المفهوم مشابه تمامًا.


تمرير مصفوفة إلى دالة Passing Array to a Function
يمكن تمرير المصفوفات إلى دالة كوسيط argument. المثال التالى يعرض تمرير مصفوفة أحادية البعد إلى دالة :
برنامج لعرض درجات 5 طلاب عن طريق تمرير مصفوفة أحادية البعد إلى دالة .


الكود:
// Passing One-dimensional Array to a Function
// display marks of 5 students by passing one-dimensional array to a function.
#include <iostream>
using namespace std;
   
void display(int marks[5]);
   
int main()
   {
       int marks[5] = {88, 76, 90, 61, 69};
       display(marks);
       return 0;
   }
   
   void display(int m[5])
   {
       cout << "Displaying marks: "<< endl;
   
       for (int i = 0; i < 5; ++i)
       {
           cout << "Student "<< i + 1 <<": "<< m[i] << endl;
       }
   }

الخرج :

الكود:
Displaying marks:
Student 1: 88
Student 2: 76
Student 3: 90
Student 4: 61
Student 5: 69

عندما يتم تمرير مصفوفة كوسيط للدالة (عند الاستدعاء ) ، يتم استخدام اسم المصفوفة فقط كوسيط كما يلى :

الكود:
 display(marks);

لاحظ أيضًا الفرق أثناء تمرير المصفوفة كوسيط بدلاً من متغير (عند التعريف) .

الكود:
void display(int m[5]);

يمثل الوسيط marks في الكود أعلاه عنوان ذاكرة العنصر الأول من المصفوفة marks[5] .
ويتحول الوسيط الرسمى int m[5] في تعريف الدالة إلى int* m . يشير هذا المؤشر إلى نفس العنوان المشار إليه بواسطة المصفوفة marks .
يعالج C++ تمرير المصفوفة إلى دالة بهذه الطريقة لحفظ الذاكرة والوقت.

تمرير مصفوفة متعددة الأبعاد إلى دالة Passing Multidimensional Array to a Function
يمكن تمرير مصفوفة متعددة الأبعاد بطريقة مماثلة لمصفوفة أحادية الأبعاد. المثال التالى يوضح تمرير مصفوفة ثنائية الأبعاد إلى دالة :

الكود:
 // Passing Multidimensional Array to a Function
// display the elements of two dimensional array by passing it to a function.
#include <iostream>
using namespace std;
   
void display(int n[3][2]);
   
int main()
   {
       int num[3][2] = {
           {3, 4},
           {9, 5},
           {7, 1}
   
       };
       display(num);
   
       return 0;
   }
   
   void display(int n[3][2])
   {
   
       cout << "Displaying Values: " << endl;
       for(int i = 0;  i < 3; ++i)
       {
           for(int j = 0; j < 2; ++j)
           {
               cout << n[i][j] << " ";
           }
       }
   }

الخرج :

الكود:
 Displaying Values:
3 4 9 5 7 1

في البرنامج أعلاه ، يتم تمرير المصفوفة متعدد الأبعاد num إلى الدالة display() .
في داخل ، الدالة display() ، المصفوفة num يتم معالجتها باستخدام لحلقة for متداخلة .
يستخدم البرنامج 2حلقة for للتكرار عبر العناصر الموجودة في المصفوفة ثنائية الأبعاد. إذا كانت المصفوفة ثلاثية الأبعاد ، فيجب عليك استخدام 3 حلقات.
أخيرًا ، تتم طباعة جميع العناصر على الشاشة.

ملاحظة: يمكن تمرير مصفوفة متعددة الأبعاد ذات أبعاد تزيد عن 2 بطريقة مماثلة للمصفوفة ثنائية الأبعاد.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings Empty رد: الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings

مُساهمة من طرف Admin الإثنين يوليو 22, 2019 11:56 am

السلاسل في C++ Strings in C++
نحن نعلم أن السلسلة string عبارة عن مصفوفة array من الأحرف characters . لنلقي نظرة على السلسلة ونعرف المزيد عنها.
هناك نوعان مختلفان من السلاسل في C++ .
• سلسلة على غرار (نمط) C C-style string (موروثة من لغة C )
• سلسلة الفئة std::string (جزء من مكتبة C++ القياسية ، تجعل العمل مع السلاسل فى C++ سهل )
في هذه الفقرة ، سوف نركز على سلسلة النمط C .

سلسلة النمط C C-style String

• إعلان السلسلة :
يمكننا التفكير في السلسلة باعتبارها مصفوفة من الأحرف ، مثل "Sam" عبارة عن سلسلة وهي عبارة عن مصفوفة من الأحرف عناصرها 'S' و 'a' و 'm' و '\0' .

الكود:
element     'S'   'a'   'm'   '\0'
index     0   1    2     3

انظر إلى الحرف في الفهرس index 3 . إنه يمثل حرف null character . قيمة ASCII للحرف '\0' هي 0 وقيمة الحرف ‘0’ هي 48. وهو يمثل حرف إنهاء السلسلة. لذلك ، إذا أعلنا: -

الكود:
char name[ ]= "Sam";

فهذا يعنى :

الكود:
 ['S','a','m','\0']

ملاحظة :
دائما نضع السلسلة بين أقواس اقتباس مزدوجة “ “
يمكننا أيضا أن نعلن متغير السلسلة باستخدام الحروف على النحو التالي :

الكود:
char name[ ]= { 'S', 'a', 'm', '\0'};

• طباعة (إخراج) السلسلة
دعونا نرى مثالين لطباعة سلسلة ، أحدهما بدون والآخر بحلقة for .


الكود:
#include <iostream>
using namespace std;

int main()
  {
  char str[ ] = "Hello"; // Declaration
  cout << str << endl;//Print , Output
  return 0;
  }

الخرج :

الكود:
Hello

في المثال أعلاه ، قمنا بطباعة السلسلة بالكامل مرة واحدة. الآن ، دعونا نرى نفس المثال لطباعة الأحرف الفردية من السلسلة باستخدام حلقة for .

الكود:
#include <iostream>
using namespace std;

int main()
  {
    char str[ ] = "Hello";
    int i;
    for( i=0; i<6; i++)
      {
        cout << str[i];
        }
  return 0;
 }

الخرج :

الكود:
Hello

في المثال الأول ، قمنا بطباعة السلسلة بالكامل مرة واحدة. بينما في المثال الثاني ، قمنا بطباعة حرف في كل مرة.

• إدخال السلسلة String Input
الآن دعونا نرى كيفية إدخال سلسلة من المستخدم بمثال.

الكود:
#include <iostream>
using namespace std;

int main()
{
   char name[20];            //declaring string 'name'

   cin >> name;          //taking string input
   cout << name << endl;    //printing string
   return 0;
}

الخرج :

الكود:
Peter
Peter

العبارة :

الكود:
 char name[20];

من خلال كتابة هذه العبارة ، فإننا نعلن عن مصفوفة من الأحرف المسماة 'name' ومنحناها حجم مصفوفة من 20 عنصر لأننا لا نعرف بالضبط طول السلسلة. وبالتالي ، احتلت مساحة في الذاكرة ذات حجم مطلوب من 20 حرفًا. لذلك ، لا يمكن للمصفوفة 'name' تخزين أكثر من 20 حرفًا.
العبارة :

الكود:
 cin >> name;

تستخدم هذه العبارة ببساطة لإدخال سلسلة من المستخدم كما نفعل مع أنواع البيانات الأخرى وليس هناك شيء جديد في هذا.

ملاحظة :
يأخذ الكود أعلاه كلمة واحدة فقط من المستخدم إلى متغير السلسلة. وينتهي مع أي مسافة بيضاء. حاول أن تكتب شيئًا ما بعد الفراغ وسيأخذ الكلمة الأولى فقط.
على سبيل المثال ، إذا قمنا في المثال أعلاه بإدخال Sam Brad كإسم ، فسيكون الإخراج هو Sam فقط لأن الكود يأخذ في الاعتبار كلمة واحدة فقط وينتهي بعد الكلمة الأولى (بعد مسافة بيضاء).

• إدخال سلسلة من كلمات متعددة
يمكننا أخذ مدخلات لسلسلة تتكون من أكثر من كلمة واحدة باستخدام الدالة cin.getline. لنرى مثالا:

الكود:
#include <iostream>
using namespace std;

int main()
{
   char name[20];               //declaring string 'name'

   cin.getline(name, sizeof(name));    //taking string input
   cout << name << endl;       //printing string
   return 0;
}


الخرج :

الكود:
Sam Bard
Sam Bard

فى العبارة :

الكود:
cin.getline(name, sizeof(name));

تأخذ الدالة cin.getline وسيطين ، متغير السلسلة name وحجم هذا المتغير sizeof(name) . لقد استخدمنا الدالة sizeof للحصول على حجم متغير السلسلة 'name' .

• تمرير السلاسل إلى الدوال
هذا هو نفس ما نفعل مع المصفوفات الأخرى. الفرق الوحيد أن هنا مصفوفة من الأحرف . لنرى مثال .


الكود:
#include <iostream>
using namespace std;

void display( char ch[] )
{
cout << ch;
}

int main(){
   char arr[30];
   cout << "Enter a word" << endl;
   cin >> arr;
   display(arr);
   return 0;
}

الخرج :

الكود:
Enter a word
cpp
cpp
 


دوال السلسلة المعرفة مسبقا Predefined string functions
يمكننا تنفيذ أنواع مختلفة من دوال السلسلة مثل ربط joining سلسلتين أو مقارنة comparing سلسلة بأخرى أو إيجاد طول السلسلة. دعونا نلقي نظرة على قائمة هذه الدوال .

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings 0B272044C7D8459892E45B7B8755DD86

هذه الدوال المحددة مسبقًا جزء من مكتبة cstring. لذلك ، نحتاج إلى تضمين هذه المكتبة في الكود الخاص بنا عن طريق كتابة :

الكود:
#include <cstring>


سنرى بعض أمثلة على الدوال strlen و strcpy و strcat و strcmp لأن هذه هي الأكثر شيوعًا.

• الدالة strlen(s1) : لحساب طول السلسلة s1 .
يتم حساب المسافة البيضاء فى طول السلسلة .


الكود:
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
   char name[ ]= "Hello";
     int len1, len2;
     len1 = strlen(name);
     len2 = strlen("Hello World");
     cout << "Length of " << name << " = " << len1 << endl;
     cout << "Length of " << "Hello World" << " = " << len2 << endl;
   return 0;
}

الخرج :

الكود:
 Length of Hello = 5
Length of Hello World = 11

ملاحظة :
الدالة strlen لا تحسب حرف الإنتهاء ‘\0’ عند حساب طول السلسلة .

• الدالة strcpy(s1, s2) تنسخ السلسلة الثانية s2 إلى السلسلة الأولى s1 .


الكود:
 #include <iostream>
#include <cstring>

using namespace std;

int main()
{
   char s2[ ]= "Hello";
     char s1[10];
     strcpy(s1, s2);
     cout << "Source string " << s2 << endl;
     cout << "Target string " << s1 << endl;
   return 0;
}

الخرج :

الكود:
 Source string Hello
Target string Hello

• الدالة strcat(s1, s2) تسلسل (تربط ) concatenates(joins) السلسلة الثانية s2 إلى السلسلة الأولى s1

الكود:
 #include <iostream>
#include <cstring>

using namespace std;

int main()
{
   char s2[ ]= "World";
     char s1[20]= "Hello";
     strcat(s1, s2);
     cout << "Source string " << s2 << endl;
     cout << "Target string " << s1 << endl;
   return 0;
}


الخرج :

الكود:
Source string World
Target string HelloWorld

لاحظ أنه في المثال أعلاه ،أعطينا حجم المصفوفة إلى السلسلة s1 لأننا نقوم بإضافة أحرف سلسلة أخرى إليها. يجب أن يكون حجم المصفوفة المعطى أكبر من أو يساوي حجم مصفوفة السلسلة بعد التسلسل (الربط) .

• الدالة strcmp(s1, s2) تقارن سلسلتين وإيجاد ما إذا كانت متشابهة أم مختلفة.
فهى تقارن أحرف السلسلتين حرف بحرف حتى يكون هناك عدم تطابق. إذا كانت السلسلتان متطابقتان identical ، فسوف تُرجع 0. وإذا لم تكن كذلك ، فتُرجع الفرق بين قيم ASCII للأزواج الأولى غير المطابقة من الأحرف.


الكود:
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
   char s1[ ]= "Hello";
     char s2[ ]= "World";
     int i, j;
     i = strcmp(s1, "Hello");
     j = strcmp(s1, s2);
     cout << i << endl;
     cout << j << endl;
   return 0;
}

الخرج :

الكود:
0
-15

مصفوفة الأحرف ثتائية الأبعاد :
كما هو الحال مع المصفوفة ثنائية الأبعاد من الأعداد الصحيحة وأنواع البيانات الأخرى ، لدينا مصفوفة ثنائية الأبعاد من الأحرف أيضًا.
على سبيل المثال ، يمكننا كتابة


الكود:
char names[4][10] =
{
                "Andrew",
                "Kary",
                "Brown",
                "Lawren"
         };

نظرًا لاستخدام السلسلة على نطاق واسع ، توفر C++ نوع بيانات سلسلة مضمّن سنتعلمه في الفقرة التالية .

لا تستخدم سلاسل النمط C Don’t use C-style strings
من المهم معرفة السلاسل ذات النمط C لأنها تستخدم في الكثير من الأكواد . ومع ذلك ، والآن بعد أن أوضحنا كيفية عملها ، سنوصي بتجنبها تمامًا كلما كان ذلك ممكنًا! ما لم يكن لديك سبب محدد وجذاب لاستخدام سلاسل النمط C ، استخدم الفئة std :: string (المعرفة في الرأس <string>) بدلاً من ذلك. الفئة std::string أسهل وأكثر أمانا وأكثر مرونة.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings Empty رد: الدرس السادس المصفوفات والسلاسل النصية Arrays and Strings

مُساهمة من طرف Admin الإثنين يوليو 22, 2019 12:35 pm

السلسلة فى C++ باستخدام الفئة (النوع) std::string
نظرًا لاستخدام السلسلة بشكل مكثف ، يوفر C++ نوع بيانات سلسلة مضمنة built-in . تمامًا مثل أنواع البيانات int أو float أو أنواع البيانات الأخرى ، يمكننا استخدام نوع بيانات السلسلة أيضًا. إنه ببساطة يجعل استخدام السلاسل أسهل.

• مثل cin و cout ، يتم تعريف السلسلة أيضًا في مساحة الاسم std namespace . لاستخدام السلاسل بهذه الطريقة ، نحتاج إلى تضمين ملف الرأس حيث يتم الإعلان عنه في رأس البرنامج . يتم ضمه عن طريق كتابة :

الكود:
#include <string>

• يتم إعلان declare المتغيرات من النوع std::string كما يلى :

الكود:
 std::string name;

فى حالة استخدام :

الكود:
using namespace std;
يكون الإعلان بالصيغة :

الكود:
string name;

إى النوع ثم الاسم .

هنا name متغير سلسلة تمامًا مثلما لدينا متغيرات int أو متغيرات float أو متغيرات أنواع بيانات أخرى.

• نقوم بتعيين assign قيمة لمتغير السلسلة تمامًا كما نقوم بتعيين قيمة لمتغير من أي نوع بيانات آخر كما يلي :

الكود:
 name = "Hall";

• يمكننا أيضًا تعيين قيمة لمتغير السلسلة في وقت الإعلان عنها كما يلى :

الكود:
std::string name("Hall");

متغير السلسلة مثله مثل أي متغير آخر.
الآن دعونا نرى مثالا لطباعة سلسلة.

الكود:
#include <iostream>
#include <string>
using namespace std;

int main()
{
   string name;
   name = "Hall";
   cout << name << endl;
   return 0;
}

الخرج :

الكود:
Hall

• إدخال سلسلة Input a string
تعرفنا بالفعل على كيفية إدخال سلسلة باستخدام مصفوفة أحرف. الآن ، دعونا ندخل سلسلة باستخدام متغير سلسلة.
نحن ببساطة نستخدم cin لإدخال سلسلة كما اعتدنا على القيام به باستخدام مصفوفة الأحرف.

الكود:
 #include <iostream>
#include <string>
using namespace std;

int main()
{
   string name;
   cin >> name;
   cout << name << endl;
   return 0;
}

الخرج :

الكود:
Hall
Hall

• إدخال كلمات متعددة :


الكود:
 #include <iostream>
#include <string>
using namespace std;

int main()
{
   string name;
   cin >> name;
   cout << name << endl;
   return 0;
}

الخرج :

الكود:
Hall Doe
Hall

كما في المثال أعلاه ، تأخذ cin أحرفًا فقط إلى مسافة بيضاء. وبالتالي متغير السلسلة name سوف يخزن فقط القيمة Hall .

• إدخال سلسلة كلمات متعددة باستخدام الدالة std::getline
لإدخال سلسلة متعدد الكلمات ، نستخدم الدالة std :: getline. دعونا نرى مثالا يأخذ مدخلات متعددة الكلمات.


الكود:
 #include <iostream>
#include <string>
using namespace std;


int main()
{
   string name;
   getline(cin, name);
   cout << name << endl;
   return 0;
}

الخرج :

الكود:
Hall Doe
Hall Doe

العبارة :

الكود:
 std::getline(std::cin, name);

هذا هو بناء جملة استخدام الدالة getline() . يتم تعريف الدالة getline() أيضًا في مساحة الاسم std namespace وبالتالي نكتبها std::getline .
تأخذ الدالة getline() بارامترين . أول بارامتر هو std :: cin والثاني هو اسم متغير السلسلة name .

إلحاق سلسلتين Append two strings
يمكننا أن نسلسل concatenate السلاسل (ربط join السلاسل) باستخدام العامل + وإلحاق append سلسلة إلى أخرى باستخدام العامل += .

الكود:
#include <iostream>
#include <string>
using namespace std;

int main()
{
   string st1("Hello");
   string st2("World");
   cout << st1 + st2 << endl;
   st1 += "cpp";
   cout << st1 << endl;
   return 0;
}

الخرج :

الكود:
HelloWorld
Hellocpp

في المثال أعلاه ، تقوم متغيرات السلسلة s1 و s2 بتخزين القيم "Hello" و "World" على التوالي.
العبارة :

الكود:
 cout << st1 + st2 << endl;

مكافئة للعبارة :

الكود:
 cout << st1 << st2 << endl;

التى تطبع سلسلة تلو الأخرى.
فى العبارة :

[CODEst1 += "cpp"; ] [/CODE]

أضفنا السلسلة "cpp" إلى قيمة المتغير st1 وبالتالي نجعل قيمته "Hellocpp".

دوال الأعضاء Member Functions
هناك العديد من الدوال الأعضاء في الفئة std :: string (الدوال المعرفة مسبقًا والمعرفة في std :: string) مثل length() ، size() ، resize() ، reserve() . دعونا ننظر في بعض هذه الدوال .

• الدالة length() :
يتم استخدام الدالة length() لإيجاد طول سلسلة. هذه الدالة معرفة مسبقًا والتى تنتمي إلى الفئة std :: string. دعونا نرى مثالا .


الكود:
 #include <iostream>
#include <string>
using namespace std;

int main()
{
   string name;
   name = "I have 4 chocolates";
   cout << name.length() << endl;
   return 0;
}

الخرج :

الكود:
19

وهكذا فإن الدالة length() تُرجع طول السلسلة 'name' بما في ذلك أحرف المسافة البيضاء.

• الدالة empty :
تقوم الدالة empty()بإرجاع ما إذا كانت السلسلة فارغة empty أم لا. تقوم بإرجاع 1 إذا كان طول السلسلة 0 (فارغة) و 0 إذا لم تكن فارغة .


الكود:
#include <iostream>
#include <string>
using namespace std;

int main()
{
   string s1, s2;
   s1 = "";
   s2 = "Brownie";
   cout << s1.empty() << endl;
   cout << s2.empty() << endl;
   return 0;
}

الخرج :

الكود:
1
0

نظرا لأن s1 تخزن سلسلة فارغة ، لذلك فإن الدالة s1.empty() ترجع 1 وحيث أن s2 تخزن السلسلة "Brownie" ، فإن s2.empty() ترجع 0 .

• الدالة size() :
تستخدم أيضًا لإرجاع طول السلسلة. وهى ترجع نفس القيمة التى ترجعها length() .


الكود:
#include <iostream>
#include <string>
using namespace std;

int main()
{
   string name;
   name = "I have 4 chocolates";
   cout << name.size() << endl;
   return 0;
}

الخرج :

الكود:
19

• الدالة resize() :
تقوم دالة تغيير الحجم resize() بتغيير حجم السلسلة إلى الطول المحدد.
افترض أن الطول المحدد هو 5. إذا كان الطول المحدد (على سبيل المثال 5) أصغر من الطول الحالي (افترض 7) ، فلن تحتوي السلسلة إلا على الأحرف الخمسة الأولى. إذا كان الطول المحدد (5) أكبر من الطول الحالي (افترض 3) ، فستحتوي السلسلة على 5 أحرف (3 من السلسلة الأصلية وحرفين محددين آخرين). دعونا نرى مثالا لفهم هذا.

الكود:
 #include <iostream>
#include <string>
using namespace std;

int main()
{
   string s = "I love C";
   int size = s.size();            //  size of s
   s.resize( size+2, '+' );        //  resizing s
   cout << s << endl;
   return 0;
}


الخرج :

الكود:
I love C++

في هذا المثال ، قمنا أولاً بتخزين حجم (Cool وهى القيمة الأصلية للسلسلة في المتغير size.
العبارة :

الكود:
s.resize( size+2, '+' );

تقوم بتغيير حجم السلسلة ‘s’ إلى 'size + 2' أي 10 وتعيين الحرف ‘+’ إلى مكاني الأحرف الزائدين في السلسلة التي تم تغيير حجمها.

• العامل operator[ ] :
يقوم بإرجاع الحرف في موضع معين في سلسلة. دعنا نرى مثالا.

الكود:
#include <iostream>
#include <string>
using namespace std;

int main()
{
   string s = "I love C";
   cout << "Character at fifth position : " << s[5] << endl;
   return 0;
}



الخرج :

الكود:
Character at fifth position : e

هنا ، تمثل s السلسلة بأكملها و تمثل s[i] حرفًا في السلسلة في الموضع ith. لاحظ أن موضع الحرف الأول في السلسلة هو 0.

• الدالة at() :
تقوم أيضًا بإرجاع الحرف في موضع معين في سلسلة.


الكود:
#include <iostream>
#include <string>
using namespace std;

int main()
{
   string s = "I love C";
   cout << "Character at fifth position : " << s.at(5) << endl;
   return 0;
}

الخرج :

الكود:
Character at fifth position : e


• الدالة compare() :
تقوم الدالة compare() بمقارنة قيمة السلسلة (str1) بسلسلة أخرى (str2).
تقوم بإرجاع 0 إذا كانت كلا من السلاسل متساوية.
تقوم بإرجاع قيمة موجبة إذا كانت str1> str2 أو الحرف الأول غير المتطابق من str1 أكبر من str2.
تقوم بإرجاع قيمة سالبة إذا كانت str1 <str2 أو الحرف الأول غير المتطابق من str1 أقل من str2.

الكود:
#include <iostream>
#include <string>
using namespace std;

int main()
{
   string str1 ("have apple");
     string str2 ("have app");
   cout << str1.compare(str2) << endl;
   return 0;
}

الخرج :

الكود:
2

هنا ، طول السلسلة 'str1' هو 2 أكثر من طول السلسلة 'str2'. لذلك ، يكون الناتج هو 2. إذا تم تبادل قيم 'str1' و 'str2' ، فسيكون الناتج -2 .

لنرى مثال آخر :

الكود:
 #include <iostream>
#include <string>
using namespace std;

int main()
{
   string str1 ("have gpple");
     string str2 ("have apple");
   cout << str1.compare(str2) << endl;
   return 0;
}


الخرج :

الكود:
 1

هذه المرة ، أول حرف لا مثيل له في 'str1' و 'str2' هما 'g' و 'a' على التوالي. نظرًا لأن قيمة ASCII الخاصة بـ "g" أكبر من القيمة "a" ، فقد حصلنا على ناتج موجب . عند تبادل قيم السلاسل ، سنحصل على إجابة سالبة .

• الدالة find() :
الدالة find() توجد موضع التواجد الأول للحرف أو السلسلة في السلسلة.


الكود:
#include <iostream>
#include <string>
using namespace std;

int main()
{
   string str1 ("I love C++");
     cout << str1.find('l') << endl;
   return 0;
}

الخرج :

الكود:
2

في هذا المثال ، أعادت الدالة find() موضع الحرف ‘l’ في السلسلة str1. الآن ، دعونا نرى مثالًا لإيجاد موضع سلسلة في سلسلة أخرى.



الكود:
#include <iostream>
#include <string>
using namespace std;

int main()
{
   string str1 ("I love C++");
   string str2 ("C++");
     cout << str1.find(str2) << endl;
   return 0;
}

الخرج :

الكود:
7

• الدالة substr() :
ترجع الدالة substr() سلسلة فرعية substring من سلسلة بتحديد موضعها.


الكود:
#include <iostream>
#include <string>
using namespace std;

int main()
{
   string str1 ("I love C++");
   cout << str1.substr(3) << endl;
   return 0;
}

الخرج :

الكود:
 ove C++

المثال أعلاه يطبع كل الحروف من الموضع 3 حتى نهاية السلسلة str1.


الكود:
 #include <iostream>
#include <string>
using namespace std;

int main()
{
   string str1 ("I love C++");
   cout << str1.substr(3,5) << endl;
   return 0;
}

الخرج :

الكود:
 ove C

هنا ، تم طباعة 5 أحرف تبدأ من الموضع 3.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة

- مواضيع مماثلة

 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى