Sunday, September 13, 2015

[Bài tập mẫu] Chuỗi ký tự trong C/C++.

I. Câu hỏi.
1. Phạm vi giá trị của các ký tự trong bảng mã ASCII?
2. Định nghĩa chuỗi?
3. Tại sao để lưu trữ một chuỗi gồm n ký tự ta cần một mảng ký tự gồm n+1 phần tử.
4. Có bao nhiêu byte được dùng trong bộ nhớ cho mỗi biến được khai báo sau đây:
a. char *str1 = { "String 1" };
b. char str2[] = { "String 2" };
c. char string3;
d. char str4[20] = { "This is String 4" };
e. char str5[20];
5. Với khai báo: char *string = "A string!";
Hãy cho biết các giá trị sau:
a. string[0]
b. *string
c. string[9]
d. string[33]
e. *string+8
f. string
6. Viết dòng lệnh khai báo mảng ký tự và khởi tạo chuỗi: "Pointers are fun!".
7. Tương tự câu trên nhưng không dùng mảng
8. Viết dòng lệnh cấp phát vùng nhớ để lưu chuỗi 80 ký tự và nhập chuỗi từ bàn phím vào vùng nhớ đó.
9. Viết hàm sao chép một mảng ký tự sang một mảng khác.
10. Viết một hàm nhận vào hai chuỗi, đếm số ký tự trong mỗi chuỗi và trả về một con trỏ trỏ tới chuỗi dài hơn.
11. Có điểm gì sai không trong khai báo sau : char a_string[10] = "This is a string";
12. Có điểm gì sai không trong khai báo sau : char *quote[100] = { "Smile, Friday is almost here!" }; 13. Có điểm gì sai không trong khai báo sau :
 char *string1; char *string2 = "Second"; string1 = string2;
TRẢ LỜI: 
 1. Các giá trong bảng mã ASCII có phạm vi từ 0 đến 255. Từ 0 đến 127 là các ký tự chuẩn, và từ 128 đến 255 là các ký tự mở rộng.
