Cỏc hàm thư viện xử lý chuỗi

Một phần của tài liệu bài giảng kỹ thuật lập trình ths. trần xuân thanh - khoa cntt, đh thành đô (Trang 32 - 105)

Cỏc hàm xử lý ký tự và chuỗi ký tự cú trong thư viện <string.h>, <ctype.h>:

Cộng chuỗi - Hàm strcat()

Cỳ phỏp: char *strcat(char *des, const char *source)

Hàm này cú tỏc dụng ghộp chuỗi nguồn vào chuỗi đớch.

Vớ dụ: Nhập vào họ lút và tờn của một người, sau đú in cả họ và tờn của họ lờn màn hỡnh. #include<conio.h>

#include<stdio.h> #include<string.h> int main(){

char HoLot[30], Ten[12];

printf("Nhap Ho Lot: ");gets(HoLot); printf("Nhap Ten: ");gets(Ten);

strcat(HoLot,Ten); /* Ghep Ten vao HoLot*/ printf("Ho ten la: ");puts(HoLot);

getch(); return 0; }

Xỏc định độ dài chuỗi - Hàm strlen()

Cỳ phỏp: int strlen(const char* s)

Vớ dụ: Sử dụng hàm strlen xỏc định độ dài một chuỗi nhập từ bàn phớm. #include<conio.h> #include<stdio.h> #include<string.h> int main(){ char Chuoi[255]; int Dodai;

printf("Nhap chuoi: ");gets(Chuoi); Dodai = strlen(Chuoi)

printf("Chuoi vua nhap: ");puts(Chuoi); printf(“Co do dai %d”,Dodai);

return 0; }

Đổi một ký tự thường thành ký tự hoa - Hàm toupper()

Hàm toupper() (trong ctype.h) được dựng để chuyển đổi một ký tự thường thành ký tự hoa. Cỳ phỏp: char toupper(char c)

Đổi chuỗi chữ thường thành chuỗi chữ hoa, hàm strupr()

Hàm struppr() được dựng để chuyển đổi chuỗi chữ thường thành chuỗi chữ hoa, kết quả trả về của hàm là một con trỏ chỉ đến địa chỉ chuỗi được chuyển đổi.

Cỳ phỏp: char*strupr(char *s)

Vớ dụ: Viết chương trỡnh nhập vào một chuỗi ký tự từ bàn phớm. Sau đú sử dụng hàm strupr() để chuyển đổi chỳng thành chuỗi chữ hoa.

#include<conio.h> #include<stdio.h> #include<string.h> int main(){

char Chuoi[255],*s;

printf("Nhap chuoi: ");gets(Chuoi); s=strupr(Chuoi) ;

printf(“Chuoi chu hoa: ”);puts(s); getch();

return 0; }

Đổi chuỗi chữ hoa thành chuỗi chữ thường, hàm strlwr()

Muốn chuyển đổi chuỗi chữ hoa thành chuỗi toàn chữ thường, ta sử dụng hàm strlwr(), cỏc tham số của hàm tương tự như hàm strupr()

Cỳ phỏp: char *strlwr(char *s)

Sao chộp chuỗi, hàm strcpy() (adsbygoogle = window.adsbygoogle || []).push({});

Hàm này được dựng để sao chộp toàn bộ nội dung của chuỗi nguồn vào chuỗi đớch. Cỳ phỏp: char*strcpy(char *Des, const char *Source)

Vớ dụ: Viết chương trỡnh cho phộp chộp toàn bộ chuỗi nguồn vào chuỗi đớch. #include<conio.h>

#include<stdio.h> #include<string.h> int main()

char Chuoi[255],s[255];

printf("Nhap chuoi: ");gets(Chuoi); strcpy(s,Chuoi);

printf(“Chuoi dich: ”);puts(s); getch();

return 0; }

Sao chộp một phần chuỗi, hàm strncpy()

