مبحث ششم: آرایه ها و رشته ها

Preview:

DESCRIPTION

حسابگری الگوریتمی. مبحث ششم: آرایه ها و رشته ها. فهرست مطالب. تعاریف اولیه مثال هایی از آرایه های یک بعدی آرايه هاي يک بعدی به عنوان آرگومان تابع روش های مرتب سازی و جستجوی آرایه ها آرایه های دوبعدی رشته ها عملیات رشته ها. آرایه. آرايه: مجموعه اي از عناصر همنوع نام ديگر: ليست - PowerPoint PPT Presentation

Citation preview

مهدی آذرنوش

http://azarnoosh.mshdiau.ac.ir

مبحث ششم: آرایه ها و رشته ها

یموریت

گی ال

رگساب

ح

2

آرایه ها و رشت

ه ها

Lecture_6

فهرست مطالب

تعاریف اولیه •مثال هایی از آرایه های یک بعدی •آرايه هاي يک بعدی به عنوان آرگومان تابع •روش های مرتب سازی و جستجوی آرایه ها•آرایه های دوبعدی•رشته ها•عملیات رشته ها•

3

تعاریفا ولیه

Lecture_6

آرایه

آرايه: مجموعه اي از عناصر همنوع •نام ديگر: ليست –

نامگذاري آرايه: مانند متغير معمولی •

نحوة دسترسي به عناصر آرايه: استفاده از •متغيري به نام انديس

4

تعاریفا ولیه

Lecture_6

آرايه هاي يک بعدي

دستيابي به عناصر آرايه: با يک انديس•

الگوي تعريف:•• نام آرايه ]طول آرايه[نوع آرايه

++Cنوع آرايه: يکي از انواع •نام آرايه: نامگذاري متغيرها•انديس آرايه از صفر شروع مي شود.•

5

تعاریفا ولیه

Lecture_6

آرايه هاي يک بعدي

ذخيره عناصر آرايه در حافظه بصورت متوالي•

ميزان حافظه اختصاصي به آرايه )برحسب بايت(:• = )طول نوع آرايه( * طول آرايهميزان حافظه آرايه•

int x[6];

x[0] x[1] x[2] x[3] x[4] x[5]

6

تعاریفا ولیه

Lecture_6

مقدار اوليه آرايه

)(( mainمقدار اوليه عناصر آرايه عمومي )خارج از •صفر است.

مقدار اوليه عناصر آرايه محلي تعريف نشده است.•

الگوي مقدار اوليه دادن به آرايه ها:•• ;نوع آرايه نام آرايه ]طول[ = }مقادير{

int x[5]={1,2,3,4,5};

int p[ ]={1,3,5,7,9};

int x[10]={1,2,3};

7

مثال هاییا زآ رایه هایی کب عدی

Lecture_6

: تعيين بيشترين معدل و 1-6مثال محل آن

Example 6-1:#include <iostream.h>int main() { const int n = 10; float ave[n], amax = 0; int i, p; for(i = 0; i < n; i++){ cout << " enter an average: "; cin >> ave[i]; } amax = ave[0]; p = 0; for(i = 1; i < n; i++) if(ave[i] > amax) {

amax = ave[i];p = i;

} cout << "\n max = " << amax << " position = " << p+1; return 0;}

enter an average: 10.5 enter an average: 17.25 enter an average: 14 enter an average: 19.25 enter an average: 15.5 enter an average: 12.75 enter an average: 14.75 enter an average: 17.25 enter an average: 18.5 enter an average: 12.5

max = 19.25 position = 4

8

مثال هاییا زآ رایه هایی کب عدی

Lecture_6

: تعيين اعداد ورودي مثبت و 2-6مثال منفي و تعداد آنها

Example 6_2:#include <iostream.h>int main() { const int n = 10; int arr[n], i, c1 = 0, c2 = 0 ; cout << "\n Enter " << n << " numbers:\n"; for(i = 0; i < n; i++) cin >> arr[i]; cout << "\n negatives are: "; for(i = 0 ; i < n ; i++) if(arr[i] < 0){

cout << arr[i] << " ";c1++; } //end of if

cout << "\n positives are: "; for(i = 0 ; i < n ; i++) if(arr[i] > 0){

cout << arr[i] << " "; c2++; }//end of if

