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ốngnhautathểsửdụngkiểumảng.Tuynhiên,trongthựctếrấtnhiềudữliệutậpcáckiểudữliệukhácnhautậphợplại,dụlịchcủamỗingườigồmnhiềukiểudữliệukhácnhaunhưhọtên,tuổi,giớitính,mứclươngđểquảndữliệukiểunàyC++đưarakiểudữliệucấutrúc.Kiểucấutrúcgiốngkiểumảngchỗcùngquảnmộ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ọitrường)sẽđượctruycậpthôngquatêngọicủathànhphầnđó.Điểmgiốngvàkhácnhaunữagiữakiểumảngvàcấutrúccácthànhphầnđượclưutrữliêntiếpnhautrongbnhớ,tuynhiênsốbytescủatừngthànhphầntrongkiểucấutrúckhácnhau,khácvớikiểumảngđộdàicủacácthànhphầnnàygiốngnhauchúngcùngkiểu.dụ,trongchươngtrìnhquảnđiểmtốtnghiệpcủasinhviên,mỗisinhviênsẽmộtđốitượngítnhất3thànhphầndữliệucầnphảilà:họtên,nămsinh,điểmtốtnghiệp.Đểquảnđốitượngsinhviênnhưtrêntathểydựngkiểucấutrúcnhưsau:structStudent{charname[30];intbirth_year;doublemark;};Lưuý,đâyStudentđượcgọithẻtên(identifier_tag)củakiểucấutrúcchứkhôngphảitênbiến.ĐểđơngiảntathểgọikiểucầutrúcStudenthayngắngọnkiểuStudent(nhưcáckiểuchuẩnint,double,bool,).TrongkiểuStudentchứa3thànhphầnvớikiểukhácnhau:xâutự,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ântheophá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,gồmkiểuvàtênthànhphần.Mộtthànhphầncũngcònđượcgọitrường(field).Phầntên(tag)củakiểucấutrúcvàphầndanhsáchbiếnthểhoặckhông.Tuynhiêntrongkhaibáotựkếtthúccuốicùngphảidấuchấmphẩy(;).Cáckiểucấutrúcđượcphépkhaibáolồngnhau,nghĩamộtthànhphầncủakiểucấutrúcthểlạimộttrườngkiểucấutrúckhác.Mộtbiếnkiểucấutrúcsẽđượcphânbbnhớsaochocácthànhphầncủađượcsắpknhauliêntụctheothứtựxuấthiệntrongkhaibáo.Khaibáobiếnkiểucấutrúccũnggiốngnhưkhaibáocácbiếnkiểusởdướidạng:structidentifier_taglist_of_var;//kiểutrongChoặctheoC++thểbỏquatừkhóastruct:identifier_taglist_of_var;//trongC++Cácbiếnđượckhaibáocũngthểđikèmkhởitạo:identifier_tagvar1={created_value},var2,...;dụkhaibáokiểuStudent:structStudent{charname[30];intbirth_year;doublemark;}monitor={NguyenVanAnh,1992,8.7},x;Trongkhaibáotrên,tađãđồngthờikhaibáo2biếnkiểuStudentmonitor(lớptrưởng)vàx,trongđóxchưađượckhởitạovàmonitorđượckhởitạovớihọtênNguyễnVânAnh,sinhnăm1992vàđiểmtốtnghiệp8.7.KhicầnkhaibáothêmbiếnkiểuStudent,thểtheopháp,dụ:Studentvice_monitor,K58[60],y;Trongkhaibáotrên,vice_monitor,ycácbiếnđơn,K58mộtmảngcácthànhphầncủacácsinhviên,dụdùngđểbiểudiễndữliệucủamộtlớphọc.Ưuđiểmcủakiểucấutrúcdùngđểbiểudiễntậpcácgiátrịkháckiểu,tuynhiênvớitậpgiátrịcùngkiểuhiểnnhiênvẫnthểđượcbiểudiễnbằngkiểucấutrúcvàtrongnhiềutrườnghợpýnghĩacủađốitượngsẽrànghơnsovớikhibiểudiễnbởikiểumảng.dụ,chươngtrướctađãtừngbiểudiễnphânsốbởimảng2thànhphầnvớingầmđịnhthànhphầnthứnhấttửvàthànhphầnthứhaimẫu.Dữliệuphânsốnàycũngthểđượ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ênthayphảingầmđịnhnhưcáchbiểudiễndạngmảng.Tươngtự,mộtngàythángthểđượckhaibáo:structDate{intday;intmonth;intyear;}holiday={1,5,2000};mộtbiếnholidaycũngđượckhaibáokèmcùngkiểuyvàđượckhởitạobởibsố1,5,2000.Cácgiátrịkhởitạoylầnlượtgánchocácthànhphầntheođúngthứtựtrongkhaibáo,tứcday=1,month=5vàyear=2000.cácthànhphầnday,month,yearcùngkiểuintnêncũnggiốngkhaibáocácloạibiếnkhác,chúngthểđượcgộptrênmộtdòng(vẫngiữđúngthứtự):structDate{intday,month,year;}holiday={1,5,2000};Kiểucấutrúccũngthểchứathànhphầnkiểucấutrúc.dụ,trongkiểusinhviênđượckhaibáotrên,tathểthaytrườngnămsinh(birth_year)bởitrườngchứacảngàythángnămsinhnhư:structStudent{charname[30];Datebirthday;doublemark;}monitor={"NguyenVanAnh",{1,1,1992},8.7},x;thànhphầnbirthdaycủaStudentkiểuDatecũngmộtcấutrúc,khiđócáchkhởitạogiátrịchobiếnmonitorcũngđãđượcthayđổichophùhợptừviệcchỉkhởitạo1992chothànhphầnbirth_yeartrongkhaibáothành{1,1,1992}chotrườngbirthdaytrongkhaibáomới.KiểucấutrúcClassdướiđâydùngchứathôngtinvmộtlớphọcgồmtênlớp,vàdanhsáchsinhviêncũngmộtdụminhhọachoviệckếthợpcácloạikiểukhácnhautrongcùngmộtkiểu.structClass{charname[10],//xâutựStudentlist[MAX];//mảngcấutrúc};Têncácthànhphầnđượcphéptrùngnhautrongcáccấutrúckhácnhau,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.dụđểvào/ramộtbiếncấutrúctaphảiviếtcâulệnhvào/rachotừngthànhphầnnhưtrongdụtrên.
dànhchohộiđồngnghiệmthu
122CáckiểudữliệutrừutượngTuynhiên,maymắnhơnsovớicáchlàmviệccủamảng,đó2cấutrúcđượcphépgán(=)giátrịchonhaumộtcáchtrựctiếp,trongkhimảngchỉthểgántừngthànhphần.Phépgántrựctiếpnàycũngtươngđươngvớiviệcgántừngthànhphầncủacấutrúc.dụ:Studentmonitor={"NVA",{1,1,1992},5.0};Studentgood_stu;good_stu=monitor;Chúý:khônggánbgiátrịcụthểchobiếncấutrúc.Cáchgánnàychỉthựchiệnđượckhikhởitạo.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ặchaicấutrúcthểđượ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àmcấutrúcMộtcấutrúcthểđượ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)123mộtbiếncấutrúc,khiđógiátrịtruyềnmộtcấutrúc.mộtthamchiếucấutrúc,giátrịtruyềnmộtcấutrúc.mộtcontrỏcấutrúc,giátrịtruyềnđịachỉcủamộtcấutrúc.Dạngtruyềntheodẫntrỏsẽđượctrìnhytrongchương7củagiáotrình.Nhìnchung,mộtcấutrúckiểudữliệulớn,chiếmnhiềubnhớvàvymấ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.dụsauđâychophéptínhchínhxáckhoảngcáchcủa2ngàythángbấtkỳcũngnhưthứcủamộtngàytháng.Vmặ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]sốngàycủathángi),tháng2vẫnxem28ngà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đốiyearnămnhuậnvà0nếungượclại.Nămnhuậnnă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àyearnămnhuậnthìcộngthêm1.longDtoN(Datedate)(DatetoNumeric).Hàmchuyểntươngđươngmộtngàythángthànhmộtsốnguyêndàisốngàytínhtừ1/1/1đếndate.Vmặtthuậttoán,hàmsẽtínhsốngàyđãquatừnăm1chođếnnămyear1.Mỗinămđượccộngthêm365hoặc366ngày.Tiếptheocộngthêmsốngàytừtháng1đếnthángmonth1củ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ênsốngàytínhtừ1/1/1đếnsốngàycầnchuyển).Vmặ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ếtthứbảy)vàlấykhoảngcáchvớidate.Dothứđượclặplạitheochukỳ7ngàynênnếukhoảngcáchnàychiahếtcho7(phần0)thìthứcủadatecũngchínhthứcủangàyđãbiết,hoặcdựatrênphầncủakhoảngcáchvới7tathểsuyđoánrathứcủadate.Tronghìnhchươngtrìnhvàoutput.1#include<iostream>2usingnamespacestd;3