5.2.4 Mảng đa chiều cú kớch khỏc nhau

Một phần của tài liệu Bài giảng môn kỹ thuật lập trình C# potx (Trang 80 - 91)

- Sơ đồ cỳ phỏp

5.2.4 Mảng đa chiều cú kớch khỏc nhau

5.2.4 Mảng đa chiều cú kớch khỏc nhau

Như chỳng ta đó biết hỡnh dạng của mảng đa chiều cựng kớch thước cú dạng hỡnh chữ nhật thỡ hỡnh dạng của mảng đa chiều cú khớch thước khỏc nhau khụng phải hỡnh chữ nhật vỡ cỏc chiều của chỳng khụng điều nhau.

Khi chỳng ta tạo một mảng đa chiều kớch thước khỏc nhau thỡ chỳng ta khai bỏo số dũng trong mảng trước. Sau đú với mỗi dũng sẽ giữ một mảng, cú kớch thước bất kỳ. Những mảng này được khai bỏo riờng. Sau đú chỳng ta khởi tạo giỏ trị cỏc thành phần trong những mảng bờn trong.

 Cỏch khai bỏo

<kiểu dữ liệu> [][] tờn mảng=new <kiểu dữ liệu>[kớch thước hàng][] ; hoặc

<kiểu dữ liệu> [][] tờn mảng; ...

tờn mảng=new <kiểu dữ liệu>[kớch thước hàng][] ;

Sau đú ta tiến hành cấp phỏt bộ nhớ cho cỏc phần tử của mỗi hàng tờnmảng[chỉ số]=new <kiểu dữ liệu>[số phần tử của mỗi hàng] Vớ dụ:

int a[][]a;

a=new int[3][];

a[0]=new int[6]; // Hàng thứ nhất cú 6 phần tử a[1]=new int[2]; // Hàng thứ nhất cú 2 phần tử a[2]=new int[5]; // Hàng thứ nhất cú 5 phần tử  Truy nhập vào cỏc phần tử của mảng

Để truy nhập vào cỏc phần tử của mảng đa chiều cú kớch khụng bằng nhau ta cú thể thực hiện theo nguyờn tắc sau:

Tờnmảng[chớ số 1][chỉ số 2]

chớ số 1 ∈ [0...Tờnmảng.Length-1]

chớ số 2 ∈ [0...Tờnmảng[chớ số 1].Length-1]

Vớ dụ: Nhập vào n dóy số nguyờn sau đú tỡm giỏ trị lớn nhất của mỗi dóy lưu vào một mảng một chiều và sẵp xếp chỳng theo thứ tự tăng dần.

--- using System;

class VisDu {

static int[][] a; static void Nhap() {

int i,j,n,m;

Console.Write("Ban muon nhap vao bao nhieu day so nguyen n="); n = int.Parse(Console.ReadLine());

a = new int[n][];

Console.WriteLine("Ban hay nhap thong tin cho moi day so nguyen"); for (i = 0; i < a.Length; ++i)

{

Console.Write("Ban hay nhap so phan tu cho day thu {0} m=", i); m = int.Parse(Console.ReadLine());

a[i] = new int[m];

Console.WriteLine("Nhap gia tri cho moi phan tu o day thu {0}", i); for (j = 0; j < a[i].Length; j++) { Console.Write("a[{0}][{1}]=", i, j); a[i][j] = int.Parse(Console.ReadLine()); } } }

static void Tim(out int[] kq) {

int i, j, d=0,max; kq = null;

for (i = 0; i < a.Length; ++i) {

max = a[i][0];

for (j = 1; j < a[i].Length; ++j) if (max < a[i][j]) max = a[i][j]; Array.Resize(ref kq, ++d);

kq[d - 1] = max; }

}

static void Hien(int []x) {

int i;

for (i = 0; i < x.Length; ++i) Console.Write("{0}\t", x[i]); Console.WriteLine();

}

static void Main() {

int[] kq; Nhap(); Tim(out kq); Array.Sort(kq);

Console.WriteLine("Cac phan tu lon nhat cua moi day da duoc sap xep la"); Hien(kq); Console.ReadKey(); } } --- 5.3 Kiểu dữ liệu xâu(chuỗi)

Cú một thời gian người ta luụn nghĩ rằng mỏy tớnh chỉ dành riờng cho việc thao tỏc cỏc giỏ trị dạng số. Cỏc mỏy tớnh đầu tiờn là được thiết kế để sử

dụng tớnh toỏn số lượng lớn như tớnh toỏn quỹ đạo của tờn lửa trong quốc phũng. Và ngụn ngữ lập trỡnh được giảng dạy ở khoa toỏn của cỏc đại học lớn.

Ngày nay, hầu hết cỏc chương trỡnh liờn quan đến nhiều chuỗi ký tự hơn là cỏc chuỗi cỏc con số. Thụng thường cỏc chuỗi được sử dụng cho việc xử lý từ ngữ, thao tỏc trờn cỏc sưu liệu, và tạo ra cỏc trang web.

Ngụn ngữ C# hỗ trợ khỏ đầy đủ cỏc chức năng của kiểu chuỗi mà chỳng ta cú thể thấy được ở cỏc ngụn ngữ lập trỡnh cấp cao khỏc. Điều quan trọng hơn là ngụn ngữ C# xem những chuỗi như là những đối tượng và được đúng gúi tất cả cỏc thao tỏc, sắp xếp, và cỏc phương thức tỡm kiếm thường được ỏp dụng cho chuỗi ký tự.

Những thao tỏc chuỗi phức tạp và so khớp mẫu được hỗ trợ bởi việc sử dụng cỏc biểu thức quy tắc (regular expression). Ngụn ngữ C# kết hợp sức mạnh và sự phức tạp của cỳ phỏp biểu thức quy tắc, (thụng thường chỉ được tỡm thấy trong cỏc ngụn ngữ thao tỏc chuỗi như Awk, Perl), với một thiết kế hướng đối tượng đầy đủ.

Trong phần này chỳng ta sẽ học cỏch làm việc với kiểu dữ liệu string của ngụn ngữ C#, kiểu string này chớnh là một alias của lớp System.String của .NET Framework. Chỳng ta cũng sẽ thấy được cỏch rỳt trớch ra chuỗi con, thao tỏc và nối cỏc chuỗi, xõy dựng một chuỗi mới với lớp StringBuilder. Thờm vào đú, chỳng ta sẽ được học cỏch sử dụng lớp Regex để so khớp cỏc chuỗi dựa trờn biểu thức quy tắc phức tạp.

Trong C# đưa ra hai loại chuỗi, một là chuỗi với nội dung khụng thể thay đổi được(String), hai là chuỗi với nội dung cú thể thay đổi được (StringBuilder).

5.3.1 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ề 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.

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ú

Stack Heap

hoTen

donViCongTac

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: \t , \n, \b ,.... Vớ dụ:

string diaChi= “Nguyen Huu Dong\nKhoa 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. Stack Heap hoTen donViCongTac NgyenHuuDong KhoaCNTT

donViCongTac

Stack Heap

hoTen1 Nguyen Van A

Nguyen Van B hoTen2

Stack Heap

hoTen1 Nguyen Van A

Nguyen Van B hoTen2

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ú:

Ta 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:

a) Đếm tổng số ký tự khụng phải là ký tự chữ số cú trong xõu s b) Đếm số lần xuất hiện của xõu “mua xuan” trong xõu s

c) 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ố.

d) Đư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; 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

//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; 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.ReadKey(); }

}

Một phần của tài liệu Bài giảng môn kỹ thuật lập trình C# potx (Trang 80 - 91)

w