Hàm này cho phộp chộp n ký tự đầu tiờn của chuỗi nguồn sang chuỗi đớch. Cỳ phỏp: char *strncpy(char *Des, const char *Source, size_t n)

Trớch một phần chuỗi, hàm strchr()

Để trớch một chuỗi con của một chuỗi ký tự bắt đầu từ một ký tự được chỉ định trong chuỗi cho đến hết chuỗi, ta sử dụng hàm strchr().

Cỳ phỏp :char *strchr(const char *str, int c)

Ghi chỳ:

- Nếu ký tự đó chỉ định khụng cú trong chuỗi, kết quả trả về là NULL.

- Kết quả trả về của hàm là một con trỏ, con trỏ này chỉ đến ký tự c được tỡm thấy đầu tiờn trong chuỗi str.

Tỡm kiếm nội dung chuỗi hàm strstr(): Hàm strstr() được sử dụng để tỡm kiếm sự xuất hiện đầu tiờn của chuỗi s2 trong chuỗi s1.

Cỳ phỏp: char*strstr(const char *s1, const char *s2)

Kết quả trả về của hàm là một con trỏ chỉ đến phần tử đầu tiờn của chuỗi s1 cú chứa chuỗi s2 hoặc giỏ trị NULL nếu chuỗi s2 khụng cú trong chuỗi s1.

Vớ dụ: Viết chương trỡnh sử dụng hàm strstr() để lấy ra một phần của chuỗi gốc bắt đầu từ chuỗi “hoc”. #include<conio.h> #include<stdio.h> #include<string.h> int main() { char Chuoi[255],*s;

printf("Nhap chuoi: ");gets(Chuoi); s=strstr(Chuoi,”hoc”);

printf(“Chuoi trich ra: ”);puts(s); getch();

}

So sỏnh chuỗi, hàm strcmp(): Để so sỏnh hai chuỗi theo từng ký tự trong bảng mó Ascii, ta cú thể sử dụng hàm strcmp().

Cỳ phỏp: int strcmp(const char *s1, const char *s2)

Hai chuỗi s1 và s2 được so sỏnh với nhau, kết quả trả về là một số nguyờn (số này cú được bằng cỏch lấy ký tự của s1 trừ ký tự của s2 tại vị trớ đầu tiờn xảy ra sự khỏc nhau).

- Nếu kết quả là số õm, chuỗi s1 nhỏ hơn chuỗi s2. - Nếu kết quả là 0, hai chuỗi bằng nhau.

- Nếu kết quả là số dương, chuỗi s1 lớn hơn chuỗi s2.

So sỏnh chuỗi, hàm stricmp(): Hàm này thực hiện việc so sỏnh trong n ký tự đầu tiờn của 2 chuỗi s1 và s2, giữa chữ thường và chữ hoa khụng phõn biệt.

Cỳ phỏp: int stricmp(const char *s1, const char *s2)

Kết quả trả về tương tự như kết quả trả về của hàm strcmp() (adsbygoogle = window.adsbygoogle || []).push({});

Khởi tạo chuỗi, hàm memset() :Hàm này được sử dụng để đặt n ký tự đầu tiờn của chuỗi là ký tự c. Cỳ phỏp:memset(char *Des, int c, size_t n)

Đổi từ chuỗi ra số, hàm atoi(), atof(), atol() (trong stdlib.h)

Để chuyển đổi chuỗi ra số, ta sử dụng cỏc hàm trờn.

Cỳ phỏp : int atoi(const char *s) : chuyển chuỗi thành số nguyờn long atol(const char *s) : chuyển chuỗi thành số nguyờn dài float atof(const char *s) : chuyển chuỗi thành số thực Nếu chuyển đổi khụng thành cụng, kết quả trả về của cỏc hàm là 0.

Ngoài ra, thư viện string.h cũn hỗ trợ cỏc hàm xử lý chuỗi khỏc, ta cú thể đọc thờm trong phần trợ giỳp.