2. Một chuỗi là một dãy các ký tự kết thúc bằng ký tự null.
3. Để lưu ký tự kết thúc chuỗi là null.
4.
a. 9 byte (8 byte cho chuỗi và 1 byte cho ký tự null)
b. 9 byte
c. 1 byte
d. 20 byte
e. 20 byte
5.
a. A
b. A
c. 0 (NUL)
d. This is beyond the end of the string, so it could have any value.
e. !
f. This contains the address of the first element of the string.
6. char array[18] = "Pointers are fun!";
7. char *array = "Pointers are fun!";
8. char *ptr; ptr = malloc(81); gets(ptr);
9.
#include <stdio.h> 
#define SIZE 10
void copyarrays( int [], int []); main()
{
int ctr=0;
int a[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int b[SIZE];
/* values before copy */
for (ctr = 0; ctr < SIZE; ctr ++ )
{
printf( "a[%d] = %d, b[%d] = %d\n", ctr, a[ctr], ctr, b[ctr]);
}
copyarrays(a, b);
/* values after copy */
for (ctr = 0; ctr < SIZE; ctr ++ )
{
printf( "a[%d] = %d, b[%d] = %d\n", ctr, a[ctr], ctr, b[ctr]);
}
return 0;
}
void copyarrays( int orig[], int newone[])
{
int ctr = 0;
for (ctr = 0; ctr < SIZE; ctr ++ )
{
newone[ctr] = orig[ctr];
}
}
10.
#include <stdio.h>
#include <string.h>
/* function prototypes */
char * compare_strings( char *, char *); main()
{
char *a = "Hello";
char *b = "World!";
char *longer;
longer = compare_strings(a, b);
printf( "The longer string is: %s\n", longer ); return 0;
}
char * compare_strings( char * first, char * second)
{
int x, y;
x = strlen(first);
y = strlen(second);
if( x > y)
return(first);
else
return(second);
}
11. Chuỗi được khai báo là mảng 10 phần tử nhưng nó được khởi tạo bởi chuỗi lớn hơn 10 phần tử.
12. Việc khởi tạo là sai. Sửa lại char *quote hoặc char quote[100].
13. Không.
14. Không thể gán một mảng cho một mảng khác.
Bài tập.
Bài 1. Viết chương trình bỏ ký tự a trong một chuỗi.
#include 
#include  
#include 
void main()
{
int i,j; char x[80];
cout<<"\nnhap mot chuoi : "; gets(x);
for (i=j=0;x[i]!=NULL;i++) if (x[i]!='a')
{
x[j]=x[i];
j++;
}
x[j]= NULL;
cout<<"\nChuoi ky tu sau khi bo ky tu a la :";
puts(x);
getch();
}
Bài 2. Viết chương trình trích chuỗi con bên trái của một chuỗi.
#include <iostream.h>
#include <conio.h> 
#include <stdio.h>
void main()
{
clrscr();
char ten[25], *tentro; tentro=ten;
int i,sokytu;
cout<<"\n nhap mot chuoi ky tu : "; gets(ten);
cout<<"\nban muon trich bao nhieu ky tu :"; cin>>sokytu;
for (i=0;i<sokytu;i++)
 cout<<*tentro++;
getch();
}

Bài 3. Câu hỏi như bài 2 nhưng có dùng hàm trích chuỗi con bên trái.
#include <stdio.h>
#include <conio.h>
#include <string.h>
char *left(char *st,int n);
void  main()
{ char st[80]; int n;
printf("\n\t nhap vao mot xau:");
gets(st);
printf("\n nhap vao so n="); scanf("%d",&n);
printf("\n\t xau ben trai %d ky tu la: %s",n,left(st,n));
getch();
}
char *left(char *st,int n)
{ char *p; int i,j;
if(strlen(st)<=n) return(st); i=0;
while(i++<n-1) p[i]=st[i]; p[i]='\0';
return(p);
}

Bài 4. Viết chương trình trích chuỗi con bên phải của một chuỗi.
#include <stdio.h>
#include <conio.h>
#include <string.h>
char *right(char *st,int n);
void  main()
{ char st[80]; int n;
printf("\n\t nhap vao mot xau:"); gets(st);
printf("\n nhap vao so n=");
scanf("%d",&n);
printf("\n Xau copy ben phai %d ky tu la: %s",n,right(st,n));
getch();
}
char *right(char *st,int n)
{ char *p; int i,j;
if(strlen(st)<=n) return(st);
i=strlen(st)-n; j=0;
while(st[i]) p[j++]=st[i++]; p[j]='\0';
return(p);
}

Bài 5. Viết chương trình trích chuỗi con trong một chuỗi.
#include <stdio.h>
#include <conio.h>
#include <string.h>
char *copy(char s[],int m,int n);
char *copy(char s[],int m,int n)
{ int i,j,k; char p[100]; j=0;
if((m<=0)&&(n<=0))
return(NULL);
i=m;
if(m==0) k=n-1; else k=n+1;
while (s[i] && (i<=k)) p[j++]=s[i++];
p[j]='\0';
return(p);
}
void  main()
{ char s[80],*p; int m,n;
clrscr();
fflush(stdin);
printf("\n\t chuong trich copy chuoi,cac chi so tinh tu 0:\n")
printf("\n nhap vao mot chuoi:");gets(s); printf("\t\t nhap vi tri dau m= ");
scanf("%d",&m);
printf("\t\t nhap so ky tu can copy n = "); scanf("%d",&n);
p=copy(s,m,n);
if(p==NULL)
printf("\n\t xau ket qua la NULL");
else
printf("\n\t xau ket qua la:%s",copy(s,m,n));
getch();
}

Bài 6. Viết chương trình xóa chuỗi con trong một chuỗi.
#include <stdio.h>
#include <conio.h>
#include <ctype.h> 
#include <string.h>
char *delst(char s[],int m,int n);
void main()
{ char st[100],*s; int m,n;
tt:fflush(stdin);
textcolor(15);
textbackground(1);
clrscr();
printf("\n\n hay nhap vao mot chuoi :");
gets(st);
printf("\n\t vi tri bat dau xoa m= ");
scanf("%d",&m);
printf("\t  nhap so ky tu can xoa n= ");
scanf("%d",&n);
s=delst(st,m,n);
if(s[0]==0)
printf("\n\t
else
printf("\t chuoi sau khi xoa la: %s",s); getch();
printf("\n\n\t Co tiep tuc khonf c/k ? : "); if(toupper(getch())=='C')
goto tt;
}
char *delst(char s[],int m,int n)
{ char p[100];int i,j; if(s[0]==0)
return(0); if(m<=0 && n<=0)
return(s);
if(n<=0 || m>strlen(s)) return(s);
if(m<0) m=0; i=j=0; while(s[i])
{
if(i<m||(i>=m+n))
p[j++]=s[i];
i++;
}
p[j]='\0';
return(p);
}

Bài 7. Viết chương trình in các từ của chuỗi trên mỗi dòng .
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
char s[50]; int i, len;
printf("\nNhap vao mot chuoi : ");
gets(s);
len = strlen(s); i = 0;
while (i<len)
{
while (s[i] == ' ' && i<len) i++;
while (s[i] != ' ' && i<len)
putc(s[i++], stdout); putc('\n', stdout);
}
getch();
}

Bài 8. Cùng câu hỏi bài 7 nhưng có dùng hàm.
#include <stdio.h> 
#include <conio.h> 
#include <string.h>
void in(char *p);
void trichchuoi(char *s,char *kq,int n, int m);
void main()
{
char *p,ch; do
{
clrscr();
printf("\n CHUONG TRINH IN CAC TU CUA CHUOI THEO TUNGDONG ");
printf("\n (nhan <ESC> de thoat)");
printf("\n ");
fflush(stdin);
printf("\n Nhap chuoi can in :");
gets(p);
printf("\n Sau khi tach : \n"); in(p);
ch=getch();
}
while (ch!=27);
}
void trichchuoi(char *s, char *kq,int k, int m)
{  int i,t;
for (t=0; t<m; t++)
*(kq+t)=*(s+k+t-1); *(kq+t)= '\0';
}
void in (char *p)
{
char *kq; int n=0,m,k; k=strlen(p);
while (n<(strlen(p)+1))
{
m=0;
while (p[n] == ' ') n++; k = n+1;
while (p[n++] != ' ') m++;
 trichchuoi(p,kq,k,m);
 puts(kq);
}
}

Bài 9. Viết chương trình tìm vị trí một chuỗi con trong một chuỗi đã cho.
#include <stdio.h>
#include <conio.h>
void main()
{
char chuoi_lon [125], chuoi_con [10]; int i, j;
printf("\nNhap vao chuoi lon : ");
gets(chuoi_lon);
printf("\nNhap vao chuoi can tim : ");
gets(chuoi_con);
i = 0;
while (chuoi_lon[i] != 0)
{
j = 0;
while (chuoi_lon[i++] == chuoi_con[j++] &&chuoi_lon[i-1] != 0 &&chuoi_con[j-1] != 0)
;
if (chuoi_lon[i-1] != 0 && chuoi_con[j-1] == 0)
printf("\nTim thay tai vi tri %d", i-j);
}
getch();
}

Bài 10. Viết chương trình ghép hai chuỗi thành một chuỗi.
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
void main()
{
int i,j;
char *x,*t; //hay char x[20,t[20];
cout<<"\nnhap chuoi thu nhat : ";
gets(x); cout<<"\nnhap chuoi thu hai : ";
gets(t);
for (i=j=0;x[i]!='\0';i++)
; //lenh rong do x[i++]=t[j++];
while (t[j]!='\0'); x[i]='\0';
cout<<"\nChuoi ghep la :"<<x;
getch();
}

Bài 11. Cùng câu hỏi bài 10, nhưng có dùng hàm.
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
char *strcat(char *str1,char *str2); void main()
{
char str1[100],str2[100];
printf("\n Nhap chuoi 1 : ");
gets(str1); printf("\n Nhap chuoi 2 : ");
gets(str2);
printf("\n Chuoi sau khi ghep :%s",strcat(str1,str2)); getch();
}
char *strcat(char  *str1,char *str2)
{
int i=0,j=0,k=0; char str[200];
while(str1[i])str[k++]=str1[i++];
while(str2[j])str[k++]=str2[j++];
str[k]='\0'; return str;
}

Bài 12. Viết chương trình nhập vào tên của không quá 50 học sinh, sắp xếp và in ra theo thứ tự tăng. Chương trình sẽ dùng một hàm nhập dữ liệu, một hàm so sánh chuỗi và một hàm hiển thị kết quả sắp xếp.
//Sap xep chuoi, khong dung ham mau strcmp() #include <conio.h>
#include <stdlib.h>
#include <stdio.h>
void nhap(char *p[],int n)
{
for(int i=0;i<n;i++)
{ fflush(stdin);
p[i]=(char *)calloc(10,sizeof(char));
printf("\nNhap Ten :"); gets(p[i]);
}
}
int strcmp(char *x,char *t)
{
while (*x==*t && *x!=NULL)
{ *x++; *t++;
}
if (*x==NULL && *t==NULL)
return (0); else
return *x - *t;
}
/* Phien ban 2 cua ham strcmp() int strcmp(char *s, char *t)
{ int i;
for (i = 0; s[i] == t[i]; i++) if (s[i] == '\0') return 0;
return s[i] - t[i]; }*/
/* Phien ban 3 cua ham strcmp() int strcmp(char *s, char *t)
{ for ( ; *s == *t; s++, t++) if (*s == '\0')
return 0; return *s - *t;
}*/
void sapxep(char *p[], int n)
{ char *tam; int i,j;
tam=(char *)calloc(10,sizeof(char));
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
if (strcmp(p[i],p[j]) >0)
{
tam=p[i];
p[i]=p[j];
p[j]=tam;
}
}
void hienthi(char *p[],int n)
{
for (int i=0; i<n; i++) printf("\n\r %2d. %s",i+1,p[i]);
}
void main()
{
int n;
char *a[50];
printf("\nNhap so hoc sinh :");
scanf("%d",&n);
nhap(a,n);
sapxep(a,n);
hienthi(a,n);
getch();
}

Bài 13. Viết chương trình đão ngược chuỗi.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
char *dnchuoi(char *s)
{
char *tmp, i;
i = 0;
tmp = (char *)malloc(strlen(s)+1);
while (i<strlen(s))
*(tmp+i) = *(s + strlen(s) - i++ - 1);
 *(tmp+i) = 0;
return tmp;
}
void main()
{
char hello[] = "Truong Dai hoc Khoa hoc"; char *s;
printf("\nChuoi ban dau = %s", hello);
s = dnchuoi(hello);
printf("\nChuoi dao nguoc = %s", s);
getch();
}

Bài 14. Viết chương trình kiểm tra chuỗi có đối xứng hay không?
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
char chuoi[125]; int i = 0, j;
printf("\nNhap vao chuoi kiem tra : ");
gets(chuoi);
j = strlen(chuoi) - 1;
while(chuoi[i++] == chuoi[j--])
;
if (--i>=++j) printf("Chuoi doi xung");
else printf("Chuoi khong doi xung");
getch();
}