cout << "\n number of negative = " << c1; cout << "\n number of positive = " << c2; return 0; {

Enter 10 numbers:12-12450-2-04-910

negatives are: -12 -2 -9 positives are: 12 4 5 4 10 number of negative = 3 number of positive = 5

9

آرايه هايي کب عدیب ه عنوانآ رگومانت ابع

Lecture_6

تعریفتعريف پارامترها در توابع داراي آرگومان آرايه:•

آرايه با طول مشخص–آرايه با طول نامشخص )که بهتر است طول –

توسط آرگومان ديگر منتقل شود(اشاره گر )فصل بعد(–

void func1 (int x[]);void func2 (int x[], int

len);void main() {

int x[10];…func1 (x);…func2 (x,10);

}void func1 (int x[10]) {

…}void func2 (int x[], int

len) {…

}

10

آرايه هايي کب عدیب ه عنوانآ رگومانت ابع

Lecture_6

: تعيين نمره ای که بيش از 3-6مثال Eهمه تکرار شده ٍxample 6-3:

#include <iostream.h>void findt(float arr[], int k);int main() { const int k = 10; float arr[k] ; int i; cout << "\nEnter " << k << " mean :\n"; for (i = 0; i < k; i++) cin >> arr[i]; findt(arr, k); return 0; }//*************************void findt(float arr[], int k) { int max_count = -1 ; float max_value; int i, j , current_count; float current_value ; for (i = 0; i < k; i ++){

current_value = arr[i] ; current_count = 0 ; for(j = 0; j < k; j++)

if (arr[j] == current_value) current_count++ ;

if (current_count > max_count) { max_count = current_count ; max_value = current_value ; } }

cout << "\n maximum iteration of ave "; cout << max_value << " is "<< max_count; }

Enter 10 mean :12.517.251413.517.2518.7512.514.2515.7517.25

maximum iteration of ave 17.25 is 3

11

روش های مرتب سازی و جستجویآ رایه ها

Lecture_6

مرتب سازي آرايه هاx[0] < x[1] < x[2] < … < x[n]مرتب سازي صعودي•x[0] > x[1] > x[2] > … > x[n]مرتب سازي نزولي •

مرتب سازي حبابي•سهولت درک برنامه نويسي–کارآيي کمتر نسبت به ساير روشها–مقايسه عناصر با يکديگر و جابجايي آنها–

بر اساس نوع مرتب سازيnبراي آرايه اي به طول –

•n-1بار مقايسه در يک مرحله •n-1.مرحله براي مقايسه داريم

آرايه اي به 6 1 9 3 4 5طول

مرحله اول 4 3 9 1 6 x[0]

x[1] 4 9 3 1 6 x[1]

x[2] 4 9 3 1 6 x[2]

x[3] 4 9 3 6 1 x[3]

x[4] مرحله دوم

9 4 3 6 1 x[0] x[1]

9 4 3 6 1 x[1] x[2]

9 4 6 3 1 x[2] x[3]

9 4 6 3 1 x[3] x[4]

مرحله سوم 9 4 6 3 1 x[0]

x[1] 9 6 4 3 1 x[1]

x[2] 9 6 4 3 1 x[2]

x[3] بعد از اين ديگر تغييري

نداريم.

12

روش های مرتب سازی و جستجویآ رایه ها

Lecture_6

: مرتب سازي حبابي تعدادي 4-6مثال عدد

Example 6-4:#include <iostream.h>void ginput(int [], int);void bubble(int [], int);void goutput(int [], int);int main() {

const int k=7 ;int temp[7];ginput(temp, k);bubble (temp, k);cout << “\nThe sorted data are :\n ";goutput(temp, k);return 0; }

void ginput(int temp[], int len) {int i;for (i=0; i<len; i++) {

cout << "enter number " << (i+1) << " : ";cin >> temp[i]; } }

void bubble(int temp[], int len) {int i, j, item;for(i = len - 1 ; i > 0; i --)for(j = 0; j < i ; j++) if(temp[j] > temp[j + 1]) {

item = temp[j] ; temp[j] = temp[j + 1]; temp[j + 1] = item ; } }

void goutput(int temp[], int len) { int i; for(i=0 ; i < len; i++)

cout << temp[i]; << “ ”; }

