Giáo trình Lập trình cơ bản C - Bài 14: Con trỏ (Tiếp theo)

Bài 14  
Con trỏ  
Mục tiêu:  
Kết thúc bài học này, bạn 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 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 bất kỳ kiểu nào. Nghĩa là, các con trỏ  
thể kiểu dữ liệu số nguyên hoặc 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ỏ tự sẽ chứa địa chỉ của một biến kiểu tự.  
14.1.1 Đếm số nguyên âm trong một chuỗi sử dụng con trỏ  
Các con trỏ thể được sử dụng thay cho các chỉ số duyệt các phần ttrong một mảng. dụ,  
một con trỏ kiểu chuỗi thể được dùng để trỏ đến địa chỉ bắt đầu của một từ. 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 như sau:  
1. Khai báo một biến con trỏ kiểu tự. lệnh như sau,  
char *ptr;  
2. Khai báo một mảng tự nhập vào cùng giá trị. lệnh như sau,  
char word[10];  
printf(“\n Enter a word : “);  
scanf(“%s”, word);  
3. Gán con trỏ tự tới chuỗi. lệnh như sau,  
ptr = &word[0];  
Địa chỉ của tự đầu tiên của mảng 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 tự đầu tiên trong mảng 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 lệnh như  
sau,  
int i, vowcnt;  
for(i = 0; i < strlen(word); i++)  
{
Con trỏ  
201  
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ừ số lượng nguyên âm trong từ. Đoạn lệnh sẽ như sau,  
printf(“\n The word is : %s \n The number of vowels in  
the word is: %d “, word,vowcnt);  
Dưới đây 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 lệnh sau:  
void main()  
{
char *ptr;  
char word[10];  
int i, vowcnt=0;  
printf(“\n Enter 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(“\n The word is: %s \n The number of  
the word is: %d “, word, vowcnt);  
vowels in  
}
Xem kết quả, theo những bước sau:  
4. Lưu tập tin với tên pointerI.C.  
5. Biên dịch tập tin, pointerI.C.  
6. Chạy chương trình, pointerI.C.  
7. Trở về trình soạn thảo.  
Kết quả của chương trình trên được thể hiện như trong hình 14.1.  
202  
Lập trình cơ bản C  
Hình 14.1 : Kết quả của chương trình pointerI.C  
14.1.2 Sắp xếp một mảng theo thứ tự abc sử dụng con trỏ  
Các con trỏ 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.  
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ỏ 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ỏ tự chứa 5 chuỗi. lệnh như sau,  
char *ptr[5];  
Mảng được tả trong hình 14.2.  
ptr[0]  
ptr[1]  
ptr[2]  
Ptr[3] ptr[4]  
Hình 14.2: Mảng con trỏ 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 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 tả như hình 14.3.  
ptr[0]  
ptr[1]  
ptr[2]  
ptr[3]  
ptr[4]  
cpyptr1[0]  
cpyptr1[1]  
cpyptr1[2]  
cpyptr1[3]  
cpyptr1[4]  
Hình 14.3 : Mảng con trỏ tự, ptr đang trỏ đến mảng tự cpyptr1  
Con trỏ  
203  
Mỗi chuỗi sẽ được đọc vào bộ nhớ một biến con trỏ sẽ được gán đến vị trí đó. Mảng  
được tả như trong hình 14.4.  
ptr[0]  
ptr[1]  
ptr[2]  
ptr[3]  
ptr[4]  
John  
Samuel  
Ritcha  
Jim  
Young  
Hình 14.4 : 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 lệnh  
như sau,  
char cpyptr2[5][10];  
for(i = 0; i < 5; i++)  
strcpy(cpyptr2[i], cpyptr1ptr[i]);  
Ở đây hàmg 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 là,  
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. Đoạn lệnh là,  
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 chương trình hoàn thiện.  
1. Tạo tập tin mới.  
2. Đưa vào đoạn lệnh sau:  
204  
Lập trình cơ bản C  
void main()  
{
char *ptr[5];  
int i;  
int j;  
char cpyptr1[5][10],cpyptr2[5][10];  
char *temp;  
for(i = 0; i < 5; i++)  
{
printf(“\nEnter 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 The Sorted list is ”);  
for(i = 0; i < 5; i++)  
printf(“\n%s”, ptr[i]);  
}
}
Để xem kết quả, thực hiện theo các bước sau:  
3. Lưu tập tin với tên pointII.C  
4. Biên dịch tập tin, pointII.C  
5. Chạy chương trình, pointII.C  
6. Trở về trình soạn thảo.  
Kết quả của dụ trên được hiển thị ra như trong hình 14.5.  
Con trỏ  
205  
Figure 14.5: Kết quả của chương trình pointII.C  
206  
Lập trình cơ bản C  
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 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.  
Con trỏ  
207  
Bài tập tự làm  
1. Viết một chương trình C để đảo một mảng 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ỏ.  
208  
Lập trình cơ bản C  
doc 8 trang Thùy Anh 26/04/2022 6320
Bạn đang xem tài liệu "Giáo trình Lập trình cơ bản C - Bài 14: Con trỏ (Tiếp theo)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • docgiao_trinh_lap_trinh_co_ban_c_bai_14_con_tro_tiep_theo.doc