Bài 15. Nhập một chuỗi từ bàn phím, kết thúc khi bấm Ctrl-Z và Enter. Đếm số từ trong các dòng đã nhập. Dòng tiêu đề của hàm đếm số từ như sau:
int NumberWords(char szString[])
/* Dem tu trong chuoi nhap tu ban phim. */ 
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define TRUE 1
#define FALSE 0
#define BIGEST_LINE 256
int NumberWords(char * pString);
char szInput[BIGEST_LINE];
void main()
{
clrscr(); int i;
printf("Nhap chuoi va ket thuc bang Ctrl \n\n"); while (gets(szInput))
{ printf("Chuoi '%.50s' co so tu la %2d \n",szInput,NumberWords(szInput));
}
printf("\n");
}
int NumberWords(char szString[])
{
int i;
int nBlank = TRUE;
int nCount = 0;
for (i = 0; szString[i]; i++)
{
if (szString[i] != ' ')
{
if (nBlank)
{
++nCount;
}
nBlank = FALSE;
}
else
{
nBlank = TRUE;
}
}
return(nCount);
}

Bài 16. Cùng câu hỏi bài 15 nhưng dòng tiêu đề đếm số từ như sau: int NumberWords(char * pString)
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define TRUE 1
#define FALSE 0
#define BIGEST_LINE 256
int NumberWords(char * pString);
char szInput[BIGEST_LINE]; void main()
{
clrscr(); int i;
printf("Nhap chuoi ky tu, de ket thuc chuong trinh bam Ctrl Z \n\n");
while (gets(szInput))
{
printf("Chuoi '%.50s' co so tu la %2d \n",szInput,NumberWords(szInput));
}
printf("\n");
}
int NumberWords(char * pString)
{
int nBlank = TRUE; int nCount = 0; do
{
if (*(pString) && *(pString) != ' ')
{
if (nBlank)
{
++nCount;
}
nBlank = FALSE;
}
else
{
nBlank = TRUE;
}
} while(*(pString++)); return(nCount);
}

