DANH SÁCH BÀI VIẾT Giải bài tập thực hành 1 – Các thành phần trong ngôn ngữ C Giải bài tập thực hành 2 – Cấu trúc rẽ nhánh Giải bài tập thực hành 3 – Cấu trúc lặp for Giải bài thực hành 4 – Cấu trúc lặp While, do…while Giải bài thực hành 5 – HÀM Giải bài thực hành 6 – Truyền tham số cho hàm Giải bài thực hành 7 – Mảng Giải bài thực hành 8 – Chuỗi ký tự Giải bài thực hành 9 – Kiểu cấu trúc Giải bài thực hành 10 – Tập tin
Bài thực hành 8 – Chuỗi ký tựa
I, Các bài thực hành cơ bản
Bài 1: Nhập vào một chuỗi ký tự, xuất ra màn hình chuỗi bị đảo ngược thứ tự các ký tự.
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
char DaoNguoc(char s[])
{
int tn=strlen(s);
int i;
for(i=0;i<(tn/2);i++)
{
s[tn]=s[i],
s[i]=s[tn-1-i];
s[tn-1-i]=s[tn];
s[tn]="";
}
printf("Chuoi dao nguoc la: %s",s);
}
int main()
{
char s[max];
char c,d;
HoanVi(c,d);
printf("Nhap vao mot chuoi ky tu: \n");
gets(s);
printf("\nChuoi da nhap: ");
puts(s);
DaoNguoc(s);
}
Bài 2: Nhập xâu ký tự từ bàn phím, đếm xem trong xâu ký tự nào xuất hiện nhiều nhất.
Code mẫu
- Kiếm tiền Accesstrade, kiếm tiền tại nhà với Accesstrade.vn – Tiếp thị liên kết
- MegaURL – Rút gọn link kiếm tiền có giá cao tại Việt Nam
- Top 4 App kiếm tiền online trên điện thoại tốt nhất 2022
#include<stdio.h>
#include<string.h>
#define max 100
int main()
{
char s[max];
printf("Nhap chuoi: ");
gets(s);
printf("Chuoi da nhap la: ");
puts(s);
int a[max],m=0;
int n=strlen(s)-1;
int i,j;
for(i=0;i<=n;i++)
{
int d=0;
for(j=0;j<=n;j++)
{
j=0;
while(j<=n)
{
if(s[i]==s[j])
{
d++;
}
j++;
}
}
a[m]=d;
m++;
}
int k;
int maxx=a[0];
int maxi=0;
for(k=0;k<m;k++)
{
if(a[k]>maxx)
{
maxx=a[k];
maxi=k+1;
}
}
int l,g;
char s1[1];
for(l=0;l<m;l++)
{
for(g=0;g<n;g++)
{
if(maxi==g)
{
s1[0]=s[g-1];
}
}
}
printf("So %s vi tri thu %d xuat hien nhieu nhat, %d lan.",s1,maxi,maxx);
}
Bài 3: Nhập xâu ký tự từ bàn phím, in ra từ dài nhất trong xâu (từ là dãy ký tự không chứa ký tự trắng).
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
char TuDaiNhat(char s[])
{
int i;
int maxx=0, maxi=0;
int len=strlen(s);
if(s[0]==' ')
{
for(i=0;i<len-1;i++)
{
if((s[i]==' ') && (s[i+1]!=' '))
{
int j=i+1;
int dem=0;
while((s[j]!=' ') && (s[j]!='\0'))
{
dem++;
j++;
}
if(dem>maxx)
{
maxx=dem;
maxi=i+1;
}
i=j-1;
}
}
}
else
{
i=0;
int dem=0;
while((s[i]!=' ') && (s[i]!='\0'))
{
dem++;
i++;
}
if(dem>maxx)
{
maxx=dem;
maxi=0;
}
for(i=maxx-1;i<len-1;i++)
{
if((s[i]==' ') && (s[i+1]!=' '))
{
int j=i+1;
int de=0;
while((s[j]!=' ') && (s[j]!='\0'))
{
de++;
j++;
}
if(de>maxx)
{
maxx=de;
maxi=i+1;
}
i=j-1;
}
}
}
int k;
for(k=maxi;k<(maxi+maxx);k++)
{
printf("%c",s[k]);
}
return s;
}
int main()
{
char s[max];
printf("Nhap xau: ");
gets(s);
printf("Tu dai nhat trong chuoi:\n");
TuDaiNhat(s);
}
Bài 5. Cho một xâu bất kỳ, không xử dụng các hàm thư viện về xâu, hãy xây dựng một hàm đổi tất cả các chữ hoa thành chữ thường(các ký tự khác giữ nguyên) và in cả 2 ra màn hình. Viết một chương trình nhập một xâu bất kỳ từ bàn phím, sau đó sử dụng hàm đã xây dựng ở trên để in kết quả ra màn hình.
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
void Doi(char s[])
{
int i;
int n=strlen(s);
for(i=0;i<n;i++)
{
if((s[i]>='A') && (s[i]<='Z'))
{
s[i]=s[i]+32;
}
}
printf("%s",s);
}
int main()
{
char s[max];
printf("Nhap chuoi: ");
gets(s);
Doi(s);
}
Bài 6. Viết chương trình nhập vào một chuỗi ký tự, đếm số ký tự có trong chuỗi.
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
int main()
{
char s[max];
printf("Nhap chuoi: ");
gets(s);
printf("Chuoi co %d ky tu!",strlen(s));
}
Bài 7. Viết chương trình đếm có bao nhiêu khoảng trắng trong chuỗi.
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
void DemKhoangTrang(char s[])
{
int i,dem=0;
for(i=0;i<strlen(s);i++)
{
if(s[i]==' ')
{
dem++;
}
}
printf("Chuoi co %d khoang trang.",dem);
}
int main()
{
char s[max];
printf("Nhap chuoi: ");
gets(s);
DemKhoangTrang(s);
}
Bài 8. Viết chương trình nhập vào một chuỗi, hãy loại bỏ những khoảng trắng thừa trong chuỗi.
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
void LoaiKhoangTrang(char s[])
{
int i,j,k;
for(i=1;i<strlen(s)-1;i++)
{
if((s[i]==' ') && (s[i+1]==' '))
{
for(j=i;j<strlen(s)-1;j++)
{
s[j]=s[j+1];
}
s[strlen(s)-1]='\0';
}
}
if(s[0]==' ')
{
for(k=0;k<strlen(s)-1;k++)
{
s[k]=s[k+1];
}
s[strlen(s)-1]='\0';
}
if(s[strlen(s)-1]==' ')
{
s[strlen(s)-1]='\0';
}
printf("Chuoi sau khi loai khoang trang la .%s.",s);
}
int main()
{
char s[max];
printf("Nhap chuoi: ");
gets(s);
LoaiKhoangTrang(s);
}
Bài 9. Viết chương trình nhập vào 2 chuỗi s1 và s2, nối chuỗi s2 vào s1. Xuất chuỗi s1 ra màn hình.
Code mẫu
#include<stdio.h>
#include<string.h>
int main()
{
char s1[30], s2[12];
printf("Nhap s1: ");
gets(s1);
printf("Nhap s2: ");
gets(s2);
strcat(s1,s2);
printf("Chuoi sau khi noi la: ");
puts(s1);
return 0;
}
Bài 10. Đổi tất cả các ký tự có trong chuỗi thành chữ thường (không dùng hàm strlwr).
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
char DoiThanhThuong(char s[])
{
int i;
for(i=0;i<strlen(s);i++)
{
if(s[i]>='A' && s[i]<='Z')
{
s[i]=s[i]+32;
}
}
printf("%s",s);
}
int main()
{
char s[max];
printf("Nhap chuoi: ");
gets(s);
DoiThanhThuong(s);
}
Bài 11. Đổi tất cả các ký tự trong chuỗi thành chữ in hoa (không dùng hàm struppr).
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
char DoiThanhInHoa(char s[])
{
int i;
for(i=0;i<strlen(s);i++)
{
if(s[i]>='a' && s[i]<='z')
{
s[i]=s[i]-32;
}
}
printf("%s",s);
}
int main()
{
char s[max];
printf("Nhap chuoi: ");
gets(s);
DoiThanhInHoa(s);
}
Bài 12. Viết chương trình đổi những ký tự đầu tiên của mỗi từ thành chữ in hoa.
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
char InHoaKyTuDau(char s[])
{
int i;
if(s[0]!=' ')
{
s[0]=s[0]-32;
for(i=1;i<strlen(s);i++)
{
if(s[i]==' ' && s[i+1]!=' ' && s[i+1]>='a' && s[i+1]<='z' )
{
s[i+1]=s[i+1]-32;
}
}
}
else
{
for(i=0;i<strlen(s);i++)
{
if(s[i]==' ' && s[i+1]!=' ' && s[i+1]>='a' && s[i+1]<='z' )
{
s[i+1]=s[i+1]-32;
}
}
}
printf("%s",s);
}
int main()
{
char s[max];
printf("Nhap chuoi: ");
gets(s);
InHoaKyTuDau(s);
}
Bài 13. Viết chương trình tìm kiếm một ký tự xem có trong chuỗi hay không, nếu có xuất ra vị trí của từ đó.
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
char TimKyTuTrongChuoi(char s[],char s2[])
{
int i;
int dem=0;
for(i=0;i<strlen(s);i++)
{
if(s[i]==s2[0])
{
printf("So *%c* o vi tri vi tri: %d\n",s[i],i);
dem++;
}
}
if(dem==0)
{
printf("Ky tu muon tim khong co trong chuoi!");
}
}
int main()
{
char s[max];
char s2[max];
printf("Nhap chuoi: ");
gets(s);
printf("Nhap ky tu muon tim: ");
gets(s2);
TimKyTuTrongChuoi(s,s2);
}
Bài 14. Viết chương trình đếm một ký tự xuất hiện bao nhiêu lần trong chuỗi.
#include<stdio.h>
#include<string.h>
#define max 100
char TimKyTuTrongChuoi(char s[],char s2[])
{
int i;
int dem=0;
for(i=0;i<strlen(s);i++)
{
if(s[i]==s2[0])
{
dem++;
}
}
printf("Ky tu ban da nhap xuat hien %d lan trong chuoi.",dem);
}
int main()
{
char s[max];
char s2[max];
printf("Nhap chuoi: ");
gets(s);
printf("Nhap ky tu muon tim: ");
gets(s2);
TimKyTuTrongChuoi(s,s2);
}
Bài 15. Viết hàm cắt chuỗi họ và tên thành chuỗi họ lót và chuỗi tên. Ví dụ: chuỗi “Nguyễn Văn A” thành chuỗi “Nguyễn Văn” và chuỗi “A”.
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
char CatHoTen(char s[],char s1[])
{
int len=strlen(s);
int i = len-1,j;
int m=0;
while(i>=0)
{
if((s[i]==' ') && (s[i+1]!=' '))
{
for(j=i+1;j<len;j++)
{
s1[m]=s[j];
m++;
}
s[i]='\0';
break;
}
i--;
}
printf("Ho: %s\n",s);
printf("Ten: %s",s1);
}
int main()
{
char s[max];
char s1[max];
printf("Nhap xau: ");
gets(s);
CatHoTen(s,s1);
}
Bài 16. Viết hàm kiểm tra xem trong chuỗi có ký tự số hay không nếu có tách ra thành mảng số riêng.
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
void XuatMang(int a[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("a[%d] = %c\n",i,a[i]);
}
}
char CatHoTen(char s[],int a[])
{
int len=strlen(s);
int n=0;
int i;
for(i=0;i<len;i++)
{
if((s[i]>='0') && (s[i]<='9'))
{
a[n] = s[i];
n++;
int j;
for(j=i;j<len;j++)
{
s[j]=s[j+1];
}
s[j+1]='\0';
i--;
}
}
printf("Chuoi ky tu: %s\n",s);
XuatMang(a,n);
}
int main()
{
char s[max];
int a[max];
printf("Nhap xau: ");
gets(s);
CatHoTen(s,a);
}
Bài 17. Nhập một chuỗi bất kỳ, yêu cầu nhập một ký tự muốn xóa. Thực hiện xóa tất cả những ký tự đó trong chuỗi.
#include<stdio.h>
#include<string.h>
#define max 100
char XoaKyTu(char s[],char s1[])
{
int len=strlen(s);
int i;
for(i=0;i<len;i++)
{
if(s[i]==s1[0])
{
int j;
for(j=i;j<len;j++)
{
s[j]=s[j+1];
}
s[j+1]='\0';
i--;
}
}
printf("Chuoi ky tu: %s",s);
}
int main()
{
char s[max];
int n=1;
char s2[n];
int a[max];
printf("Nhap xau: ");
gets(s);
printf("Nhap ky tu muon xoa: ");
gets(s2);
XoaKyTu(s,s2);
}
Bài 18. Viết một chương trình xóa một từ nào đó trong chuỗi. Ví dụ: chuỗi đầu “Nguyễn Văn A” . Nhập “Nguyễn Văn”, và kết quả xuất ra: “ A”.
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
char XoaTu(char s[],char s1[])
{
int len=strlen(s);
int len2=strlen(s1);
int i;
for(i=0;i<len;i++)
{
if((s[i]==s1[0]) && (s[i+len2-1]==s1[len2-1]))
{
int j;
for(j=i;j<len;j++)
{
s[j]=s[j+len2];
}
s[j+len2]='\0';
break;
}
}
printf("Chuoi ky tu sau khi cat: %s",s);
}
int main()
{
char s[max];
char s2[max];
int a[max];
printf("Nhap xau: ");
gets(s);
printf("Nhap tu muon xoa: ");
gets(s2);
XoaTu(s,s2);
}
II, Các bài thực hành nâng cao
Bài 21: Đổi các từ ở đầu câu sang chữ hoa và những từ không phải đầu câu sang
chữ thường.
Ví dụ: nGuYen vAN a đổi thành: Nguyen Van A
code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
char dauCau(char &c)
{
if(c>='a' && c<='z') c-=32;
return c;
}
char khongDauCau(char &c)
{
if(c>='A' && c<='Z') c+=32;
return c;
}
void chuanHoa(char str[])
{
int len = strlen(str);
dauCau(str[0]);
for(int i = 1; i<len;i++)
{
if(str[i-1]==' ' && str[i] !=' ') dauCau(str[i]);
else khongDauCau(str[i]);
}
}
int main()
{
char str[max];
printf("Nhap xau: ");
gets(str);
chuanHoa(str);
printf("%s", str);
}
Bài 22. Viết chương trình đảo ngược thứ tự các từ có trong chuỗi
Ví dụ: Nhập DH CNTT
Xuất ra màn hình là: TTNC HD
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
void strRev(char str[])
{
int len = strlen(str);
for(int i = 0;i<len/2;i++)
{
int temp = str[i];
str[i]=str[len-i-1];
str[len-i-1] = temp;
}
}
int main()
{
char str[max];
printf("Nhap xau: ");
gets(str);
strRev(str);
printf("Chuoi dao nguoc: %s", str);
}
Bài 23. Nhập 1 chuỗi bất kì, liệt kê xem mỗi ký tự xuất hiện mấy lần.
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
int danhdau[256] = {0};
void lietKe(char str[])
{
int len = strlen(str);
for(int i = 0;i<len;i++)
{
danhdau[str[i]] ++;
}
for(int i = 0;i<256;i++)
{
if(danhdau[i]!=0)
printf("%c - %d\n", i, danhdau[i]);
}
}
int main()
{
char str[max];
printf("Nhap xau: ");
gets(str);
lietKe(str);
}
Bài 24. Viết hàm kiểm tra xem trong 2 chuỗi có bao nhiêu ký tự giống nhau.
Code mẫu
#include<stdio.h>
#include<string.h>
#define max 100
int danhdau[256] = {0};
int dem = 0;
void Kiemtra(char str[], char str2[])
{
int len = strlen(str), len2 = strlen(str2);
for(int i = 0;i<len;i++)
{
if(danhdau[str[i]]==0)
{
for(int j = 0;j<len2;j++)
{
if(str[i] == str2[j])
{
danhdau[str[i]] = 1;
dem++;
break;
}
}
}
}
printf("Co %d ky tu giong nhau trong 2 chuoi\n =>Cac ky tu do la: ", dem);
for(int i = 0;i<256;i++)
{
if(danhdau[i]!=0)
printf("%c ", i);
}
}
int main()
{
char str[max], str2[max];
printf("Nhap chuoi 1: ");
gets(str);
printf("Nhap chuoi 2: ");
gets(str2);
Kiemtra(str, str2);
}
Bài 25. Viết chương trình chữ chạy từ trái qua phải màn hình.
Code mẫu
#include<stdio.h>
#include<string.h>
#include <windows.h>
#define max 60
void run(char str[])
{
int temp = str[59];
for(int i = 59;i>0;i--) str[i]=str[i-1];
str[0] = temp;
}
void chuChay(char str[])
{
int len = strlen(str);
for(int i = len;i<60;i++ ) str[i]=' ';
while(true)
{
run(str);
system("cls");
printf("%s", str);
Sleep(60);
}
}
int main()
{
char str[max];
printf("Nhap chuoi: ");
gets(str);
chuChay(str);
}
Bài 26. Viết 1 chương trình chèn 1 từở bất cứ vị trí nào mà người dùng yêu cầu.
Code mẫu
#include<stdio.h>
#include<string.h>
#include <windows.h>
#define max 100
void chenTu(char str[], char tuchen[], int vt)
{
int len = strlen(str), len1 = strlen(tuchen);
char str2[len+len1+1];
str2[len+len1+1]=0;
int k=0;
if(vt == 1 || vt==0)
{
for(int i=0;i<len+len1;i++)
{
if(i<len1) str2[i] = tuchen[i];
else if(i==len1){
str2[i] = ' ';
str2[i+1] = str[i-len1];
}
else str2[i+1] = str[i-len1];
}
}else{
int demtu = 1;
for(int i=2;i<len;i++)
{
if(str[i-1] == ' ' && str[i] !=' ')
{
if(++demtu > vt-1) {
k=i;
break;
}
}
}
for(int i=0;i<len+len1;i++){
if(i<k) str2[i] = str[i];
else if(i>=k && i<k+len1) str2[i] = tuchen[i-k];
else if(i==k+len1)
{
str2[i] = ' ';
str2[i+1] = str[i-len1];
}
else str2[i+1] = str[i-len1];
}
}
printf("%s", str2);
}
int main()
{
char str[max], tuchen[15];
int vt;
printf("Nhap chuoi: ");
gets(str);
printf("Nhap tu can chen: ");
gets(tuchen);
printf("Nhap vi tri can chen: ");
scanf("%d", &vt);
chenTu(str,tuchen, vt);
}
Bài 27. Viết chương trình nhập vào một chuỗi đếm xem chuỗi có bao nhiêu từ. Các
từ cách nhau bằng khoảng trắng, dấu chấm câu: dấu chấm (.), dấu phẩy (,), dấu
chấm phẩy (;), dấu hỏi (?) và dấu chấm than (!).
Code mẫu
#include<stdio.h>
#include<string.h>
#include <windows.h>
#define max 100
void demTu(char str[])
{
int len = strlen(str);
int dem;
if((str[0] >= 'A' && str[0] <= 'Z') || (str[0] >= 'a' && str[0] <= 'z') ) dem=1;
for(int i = 2;i<len;i++)
{
if(str[i-1]==' ' && ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z') ))
{
dem++;
}
if(str[i-1] == '.' && ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z') ))
{
dem++;
}
if(str[i-1] == ',' && ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z') ))
{
dem++;
}
if(str[i-1] == ';' && ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z') ))
{
dem++;
}
if(str[i-1] == '?' && ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z') ))
{
dem++;
}
if(str[i-1] == '!' && ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z') ))
{
dem++;
}
}
printf("So tu la: %d", dem);
}
int main()
{
char str[max];
int vt;
printf("Nhap chuoi: ");
gets(str);
demTu(str);
}