
dànhchohộiđồngnghiệmthu
Chương6Cáckiểudữliệutrừutượng6.1Kiểudữliệutrừutượngbằngcấutrúc(struct)Trongchươngtrước,tathấyđểlưutrữcácgiátrịgồmnhiềuthànhphầndữliệugiốngnhautacóthểsửdụngkiểumảng.Tuynhiên,trongthựctếrấtnhiềudữliệulàtậpcáckiểudữliệukhácnhautậphợplại,vídụlýlịchcủamỗingườigồmnhiềukiểudữliệukhácnhaunhưhọtên,tuổi,giớitính,mứclương…đểquảnlýdữliệukiểunàyC++đưarakiểudữliệucấutrúc.Kiểucấutrúcgiốngkiểumảngởchỗcùngquảnlýmộttậphợpcácdữliệuchiathànhcácthànhphần.Cácthànhphầntrongkiểumảngđượctruycậpthôngquachỉsố,cònmỗithànhphầntrongkiểucấutrúc(cònđượcgọilàtrường)sẽđượctruycậpthôngquatêngọicủathànhphầnđó.Điểmgiốngvàkhácnhaunữagiữakiểumảngvàcấutrúclàcácthànhphầnđượclưutrữliêntiếpnhautrongbộnhớ,tuynhiênsốbytescủatừngthànhphầntrongkiểucấutrúclàkhácnhau,khácvớikiểumảngđộdàicủacácthànhphầnnàylàgiốngnhauvìchúngcócùngkiểu.Vídụ,trongchươngtrìnhquảnlýđiểmtốtnghiệpcủasinhviên,mỗisinhviênsẽlàmộtđốitượngmànócóítnhất3thànhphầndữliệucầnphảicólà:họtên,nămsinh,điểmtốtnghiệp.Đểquảnlýđốitượngsinhviênnhưtrêntacóthểxâydựngkiểucấutrúcnhưsau:structStudent{charname[30];intbirth_year;doublemark;};Lưuý,ởđâyStudentđượcgọilàthẻtên(identifier_tag)củakiểucấutrúcchứkhôngphảitênbiến.ĐểđơngiảntacóthểgọilàkiểucầutrúcStudenthayngắngọnlàkiểuStudent(nhưcáckiểuchuẩnint,double,bool,…).TrongkiểuStudentcóchứa3thànhphầnvớikiểukhácnhaulà:xâukítự,sốnguyênvàsốthựctươngứngvớicáctênthànhphầnnàylà:name,birth_year,mark.Thôngthường,cáckiểucấutrúchayđượcdùngchungchocáchàmnênphầnlớnchúngđượckhaibáonhưkiểutoàncục.Tómlại,việcxâydựngmộtthẻtênkiểucấutrúchaykiểucấutrúcsẽtuântheocúphápsau.6.1.1Khaibáo,khởitạo

dànhchohộiđồngnghiệmthu
120Cáckiểudữliệutrừutượngstructidentifier_tag{listofmembers;}var_list;•Mỗithànhphần(member)giốngnhưmộtbiếnriêngcủakiểu,nógồmkiểuvàtênthànhphần.Mộtthànhphầncũngcònđượcgọilàtrường(field).•Phầntên(tag)củakiểucấutrúcvàphầndanhsáchbiếncóthểcóhoặckhông.Tuynhiêntrongkhaibáokítựkếtthúccuốicùngphảilàdấuchấmphẩy(;).•Cáckiểucấutrúcđượcphépkhaibáolồngnhau,nghĩalàmộtthànhphầncủakiểucấutrúccóthểlạilàmộttrườngcókiểucấutrúckhác.•Mộtbiếncókiểucấutrúcsẽđượcphânbốbộnhớsaochocácthànhphầncủanóđượcsắpkềnhauliêntụctheothứtựxuấthiệntrongkhaibáo.•Khaibáobiếnkiểucấutrúccũnggiốngnhưkhaibáocácbiếnkiểucơsởdướidạng:structidentifier_taglist_of_var;//kiểucũtrongChoặctheoC++cóthểbỏquatừkhóastruct:identifier_taglist_of_var;//trongC++Cácbiếnđượckhaibáocũngcóthểđikèmkhởitạo:identifier_tagvar1={created_value},var2,...;VídụkhaibáokiểuStudent:structStudent{charname[30];intbirth_year;doublemark;}monitor={“NguyenVan”Anh,1992,8.7},x;Trongkhaibáotrên,tađãđồngthờikhaibáo2biếnkiểuStudentlàmonitor(lớptrưởng)vàx,trongđóxchưađượckhởitạovàmonitorđượckhởitạovớihọtênlàNguyễnVânAnh,sinhnăm1992vàđiểmtốtnghiệplà8.7.KhicầnkhaibáothêmbiếncókiểuStudent,cóthểtheocúpháp,vídụ:Studentvice_monitor,K58[60],y;Trongkhaibáotrên,vice_monitor,ylàcácbiếnđơn,K58làmộtmảngmàcácthànhphầncủanólàcácsinhviên,vídụdùngđểbiểudiễndữliệucủamộtlớphọc.Ưuđiểmcủakiểucấutrúclàdùngđểbiểudiễntậpcácgiátrịkháckiểu,tuynhiênvớitậpgiátrịcùngkiểuhiểnnhiênvẫncóthểđượcbiểudiễnbằngkiểucấutrúcvàtrongnhiềutrườnghợpýnghĩacủađốitượngsẽrõrànghơnsovớikhibiểudiễnbởikiểumảng.Vídụ,chươngtrướctađãtừngbiểudiễnphânsốbởimảng2thànhphầnvớingầmđịnhthànhphầnthứnhấtlàtửvàthànhphầnthứhailàmẫu.Dữliệuphânsốnàycũngcóthểđượcbiểudiễnbởicấutrúcnhưsau:

dànhchohộiđồngnghiệmthu
6.1Kiểudữliệutrừutượngbằngcấutrúc(struct)121structFraction{intnumerator;intdenomirator;};Vớicáchbiểudiễnnày,cácthànhphầntửvàmẫucủaphânsốđềuđãđượcđặttênthayvìphảingầmđịnhnhưcáchbiểudiễndạngmảng.Tươngtự,mộtngàythángcóthểđượckhaibáo:structDate{intday;intmonth;intyear;}holiday={1,5,2000};mộtbiếnholidaycũngđượckhaibáokèmcùngkiểunàyvàđượckhởitạobởibộsố1,5,2000.Cácgiátrịkhởitạonàylầnlượtgánchocácthànhphầntheođúngthứtựtrongkhaibáo,tứcday=1,month=5vàyear=2000.Vìcácthànhphầnday,month,yearcùngkiểuintnêncũnggiốngkhaibáocácloạibiếnkhác,chúngcóthểđượcgộptrênmộtdòng(vẫngiữđúngthứtự):structDate{intday,month,year;}holiday={1,5,2000};Kiểucấutrúccũngcóthểchứathànhphầnlàkiểucấutrúc.Vídụ,trongkiểusinhviênđượckhaibáoởtrên,tacóthểthaytrườngnămsinh(birth_year)bởitrườngcóchứacảngàythángnămsinhnhư:structStudent{charname[30];Datebirthday;doublemark;}monitor={"NguyenVanAnh",{1,1,1992},8.7},x;thànhphầnbirthdaycủaStudentcókiểuDatecũnglàmộtcấutrúc,khiđócáchkhởitạogiátrịchobiếnmonitorcũngđãđượcthayđổichophùhợptừviệcchỉkhởitạo1992chothànhphầnbirth_yeartrongkhaibáocũthành{1,1,1992}chotrườngbirthdaytrongkhaibáomới.KiểucấutrúcClassdướiđâydùngchứathôngtinvềmộtlớphọcgồmtênlớp,vàdanhsáchsinhviêncũnglàmộtvídụminhhọachoviệckếthợpcácloạikiểukhácnhautrongcùngmộtkiểu.structClass{charname[10],//xâukítựStudentlist[MAX];//mảngcấutrúc};Têncácthànhphầnđượcphéptrùngnhautrongcáccấutrúckhácnhau,vídụnamexuấthiệntrongcảhaicấutrúcStudentvàClass.Giốngcácbiếnmảng,đểlàmviệcvớimộtbiếncấutrúc,trongmộtsốthaotácchúngtaphảithựchiệntrêntừngthànhphầncủachúng.Vídụđểvào/ramộtbiếncấutrúctaphảiviếtcâulệnhvào/rachotừngthànhphầnnhưtrongvídụtrên.

dànhchohộiđồngnghiệmthu
122CáckiểudữliệutrừutượngTuynhiên,maymắnhơnsovớicáchlàmviệccủamảng,đólà2cấutrúcđượcphépgán(=)giátrịchonhaumộtcáchtrựctiếp,trongkhimảngchỉcóthểgántừngthànhphần.Phépgántrựctiếpnàycũngtươngđươngvớiviệcgántừngthànhphầncủacấutrúc.Vídụ:Studentmonitor={"NVA",{1,1,1992},5.0};Studentgood_stu;good_stu=monitor;Chúý:khônggánbộgiátrịcụthểchobiếncấutrúc.Cáchgánnàychỉthựchiệnđượckhikhởitạo.Vídụ:Studentgood_stu;good_stu={"NVA",{1,1,1992},5.0};//sai1#include<iostream>2#include<iomanip>3usingnamespacestd;45intmain()6{7constintNUM_OF_STUDENTS=3;8structDate9{10intday,month,year;11};12structStudent13{14charname[30];15Datebirthday;16doublemark;17};18Studentmonitor={"BillGate",{1,11,2001},5.0};19Studentother_student;20other_student=monitor;21other_student.birthday.year=2002;//Datlainamsinh2223cout<<"Name:"<<other_student.name<<endl;24cout<<"Birthday:"<<other_student.birthday.day<<"/"<<other_student.birthday.month<<"/"<<other_student.birthday.year<<endl;25cout<<"Mark:"<<other_student.mark<<endl;262728return0;29}Hình6.1:Gáncácbiếncấutrúc.Chúý:Mặcdùhaicấutrúccóthểđượcgánchonhau(=)nhưngchúnglạikhôngsosánh(==)đượcvớinhau,trừphitaphảisosánhtừngthànhphầncủachúng.6.1.2HàmvàcấutrúcĐốicủahàmlàcấutrúcMộtcấutrúccóthểđượcsửdụngđểlàmđốicủahàmdướicácdạngsauđây:

dànhchohộiđồngnghiệmthu
6.1Kiểudữliệutrừutượngbằngcấutrúc(struct)123•Làmộtbiếncấutrúc,khiđógiátrịtruyềnlàmộtcấutrúc.•Làmộtthamchiếucấutrúc,giátrịtruyềnlàmộtcấutrúc.•Làmộtcontrỏcấutrúc,giátrịtruyềnlàđịachỉcủamộtcấutrúc.Dạngtruyềntheodẫntrỏsẽđượctrìnhbàytrongchương7củagiáotrình.Nhìnchung,mộtcấutrúclàkiểudữliệulớn,chiếmnhiềubộnhớvàvìvậymấtnhiềuthờigiansaochépnêndạngtruyềntheothamchiếuđượcsửdụngthườngxuyênhơntruyềntheogiátrị,Đểtránhthayđổigiátrịbiếnngoàithườngtakhaibáothamđốikiểuthamchiếudướidạngconst.Vídụsauđâychophéptínhchínhxáckhoảngcáchcủa2ngàythángbấtkỳcũngnhưthứcủamộtngàytháng.Vềmặtdữliệu,kiểungàytháng(Date)sẽđượckhaibáodạngtoàncục.MảnghằngintNUM_DAYS[13]cungcấpsốngàycốđịnhcủacáctháng(NUM_DAYS[i]làsốngàycủathángi),tháng2vẫnxemlà28ngày,nếugặpnămnhuậnsốngàycủatháng2đượccộngthêm1.Chươngtrìnhgồmcáchàm:•intbissextile_year(intyear):Hàmtrảlại1nếuđốiyearlànămnhuậnvà0nếungượclại.Nămnhuậnlànămchiahếtcho4nhưngkhôngchiahếtcho100,tuynhiênnếuchiahếtcho400thìnămlạinhuận.•intnum_days_of_month(intmonth,intyear):Hàmtrảlạisốngàycủatháng(month)trongnămyear,đơngiảnhàmlấydữliệutừmảngNUM_DAYSchosẵnvànếumonth=2vàyearlànămnhuậnthìcộngthêm1.•longDtoN(Datedate)(DatetoNumeric).Hàmchuyểntươngđươngmộtngàythángthànhmộtsốnguyêndàilàsốngàytínhtừ1/1/1đếndate.Vềmặtthuậttoán,hàmsẽtínhsốngàyđãquatừnăm1chođếnnămyear–1.Mỗinămđượccộngthêm365hoặc366ngày.Tiếptheocộngthêmsốngàytừtháng1đếnthángmonth–1củanămhiệntại(sốngàycủatừngthángđượclấythôngquahàmnum_days_of_month)vàcuốicùngcộngthêmsốngàyhiệntại(day).•DateNtoD(longn)(NumerictoDate).Hàmchuyểntươngđươngmộtsốnguyênthànhngàytháng(quanniệmsốnguyênlàsốngàytínhtừ1/1/1đếnsốngàycầnchuyển).Vềmặtthuậttoán,hàmsẽtrừdần365hoặc366ngàyđểtínhtănglênmộtnăm,sốngàycònlại(béhơn365hoặc366)sẽđượcchuyểnsangthángvàngàytheocáchtươngtự.•longDistance_Dates(Datedate1,Datedate2):Hàmtrảlạikhoảngcáchgiữahaingàytháng,đơngiảnlà:DtoN(date1)-DtoN(date2);•Đểtínhthứcủamộtdate,hàmchọnmộtngàyđãbiếtthứ(vídụngày1/1/2000đãbiếtlàthứbảy)vàlấykhoảngcáchvớidate.Dothứđượclặplạitheochukỳ7ngàynênnếukhoảngcáchnàychiahếtcho7(phầndưlà0)thìthứcủadatecũngchínhlàthứcủangàyđãbiết,hoặcdựatrênphầndưcủakhoảngcáchvới7tacóthểsuyđoánrathứcủadate.Tronghìnhlàchươngtrìnhvàoutput.1#include<iostream>2usingnamespacestd;3