Bài 17. Viết chương trình in các dòng được nhập vào từ bàn phím, kết thúc bằng cách bấm Ctrl-Z và Enter.
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define MAX_CHARACTERS 32767
#define MAX_LINES 1000
#define BIGEST_LINE 128
char szInput[BIGEST_LINE]; char szBuffer[MAX_CHARACTERS]; char*pBuffer[MAX_LINES];
int nBufferPointer = {0};
int nLine = 0;
void  main()
{
int i;
printf("Go vao mot so dong, ket thuc nhan Ctrl Z\n"); while (gets(szInput))
{
if ((nBufferPointer + strlen(szInput)) > MAX_CHARACTERS)
{ // Dong qua dai, xin nhap lai!. break;
}
pBuffer[nLine] = &szBuffer[nBufferPointer]; strcpy(pBuffer[nLine], szInput); nBufferPointer +=strlen(szInput)+ 1;
if (++nLine >= MAX_LINES)
{ // Qua nhieu dong, xin nhap lai! break;
}
}
for (i = 0; i < nLine; i++)
{
printf("Dong %d '%s'\n", i, pBuffer[i]);
}
printf("\n");
getch();
}

Bài 18. Viết chương trình tìm và thay thế một chuỗi con trong một chuỗi đã cho.
/* Tim kiem va thay the chuoi con trong mot chuoi lon s : chuoi lon
s1 : chuoi con
s2 : chuoi se thay the
De chac chan khong bi loi thi chuoi s phai co kha nang chua du */
#include <stdio.h>
#include <string.h>
#include <conio.h>
char *str_str(char *s, char *s1, char *s2)
{
int len = strlen(s);
int len1 = strlen(s1);
int len2 = strlen(s2);
int i=0, j, luu;
if (len1!=0)
while (i<len)
{
if (s[i] == s1[0])
{
j = 0; luu = i;
while ((s[luu++] == s1[j++]) && (j < len1)) ;
if (j==len1)
{
memmove(&s[i+len2], &s[i+len1],len-i-len1+1); memcpy(&s[i],s2,len2);
len = len + len2 - len1; i += len2;
}
else i ++;
}
else i++;
}
return s;
}
void main()
{
char s[255], s1[20], s2[20]; printf("Nhap vao chuoi lon : "); gets(s);
printf("Nhap vao chuoi tim : "); gets(s1);
printf("Nhap vao chuoi thay the : "); gets(s2); str_str(s, s1, s2);
printf("Chuoi sau khi tim va thay the la : %s", s);
getch();
}

