Tài liệu Lập trình C# từ cơ bản đến nâng cao: Phần 2 gồm nội dung từ chương 8 đến chương 13. Nội dung phần này trình bày các nội dung về file, chuỗi kĩ tự, multithreading, lập trình Windows với C#, lập trình cơ sở dữ liệu.
Trang 1ChươNq 8 F ì I esKhi cần lưii dữ liệu vào đĩa, cung cấp một cơ ch ế để thite hiện giống như mọi ngôn ngữ khác Có hai cách ghi và đọc dử liệu vào íiles; kiểu file íext và kiểu file nhị phân.
8. 1 G H I / Đ Ọ C F I L E T E X T
ỉ<hi viết chương trinh để luu dữ liệu vảo fi!e, ta phải thêm dòng tiêu đề;
using System.10;
8.1.1 Ghi d ữ liệu v ã o file
Cú pháp để ghi dữ liệu vào íile:
Trang 2Chú ý: Một cách khác đ ể ghi d ữ iiệu vào file Tniớc hếỉ phải khai
báo biến file:
StreanMriter sw;
Tạo tìle text nhờ hàm CreateYextQ:
s t a t l c s t r in g f i l e l * " c : \ \ t e s t f i l e t x t " ;
sw •= F i l e C r e a t e T e x t ( f i l e l ) ;
Trang 3I ?
Ghi dữ liệu vào file:
sw W riteL inerT his i s a t e x t " ) ;
Sau khi ghi xong dữ liệu cần phải đóng file lại
sw.WriteLine{"Dai hoc Bach Khoa Ha N oi.");
sw.WriteLine("Trung tam Genetic Singapore.");
Trang 4s t r i n g input;
s r l * F i l e O p e n T e x t ( f ile l) ;
input « srl.ReadToEnđ0 ;
C on sole.W riteL in e(in p u t);
Console VíriteLine (** The end o f the stream!” );
Daí hoc Bach Khoa Ha Noi
Trung tam Genetic Singapore
Trang 68 2 G H I/Đ Ọ C FILE NHỊ PH Â N
Việc ghi/đọc dữ liệu của file nhị phân có nhiều ưu điểm hcAi ỉile text
vì bảo mật file cao hơn ở đây sỗ trình bày cách ghi/đọc dữ liệu cho một byte và cách ghi/đọc dữ liệu cho một đối tượng chúÈi nhiều trường dữ iiệu
- Ghi dữ liệu vào file kiểu byte:
+ Giả sử ta khai báo một biến mảng kiểu
Trang 7& Ví dụ 8.4. Ví dụ này cho phép ta ghi và đọc các số có kiểu byte (giá trị 0 ^ 255).
Trang 8Ta có thể thực hiện việc ghi/đọc dữ liệu của nhiều kiểu dữ liệu khác nhau bằng file nhị phân.
- Ghi dữ liệu từ íile nhị phân;
s t r i n o f i l e l = " c : \ \ F i l e B i n l d a t " ;
FileStreâfn f i l e l ;
s t r i n g name; //d ữ l i ê u thành viên
double Sâlary; //d ừ l i ê u thành viên
/ / khai bảo đ6i tượng wf cho v iê c ghi vào f i l e nhị phán
B in ary W riter wf * new B i n a r ỵ W r i t e r ;
/ / Các hàm Write {) để g h i từng thảnh vỉén
wf,Write(name);
w f.W rite(sa la ry ) /
“ Đọc dữ liệu từ íilc nhị phân:
Khai báo file cần đọc:
riieS trea m f i l e l ;
Khai báo đối tưỢng rf cho việc đọc:
BinarỵReađer r f « new B in a r y R e a d e r (filô l);
Trang 9p u b lic void Show()
Console.WriteLine(’'Ten: *'+name+''; Tuoi: ’.'+age);
109
Trang 10C on sole.W riteL in eL u on g: **+saLary);
)
p u b lic void SaveData(FileStream f i l e l )
Console • VíriteLine (" 1, Nhap du l i e u ” );
Console WriteLine <"2• Doc va xem " );
Console WriteLine (” 3 • Thoat” );
Trang 11Câse ” 1*’ : Console.WriteLine Save data to
EileStream fwr * new r ile S t r e a m (fiie n a m e ,
EileM ođe C rea te, r i l e A c c e s s Write^ r i l e S h a r e W r ite );
c a se ” 2": Consoie.WriteLine ("Read dâtâ from f i l e ” );
F ilestream f r new F ile S t r e a m ( f iie n a m e , PileMode.Open,
Trang 123 Thoat
Nhap so 1 - 3 de lua chon: 1
Save daĩa to file
Nhap ten: Hoa
Nhap so 1 - 3 de lua chon: 2
Read data from file
Ten: Hoa; Tuoi; 22
Trang 13Console.MriteLine ("Ten ” -*-najne+” ; Tuoi:" ;
Console WriteLine("Luong: "+ sa lâ r y );
Trang 14FileStream fwr * new FileStream (filenam e, FileMode.Create,
F ileA ccess,W rite/ F ileS h are.w rit e ) ;
-Console,W riteLine{’* Doc du l í e u tu f i l e ” );
FileBin3 [ ] p i “ new FileBini^ n] ;
rileStream f r = new FileStream (filenam e, rileMode.Open, PileAccess.Read, r ile S h â r e Read);
Trang 15^ ^ K ể t quả:
Nhap n = 2
Ghi du lieu vao fìle
Nhap ten: Mai
Doc du lieu tu fìle
Ten: Mai: Tuoi: 22
Luong: 1000
Doc du lieu tu file
Ten; Ha; Tuoi; 32
Luong; 2000
G v i dụ 8 7 Xây dựng m ột menu để th ụ t hiện các thao tác: Nhập, liệt
kê, xoá, sửa tim kiêm, bổ sung
using System; //C o n so ie A p p lica tio n
Trang 16Console WriteLine ("person { 0) " , i ) ;
Console.VỉriteLine ("Enter name: " );
Trang 17C o n so le.V ỉriteL in e ("Name; f CỊ ; ID: ( l } ; a g e : 12}",
Trang 18Console.W riteLine("Enter name: ” );
p{ i] name “ Console ReaoLine () ;
C onsole.K riteL inerE nter ID: '•);
Trang 19Console.VíriteLine(” Bnter ID: ” );
fị nì ID » Int64,Pârse{Console.R6ddLine{));
Console.W riteLineTEnter age: ");
p( n] ,age ® Int32.Parse (Console.ReađLineO );
C onsole WriteLine r* MENU ” );
Console.W riteLine(" 1 Input D a t a ’M;
C onsole-VíriteLiner 2 L is t A ll **);
Console WriteLine r 3• Edit (Name) ");
C onsole.writ e L i n e r 4 Search Name ");
Console.WriteLine(" 5, Search ID " ) /
Console.W riteLine(" 6, Delete
Console.W riteLine(** 7, Append");
Trang 20case 5: p er.S ea rch lù d ;break;
Ndmp :Nga ; 1 0 11 1 I^9e : 26
tình ; 10 333 r ^99 : 28 MENU
Hình 8.3
Vi d ụ 8 8 Ví dụ này đuục coi là một bài tập dài trong cuốn Lập trình
c # từ cơ bản đến nâng cao Yẻu cầu của bài tập này như sau;
Công ty tmyền thông ABC giữ vai trò quan trọng trong sự phát triển
Trang 21vé công nghiệp điện thoại cùa khu vụt Yêu cầu bạn phải phát triển một
hệ thống thông tin để quản lý bằng máy tính vể điện thoại nhằm cung cấp cho khách hàng sự hỗ trỢ những thông tin cần thiết-
Các yêu cầu đặt ra như sau:
2 Dử liệu này cần phải được:
a) Khcfi tạo nhờ hàm tạo (constructor)
b} Truy cập dữ liệu nhờ sử dụng thuộc tính (properties)
3 Lớp phone phải có phương thức để lưu đối tượng nhờ iớp PiieStream
4 Tạo một lcfp phone book để lưu toàn bộ lớp phone vào trong một mảng
5 Trong lớp phone book phải sửdụng Indexer để sao cho ta có thể truy cập vào tCíng phần tử của mảng phone
6 Ngưcí sử dụng phải thựt hiện đưỢc các chủt năng sau:
a) Add New (thêm bản ghi mới)
b) Edií (sửa đổi một bản ghi)
c) Delete {xoá một bản ghi)
d) Tim một bằn ghi trong mảng phone {tìm theo tên và tìm theo số
điện thoại)
e) Hiển thị các số đ ệ n thoại khẩn cấp
Duứi đây liệt kê toàn bộ chương trình của bài tập dài nêu trên
/* ProgrartBning using c# - Examples
' P roject 1: Telephone in q u irỵ system
121
Trang 22• In c ld s s PhoneBook: an array c f phcnes i s implemented
th is^ ad d ress * ađdress/
t h i3 .no0 fLine “ noOfLine;
get{ return phoneNun*iber;)
setí phoneNumber » v a lu e;l
}
p u b ỉic s t r in g FuliName
n.dị^wỀmi.JtíM
122
Trang 23uet{ r e t u r n íullKame;}
se ti fullKame « value;)
p u b l i c S ũ r i n g A t í d r e i ^ s
get{ return th is â d đ r e s s ;}
set{ address = value;)
oet ị return type;}
set{ type = value;i
Console,W rite r F u ll name: '•) ;
fullName « Consolế.R eadLineO ;
C onsole Write í” Address: ” ) /
address * C onsole ReadLine();
C onsole.W rite(”No o f i i n e : ,
noOfLine « In r3 2.P arsetC on sole.R ead L in e());
Console.Vírite("Tỵpe: " );
Trang 24type * Console.ReadLine();
organ izâtion « Console.ReadLine ();
Return (String.Format (’* Phone: { 0) \nName: { ỉ}\nAddress:
{ 2) \n L in e: { 3} \ n T ^ e : { 4} \nOrg: ( 5} phoneNumber, fullName, addresố, noOíLine, type, o r g a n iz a tio n ));
Trang 26thisỊ index} Input 0 ;
C o n s3le.W riteL in er Done" i !
Trang 29case 7: / / Load from f i l e
Console.WriteLine (** 1 Add a Phone" );
Console.WriteLine (" 2 Edit a Phone’' );
Console.WriteLine r* 3 De l e t e d Phone" );
Console VíriteLine ự* 4 Search d Phone" );
Console.WriteLine (** 5, Display PhoneBook” );
Consòle WriteLine 6 Save to
Console.WriteLine r 7 Load from f ile " );
Console.WriteLine ("8 Display Emergency Numbers");
C onsoie.w riteLine C’ 9* E xit” ) ;
Trang 30Console WriteLine {’* Enter Phone i n f c ;
Phone phonê » new Phone {);
Trang 31Console Write ('* Enter Name: **);
Console Write (" Enter Phone Nuraber:
ulong t e l - UInt64 Parse(Console.ReadLỉne( ) ) ;
Console Write ("XnEnter index o f Phone to e d i t : ” );
i n t i = Ĩn t3 2 Parse (Console ReadLine {));
i i s t E d i t ( i );
1
s t a t i c void D eleteO
{
Consoỉe.Mrite ("\nEnter index o f Phone t o đ e le t e : '*);
i n t i = Int32 Parse (Console ReadLine ( ) ) ;
File* D ele te(fileN a m e);
//remove pre*stored f i l e i f any
rileStream f s = new FiÌeStreâíTi(fileName, rileMode.Appenđ, FileA ccess.W rite, FileSharevW rite);
BinarỵWriter bw ® new B in a ry W riter(fsì;
Trang 32fo r (in t i = 0; i < list.C o u n t; ++i)
FileStream f s =■ new FileStreajn(fileNarae, FíleMode.Open,
F ile A c c e s s Read, F ileS h a re Bead);
BinaryReader br = new BinaryReađer(fs);
Console.M riteliine C' P o lic e i 113") ỉ ■
C onsole.w rit e L in e (” P o lic e : 114")/
Console.WriteLine c* P o lic e : 115")!
}
}
132
Trang 33Sau khi biên địch và chạy chương trình, ta có kết quả như trên hình 8-4 Khi đó chọn một yêu cầu tưcíig ứrtg vcrt một phím số đ ể cung cấp dịch vụ cần thiết Ví dụ:
~ Để lưu số liệu vào ổ đĩa cífrig gô số 6 vcrt File nâme: nn 1 dat
- Khi chạy lại chương ừinh, gõ số 7 và gọi tập tin nằm m ặc đính trong thư mục chứa chưcíng trình Các bạn có thể gô đưdừig dẫn cho tập
tin C :\n n l.d a t và khi đọc tậ p tin này cũng phải có đường dẫn
■ C : \ g e n e t i c 0 6 \ B a i t a p d a i G e n \ B a i t a p d a i G e n \ b i n \ D e b
1 1
L Ê X
ì Load from f ile
3 Diỉpiày Emsrgency Mjiiiberủ
ĩnter yo iir choice- 5
'ianc/ũrganiration Phaíi cong Kgo / Dh 8ach khũS Ha noi
■í;idrFi3 Giap bât Hă noi
'í â - í / O r ạ â n i r a t i o n - PbôJi Bao ưan / I8H ị
Trang 34ChươNq 9 Chuồi k ỷ T ự (s T R ÌN q )
xử !ý chuối trong các ngôn ngữ lập trinh là hết sứt cần thiết Trong
có nhiều hám (phưtfng ửiức) thư viện để thực hiện việc xử lý chuỗi
tự Sau đây ta S€ xét một số phương thức cơ bản
9.1 PHƯ ƠNG THỨC STRING.FORMAT()
Phương thức này cho phép ta định dạng một chuỗi kết hợp nhiều dạng khác nhau
Ngay gio hien hanh: 8/15/2Ũ07 2:35:45 PM
9 ^ PHƯ ƠNG THỪC CONCATO
Phương thúc này cho phép nối các chuỗi vcrt nhau thành m ột chuỗi lớn hơn
9.2.
using System;
Trang 35s c a t i c void Main(stringí 1 args)
Hello and welcome to you
Heiio— and— welcome— to— you
135
Trang 36Nếu có một chuỗi s l = "Hello beautiíui world!", s2 = "Viet nam", khi
th ụ t hiện câu lệnh: sl.CopyTo(6, s2, 0, 4) trong đó 6 là vi ừí bắt đẳu
M ch các phần tử của chuỗi s l, 0 là vậ trí đầu tiên để copy chuỗi mcfi vào.
4 là độ dài chuỗi cắn copy vào.
Trang 37C onsole WriteLine(mchar);
sl.CopyTo(6, s2, 0, 4);
/ / 6 l ã v ị t r í đẩu của chuỗi cán t r íc h ra
/ / 0 l à v ị t r í đầu của chuỗi mới
s1: Hello beautiíul vvorid !
9.6 PHƯƠNG THỨC TRIMSTART(), TRỈMEND(), TRIMQ
Phương thút TrimSíartO cho phép cắt bỏ ký tự trắng ở đầu chuỗi Phưcừig thức TrimEndO cho phép cắt bỏ tự trắng ở cuối chuỗi Phưc^g thức TrimO cho phép cắt bỏ ký tự trắng ở hai đầu chuỗi
s t r in g s l « Big **; / / c o h a i dau cach h a i ben
Console WriteLine (" Heiloí 0} Worlđ*, s l ) ;
s t r in g s2 « s l.T r im S t a r t0 ; / / c a t bo dau cach dau chuoi Console WriteLine (" Heilo( 0} Worlđ: ", s 2 ) ;
s2 - s l TrimEnd (); / / c a t bo dau cach cu oi chuoi
Console WriteLine ự* Hello{ 0} World: ", s 2 ) ;
Trang 38s2 “ s l TrimO; / / c a t bo cac dâu cach ca h a i phia cua chuoi Console.WriteLine (” Hello( 0} World: s 2 ) ;
Console.ReadLine (); «
)
)
Hello Big World // có cả 2 dấu cách hai bên
HetloBig Wor1d //cắt bỏ các dấu cách đầu (bên trái)
Heỉlo BigVVorld // cắt bỏ các dấu cách cuối (bên phải)
HelloBigVVorld // cát bỏ cả 2 dấu cách đầu và cuối {hai bên)
9.7 PH Ư Ơ N G THỨC REMOVEO, PADLEFT{), PADRIGHTQ
Phương thíte RemoveO cho phép cắt bỏ các phần tử của chuỗi từ vị trí m và có độ dài n.
Phương thứ t PadLeítO cho phép điển một ký tự mcí vào phía trái mộỉ chuỗi đã cho để lấp đầy n ký tự cửa chuỗi (bao gồm cả tự mé^) Phương thức PadRÌghtO cho phép điển một ký tự mcS vào phía phải
m ột chuỗi đâ cho để lấp đầy n ký tự của chuỗi (bao gồm cả ký tự m tì).
s t r ln g s l ■ "H ello B e a u tifu l World";
C o n so le.W riteL in e(sl);
Trang 39•**’ **“ *Hello Beautitul VVortd
Hello Beautitul VVorld"” * " * '
Phưcmg thửc String.Equals{sl, s2); trả vể giá ừị írue nếu hai chuỗi s l
® s2, trả vể giá trị false nếu hai chuỗi s l và s2 khác nhau
Trang 409.9 PHƯƠNG THỨ C XÁC Đ ỊN H C H U Ỗ l C O N ĐẦU VÀ CUỐI
Đổi thành chữ hoa và chữ thuởng.
Cho các chuổi s l = "Hello World";
s2 - "Hello":
s3 - '^Vorld":
Phương thứt sl.StartsWith(s2); cho phép ta so sánh chuỗi s2 với từ đầu tiên củâ chuồi s l Nếu chựng bằng nhau sẽ trả v | giá trị true Nếu chúng khác nhau sẽ trả về giá trị false.
Phương thức sl.ToUpperO; sẻ đổi toàn bộ ký tự của chuỗi s l thành
ký tự hoa.
Phương thút sl.ToLo\A«rO; sẽ đổi toàn bộ ký tự của chuỗi s l ứiành
Trang 41Consoie MriteLine ( s ĩ S ta rtsW ith {s2 ));
C onsolô.W riteLine{sl.EndsW ith(s2));
Console.WriteLine ( s l StartsW ith ( s 3 ) );
C onsole.W riteL ine(sl ToUpper {)) ;
Console ;WriteLine ( s l ToLover ( ) ) ;
Cho chuỗi s l = "Helio World";
Phương tíiức sl.IndexO f(’o'); cho ta biết ký tự ‘o’ đầu tiên trong chuỗi s l có vị trí n (tính vị trí đều tiên là 0).
141
Trang 42HiUơng thút sl.LastlndexOf(T): cho ta biết ký tự ‘1’ cuối cùng của chuỗi s l có vị ừí m.
s t r in g Drive = s S u b str in g íO ,s.In d ex O í(" \\" ) ) ;
s t r i n g Path = s.R em ove{s.L astInd exO f ) ,
s.L e n g th s.L a stIn đ e x O f ( 0"\ ") ) /
s t r in g filename = s.S u b strin g(s.L astln d exO í(Ễ " \" )+1);
strin g extension = filename.Substring(filename.Inde>aDf ;
Trang 43Console.VỉriceLine C'Drive: f0, 15) Path: { 1)\nFilename
{2, 12} Extension: { 3} " , Drive, Path, f ilen a m e,ex ten sio n );
Console BeadLine() ;
^ ^ K ế í quả;
Enter string to parse
c:\CS0807\Data\file1 ,dat
Drive: c Path; c:\CS080AData
Piiename: file1.dat Extension; daỉ
1 4 3
Trang 44ChươNq 10 MULTITHREADINC (Đ a luồNq)
Luồng (threađ) là trình tự th ụ t hiện trong chươíig trinh Tất cả các chương trinh c # cho đến nay chỉ có một điểm vào (entry poiní) - hàm MainQ Việc thựt hiện chương trình được bắt đáu vái câu lệnh đầu tiên của hàm MainO và tiếp tục cho tctí iúc phương thút đưỢc trả vể Cấu trúc chương trình kiểu như th ế này rất h(Ị^ lý cho những chii^ng trình trong
đó chỉ có m ột trình tự thựt hiện xác định sẵn
Khi một chương trình cần đọtì một cái gi đó xảy ra, chẳng hạn nhập ứìông tin vào, downIoad tập tin từ Internet thi toàn bộ chương trình phải chờ cho tới khi công việc đó xong xuôi rồi mctì tiếp tục chạy đưỢc Chương trinh đift?c phân nhánh thành các chương trình con, chúng được gọi là luồng (thread)
Tuy nhiên thông thifờng một chutmg trình cần thụt hiện nhiều việc đồng thời, ví dụ khi khởi động trình duyệt Internet Explorer flE) cần phải thực hiện ít nhất ba nhiệm vụ sau:
- Lấy dữ liệu cho trang đưa về từ E
- Trinh bày ừang
- Xem xét đối với bất kỳ đầu vào nào của ngưctì sử dụng và có thể chl ra rằng ngưỂtì sử dụng muốn lE làm thứ gì khác nữa
Tinh huống tưbng tự có thể áp dụng cho bắt cứ tntòng hợp nào mà chương trình ứ iụt hiện m ột vài việc, đổng ứictí lúc này vẫn hiển ửiị hộp thoại cho phép bạn cơ hội để huỷ bỏ nhiệm vụ hiện hầnh
Một chương trìhh khi chạy có thể phải làm nhiểu việc đổng
Hiểu ứĩuật ngữ "đồng ửỉờí" không phải là ngay cùng m ột th<M điểm (onemoment) mà là một khoảng thcrt gian hữu hạn Ý tưởng về luồng (thread)
có nghĩa là thụt hiện nhiều việc cùng khoảng thời gian có sự phân định tùhg mẩu thời gian nhỏ cho từhg việc C’time slice” hay là "íor a short of periođ of time") Thông thường m ột máy tính chỉ có m ột vi xử lý và nó
cũng chì làm đuọc một việc b một thời điểm nhất định Việc một máy túih
- một vi xử lý làm nhiều việc ngay lập tứt, đồng thcrt là điều vô lý, không
tưởng C hút năng "đa nhiệm" (multitasking) cũng là m ột cách m à luồng
144