Danh sỏch cỏc thư viện hàm hay dựng:

Thư viện vào/ra (nhập/xuất) : <stdio.h>

Xử lý ký tự và chuỗi ký tự :<string.h>, <ctype.h>

Thư viện hàm toỏn học :<math.h>, <float.h>

Thời gian, ngày thỏng :<time.h>, <locale.h>

Cấp phỏt bộ nhớ động :<stdlib.h>

Cỏc hàm ký tự rộng :<wchar.h>, <wctype.h>

Chương 4. CÁC CẤU TRÚC RẼ NHÁNH 4.1 Cỏc điều kiện rẽ nhỏnh

Một chương trỡnh thường khụng chỉ bao gồm cỏc lệnh tuần tự nối tiếp nhau. Trong quỏ trỡnh chạy nú cú thể rẽ nhỏnh hay lặp lại một đoạn mó nào đú. Để làm điều này chỳng ta sử dụng cỏc cấu trỳc điều khiển.

Cựng với việc giới thiệu cỏc cấu trỳc điều khiển chỳng ta cũng sẽ phải biết tới một khỏi niệm mới:

khối lệnh, đú là một nhúm cỏc lệnh được ngăn cỏch bởi dấu chấm phẩy (;) nhưng được gộp trong một khối giới hạn bởi một cặp ngoặc nhọn: { và }.

Hầu hết cỏc cấu trỳc điều khiển mà chỳng ta sẽ xem xột trong chương này cho phộp sử dụng một lệnh đơn hay một khối lệnh làm tham số, tuỳ thuộc vào chỳng ta cú đặt nú trong cặp ngoặc nhọn hay khụng.

4.2 Phỏt biểu if-else

Cấu trỳc này được dựng khi một lệnh hay một khối lệnh chỉ được thực hiện khi một điều kiện nào đú thoả món. Dạng của nú như sau:

4.2.1. Cỳ phỏp if đơn: if (condition) statement

Trong đú condition là biểu thức điều kiện sẽ được tớnh toỏn. Nếu điều kiện đú là true, statement

được thực hiện. Nếu khụng statement bị bỏ qua (khụng thực hiện) và chương trỡnh tiếp tục thực hiện lệnh tiếp sau cấu trỳc điều kiện.

Vớ dụ, đoạn mó sau đõy sẽ viết x is 100 chỉ khi biến x chứa giỏ trị 100: if (x = = 100)

cout << "x is 100";

Nếu chỳng ta muốn cú hơn một lệnh được thực hiện trong trường hợp conditiontrue chỳng ta cú thể chỉ định một khối lệnh bằng cỏch sử dụng một cặp ngoặc nhọn { }:

Vớ dụ:

if (x == 100) { cout << "x is "<<x; }

Chỳng ta cũng cú thể chỉ định điều gỡ sẽ xảy ra nếu điều kiện khụng được thoả món bằng cỏch sửu dụng từ khoỏ else. Nú được sử dụng cựng với if như sau:

4.2.2. Cỳ phỏp if - else: if (condition) statement1 else statement2 Vớ dụ:

else cout << "x is not 100"; (adsbygoogle = window.adsbygoogle || []).push({});

Cấu trỳc if + else cú thể được múc nối để kiểm tra nhiều giỏ trị. Vớ dụ sau đõy sẽ kiểm tra xem giỏ trị chứa trong biến x là dương, õm hay bằng khụng.

if (x > 0) cout << "x is positive"; else if (x < 0) cout << "x is negative"; else cout << "x is 0";

4.3 Phỏt biểu if-else lồng

Phỏt biểu if-else lồng nhau trong trường hợp cỏc phỏt biểu if-else lại nằm trong cỏc phỏt biểu if-else khỏc.

Vớ dụ: 1) Giải phương trỡnh ax+b=0

2) Giải phương trỡnh ax2 + bx + c = 0

4.4 Phỏt biển switch