enter number 1: 12enter number 2: 14enter number 3: 178enter number 4: 43enter number 5: 2124enter number 6: 213enter number 7: 92

The sorted data are :12 14 43 93 178

213 2124

13

روش های مرتب سازی و جستجویآ رایه ها

Lecture_6

جستجو در آرايهروش ترتيبي:•

مقايسه عنصر مورد نظر با هريک از عناصر آرايه–اتمام جستجو:–

يافتن عنصر مورد نظر•اتمام عناصر آرايه•

روش دودويي:•آرايه بايد مرتب باشد.–ابتدا با عنصر وسط مقايسه مي شود در صورت –

عدم تساوياگر بزرگتر بود با عناصر بااليي آرايه مقايسه مي شود.•اگر کوچکتر بود با عناصر پاييني آرايه مقايسه مي شود.•

ادامة جستجو تا يافتن عنصر يا اتمام آرايه–

14

روش های مرتب سازی و جستجویآ رایه ها

Lecture_6

: جستجويي ترتيبي در شماره 5-6مثال دانشجويي

Example 6-5:#include <iostream.h>void ginput(int [], int);int lsearch(int [], int, int);int main() { const int k = 5 ; int st[k], no; ginput(st, k); cout << "\nEnter a student # to search: "; cin >> no; if(lsearch(st, k, no) == -1) cout << "\n number " << no << " does not exist in list "; else cout << "\n number " << no << " exists in list."; return 0; }//**************************void ginput(int st[], int len) { int i; for(i = 0; i < len; i++) { cout << "enter student number " << i+1 << " : "; cin >> st[i]; } }//**********************int lsearch(int st[], int len, int no) { int i; for(i = 0; i < len; i++) if(st[i] == no) return i; return -1; }

enter student number 1 : 121

enter student number 2 : 134

enter student number 3 : 215

enter student number 4 : 219

enter student number 5 : 123

Enter a student # to search: 215

Number 215 exists in list.

15

روش های مرتب سازی و جستجویآ رایه ها

Lecture_6

: جستجويي دودويي در شماره 6-6مثال دانشجويي

Example 6-6:#include <iostream.h>void ginput(int [], int);void bubble(int [], int);int bsearch(int [], int, int);int main() { const int k = 5 ; int st[k], no; ginput(st, k); cout << "\nEnter a student # to search:"; cin >> no; bubble(st, k); if(bsearch(st, k, no) == -1) cout << "\n number " << no << " does not exist in list "; else cout << "\n number " << no << " exists in list."; return 0; }//**********************int bsearch(int st[], int len, int no) { int mid, low = 0, high = len - 1; while(low <= high){ mid = (low + high) / 2; if(no < st[mid])

high = mid - 1; else if(no > st[mid])

low = mid + 1; else return mid; } return -1; }

enter student number 1 : 121

enter student number 2 : 134

enter student number 3 : 215

enter student number 4 : 219

enter student number 5 : 123

Enter a student # to search: 215

Number 215 exists in list.

16

آرایه هاید وب عدی

Lecture_6

تعریف آرايه دو بعديدستيابي به عناصر : با دو انديس سطر و ستون•الگوي تعريف:•

• [2[ ]بعد 1 نام آرايه ]بعد نوع آرايهبعد اول: تعداد سطر–بعد دوم: تعداد ستون–شروع هر انديس از صفر–

نحوة ذخيره در حافظه : سطري•

y[0][0] y[0][1] y[0][2] y[0][3]y[1][0] y[1][1] y[1][2] y[1][3]y[2][0] y[2][1] y[2][2] y[2][3]

y[0][0] y[1][0] y[2][0]

17

آرایه هاید وب عدی

Lecture_6

مقدار اوليه آرايه چند بعدی

الگوي مقدار اوليه دادن به آرايه های چند بعدی:•• [ ]…[ = 2[ ]بعد 1 نام آرايه ]بعد نوع آرايه

