24/05/2018, 15:58

Chuỗi với nội dung cố định (String)

C# xem những chuỗi như là những kiểu dữ liệu cơ bản tức là các lớp này rất linh hoạt, mạnh mẽ, và nhất là dễ sử dụng. Mỗi đối tượng chuỗi là một dãy cố định các ký tự Unicode. Nói cách khác, các phương thức được dùng để làm thay đổi một chuỗi thực sự trả về ...

C# xem những chuỗi như là những kiểu dữ liệu cơ bản tức là các lớp này rất linh hoạt, mạnh mẽ, và nhất là dễ sử dụng. Mỗi đối tượng chuỗi là một dãy cố định các ký tự Unicode. Nói cách khác, các phương thức được dùng để làm thay đổi một chuỗi thực sự trả về một bản sao đã thay đổi, chuỗi nguyên thủy không thay đổi. Khi chúng ta khai báo một chuỗi C# bằng cách dùng từ khóa string, là chúng ta đã khai báo một đối tượng của lớp System.String, đây là một trong những kiểu dữ liệu được xây dựng sẵn được cung cấp bởi thư viện lớp .NET (.NET Framework Class Library). Do đó một kiểu dữ liệu chuỗi C# là kiểu dữ liệu System.String, và trong suốt chương này dùng hai tên hoán đổi lẫn nhau.

  • Cách khai báo chuỗi: Để khai báo chuỗi theo kiểu này ta thực hiện như sau:

string Tênchuỗi;

Ví dụ:

string hoTen, queQuan;

string s;

Như chúng ta đã biết chuỗi là một kiểu dữ liệu tham chiếu, một chuỗi chẳng qua là một đối tượng thuộc lớp System.String. Với khai báo trên ta mới chỉ thu được tên của đối tượng chuỗi đặt trong stack còn nội dung cấp phát cho nó thì chưa có. Để tạo nội dung cho chuỗi ta thực hiện theo cách như sau:

  • Tạo nội dung cho chuỗi

string hoTen= “Nguyen Huu Dong”;

string donViCongTac;

Ta thấy rằng khi khai báo hai chuỗi hoTen và donViCongTac thì biến xấu được cấp phát trong Stack, còn nội dung thực sự của chuỗi được cấp phát trong Heap. Trong ví dụ trên thì ngay từ đầu xâu hoTen đựơc cấp vùng nhớ với nội dung là “Nguyen Huu Dong” trong Heap, còn xâu donViCongTac thì chỉ có biến xâu trong Stack và phần nội dung thì chưa có.

Giả sử sau đó ta gán cho xau donViCongTac một xâu là ”Khoa CNTT”. donViCongTac=”Khoa CNTT”

Sau khi gán cho xâu donViCongTac xâu “Khoa CNTT” lúc đó ta có

Như vậy ta thấy rằng chuỗi là một kiểu dữ liệu tham chiếu với biến chuỗi thì đặt trong Stack và nội dung thực sự của chuỗi thì đặt trong Heap.

Chuỗi có thể chứa các ký tự đặc biệt: , ,  ,....

Ví dụ:

string diaChi= “Nguyen Huu Dong Khoa CNTT-DHSPKTHY”

Khi hiển thị ta được nội dung sau:

Nguyen Huu Dong

Khoa CNTT-DHSPKTHY

Chuỗi cũng có thể được tạo bằng cách sử dụng chuỗi cố định hay nguyên văn (verbatim), tức là các ký tự trong chuỗi được giữ nguyên không thay đổi. Chuỗi này được bắt đầu với biểu tượng @. Biểu tượng này bảo với hàm khởi dựng của lớp String rằng chuỗi theo sau là nguyên văn, thậm chí nó chứa nhiều dòng hoặc bao gồm những ký tự escape....

Ví dụ:

string diaChi=@”Nguyen Huu Dong

Khoa CNTT-DHSPKTHY”;

Khi hiển thịta thu được nội dung sau:

Nguyen Huu Dong