Cỳ phỏp của lệnh switch hơi đặc biệt một chỳt. Mục đớch của nú là kiểm tra một vài giỏ trị hằng cho một biểu thức, tương tự với những gỡ chỳng ta làm ở đầu bài này khi liờn kết một vài lệnh if và else if

với nhau. Dạng thức của nú như sau:

Cỳ phỏp: switch (expression) { case constant1: block of instructions 1 break; case constant2: block of instructions 2 break; default:

default block of instruction }

Nú hoạt động theo cỏch sau: switch tớnh biểu thức và kiểm tra xem nú cú bằng constant1 hay khụng, nếu đỳng thỡ nú thực hiện block of instructions 1 cho đến khi tỡm thấy từ khoỏ break, sau đú nhảy đến phần cuối của cấu trỳc lựa chọn switch.

Cũn nếu khụng, switch sẽ kiểm tra xem biểu thức cú bằng constant2 hay khụng. Nếu đỳng nú sẽ thực hiện blockof instructions 2 cho đến khi tỡm thấy từ khoỏ break.

Cuối cựng, nếu giỏ trị biểu thức khụng bằng bất kỡ hằng nào được chỉ định ở trờn (bạn cú thể chỉ định bao nhiờu cõu lệnh case tuỳ thớch), chương trỡnh sẽ thực hiện cỏc lệnh trong phần default: nếu nú tồn tại vỡ phần này khụng bắt buộc phải cú.

Hai đoạn mó sau là tương đương:

vớ dụ switch if-else tương đương

switch (x) { case 1: cout << "x is 1"; break; case 2: cout << "x is 2"; break; default:

cout << "value of x unknown"; } if (x == 1) { cout << "x is 1"; } else if (x == 2) { cout << "x is 2"; } else {

cout << "value of x unknown"; }

4.5 Biểu thức điều kiện

C++ cú một toỏn tử rất mạnh và thớch hợp để thay thế cho cỏc cõu lệnh của If- Then-Else. Cỳ phỏp của việc sử dụng toỏn tử “?” là: E1 ? E2 : E3;

Trong đú E1, E2, E3 là cỏc biểu thức.

í nghĩa: Trước tiờn E1 được ước lượng, nếu đỳng E2 được ước lượng và nú trở thành giỏ trị của biểu thức; nếu E1 sai, E2 được ước lượng và trở thành giỏ trị của biểu thức.

Thỡ y được gỏn giỏ trị 100, nếu x nhỏ hơn 9 thỡ y sẽ nhận giỏ trị là 200.

Vớ dụ: Đoạn mó này tương đương cấu trỳc if như sau: x=10;

y = (x<9) ? 100 : 200; // tương đương với x = 10;

if (x < 9) y = 100; else y = 200;

4.6 Khai bỏo enum

Kiểu enum là một kiểu dữ liệu đặc biệt được dựng để định nghĩa một quan hệ thứ tự cho một tập họp hữu hạn cỏc tờn. (Trong thực tế thỡ enum cú kiểu là int):

Vớ dụ: enum Wiki {Arisa, Bluesman, VietBio, Trung, Quang, Minh}; (adsbygoogle = window.adsbygoogle || []).push({});

Để khai bỏo biến wiki cú kiểu enum dựng cõu lệnh:

enum wiki;

Cỏc giỏ trị (hiểu ngầm) của cỏc kớ hiệu Arisa, Bluesman, VietBio, Trung, Quang,

Minh theo mặc định sẽ tương ứng với 0, 1, 2, 3, 4, 5. Cỏc cõu lệnh cỏch viết sau đõy là cú hiệu lực:

if (member == VietBio) { do_some_commands }

for (member=Arisa; member <= Trung; member++) { do_some_commands }

Như vậy, theo mặc định, cỏc tờn của một enum được xem là cỏc hằng số từ 0 tăng dần cho đến tờn cuối cựng.

