Thực hành ngôn ngữ lập trình C (Bài tập lập trình và ñáp án) I. Hướng dẫn sử dụng Turbo C v2.01 Turbo C là môi trường soạn thảo và biên dịch chương trình cho ngôn ngữ C trên hệ ñiều hành DOS. Tệp chương trình thường có tên là tc.exe. Ngoài ra nó cũng cần một số tệp khác kèm theo phục vụ cho một số mục ñích nhất ñịnh. Ví dụ như các tệp tiêu ñề .h, và các tệp thư viện .lib hoặc .obj. Thao tác soạn thảo, biên dịch và debug lỗi chương trình trên Turbo C hoàn toàn giống như khi bạn làm việc trên môi trường của Turbo Pascal. Tuy nhiên cần chú ý một số ñiểm sau ñây. 1. Xác lập thư mục Khi biên dịch chương trình, trình biên dịch cần biết thông tin nơi tìm kiếm các tệp header và thư viện (.h, .lib, .obj) và thông tin này ñược ñặt trong lựa chọn Option/Directories. Nếu như các bạn ñặt lựa chọn này sai thì khi dịch chương trình thường xuất hiện lỗi dạng như: Unable to open include file "stdio.h". Như vậy bạn phải ñặt ñúng ñường dẫn thư mục thì trình biên dịch mới tìm thấy tệp cần thiết. Có hai ñường dẫn: • ðường dẫn tìm các tệp tiêu ñề (.h) cho phần INCLUDE. Ví dụ C:\TC\INCLUDE nếu như các tệp tiêu ñề nằm trong thư mục này • ðường dẫn tìm các tệp thư viện (.obj) cho phần LIB. Ví dụ C:\TC\LIB nếu như các tệp thư viện nằm trong thư mục này. 2. Soạn thảo và biên dịch chương trình Sau khi soạn thảo xong chương trình có thể cất ra ñĩa bằng menu lệnh File\Save hoặc nhấn F2. Tên tệp của bạn có ñuôi “.c”. Chúng ta có thể biên dịch chương trình bằng cách nhấn F9 hoặc chạy chương trình bằng Ctrl-F9. Nếu như chương trình có lỗi thì trên màn hình sẽ xuất hiện cửa sổ liệt kê các lỗi của chương trình. Khác với Turbo Pascal, tất cả các lỗi có trong chương trình C ñược hiện cùng một lúc trên một cửa sổ do vậy bạn có thể di chuyển thanh sáng trên cửa sổ lỗi ñể biết vị trí lỗi tương ứng trên chương trình và sửa nó. 3. Gỡ rối chương trình Hãy thử công cụ gỡ rối bằng các chức năng • Chạy lần bước : F8 • Chạy ñến vị trị con trỏ : Ctrl-F4 • Xem kết quả chạy chương trình : Alt-F5. • Dừng chạy lần bước chương trình : Ctrl-F2 II. Bài tập thực hành Bài 1: Viết chương trình tìm số lớn nhất của ba số a, b, c ñược nhập vào từ bàn phím. Bài 2: Viết một chương trình cho phép tạo một menu ñơn giản sau 1. Chào 2. Cảm ơn 3. Tạm biệt Nhập lựa chọn (1-2-3): Tuỳ vào lựa chọn của người sử dụng mà chương trình in ra dòng chữ tương ứng. Nếu lựa chọn là 1-2 chương trình tiếp tục thực hiện ñể người sử dụng nhập lựa chọn mới. Lựa chọn 3 cho phép kết thúc chương trình. Bài 3: Viết chương trình tìm các số có 3 chữ số xyz sao cho xyz = x 3 + y 3 + z 3 . Bài 4: Viết chương trình cho phép nhập một chuỗi kí tự bất kì và sau ñó in ra xâu ngược của chuỗi kí tự ñó. Bài 5: Viết chương trình quản lí ñiểm học sinh bằng danh sách móc nối. Mỗi nút trong danh sách là một cấu trúc bao gồm thông tin về tên và ñiểm của học sinh. Xây dựng một menu cho chương trình cho ñể cho phép người sử dụng thực hiện các thao tác như thêm, sửa, xoá và tìm kiếm trong danh sách học sinh. III. ðáp án Bài 1: #include <stdio.h> #include <conio.h> void main(void) { int a, b, c, max; do { /* nhập 3 số a, b, c */ printf("Nhap so thu nhat : "); scanf("%d", &a); printf("Nhap so thu hai : "); scanf("%d", &b); printf("Nhap so thu ba : "); scanf("%d", &b); /* tim so lon nhat */ max = a > b ? a : b; if (max < c) max = c; /* in ket qua */ printf("So lon nhat la: %d\n", max); printf("An ESC de ket thuc, phim khac de tiep tuc "); }while (getche()!=27); } Bài 2: #include <stdio.h> #include <conio.h> void main(void) { int lc; do { /* in menu */ printf("Chao\n"); printf("Cam on\n"); printf("Tam biet\n"); /* nhập lựa chọn */ printf("\nNhap lua chon (1-2-3):"); scanf("%d", &lc); /* kiểm tra lựa chọn và thực hiện */ switch(lc) { case 1 : printf("Chao ban\n"); break; case 2 : printf("Cam on ban\n"); break; case 3 : printf("Tam biet! Chuong trinh ket thuc o day\n"); break; default : printf("Ban da nhap sai gia tri\n"); } if (lc!=3) { printf("An phim bat ki de tiep tuc"); getche(); } }while (lc!=3); } Bài 3: #include <stdio.h> #include <conio.h> void main(void) { int chuso, tong, dem, i; dem = 0; for (i=100; i<=999; i++) { tong = 0; /* lấy số thứ nhất */ chuso = i/100; tong += chuso*chuso*chuso; /* lấy số thứ hai */ chuso = (i/10)%10; tong += chuso*chuso*chuso; /* lấy số thứ ba */ chuso = i%10; tong += chuso*chuso*chuso; if (i==tong) printf("\nSo thu %d la: %d", ++dem, i); } getch(); } Bài 4: #include <stdio.h> #include <string.h> void main() { char s[80], ch; int i, n; printf("Nhap xau: "); gets(s); i = 0; n = strlen(s); /* duyệt các kí tự một nửa ñầu của xâu */ for (i=0; i<n/2; i++) { /* ñổi chỗ của hai kí tự ñối xứng tại hai ñầu */ ch = s[i]; s[i]=s[n-1-i]; s[n-1-i]=ch; } printf("Xau nguoc la: %s", s); } Bài 5: #include <stdio.h> #include <alloc.h> #include <stdlib.h> struct nut_hs { char ten[25]; int diem; struct nut_hs* tiep; }; /* khai báo biến tổng thể là con trỏ ñến nút ñầu danh sách */ struct nut_hs *nutdauds = NULL; /* ban ñầu danh sách rỗng */ /* thêm một nút học sinh mới vào danh sách */ void them_nuths(char* ten, int diem); /* xoá một nút học sinh có tên là ten */ void xoa_nuths(char *ten); /* in danh sách học sinh */ void in_ds(); /* tra ñiểm của học sinh theo tên */ void timkiem(char *ten); /* tạo menu lựa chọn công việc */ void tao_menu(); void main() { tao_menu(); } void tao_menu() { char ten[25]; int diem; int chon; do { printf("1. Nhap hoc sinh\n"); printf("2. Xoa hoc sinh\n"); printf("3. In danh sach hoc sinh\n"); printf("4. Tim kiem\n"); printf("0. Thoat\n"); printf("Lua chon: "); scanf("%d", &chon); switch(chon) { case 1: fflush(stdin); printf("Ten: "); gets(ten); if (strcmp(ten, "")!=0) { printf("Diem: "); scanf("%d", &diem); them_nuths(ten, diem); } break; case 2: fflush(stdin); printf("Ten hoc sinh can xoa: "); gets(ten); xoa_nuths(ten); break; case 3: in_ds(); break; case 4: fflush(stdin); printf("Ten hoc sinh: "); gets(ten); timkiem(ten); break; case 0: printf("Tam biet"); break; default: printf("Nhap lai gia tri khac\n"); } }while(chon!=0); } void them_nuths(char* ten, int diem) { struct nut_hs * hs; /* tạo nút mới và copy dữ liệu */ hs = (struct nut_hs*)malloc(sizeof(struct nut_hs)); strcpy(hs->ten, ten); hs->diem = diem; /* nối nút vào ñầu danh sách, danh sách ko sắp xếp */ hs->tiep = nutdauds; nutdauds = hs; } void xoa_nuths(char *ten) { struct nut_hs * hs, *p; /* tìm nút cần xoá */ hs = nutdauds; p = NULL; /* p trỏ tới nút trước nút cần xoá */ while(hs!=NULL&&strcmp(hs->ten, ten)!=0) { p = hs; /* xác lập lại cho p trỏ tới trước hs */ hs = hs->tiep; } if (hs !=NULL) /* nếu tìm thấy nút cần xoá */ { /* kiểm tra có nút ñứng trước nút cần xoá không */ if (p !=NULL) p->tiep = hs->tiep; else /* nút ñầu danh sách sẽ là nút sau nút cần xoá */ nutdauds = hs->tiep; free(hs); } } void in_ds() { struct nut_hs * hs; printf("Danh sach ten va diem hoc sinh:\n"); /* duyệt danh sách bằng vòng for */ for(hs=nutdauds; hs!=NULL; hs=hs->tiep) printf("%s: %d\n", hs->ten, hs->diem); } void timkiem(char *ten) { struct nut_hs *hs; hs = nutdauds; while(hs!=NULL&&strcmp(hs->ten, ten)!=0) { hs = hs->tiep; } if (hs!=NULL) printf("Diem cua hoc sinh la %d\n", hs->diem); else printf("Khong tim thay hoc sinh co ten dua vao\n"); } . hiện c a sổ liệt kê c c lỗi c a chương trình. Kh c với Turbo Pascal, tất c c c lỗi c trong chương trình C ñư c hiện c ng một l c trên một c a sổ do vậy bạn c thể di chuyển thanh sáng trên c a. lệnh FileSave ho c nhấn F2. Tên tệp c a bạn c ñuôi “ .c . Chúng ta c thể biên dịch chương trình bằng c ch nhấn F9 ho c chạy chương trình bằng Ctrl-F9. Nếu như chương trình c lỗi thì trên màn. Th c hành ngôn ngữ lập trình C (Bài tập lập trình và ñáp án) I. Hướng dẫn sử dụng Turbo C v2.01 Turbo C là môi trường soạn thảo và biên dịch chương trình cho ngôn ngữ C trên hệ