Bài 19. Viết chương trình tìm số dòng, số từ, số ký tự của một chuỗi. Chuỗi được nhập vào từ bàn phím và kết thúc bằng cách bấm Ctrl-Z và Enter.
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
void main()
{
int sokytu=0, dautu = 0, sotu=0, sodong=1; char c;
puts("\n");
printf("\n Nhap vao mot so dong (ket thuc bam Ctrl-Z va Enter \n");
do {
c = getchar();
if (c != '\n' && c != EOF) sokytu++;
if (isalnum(c) && dautu == 0)
{
sotu++;
dautu=1;
}
if (!isalnum(c) && dautu == 1) dautu = 0;
if (c == '\n') sodong++;
} while (c != EOF);
printf("\n\nSo dong : %d", sodong);
printf("\nSo tu : %d", sotu);
printf("\nSo ky tu : %d", sokytu);
getch();
}

Bài 22. Viết chương trình tìm những người có họ nguyễn trong một mảng các chuỗi.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define maxn 40
int nhap(char mang[][80]);
void lamgon( char *chuoi);
void in(char mang[][80],int n);
void main()
{
char mang[maxn][80]; int tam;
clrscr();
printf("\n CHUONG TRINH TIM TAT CA NHUNG NGUOI CO HO NGUYEN");
printf("\n"); tam=nhap (mang);
printf("\n Nhung nguoi co ho Nguyen la :"); in(mang,tam);
getch();
}
int nhap(char mang[][80])
{
int n=0;
printf("\n Nhap ten ( <ENTER> de ngung nhap)");
while (n<maxn)
{ printf(" \n ten thu %d:",n+1);
gets(mang[n]);
if (strlen(mang[n]) == 0) break;
lamgon(mang[n]);
n++;
}
return(n);
}
void lamgon( char *chuoi)
{
int j,n,t; n=strlen(chuoi);
t=strstr(chuoi," ")-chuoi;
while (t>=0)
{
for (j=t+1; j< n-1; j++)
*(chuoi + j ) = *(chuoi +j+1);
 *(chuoi+j) ='\0';
n-=1;
t=strstr(chuoi," ")-chuoi;
if (t>=n) break;
}
if ( *(chuoi)==' ')
{
for (j=0 ; j<n-1; j++) *(chuoi+j) = *( chuoi +j+1); *(chuoi+j)='\0';
n -=1;
}
if (*(chuoi +n)==' ') *(chuoi +n) = '\0';
}
void in(char mang[][80], int tam)
{
int i=0,j=0,t; char s[6];
for (i=0;i<tam; i++)
{
for (t=0; t<6; t++)
{
s[t]=mang[i][j];
j++;
}
s[t] = '\0';
if (stricmp(s,"nguyen") == 0) printf("\n %s",mang[i]);
}
}

