فصل دوم : آرايه ها و ساختارها
DESCRIPTION
فصل دوم : آرايه ها و ساختارها. اهداف. در اين فصل دانشجو با کاربرد موارد زير آشنا خواهد شد:. آرايه ليست چند جملهاي ماتريس خلوت رشته. بازيابي. ذخيره سازي مقادير. آرايه. در رابطه با آرايه به دو عمل اساسي نياز است :. - PowerPoint PPT PresentationTRANSCRIPT
صفحه
آرايهليستچندجملهايماتريسخلوترشته
اهداف
:دراينفصلدانشجوباکاربردمواردزيرآشناخواهدشد
1
صفحه
آرايهمجموعهاياززوجها،شاملانديسومقدار.بهازايهرانديس>(index<,<value)>است
يکمقدارمربوطبهآنانديسوجودداردکهبهزبانرياضيآنراتناظرياانگاشتمينامند.
آرايهآرايه
دررابطهباآرايهبهدو:عملاساسينيازاست
بازيابي•
ذخيرهسازي•مقادير
2
صفحه
آرايهنوعيساختماندادهاستكهعناصرآنهمنوعبودهوهريكازعناصربايكانديسوبصورت
مستقيمقابلدستيابيميباشد.آرايهميتوانديكبعديوياچندبعديباشدآرايههايدوبعديرابانامماتريسميشناسيم
3
انديس 0 1 2 3
مقدار 12 8 6 7
صفحه
بهصورتمثالدرزيرآمدهCآرايهدرزباناست:
intlist[5]
شروعمي0تمامآرايههاازانديسCدرزبانشوند.
ميتوانn-1تا0عنصرباانديسهايnآرايهايبابهدرايههايآندسترسيپيداكرد
نکته
5
صفحه
ليست
سادهتcرينومتcداولتcريننcوعسcاختماندادههcاسادهتcرينومتcداولتcريننcوعسcاختماندادههcا،ليستهايمرتبشدهياخطيهستند.،ليستهايمرتبشدهياخطيهستند.
ليستليست
مثال:مثال:
...روزهايهفته)شنبه...روزهايهفته)شنبهجمعه(جمعه(
),...,,( 110 nitemitemitem ليستهاشاملاقالمدادهبهصورتليستهاشاملاقالمدادهبهصورتميباشند.ميباشند.
6
صفحه
پيداکردنطوليکليست
خواندناقالمدادهيکليستازچپبهراستيابرعکس
(i<n≥0)امينعنصرازيکليستiبازيابي
(i≤n≥0)امينموقعيتيکليستiتعويضيکقلماطالعاتيدر
.(i<n≥0)امينموقعيتيکليستiدرجيکقلمدادهجديددر
شمارهگذاريi،i+1،…،n-1)اقالمدادهايکهقبالبهصورتدرميآيند(i+1،i+2،…،nشدهاندبهصورت
.(i<n≥0)امينموقعيتيکليستiحذفيکقلماطالعاتيازتبديلI،i+1،…،n-2دادهباشمارهبهاقالمi+1،…،n-1اقالمدادهميشود.
7
صفحه
متداولترينپيادهسازي،نمايشيکليستمرتبشدهبهصورتيکآرايهميباشدبهنحويکه
آرايهمتناظرباشد.اينiامليستباانديسiعنصرمطلبيکنگاشتترتيبيناميدهميشود.
نگاشتنگاشتترتيبيترتيبي
8
صفحه
راهحلديگربرايپيادهسازيليست،ذخيرهدريكليستپيونديميباشدكههرگرهازليست
حاويدوعنصرانديسومقدارميباشد.
ليستليستپيونديپيوندي
انديسمقدار
كلين
10 n-12
9
صفحه
مانيازمندساختيكنوعدادهايتجريديبراينمايشوپردازشچندجملهاينمادينهستيم.
منظورازنمادينليستيازضرايبوتوانهاستكهباهمچندجملهايراتشكيلميدهند.
1310)(
423)(234
2
xxxxB
xxxA
10
صفحه
بزرگترينتوانxدرچندجملهايرادرجهچندجملهايميگويند.
PAدرجهچندجملهايA)x(
11
A B
BA
B
A
P
i
P
j
jj
ii
PP
i
iii
P
i
ii
P
i
ii
xbxaxBxA
xbaxBxA
xbxB
xaxA
0 0
),max(
0
0
0
.)().(
)()()(
)(
)(
استفادهازآرايهومقدارذخيرهxدراينروشانديسآرايهمعرفتوان◦
شدهمعرفضريبميباشد.مثال:◦
70812
3210 1287 3 xx
صفحه
بطوركلياگربهصورتكالسبنويسيمكالسچندجملهايبهشكلزيرخواهدبود.
classPolynomial{private:
intdegree;floatCoef[MaxDegree+1];
};/////////////////////////////////////////////////////////////////////classPolynomial{public:
Polynomial)intdeg({degree=deg;Coef=newfloat[deg];}
private:intdegree;float*Coef;
};
1پيادهسازي
2پيادهسازي
13
صفحه
� دراينچندجملهايهاضرايبصفرزيادهستندمثالx1000+1صفراست.999داراي
برايذخيرهچندجملهايهايخلوتازساختارزيراستفادهميكنيم
عناصربراساسقوايصعوديويانزوليمرتبميشوند
78
3000 87 300 x
14
صفحه
classPolynomial;classTerm{friendclassPolynomial;private:
floatcoef;//Coefficient
intexp; //Exponent};
classPolynomial{private:
intterms;TermtermArr[MaxTerms];
public:Polynomial)({
terms=0;termArr[0]=0;
}};
15
16صفحه
PolynomialPolynomial::Add)constPolynomial&B({Polynomialc;inta=0,b=0;floattemp;while)a<terms&&b<B.terms({switch)compare)termArr[a].exp,B.termArr[b].exp(({case‘=‘:
temp=termArr[a].coef+B.termArr[b].coef;if)temp(c.NewTerm)temp,termArr[a].exp(;a++;b++;
break;case‘<‘:
c.NewTerm)B.termArr[b].coef,B.termArr[b].exp(;b++;
break;case‘<‘:
c.NewTerm)termArr[a].coef,termArr[a].exp(;a++;
break;
}}for);a<terms;a++(
c.NewTerm)termArr[a].coef,termArr[a].exp(;for);b<B.terms;b++(
c.NewTerm)B.termArr[b].coef,B.termArr[b].exp(;returnc;}
جمعدوچندجملهايخلوت
صفحه
voidPolynomial::NewTerm)floatc,inte({if)terms<=MaxTerms({cerr<<“Toomanytermsinpolynomial\n”;return;}termArr[terms].coef=c;termArr[terms].exp=e;terms++;}
17
صفحه
برنامهايبنويسيدكهدوچندجملهايخلوترادرهمضربنمايد.
برايپيادهسازيتابعضربدرصورتنيازتوابعديگريكه◦كارشماراسادهترسازدرانيزميتوانيدتعريفنماييد
))زمانتحويلجلسهآيندهزمانتحويلجلسهآينده((
18
صفحه
mبهطورکليدررياضيات،يکماتريسشاملستونبودهوميتواندمانندشکلزيرnسطرو
نمايشدادهشود.
27- 3 4
6 82 2-
109 64- 11
12 8 9
48 27 47
row 0
row 1
row 2
row 3
row 4
col1 col2 col3
19
صفحه
درعلومکامپيوترمتداولتريننمايشبرايماتريسa[MAX_ROW]آرايهدوبعدياستکهبهصورت
[MAX_COLS]نمايشدادهميشود.هرعنصرنمايشدادهميشود.a[i][j]ماتريسبهصورت
ماتريسماتريسيکهعناصرصفرآنزيادباشدناميدهميشود.اسپارس
ماتريسماتريساسپاراسپارسس
ايجاد،جمع،ضربوايجاد،جمع،ضربوحداقلاعمالممکنشاملميباشد.ترانهادهماتريسترانهادهماتريس
20
0 0 0 0 9
0 5 8 0 0
0 0 0 0 0
صفحه
باتوجهبهويژگيهاياينماتريسهرعضوراميتوانبصورتمنحصربفرديباسهتايي
<row,col,value>.مشخصنمود
سهتاييهايبدستآمدهبراساسسطرهامرتبهستندوسپسعناصريكهدريكسطرقراردارند
بهترتيبشمارهستونمرتبميشوند.
22
صفحه
0 0 0 0 9
0 5 8 0 0
0 0 0 0 0
Row Col Value
0 4 9
1 1 5
1 2 8
classSpMtx;//SparseMatrixclassclassMTerm{friendclassSpMtx;private:
introw,col,value;};
classSpMtx{private:
intRows,Cols,Terms;MTermsmArr[MaxTerms];
};
23
صفحه
برايپيدانمودنترانهادهيکماتريسبايدجايسطرهاوستونهاراعوضکردبدينمفهومکههر
درb[j][i]درماتريساوليهبهعنصرa[i][j]عنصرماتريسترانهادهتبديلميشود.
،الگوريتمزيربرايپيداکردنترانهادهيکماتريس،الگوريتمزيربرايپيداکردنترانهادهيکماتريسالگوريتممناسبياست:الگوريتممناسبياست:
for all element in column j
place element < i ، j ،value> in
element < j ، i ،value>
24
صفحه
SpMtxSpMtx::Transpose)({SpMtxb;b.Rows=Cols;b.Cols=Rows;b.Terms=Terms;if)Terms<=0(returnb;intCurB=0;for)intc=0;c<Cols;c++(for)inti=0;i<Terms;i++(if)smArr[i].Col==c({
b.smArr[CurB].row=c;b.smArr[CurB].col=smArr[i].row;b.smArr[CurB].value=smArr[i].value;CurB++;
}returnb;}
25
صفحه
الگوريتمبيانشدهنشانميدهدکهبايدتمامذخيره0راپيداوآنهارادرسطر0عناصردرستون
راپيداودرسطر1کردهمچنينتمامعناصرستونقراردادوهمينفرآيندراادامهداد.ازآنجاکه1
ماتريساوليهسطريبودهلذاستونهايداخلهرسطرازماتريسترانهادهنيزبهصورتصعودي
مرتبميشود.
26
صفحه
تعيينزماناجراياينالگوريتمازآنجاکهحلقههايتودرتوي
for.عاملتعيينکنندهميباشد،آساناست
حلقهforخارجيColsمرتبهتکرارميشودکهColsحاوي
تعدادستونهايماتريساوليهاست.
بهازايهربارتكرارحلقهخارجيحلقهداخليTermsبارتكرار
تعدادعناصرغيرصفرماتريساوليهميباشدTermsميشودكه
بنابراينزمانکليبرايحلقههايتودرتويforبرابرباحاصل
ميباشد.(Cols.Terms)ضربستونهادرعناصر
بنابراينزماناجرابهصورتO)Cols.Terms(.خواهدبود
27
صفحه
آياميتوانسرعتالگوريتميافتنترانهادهراافزايشداد.
2تمرين
بامراجعهبهكتابالگوريتممحاسبهسريع
ترانهادهرابههمراهالگوريتمبيانشدهپياده
سازينماييد.))زمانتحويلهفتهآيندهزمانتحويلهفتهآينده((
28
صفحه
درc++.آرايههايچندبعديبهشكلزيرتعريفميشوند DataTypeArrayName[D1][D2]…[Dn]
كهDiتعدادعناصربعدi.امميباشددرزبانهايبرنامهنويسيديگرمانندPascalميتوانبراي
انديسهايآرايهبازهتعريفنمود: DataTypeArrayName[P1..Q1][P2..Q2]…[Pn..Qn]
29
30صفحه
باتوجهبهتعريفيكهارائهشدتعدادخانههايآرايهnبعديبهشكلزيرمحاسبهميشود:
)(1
ii
n
iPQ
صفحه
:درآرايهيكبعدي
A[i]=+iآدرس
:درآرايهدوبعدي
A[i][j]=+iD2+jآدرس
:درآرايهسهبعدي
A[i][j][k]=+i.D2.D3+j.D3+kآدرس
درآرايهn:بعدي
A[i1][i2]…[in]=+i1.D2.D3…Dn+i2.D3.D4…Dn+…+inآدرس
31
صفحه
آدرسA[i1][i2]…[in]
32
; 1
; ; 1
1
nk
nknkDa
ai
n
kjj
k
n
kkk
33صفحه
تعريفيکرشتهبهصورتADTازديدگاهکاراکترهاياخذشدهازميگرددبهنحويکه
مجموعهکاراکترهايزبانبرنامهنويسيميباشد.يکرشتهتهيميباشد. Sباشد،n=0اگر
10 ,..., nssS
is
،رشتههابهصورتآرايههايکاراکتريکهبهCدرزبانختمميشوند،آرايهميگردد.’0\‘کاراکترتهي
34صفحه
عملکردهايمناسبومفيديوجودداردکهميتوانبرايرشتههاتعريف
کردمانند:
ايجاديکرشتهتهيجديد
خواندنيانوشتنيکرشته
ضميمهکردندورشتهبهيکديگر(concatenation)کپيکردنيکرشته
مقايسهرشتهها
درجکردنيکزيررشتهبهداخلرشته
برداشتنيکزيررشتهازيکرشتهمشخص
پيداکردنيکالگو(pattern)ياعبارتدريکرشته
جديدADTمختص
35صفحه
d o g \0
نحوهذخيرهسازيدرحافظه:
chars[]="dog”;
s[0] s[1] s[2]s[3]
Cنمايشرشتهدرزبان
36صفحه
a m o b i l e \0
u t o \
0
جايsرشتهi=1رادرموقعيتtميخواهيمرشتهدهيم:
a u t o m o b i l e \0
a u t o \0
a \
0
\0
s
t
temp initially
)a(Afterstrncpy)temp،s،i(
)b(Afterstrcat)temp،t(
temptemptemp
صفحه
،بهpatوstringفرضکنيدکهدورشتهداريم،بودهوبايددرpatternيکالگوياpatنحويstringپيداشود.سادهترينراهبرايتعييناينکهآيا
patدررشتهوجودداردياخير،استفادهازتابعميباشد.strstrکتابخانهايبرايتطابقعبارتمناسببهنظرstrstrباوجوداينکه
ميرسد،دودليلعمدهبراينوشتنتابعتطابقالگووجوددارد:
جديدبودهوممکناست.ANSI Cبرايstrstrتابعکهدرکامپايلرموجودنباشد.
چندينروشبرايپيادهسازيتابعتطابقالگووجود37دارد.
صفحه
تطابقالگو
غيرموثرترينروش،تستمتواليهرکاراکتررشتهتازمانپيداشدنالگوويارسيدنبهانتهايرشته،
نباشد،اينروشدارايstringدرpatميباشد.اگر طولnخواهدبودکهدرآن(n.m)0زمانمحاسباتي
patوmطول string.ميباشد
نکتهنکته
38
صفحه
class CMyString{public:
char *str;CMyString(char *init,int len);CMyString(CMyString &s);int Getlength();int Find(CMyString &pat);
};CMyString::CMyString(char *init,int le){
str=new char[le];strcpy(str,init);
}CMyString::CMyString(CMyString &s){
str=new char[s.Getlength()+1];strcpy(str,s.str);
}int CMyString::Getlength(){
return strlen(str);}
كالسرشتهبههمراهكالسرشتهبههمراهسازندههاوتعريفسازندههاوتعريفتوابععضوتوابععضو
39
صفحه
int CMyString::Find(CMyString &pat){
char *p=pat.str,*s=str;int srcL = Getlength() , patLen = pat.Getlength();int i,j;for(i=0;i<= srcL - patLen ; i++){
for(j=0;j< patLen ; j++)if(s[i+j]!=p[j])
break;if(j== patLen )
return i;}return -1;
}
روشاولپيادهسازيجستجوييكزيرروشاولپيادهسازيجستجوييكزيررشتهرشته
40
تابعشكست:برايهريكازعناصرتعيينميكنيمدرصورتشكستازچهعنصريبررسيمجددآغازشود.
يكpatدررشتهjوبهازايهركاراكتردرموقعيتمقداربدستميآيد.
jاندي(س(
0 1 2 3 4 5 6 7 8 9
pat a b c a b c a c a b
f -1 -1 -1 0 1 2 3 -1 0 1
j)انديس( 0 1 2 3 4 5 6 7 8 9
pat a b c a b c a c a bf -1 -1 -1 0 1 2 3 -1 0 1
f)j(=(=
-p0p1…pk=pj-kpjبصورتيكهk<jكهkبزرگترينمقدار
k+1…pjاگرچنينk≤jايوجودداشتهباشدkk
-1-1 درغيراينصورت
صفحه
class CMyString{public:
char *str;
char *f;CMyString(char *init,int len);CMyString(CMyString &s);int Getlength();int Find(CMyString &pat);
void Fastfind(CString &pat);void Fail();
};CMyString::CMyString(char *init,int le){
str=new char[le];
f=new char[le];strcpy(str,init);
}CMyString::CMyString(CMyString &s){
str=new char[s.Getlength()+1];
f=new char[s.Getlength()+1];strcpy(str,s.str);
}
fافزودنمتغيرعضوجهتنگهداريمقاديرشكستوتغييراتاعمالشدهدرسازندههاو
43
صفحه
int CMyString::Fail(){
int lengthp=Getlength();f[0]=-1;for(int j=1 ; j<lengthp ; j++){
int pf = f[j-1];while(str[j]!=str[pf+1] && pf>=0)
i=f[pf];if(str[j]==str[pf+1])
f[j]=pf+1;else
f[j]=-1;}
}
44
صفحه
int CMyString::Fastfind(CMyString &pat){
pat.Fail();int posp=0,poss=0;int lengthp=pat.Getlength(),lengths=Getlength();while(posp<lengthp && poss<lengths){
if(pat.str[posp]==str[poss]){
posp++;poss++;
}else{
if(posp==0)poss++;
elseposp=pat.f[posp-1]+1;
}}if(posp<lengthp)
return -1;return poss-lengthp;
}45
صفحه
كالسرشتهرابادوتابعfindوfastfindپيادهسازينمودهوسرعتجستجوييكزيررشتهرادرمتن
مقايسهنماييد.
))زمانتحويلهفتهبعدزمانتحويلهفتهبعد((
46