Tuy nhiờn, C++ khụng loại trừ khả năng xếp lại giỏ trị của một kiểu enum theo cỏch riờng:

Vớ dụ: enum reordert={duck,cat=10, mouse =50, elephant =1000, lion, virus};

Trong thớ dụ trờn thỡ duck cú giỏ trị tương ứng là 0, cat là 10, ..., elephant là 1000, cũn lion

tương ứng với giỏ trị 1001 và virus tương ứng với 1002.

Một trong những ứng dụng chớnh của kiểu này là để tăng cường khả năng đọc mó được dể hiểu hay phự hợp hơn.

Chương 5. CÁC CẤU TRÚC LẶP 5.1 Vũng lặp while

Cỳ phỏp:while (expression) statement

và chức năng của nú đơn giản chỉ là lặp lại statement khi điều kiện expression cũn thoả món.

Vớ dụ, chỳng ta sẽ viết một chương trỡnh đếm ngược sử dụng vào lặp while:

// custom countdown using while #include <iostream.h>

int main () {

int n;

cout << "Enter the starting number > "; cin >> n; while (n>0) { cout << n << ", "; - - n; } cout << "FIRE!"; return 0; }

Enter the starting number > 8 8, 7, 6, 5, 4, 3, 2, 1, FIRE!

Khi chương trỡnh chạy người sử dụng được yờu cầu nhập vào một số để đếm ngược. Sau đú, khi vũng lặp while bắt đầu nếu số mà người dựng nhập vào thoả món điều kiện điều kiện n>0 khối lệnh sẽ được thực hiện một số lần khụng xỏc định chừng nào điều kiện (n>0) cũn được thoả món.

Chỳng ta cần phải nhớ rằng vũng lặp phải kết thỳc ở một điểm nào đú, vỡ vậy bờn trong vũng lặp chỳng ta phải cung cấp một phương thức nào đú để buộc condition trở thành sai nếu khụng thỡ nú sẽ lặp lại mói mói. Trong vớ dụ trờn vũng lặp phải cú lệnh - - n; để làm cho condition trở thành sai sau một số lần lặp.

5.2 Vũng lặp for

Cỳ phỏp: for (initialization; condition; increase) statement;

Chức năng chớnh của nú là lặp lại statement chừng nào condition cũn mang giỏ trị đỳng, như trong vũng lặp while. Nhưng thờm vào đú, for cung cấp chỗ dành cho lệnh khởi tạo và lệnh tăng. Vỡ vậy vũng lặp này được thiết kế đặc biệt lặp lại một hành động với một số lần xỏc định.

Cỏch thức hoạt động của nú như sau:

Initialization (biểu thức 1) được thực hiện. Núi chung nú đặt một giỏ khớ ban đầu cho biến điều khiển. Lệnh này được thực hiện chỉ một lần.

condition (biểu thức 2) được kiểm tra, nếu nú là đỳng vũng lặp tiếp tục cũn nếu khụng vũng lặp kết thỳc và statement được bỏ qua.

statement được thực hiện. Nú cú thể là một lệnh đơn hoặc là một khối lệnh được bao trong một cặp ngoặc nhọn. (adsbygoogle = window.adsbygoogle || []).push({});

Cuối cựng, increase (biểu thức 3) được thực hiện để thay đổi biến điều khiển và vũng lặp quay trở lại kiểu tra điều kiện condition.

Sau đõy là một vớ dụ đếm ngược sử dụng vũng for. // countdown using a for loop #include <iostream.h> int main () { for (int n=10; n>0; n--) { cout << n << ", "; } cout << "FIRE!"; return 0; } 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FIRE!

Phần khởi tạo và lệnh tăng khụng bắt buộc phải cú. Chỳng cú thể được bỏ qua nhưng vẫn phải cú dấu chấm phẩy ngăn cỏch giữa cỏc phần. Vỡ vậy, chỳng ta cú thể viết for (;n<10;) hoặc for (;n<10;n++).