;}مقادير{int y[2][3]={1,2,3,4,5,6};

int y[2][3]={{1,2,3},{4,5,6}};

int m[3][2][4]={{{1,2,3,4},{5,6,7,8}}, {{7,9,3,2},{4,6,8,3}}, {{7,2,6,3},{0,1,9,4}}};

18

آرایه هاید وب عدی

Lecture_6

: جدول ضرب7-6مثال Example 6-7:#include <iostream.h>int main() { int table[10][10], i, j ; for(i = 0; i < 10; i++)

for(j = 0; j < 10; j++) table[i][j] = (i + 1)*(j + 1) ;

for(i = 0; i < 10; i++) { for(j = 0; j < 10; j++) cout << table[i][j] << " " ; cout << endl ;

} return 0;}

1 2 3 4 5 6 7 8 9 102 4 6 8 10 12 14 16 18

20……9 18 27 36 45 54 63 72

81 9010 20 30 40 50 60 70 80

90 100

19

آرایه هاید وب عدی

Lecture_6

آرايه هاي دو بعدی به عنوان آرگومان تابع

تعريف پارامترها در توابع داراي آرگومان آرايه •دو بعدي:

آرايه با طول مشخص–آرايه با طول نامشخص )طول سطر توسط –

آرگومان ديگر منتقل شود(اشاره گر )فصل بعد(–

void f1 (int x[5][10]);void f2 (int x[][10], int

row);void main() {

int x[5][10];…f1 (x);…f2 (x,5);

}void f1 (int x[5][10]) {

…}void func2 (int x[][10],

int row) {…

}

20

آرایه هاید وب عدی

Lecture_6

: يافتن بزرگترين عنصر هر 8-6مثال سطر ماتريس

Example 6-8:#include <iostream.h>void minput(int [][2], int);void mcal(int mat[][2], int);void main() { const int r = 3, c = 2; int mat[r][c]; minput(mat, r); mcal(mat, r); }//*********************void minput(int mat[][2], int r) { int i, j; for(i = 0; i < r; i++) for(j = 0; j < 2; j++) {

cout << "enter mat[" << i << "][" << j << "]: ";cin >> mat[i][j]; } }

//**********************void mcal(int mat[][2], int r) { int i, j, rmax; cout << " ROW \t\tMAX"; cout << "\n-------------------"; for(i = 0; i < r; i ++) { rmax = mat[i][0]; for(j = 1; j < 2; j++) if(mat[i][j] > rmax)

rmax = mat[i][j]; cout << "\n " << i+1 << " \t\t " << rmax; } }

enter mat[0][0]: 126enter mat[0][1]: 112enter mat[1][0]: 312enter mat[1][1]: 152enter mat[2][0]: 112enter mat[2][1]: 424 ROW

MAX----------------------------

--- 1

126 2

312 3

424

21

آرایه هاید وب عدی

Lecture_6

ماتريس2: محاسبة حاصلضرب 9-6مثال Example 6-9:#include <iostream.h>int main() { int mat1[2][3], mat2[3][4], mat3[2][4]={0} ; int i,j,k,l ; //read mat1 for(i=0 ; i<2 ; i++) for(j=0 ; j<3 ;j++) {

cout << "enter mat1[" << i << "][" << j << "]: ";cin >> mat1[i][j]; }

//read mat2 for(i=0 ; i<3 ; i++) for(j=0 ; j<4 ;j++) {

cout << "enter mat2[" << i << "][" << j << "]: ";cin >> mat2[i][j]; }

//multiply mat1 by mat2 for(i=0 ; i<2 ; i++)

for(j=0 ; j<4 ;j++) { mat3[i][j]=0 ; for(k=0 ;k<3 ; k++) mat3[i][j] = mat3[i][j]+mat1[i][k]*mat2[k][j]; }

