Trang chủLập trìnhLập trình C/C++Bài toán chuẩn hóa xâu ký tự lập trình C/C+

Bài toán chuẩn hóa xâu ký tự lập trình C/C+

Bài toán chuẩn hóa xâu ký tự là một bài toán rất cơ bản trong lập trình, khi mới bắt đầu làm quen lập trình hầu hết chúng ta cũng sẽ gặp qua bài toán này.

Chuẩn hóa xâu ký tự trong C/C++

Cụ thể chúng ta có thể phát biểu đề bài như sau:

 Nhập một xâu ký tự từ bàn phím, hãy chuẩn hóa xâu ký tự theo các quy tác sau:
 -Xóa bỏ kí tự trống (trắng) đầu dòng
 -Xóa bỏ kí tự trống cuối dòng
 -Xóa bỏ kí tự trống không hợp lệ(ký tự trống bị thừa)
 -In hoa chữ cái đầu tiên

Vì đây là một bài toán làm quen lập trình, nhằm mục đích học tư duy logic trong lập trình. Thế nên đối với bài toán này chúng ta không được phép sử dụng các hàm chuẩn hóa có sẵn như hàm trim() chẳng hạn.

Để xử lý bài toán này chúng ta sẽ xử lý theo từng ý như sau:

Giả xử ở đây chúng ta có xâu a có độ dài là n.

  • Xóa bỏ kí tự trống (trắng) đầu dòng
	for(int i=0;i<n;i++){ //Duyệt các ký tự từ đầu xâu tới cuối xâu
		if(a[i]==' '){//Kiểm tra xem nếu ký tự là khoảng trắng thì thực hiện khối lệnh
			for(int j=i;j<n-1;j++){//Duyệt j từ vị trí thứ i
				a[j] = a[j+1]; //Gắn phần tử j bằng phần tử kế tiếp nó
			}
             //=>Sau khi thực hiện vòng lặp j, xâu bị đẩy về phía trước 1 đơn vị và phần thứ i sẽ bị mất
			a[n-1]=NULL; //gắn phần tử cuối cùng của xâu là NULL
			i--; // Vì xâu đã bị đẩy lùi về phía trước, thực hiện kiểm tra lại ký tự đó
			n--; //Vì đã xóa khoảng trắng xâu sẽ ngắn đi 1 ký tự
		}
		else break;//Nếu gặp ký tự không phải khoảng trắng thì thoát vòng lặp ngay lập tức
	}
  • Xóa bỏ kí tự trống cuối dòng
	for(int i=n-1;i>=0;i--){//Duyệt các ký tự từ cuối xâu về đầu xâu
		if(a[i]==' '){//kiểm tra ký tự thứ i có phải là khoảng trắng
			a[i]=NULL; //Nếu là khoảng trắng chỉ cần gắn phần tử cuối xâu này là null
			n--; //Lúc này xâu cũng sẽ bị ngắn đi 1 ký tự
		}
		else break;//nếu gặp ký tự không phải là khoảng trắng ngày lập tức dừng vòng lặp
	}
  • Xóa bỏ kí tự trống không hợp lệ
//Khối lệnh chạy tương tự như xóa khoảng trắng ở đầu xâu, tuy nhiên sẽ không có lệnh dừng vòng lặp nếu gặp ký tự khác ký tự khoảng trắng	
for(int i=1;i<n-1;i++) //Vì ký tự khoảng trắng ở đầu và cuối xâu đã bị xóa nên i chỉ cần chạy từ vị trí thứ 1 tới n-2
	{
		if(a[i]==a[i+1]){
			for(int j=i;j<n-1;j++){
				a[j] = a[j+1];
			}
			a[n-1]=NULL;
			i--;
			n--;
		}
	}
  • In hoa chữ cái đầu tiên
a[0] =  toupper(a[0]);  //in hoa chữ cái đầu tiên

hoặc nếu đề bài có thêm yêu cầu là in hoa các ký tự đầu tiên trong mỗi từ chúng ta sẽ thêm vào đoạn code sau:

for(int i=0;i<n-1;i++)
{
  if(a[i] ==' ' && a[i+1]!=' ') a[i+1] =  toupper(a[i+1]);  //in hoa chữ cái đầu tiên mỗi từ
}

Trong đó hàm toupper sẽ có nội dung code như sau

char toupper(char charx){
		if(charx >= 'a' && charx <='z') charx = charx-32; //Nếu ký tự là ký tự in thường, chúng ta sẽ -32 để biến đổi nó thành in hoa(trong bảng mã ASCII ký tự thường và hoa cách nhau 32 đơn vị)
	return charx;
}

Chương trình minh họa hoàn chỉnh

#include <stdio.h>
#include <string.h>

//Hàm biến đổi ký tự thường thành ký tự hoa
char toupper(char charx){
	if(charx >= 'a' && charx <='z') charx = charx-32;
	return charx;
}


//Hàm chuẩn hóa xâu
void chuanHoa(char a[])
{
	int n = strlen(a); //Lấy độ dài xâu

//Xóa khoảng trắng đầu xâu
	for(int i=0;i<n;i++){
		if(a[i]==' '){
			for(int j=i;j<n-1;j++){
				a[j] = a[j+1];
			}
			a[n-1]=NULL;
			i--;
			n--;
		}
		else break;
	}
	

//Xóa khoảng trắng cuối xâu
	for(int i=n-1;i>=0;i--){
		if(a[i]==' '){
			a[i]=NULL;
			n--;
		}
		else break;
	}
	
	//Xóa khoảng trắng không hợp lệ(khoảng trắng bị thừa)
	for(int i=1;i<n-1;i++)
	{
		if(a[i]==a[i+1]){
			for(int j=i;j<n-1;j++){
				a[j] = a[j+1];
			}
			a[n-1]=NULL;
			i--;
			n--;
		}
	}
	
//In hoa ký tự đầu tiên
	a[0] = 	toupper(a[0]);	
}
int main()
{
	char a[100];
	printf("Moi ban nhap chuoi:"); gets(a);
	chuanHoa(a);
	printf("Chuoi duoc chuan hoa:");
	puts(a);
}

Kết quả chạy chương trình

Chuẩn hóa xâu ký tự- kết quả chạy chương trình

Cảm ơn bạn đã theo dõi bài viết! Chúc bạn học tốt!

XEM THÊM
Cách tìm UCLN và BCNN trong lập trình C/C++
Tìm hiểu về Hàm đệ quy trong lập trình
Thuật toán tìm kiếm nhị phân trong C/C++
Thuật toán đếm số lượng chữ số của số nguyên dương n bằng C / C++
Thuật toán tính dãy số Fibonacci bằng 3 cách trong C/C++
4 1 Bỏ phiếu bình chọn
Xếp hạng bài viết
BÀI VIẾT LIÊN QUAN
Đăng ký nhận thông báo
Thông báo email khi
guest
0 Bình luận
Không thể gửi email
Phản hồi nội tuyến

NÊN ĐỌC THÊM

Bạn muốn tìm kiếm gì?


0
Giáo sư! có thể ném gạch bên dưới nhé!x
()
x