Bằng cỏch sử dụng dấu phẩy, chỳng ta cú thể dựng nhiều lệnh trong bất kỡ trường nàotrong vũng

for, như là trong phần khởi tạo. Vớ dụ chỳng ta cú thể khởi tạo một lỳc nhiều biến trong vũng lặp: for ( n=0, i=100 ; n!=i ; n++, i-- )

{

// cỏi gỡ ở đõy cũng được...

}

Vũng lặp này sẽ thực hiện 50 lần nếu như n và i khụng bị thay đổi trong thõn vũng lặp:

5.3 Cỏc vũng lặp lồng

Trong trường hợp cỏc vũng lặp lại chứa cỏc vũng lặp khỏc.

Vớ dụ: Tớnh giỏ trị của biểu thức: S = 2! + 4! + 6! + … + n!; (n nhập vào từ bàn phớm). #include <iostream.h>

int main(){ int n;

cout<<”\n n=”; cin>>n; int gt=1,s=0;

for(int i=2; i<=n;i=i+2) {

for (int j=1;j<=i;j++) gt=gt*j;

s=s+gt; gt=1; } cout << “\n S=” <<s; return 0; }

5.4 Vũng lặp do-while

Cỳ phỏp: do statement while (condition);

Chức năng của nú là hoàn toàn giống vũng lặp while chỉ trừ cú một điều là điều kiện điều khiển vũng lặp được tớnh toỏn sau khi statement được thực hiện, vỡ vậy statement sẽ được thực hiện ớt nhất một lần ngay cả khi condition khụng bao giờ được thoả món. Vớ dụ, chương trỡnh dưới đõy sẽ viết ra bất kỡ số nào mà bạn nhập vào cho đến khi bạn nhập số 0.

// number echoer #include <iostream.h> int main () { unsigned long n; do {

cout << "Enter number (0 to end): ";

cin >> n;

cout << "You entered: " << n << "\n";

} while (n != 0); return 0;

}

Enter number (0 to end): 12345 You entered: 12345

Enter number (0 to end): 160277 You entered: 160277

Enter number (0 to end): 0 You entered: 0

Vũng lặp do-while thường được dựng khi điều kiện để kết thỳc vũng lặp nằm trong vũng lặp, như trong vớ dụ trờn, số mà người dựng nhập vào là điều kiện kiểm tra để kết thỳc vũng lặp. Nếu bạn khụng nhập số 0 trong vớ dụ trờn thỡ vũng lặp sẽ khụng bao giờ chấm dứt. (adsbygoogle = window.adsbygoogle || []).push({});

5.5 Cõu lệnh break, continue, goto và hàm exit

5.5.1. Lệnh break.

Sử dụng break chỳng ta cú thể thoỏt khỏi vũng lặp ngay cả khi điều kiện để nú kết thỳc chưa được thoả món. Lệnh này cú thể được dựng để kết thỳc một vũng lặp khụng xỏc định hay buộc nú phải kết thỳc giữa chừng thay vỡ kết thỳc một cỏch bỡnh thường. Vớ dụ, chỳng ta sẽ dừng việc đếm ngược trước khi nú kết thỳc:

// break loop example #include <iostream.h> int main () { int n; for (n=10; n>0; n--) { cout << n << ", "; if (n==3) { cout<<"countdown aborted!"; break; } } return 0; } 10, 9, 8, 7, 6, 5, 4, countdown aborted! 5.5.2.Lệnh continue.

Lệnh continue làm cho chương trỡnh bỏ qua phần cũn lại của vũng lặp và nhảy sang lần lặp tiếp theo. Vớ dụ chỳng ta sẽ bỏ qua số 5 trong phần đếm ngược:

// break loop example #include <iostream.h>

Một phần của tài liệu bài giảng kỹ thuật lập trình ths. trần xuân thanh - khoa cntt, đh thành đô (Trang 32 - 105)