Upload
edythe
View
39
Download
1
Embed Size (px)
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.