Khoa CNTT-DHSPKTHY

  • Cách truy nhập vào các phần tử của xâu

Để truy nhập vào các phần tử của xâu, chúng ta thực hiện theo nguyên tắc: TênXau[chỉ số] với chỉ số ∈ [0..TênXau.Length-1]

  • Thao tác trên chuỗi

Lấy tổng chuỗi: Tổng của hai hay nhiều chuỗi kết quả cho ta là một chuỗi.

string firstName= “Dong”;

string lastName=”Nguyen Huu”;

string fullName= lastName + “ “ +firstName;

Khi đó chuỗi fullName có nội dung là: Nguyen Huu Dong

Gán chuỗi

string hoTen1=”Nguyen Van A”;

string hoTen2=”NguyenVan B”;

Nếu ta thực hiện:

hoTen1=hoTen2;

Lúc này ta có:

donViCongTacTa thấy rằng sau khi gán xâu hoTen2 cho xâu hoTen1 thì hai xâu hoTen1 và hoTen2 đều trỏ vào cùng một vùng nhớ. Tức là hai xâu hoTen1 và hoTen2 là có vai trò như nhau.

 Chúng ta không lên so sánh trực tiếp hai xâu với nhau, hay gán trực tiếp hai xâu cho nhau.v.v... mà ta sẽ sử dụng các hàm trong lớp lớp string. Lớp string cung cấp rất nhiều các hàm để so sánh, tìm kiếm và thao tác trên xâu, các hàm này được trình bày trong bảng sau:

  • Ví dụ áp dụng

Ví dụ 1: Nhập vào một xâu ký tự s. sau đó thực hiện các yêu cầu sau:

  1. Đếm tổng số ký tự không phải là ký tự chữ số có trong xâu s
  2. Đếm số lần xuất hiện của xâu “mua xuan” trong xâu s
  3. Chỉ ra trong xâu s một xâu con có độ dài lớn nhất chứa toàn các ký tự chữ số.
  4. Đưa ra màn hình các từ có ở trong xâu. Biết rằng giữa các từ được đặt cách nhau bởi dấu: [‘.’ , ’ ‘ , ‘!’ , ‘?’ , ‘.’]

---------------------------------------------------------------------------------------------

using System;

class BaiXau

{

static int demKhongChuSo(string s)

{

int d=0;

for(int i=0;i<s.Length;++i)

if(!(s[i]>='0' && s[i]<='9')) d++;

return d;

}

static int demXauCon(string con, string s)

{

int d=0;

for(int i=0;i<s.Length-con.Length+1;++i)

if(string.Compare(con,s.Substring(i,con.Length))==0) d++;

return d;

}

static string timXauLon(string s)

{

string tmp="";

string max="";

for(int i=0;i<s.Length;++i)

{

if(s[i]>='0' && s[i]<'9')

tmp=tmp+s.Substring(i,1);

else if(tmp.Length>0)

{

if(max.Length<tmp.Length)

max=string.Copy(tmp);

tmp="";

}

}

return max;

}

static void hienTu(string s)

{

Console.WriteLine("Cac tu co o trong xau");

char[]dau={' ','?','.','!'};

foreach(string con in s.Split(dau))

if(con.Length>0)

Console.WriteLine(con);

}

static void Main()

{

string s;

Console.Write("Nhap xau:");s=Console.ReadLine();

//Câu a

Console.WriteLine(" So ky tu la:" + demKhongChuSo(s));

//Câu b

Console.WriteLine("So cum tu mua xuan co trong xau:"

+demXauCon("mua xuan",s));

//Câu c

Console.WriteLine("Xau can tim la:" + timXauLon(s));

//Câu d

hienTu(s);

Console.ReadKey();

}

}

---------------------------------------------------------------------------------------------

Ví dụ 2: Tìm tất cả các số tự nhiên không quá n sao cho số đó trùng với phần cuối của bình phương chính nó. Chẳng hạn:62=36; 252=625

---------------------------------------------------------------------------------------------

using System;

class BaiXau