cout << "\n the product of mat1 & mat2 " ; cout << " is :\n\n" ; for(i=0 ;i<2 ;i++) { for(j=0 ; j<4 ;j++)

cout << mat3[i][j] << “\t"; cout << "\n" ; } return 0; }

enter mat1[0][0]: 1enter mat1[0][1]: -1enter mat1[0][2]: 2enter mat1[1][0]: 0enter mat1[1][1]: 0enter mat1[1][2]: -2enter mat2[0][0]: 1 enter mat2[0][1]: 2enter mat2[0][2]: -1enter mat2[0][3]: -2enter mat2[1][0]: 2enter mat2[1][1]: 1enter mat2[1][2]: 0enter mat2[1][3]: -3enter mat2[2][0]: 1enter mat2[2][1]: -1enter mat2[2][2]: -1enter mat2[2][3]: 1

the product of mat1 & mat2 is :

-1 1 3-3

-2 2 2-2

22

آرایه هاید وب عدی

Lecture_6

: يافتن کوچکترين عنصر آرايه10-6مثال

Example 6-10:#include <iostream.h>int findmin(int [], int);void main() { int list[20], num, size=0 ; do{ cout << "type list[" << size << "] : "; cin >> list[size]; } while(list[size ++] != 0) ; size --; num = findmin(list, size) ; cout << "\n minimum is: " << num; }//***********************int findmin(int arr[], int size) { int i, min1 ; min1 = arr[0] ; for(i = 0 ; i < size; i++)

if(arr[i] < min1) min1 = arr[i] ;

return(min1) ; }

type list[0] : 27type list[0] : 41type list[0] : 15type list[0] : 34type list[0] : 32type list[0] : 61type list[0] : 123type list[0] : 0

minimum is: 15

23

رشته ها

Lecture_6

تعریفآرايه اي از کاراکترها•NULL (‘\0’)تعيين انتهاي رشته با کاراکتر •الگوي تعريف:••char s[20];مقدار اولية رشته:•

رشته داخل کوتشين قرار گرفته به متغير نسبت داده شود. –هريک از کاراکترهاي رشته اي جداگانه اختصاص يابد. )تهي را نيز –

بايد تعيين نمود(

char s1[ ] = “Programming”;

p r o g r a m m i n g \0

char s2[12] = “Computer”;char s3[ ] = { ‘C’ , ‘+’ , ‘+’ , ‘\0’};

C o m p u t e r \0 ? ? ? C + + \0

24

رشته ها

Lecture_6

ورودي و خروجي رشته ها

cout و cinاستفاده از • است.cin) ( که عضو getاستفاده از تابع •الگوي استفاده:•

• cin.get (نام رشته, طول رشته)• cin.get (نام رشته, طول رشته, ‘جداکننده’)

مشخص کنندة انتهاي جمله است.enterدر دستور اول –در دستور دوم کاراکتر تعيين شده مشخص کنندة انتهاي –

جمله است.

امکانات: با اين دستور رشته مي تواند شامل فاصله • نيز باشد.Tabو

25

رشته ها

Lecture_6

: تبديل حروف کوچک يک 11-6مثال رشته به بزرگ

Example 6-11:#include <iostream.h>void upper(char []);void main() { char s[21]; cout << “Enter a string: "; cin.get(s,20); upper(s); cout << “\nResult is: " << s; }//***********************void upper(char s[]) { int i; for(i = 0; s[i]; i++) if(s[i] >= 'a' && s[i] <= 'z')

s[i] -= 32; }

Enter a string: changing characters to upper case

Result is : CHANGING CHARACTERS

26

رشته ها

Lecture_6

: تبديل يک کاراکتر به کاراکتر ديگر 12-6مثال در يک رشته

//Example 6-12:#include <iostream.h>#include <conio.h>void replace(char [], char, char);void main() {

char string[50] ; char source_letter, target_letter ; int i ; cout << "\nEnter a string: "; cin.get(string,50) ; cout << "Enter source character: "; source_letter = getche() ; cout << "\nEnter target character: "; target_letter = getche() ; replace(string, source_letter, target_letter); cout << "\nThe result string is: "; cout << string ; }

//************************void replace(char string[], char source_letter, char target_letter){

int i; if(source_letter != target_letter)

for(i = 0 ; string[i] ; i++)if(string[i] == source_letter)

string[i] = target_letter; }

Enter a string: changing one character of a string

Enter source character: aEnter target character: eThe result string is: chenging one cherecter

of e string

27

رشته ها

Lecture_6

: تعويض محتويات دو رشته با 13-6مثال يکديگر

Example 6-13:#include <iostream.h>void main() {

char s1[81], s2[81], temp;int i, j;cout << "enter string <s1> : " ;cin.get(s1,81); cin.get();cout << "enter string <s2> : " ;cin.get(s2,81); for(i = 0; s1[i] && s2[i]; i++) {

temp = s1[i] ;s1[i] = s2[i] ;s2[i] = temp ; }