Bài 20. Viết chương trình tìm từ dài nhất trong chuỗi.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
char *max(char s[]); void main()
{ char s[80],*p; int m,n;
tt:
clrscr();
fflush(stdin);
printf("\n\t\t chuong trih tim maxword cau xau:\n"); printf("\n nhap vao mot xau:");
gets(s);
if(s==NULL)
printf("\n\t xau rong ");
else
printf("\n\t tu dai nhat la :%s",max(s)); getch();
printf("\n\t\t tiep tuc khong c/k ? :"); if(toupper(getche())=='C') goto tt;
}
char *max(char s[])
{ char p[100],q[100]; int i,j,k,max=0;
i=0;
while(s[i])
j=0;
if((s[i]!=' ')&&(s[i]!='\t'))
{
while (s[i]!='\0')
{
if((s[i]==' ')||(s[i]=='\t')) break;
p[j++]=s[i++];
}
p[j]='\0';
if (strlen(p)>max) {max=strlen(p);
strcpy(q,p);
}
}
else i++;
}
return q;
}

Cám ơn bạn đã đọc bài viết này. Hãy chia sẻ bài viết và bình luận ý kiến của bạn ở bên dưới.

Share this

Chào mừng bạn đến với SimpleCodeCJava Blog - Mục đích của chúng tôi khi thành lập blog này là muốn chia sẻ những kiến thức và kinh nghiệm lập trình mà chúng tôi đã học được với mong muốn giúp đỡ mọi người, giúp bạn rút ngắn được thời gian tìm hiểu cũng như việc giải quyết những vấn đề trong lập trình C và Java.

0 Comment to "[Bài tập mẫu] Chuỗi ký tự trong C/C++."