{

static bool KiemTra(long i)

{

bool ok;

string s=Convert.ToString(i*i);

string con=i.ToString();

if(string.Compare(s.Substring(s.Length-con.Length,con.Length),con)==0)

ok=true;

else

ok=false;

return ok;

}

static void Main()

{

long n;

Console.Write("Nhap n=");n=long.Parse(Console.ReadLine());

Console.WriteLine("Cac so thoa ma yeu cau bai toan:");

for(long i=1;i<=n;++i)

if(KiemTra(i))

Console.WriteLine(i+ "-->"+i*i );

Console.ReadKey();

}

}

---------------------------------------------------------------------------------------------

Ví dụ 3: Nhập vào một xâu ký tự s. Sau đó thực hiện các yêu cầu sau:

  1. Xoá đi trong xâu s các dấu cách thừa: ở bên trái, bên phải và dấu cách thừa ở giữa xâu, gữa các từ chỉ để lại một dấu cách
  2. Xoá đi tất cả các xâu con có nội dung là “mua xuan” có ở trong xâu s
  3. Sắp xếp các từ trong xâu s theo thứ tự từ điển
  4. Đếm tần xuất xuất hiện của các từ có trong xâu s

Chú ý: Từ là các ký tự viết liền nhau và cách nhau bởi dấu cách

---------------------------------------------------------------------------------------------

using System;

class BaiXau

{

static string LTrim(string s)

{

string tmp=string.Copy(s);

while(tmp[0]==' ') tmp=tmp.Remove(0,1);

return tmp;

}

static string RTrim(string s)

{

string tmp=string.Copy(s);

while(tmp[tmp.Length-1]==' ') tmp=tmp.Remove(tmp.Length-1,1);

return tmp;

}

static string Trim(string s)

{

string tmp=string.Copy(s);

tmp=LTrim(tmp);tmp=RTrim(tmp);

while(tmp.IndexOf(" ")>0)

tmp=tmp.Remove(tmp.IndexOf(" "),1);

return tmp;

}

static string Xoa(string con, string s)

{

string tmp=string.Copy(s);

while(tmp.IndexOf(con)>0)

tmp=tmp.Remove(tmp.IndexOf(con),con.Length);

return tmp;

}

static void catTu(string s,ref string []tu)

{

int d=0;

foreach(string con in s.Split(' '))

if(con.Length>0)

{

Array.Resize(ref tu,++d);

tu[d-1]= con;

}

}

static string sapXep(string []tu)

{

Array.Sort(tu);

string tmp="";

for(int i=0;i<tu.Length;++i)

tmp=tmp+" "+tu[i];

return tmp;

}

static void tanXuat(string []tu)

{

string []tmp=null;

int i,j,d=0;

bool ok;

for(i=0;i<tu.Length;++i)

{

ok=true;

for(j=0;j<d;++j)

if(string.Compare(tmp[j],tu[i])==0) ok=false;

if(ok)

{

Array.Resize(ref tmp,++d);

tmp[d-1]=string.Copy(tu[i]);

}

}

Console.WriteLine("Tan xuat xuat hien cua cac tu la:");

for(j=0;j<tmp.Length;++j)

{

d=0;

for(i=0;i<tu.Length;++i)

if(string.Compare(tu[i],tmp[j])==0) d++;

if(d>0) Console.WriteLine("Tu {0} xuat hien {1} lan",tmp[j],d);

}

}

static void Main()

{

string s,tmp;

Console.Write("Nhap xau:");s=Console.ReadLine();

//Cau a

tmp=Trim(s);

Console.WriteLine("Xau sau khi xoa:{0}",tmp);

//Cau b

tmp=Xoa("mua xuan",s);

Console.WriteLine("Xau sau khi xoa:{0}",tmp);

//Cau c

string []tu=null;

catTu(s,ref tu);

Console.WriteLine("Xau sau khi sap xep:"+sapXep(tu));

//Cau d

tanXuat(tu);

Console.ReadKey();

}

}

0