if(s1[i]) { //s1 has more charj = i ;while(s1[i])

s2[i] = s1[i++] ;s2[i]='\0' ;s1[j]='\0' ; }//end of if

else if (s2[i]) { //s2 has more charj = i ;while(s2[i])

s1[i] = s2[i++] ;s2[j]='\0' ;s1[i]='\0' ; } //end of else if

cout << “\nnew content of s1 is: " << s1;cout << “\nnew content of s2 is: " << s2; }

enter string <s1> : Computer programming

enter string <s2> : C++

new content of s1 is: C++new content of s2 is: Computer

programming

28

رشته ها

Lecture_6

: تعيين عملگر و عملوندها در عبارت 14-6مثال محاسباتي

Example 6-14:#include <iostream.h>void separate(char exp[], char oper[], int opnd[]);void main() {

char expr[21], oper[21];int opnd[21];cout << "enter expression: ";cin.get (expr,21);separate(expr, oper, opnd); }

//***************void separate(char expr[], char oper[], int opnd[]) { int i, j = 0 , k = 0; for(i = 0; expr[i]; i ++)

if(expr[i] >= '0' && expr[i] <= '9')opnd[j ++] = expr[i] - 48;

elseoper[k ++] = expr[i];

oper[k] = '\0';cout << "operators are: “ << oper << endl;cout << "operands are: ";for(i = 0; i < j; i ++)

cout << opnd[i] << " "; }

enter expression: 2 * 4 / 3 - 4 + 2

operators are: * / - +operands are: 2 4 3 4 2

29

عملیات رشته ها

Lecture_6

انتساب رشته ها

انتساب رشته ها به صورت معمول صحيح •نيست:

• s2 = s1;• s = “Computer”;

روش صحيح:•• strcpy (str1, str2);

string.hفايل سرآيند مربوطه: •

str1 بيشتر از طول str2در صورتيکه طول • ذخيره مي شود.str1باشد در حافظه در ادامة

30

عملیات رشته ها

Lecture_6

مقايسه رشته ها

مقايسه رشته ها به صورت معمول نيست:•• s1 == s2

روش صحيح:•• strcmp(s1,s2)

string.hفايل سرآيند مربوطه: •خروجي تابع:•

عدد صفر: دو رشته با هم مساوي هستند.– s1 < s2عدد منفي: –s1 > s2عدد مثبت: –

31

عملیات رشته ها

Lecture_6

الحاق دو رشته

الگوي استفاده:•• strcat(s1, s2);

string.hفايل سرآيند مربوطه: •

قرار مي گيرد.s1 در انتهاي رشتة s2رشتة •

32

عملیات رشته ها

Lecture_6

: جستجوي يک نام در يک 16-6مثال ليست

Example 6-16:#include <iostream.h>#include <string.h>void bubble(char [][21], int);int bsearch(char [][21], char [], int);void main() { const int n = 5; int i; char name[21], arr [n][21]; for(i = 0; i < n; i ++){ cout << "Enter name " << (i + 1) << " : " ; cin.get(arr[i], 20); cin.get(); } bubble(arr, n); cout << "Enter one name for search :" ; cin.get(name, 20) ; if(bsearch(arr, name, n) == -1) cout << "Name " << name << " does not exist in table." ; else cout << "Name " << name << " exists in table." ; }//********************void bubble(char arr[5][21], int n) { int i, j; char temp[21]; for(i = n - 1; i > 0; i --) for(j = 0; j < i; j++) if(strcmp(arr[j], arr[j + 1]) > 0){

strcpy(temp, arr[j]); strcpy(arr[j], arr[j + 1]); strcpy(arr[j + 1], temp); } }//*******************int bsearch(char arr[5][21], char name[21], int n) { int mid, low = 0, high = n - 1; while(low <= high){

mid = (low + high) / 2; if(strcmp(name, arr[mid]) < 0) high = mid - 1; else if(strcmp(name, arr[mid]) > 0) low = mid + 1; else return mid; } return -1; }

Enter name1 : AliEnter name 2 : MohammadEnter name 3 : HusseinEnter name 4 : MahdiEnter name 5 : HassnEnter one name for search :

JavadName Javad does not exist in

table.