Bài 14: Con trỏ [Thực Hành]
Mục tiêu:
Kết thúc bài học này, bạn có thể:
Ø Sử dụng con trỏ
Ø Sử dụng con trỏ với mảng.
Các bước trong bài học này được trình bày chi tiết, rõ ràng và cẩn
thận. Điều này giúp ta hiểu rõ về công cụ lập trình. Thực hiện theo các bước
sau thật cẩn thận.
Phần I – Trong thời gian 1 giờ 30 phút đầu:
14.1 Con trỏ
Các biến con trỏ trong C chứa địa chỉ của một biến có bất kỳ kiểu
nào. Nghĩa là, các con trỏ có thể là kiểu dữ liệu số nguyên hoặc ký tự. Một
biến con trỏ số nguyên sẽ chứa địa chỉ của một biến số nguyên. Một con trỏ ký
tự sẽ chứa địa chỉ của một biến kiểu ký tự.
14.1.1 Đếm số nguyên âm trong một chuỗi sử dụng con trỏ
Các con trỏ có thể được sử dụng thay cho các chỉ số duyệt các phần
tử trong một mảng. Ví dụ, một con trỏ kiểu chuỗi có thể được dùng để trỏ đến
địa chỉ bắt đầu của một từ. Vì vậy một con trỏ được sử dụng để đọc các ký tự
trong từ đó. Để minh họa điều này, chúng ta viết một chương trình C để đếm số
nguyên âm trong một từ bằng cách sử dụng con trỏ. Các bước được liệt kê như
sau:
1. Khai
báo một biến con trỏ kiểu ký tự. Mã lệnh như sau:
char *ptr;
2. Khai
báo một mảng ký tự và nhập vào cùng giá trị. Mã lệnh như sau:
char word[10];
printf(“\n Enter a word : “);
scanf(“%s”, word);
3. Gán
con trỏ ký tự tới chuỗi. Mã lệnh như sau:
ptr = &word[0];
Địa chỉ của ký tự đầu tiên của mảng ký tự, word, sẽ được lưu trong
biến con trỏ, ptr. Nói cách khác, con trỏ ptr sẽ trỏ tới ký tự đầu tiên trong
mảng ký tự word.
4. Lần
lượt duyệt các ký tự trong từ để xác định đó là nguyên âm hay không. Trong
trường hợp một nguyên âm được tìm thấy, tăng giá trị biến đếm nguyên âm. Đoạn
mã lệnh như sau:
int i, vowcnt;
for(i = 0; i < strlen(word); i++)
{
if((*ptr==‘a’)||(*ptr==‘e’)||(*ptr==‘i’)||(*ptr==‘o’)||(*ptr==‘u’)||(*ptr==‘A’)||(*ptr==‘E’)||(*ptr==‘I’)||(*ptr==‘O’)||(*ptr==‘U’))
vowcnt++;
ptr++;
}
5. Hiển
thị từ và số lượng nguyên âm trong từ. Đoạn mã lệnh sẽ như sau:
printf(“\nThe word is:%s \nThe number
of vowels in the word is: %d “, word,vowcnt);
Dưới đây là chương trình hoàn chỉnh.
1. Gọi trình soạn thảo chương trình C.
2. Tạo tập tin mới.
3. Đưa vào đoạn mã lệnh sau:
#include<stdio.h>
#include<conio.h>
#include<string.h>
main()
{
char *ptr;
char word[10];
int i, vowcnt=0;
printf("\nEnter a word: ");
scanf("%s", word);
ptr = &word[0];
for(i = 0; i < strlen(word); i++)
{
if((*ptr=='a')||(*ptr=='e')||(*ptr=='i')||(*ptr=='o')||(*ptr=='u')||(*ptr=='A')
|| (*ptr=='E')||(*ptr=='I')||(*ptr=='O')||(*ptr=='U'))
vowcnt++;
ptr++;
}
printf("\nThe word is: %s \nThe number
of vowels in the word is: %d ", word, vowcnt);
getch();
}
3. Biên dịch và thực thi chương trình.
Kết quả của chương trình:
14.1.2 Sắp xếp một mảng theo thứ tự abc sử dụng con trỏ
Các con trỏ có thể được sử dụng để hoán vị nội dung của hai ô nhớ.
Để minh họa điều này, chúng ta viết một chương trình C để sắp xếp một tập các
chuỗi theo thứ tự abc.
Có nhiều cách giải quyết chương trình này. Chúng ta hãy dùng một
mảng của con trỏ ký tự để hiểu cách dùng mảng của con trỏ.
Để thực hiện chương trình này:
1. Để
khai báo mảng con trỏ ký tự chứa 5 chuỗi. Mã lệnh như sau:
char
*ptr[5];
Mảng được mô tả trong hình
14.1.
Hình 14.1: Mảng con trỏ ký tự
2. Nhập
5 chuỗi và gán các con trỏ trong mảng con trỏ đến các chuỗi. Đoạn mã lệnh
như sau:
int i;
char cpyptr1[5][10];
for (i=0;i<5;i++)
{
printf(“\n Enter a string : “);
scanf(“%s”,cpyptr1[i]);
ptr[i]=cpyptr1[i];
}
Mảng được mô tả như hình
14.2.
Hình 14.2 : Mảng con trỏ ký tự, ptr
đang trỏ đến mảng ký tự cpyptr1
Mỗi chuỗi sẽ được đọc vào bộ nhớ và một biến con trỏ sẽ được gán
đến vị trí đó. Mảng được mô tả như trong hình
14.3.
Hình 14.3 : Mảng sau khi được nhập các giá
trị
3. Lưu
trữ mảng của các chuỗi trước khi sắp xếp.
Để thực hiện điều này, chúng ta cần tạo một bản sao của mảng các
chuỗi. Đoạn mã lệnh như sau:
char cpyptr2[5][10];
for(i = 0; i < 5; i++)
strcpy(cpyptr2[i], cpyptr1ptr[i]);
Ở đây hàm strcpy()
được sử dụng để sao chép các chuỗi vào một mảng khác.
4. Sắp
xếp mảng các chuỗi theo thứ tự abc. Mã lệnh:
char *temp;
for(i = 0; i < 4; i++)
{
for(j = i + 1; j < 5; i++)
{
if (strcmp(ptr[i], ptr[j])
> 0)
{
temp = ptr[i];
ptr[i] = ptr[j];
ptr[j] = temp;
}
}
}
5. Hiển
thị các chuỗi ban đầu và các chuỗi đã được sắp xếp. Mã lệnh:
print(“\nThe Original list is ”);
for(i = 0; i < 5; i++)
printf(“\n%s”,
cpyptr2[i]);
printf(“\nThe Sorted list is ”);
for(i = 0; i < 5; i++)
printf(“\n%s”, ptr[i]);
Dưới đây là chương trình hoàn thiện.
1. Tạo tập tin mới.
2. Đưa vào đoạn mã lệnh sau:
#include<stdio.h>
#include<conio.h>
#include<string.h>
main()
{
char
*ptr[5];
int i;
int j;
char
cpyptr1[5][10],cpyptr2[5][10];
char *temp;
for(i = 0; i < 5; i++)
{
printf("Enter a string: ");
scanf("%s", cpyptr1[i]);
ptr[i] = cpyptr1[i];
}
for(i = 0; i < 5; i++)
strcpy(cpyptr2[i],
cpyptr1[i]);
for(i = 0; i < 4; i++)
{
for(j = i + 1; j < 5; j++)
{
if (strcmp(ptr[i],
ptr[j]) > 0)
{
temp =
ptr[i];
ptr[i] =
ptr[j];
ptr[j] = temp;
}
}
}
printf("\n The Original list is
");
for(i = 0; i < 5; i++)
printf("\n%s",
cpyptr2[i]);
printf("\n\n The Sorted list is ");
for(i = 0; i < 5; i++)
printf("\n%s", ptr[i]);
getch();
}
3. Biên
dịch và thực thi chương trình.
Kết
quả của chương trình:
Phần II – Trong thời gian 30 phút kế tiếp:
1. Viết
một chương trình C để nối hai chuỗi bằng cách sử dụng các con trỏ.
Để thực hiện điều này:
a. Khai
báo ba biến chuỗi.
b. Khai
báo ba con trỏ kiểu ký tự.
c. Nhập
các giá trị của hai chuỗi.
d. Tạo
ba con trỏ để trỏ đến ba biến chuỗi. Chuỗi thứ ba hiện tại không có bất kỳ giá
trị gì.
e. Lặp
qua chuỗi thứ nhất và sao chép nội dung của chuỗi đó vào chuỗi thứ ba. Sử dụng
các biến con trỏ để sao chép các giá trị.
f. Sau
khi sao chép chuỗi thứ nhất, lặp qua chuỗi thứ hai và chép nội dung của chuỗi
vào cuối chuỗi ba. Sử dụng các biến con trỏ để sao chép giá trị.
g. In
ra chuỗi thứ ba.
Bài tập tự làm
1. Viết
một chương trình C để đảo một mảng ký tự bằng cách sử dụng con trỏ.
2. Viết
một chương trình để cộng hai ma trận sử dụng các con trỏ.
Ăn cắp của aptech
Trả lờiXóaBạn Kim Tùng nói khó nghe vậy? Chỉ là chia sẻ kiến thức thôi mà.
Trả lờiXóa