Bài tập thực hành ngôn ngữ C Nguyễn Trần Thi Văn Bài tập thực hành số 1 (Các khái niệm cơ bản -Nhập xuất dữ liệu) 1. Làm quen với trình soạn thảo mã nguồn của Turbo C 3.0 (hay Borland C 3.1) Hướng dẫn: ● Trình soạn thảo mã nguồn của C gần như hoàn toàn tương tự với trình soạn thảo của Pascal 7.0, do đó các bạn có thể làm quen dễ dàng. ● Tập tin chạy \TC30\BIN\TC.EXE (hoặc \BORLANDC\BIN\BC.EXE) ● Các thao tác Edit trên màn hình soạn thảo hoàn toàn tương tự như của Pascal. 2. Nhập vào và chạy thử các ví dụ mẫu trong phần lý thuyết: a. Chương trình Hello World b. Chương trình tính chu vi và diện tích hình tròn. c. Chương trình minh họa các tiền xử lý (#include và #define), … Hướng dẫn: ● Biên dịch chương trình > Menu COMPILE > Make (Phím nóng F9). ● Chạy chương trình > Menu RUN > Run (Ctrl-F9). Lưu ý là chương trình chỉ chạy được khi không có lỗi biên dịch (biên dịch thành công). ● Xem kết quả > Menu WINDOW > User Screen (Alt-F5). 3. Viết chương trình in ra màn hình các hình vẽ như sau: a. * *** ***** ******* b. ******* ******* ******* ******* c. * *** ***** ******* Hướng dẫn: Dùng hàm printf in chuỗi bình thường. Lưu ý sử dụng ‘\n’! 4. (*)Viết chương trình tìm số lớn nhất trong 3 số nguyên cho trước. Hướng dẫn: ● Dùng hàm scanf(“%d”, &<tên_biến>) để nhập một số nguyên từ bàn phím. ● Dùng toán tử cấp 3 ?: để tìm max (xem ví dụ trong bài giảng) 5. (*)Viết chương trình nhập vào 2 số nguyên x, y. Tính và in ra màn hình các kết quả sau: a. (x 3 + y 3 )*(x + y) b. (x << 2) + ( y>>2 ) Page 1/9 Page 1/9 Bài tập thực hành ngôn ngữ C Nguyễn Trần Thi Văn c. (x | y) – (x & y) (ghi chú: các bài tập sau đây có sử dụng câu lệnh rẽ nhánh if) 6. (*)Viết chương trình giải phương trình bậc 2: ax 2 + bx + c = 0 với các hệ số a, b, c nhập từ bàn phím. 7. (*)Viết chương trình giải hệ phương trình bậc nhất 2 ẩn, các hệ số nhập từ bàn phím: ax + by + c = 0 mx + ny + p = 0 8. (*)Viết chương trình thể hiện một menu đơn giản, cho phép chọn một trong các hình để tính chu vi và diện tích: 1. Hình tam giác 2. Hình tròn 3. Hình vuông 4. Hình chữ nhật Bạn chọn hình nào?_ Với hình tam giác, nhập vào độ dài 3 cạnh; hình tròn nhập bán kính, hình vuông nhập 1 cạnh; hình chữ nhật nhập 2 cạnh. In ra màn hình chu vi và diện tích của hình đó. 9. Viết chương trình tính tiền điện, với qui định về giá như sau: a. 100 kwh đầu tiên giá 600đ/kwh b. 50 kwh tiếp theo giá 900đ/kwh c. 100 kwh kế tiếp giá 1200đ/kwh d. từ kwh thứ 250 trở đi, giá 1500đ/kwh Nhập vào số KWH tiêu thu trong tháng, tính và in ra số tiền phải trả. 10. Viết chương trình trò chơi đoán số. a. Người đoán, máy trả lời. b. Máy đoán, người trả lời. Lưu ý: Các bài có dấu (*) là bài tập bắt buộc. Page 2/9 Page 2/9 Bài tập thực hành ngôn ngữ C Nguyễn Trần Thi Văn Bài tập thực hành số 2 (các cấu trúc điều khiển) 1. (*)Cho số nguyên n nhập từ bàn phím. Kiểm tra xem n có phải là số nguyên tố hay không? Hướng dẫn: ● Một số được gọi là số nguyên tố nếu nó chỉ chia hết cho 1 và chính nó. ● Nếu một số n không chia hết cho bất kì số nào trong khoảng từ 2 cho đến+1 thì n là số nguyên tố. 2. (*)Viết chương trình liệt kê tất cả các số nguyên tố nhỏ hơn hay bằng một số n cho trước. 3. (*)Viết chương trình tìm Ước số chung lớn nhất (USCLN) và Bội số chung nhỏ nhất (BSCNN) của 2 số nguyên dương a, b nhập từ bàn phím. 4. Viết chương trình nhập ngày tháng năm sinh (D, M, Y) của một người. Tìm xem người đó sinh vào ngày thứ mấy trong tuần. 5. Viết chương trình thực hiện phép trừ 2 ngày với nhau. VD: Từ ngày 1/1/2003 đến ngày 10/1/2003 được tính là 9 ngày. (*) Lưu ý: 2 bài tập 4 và 5, SV phải làm ít nhất 1 bài! 6. Mở rộng chương trình trong bài tập 3 (BTTH số 1), in ra màn hình các dạng tam giác với chiều cao n nhập từ bàn phím. c. a. * *** ***** ******* b. ******* ******* ******* ******* c. * *** ***** ******* d. * *** ***** *** * e. * ***** ********* ***** * Page 3/9 Page 3/9 Bài tập thực hành ngôn ngữ C Nguyễn Trần Thi Văn f. * * * * * * * * * g. * * * * * * * * * * * * h. * * * * * * * * * i. * * * * * * * * j. * * * * * * * * 7. Viết chương trình tìm tất cả các ước số của một số nguyên cho trước nhập từ bàn phím. 8. Viết chương trình cho một dòng chữ chạy ngang màn hình. Bài tập thực hành số 3 (mảng và chuỗi) 1. (*)Cho số nguyên n nhập từ bàn phím. Viết chương trình đổi số này sang các hệ nhị phân, bát phân và thập lục phân. In các kết quả ra màn hình. 2. (*)Viết chương trình tìm số lớn nhất và nhỏ nhất trong mảng số nguyên a cho trước với số phần tử của mảng là n. 3. (*)Cho mảng a có n phần tử. Viết chương trình minh họa các thao tác cập nhật và xóa phần tử tại vị trí thứ i trong mảng, thực hiện việc chèn thêm một số nguyên x vào sau phần tử thứ i (0 i < n). 4. Cho số nguyên x và mảng nguyên a có n phần tử. Viết chương trình kiểm tra xem một mảng a đã được xếp tăng hay chưa. Nếu mảng có thứ tự thì tìm xem x có trong mảng không (bằng phương pháp tìm kiếm nhị phân). Còn nếu mảng chưa có thứ tự thì thực Page 4/9 Page 4/9 Bài tập thực hành ngôn ngữ C Nguyễn Trần Thi Văn hiện việc sắp xếp mảng tăng dần, sau đó chèn phần tử x vào mảng sao cho mảng a vẫn có thứ tự. 5. Cho 2 mảng nguyên A, B có thứ tự (tăng dần). Thực hiện việc trộn 2 mảng A và B để tạo ra mảng C cũng có thứ tự (tăng dần). 6. Cho mảng số nguyên A. Tạo ra 2 mảng nguyên B và C theo quy tắc: mảng B gồm các phần tử dương hoặc bằng 0 của A và mảng C gồm các phần tử âm của A. 7. (*)Viết hàm đếm số từ trong một chuỗi. 8. Viết chương trình đảo ngược các từ trong chuỗi. Ví dụ chuỗi ban đầu là “học sinh” thì chuỗi kết quả là “sinh học”. 9. Viết chương trình nhập vào một số nguyên (unsigned long). Xuất ra màn hình cách đọc của số đó. Ví dụ: số 107 đọc là “ Một trăm lẻ bảy”, số 1065 đọc là “Một ngàn không trăm sáu mươi lăm”, (*) 10. (*)Viết chương trình loại bỏ các khoảng trắng thừa ở đầu chuỗi và cuối chuỗi, giữa các từ chỉ để lại một khoảng trắng. Lưu ý: Các bài tập có dấu (*) là bài tập bắt buộc Page 5/9 Page 5/9 Bài tập thực hành ngôn ngữ C Nguyễn Trần Thi Văn Bài tập thực hành số 3a (mảng và chuỗi - phần bổ sung) 1. Cho mảng A gồm n phần tử. Viết chương trình tìm số lớn thứ hai trong mảng. Lưu ý, chỉ duyệt qua mảng một lần (dùng một vòng lặp).\ 2. Viết chương trình nhập vào một mảng, trong quá trình nhập, mảng được sắp xếp thứ tự luôn (tăng / giảm dần). 3. Cho ma trận vuông A[20][20], có kích thước N. Viết chương trình: a. tính tổng trên các dòng, các cột, trên đường chéo chính, đường chéo phụ. b. Sắp xếp ma trận sao cho các phần tử trên đường chéo chính dần. c. Sắp xếp ma trận sao cho các phần tử trên đường chéo phụ giảm dần. d. Tìm và in ra tất cả các vị trí xuất hiện của số lớn nhất trong ma trận. 4. Viết chương trình đổi chữ cái đầu tiên của mỗi từ trong một chuỗi thành chữ hoa. 5. (*)Cho một mảng số nguyên A gồm n phần tử. Tìm mảng con không giảm (run) dài nhất trong A. Ví dụ: Cho mảng : 5 8 7 8 9 6 12 20 30 18 (n = 10) thì mảng con không giảm dài nhất sẽ là: 6 12 20 30 (gồm 4 phần tử) Hướng dẫn: ● Dùng 2 biến: startIndex để lưu vị trí bắt đầu của mảng con trong mảng chính, maxLength lưu chiều dài mảng con. ● Dùng vòng lặp duyệt mảng, sử dụng 2 biến tạm lưu vị trí và chiều dài của run hiện thời, so sánh và cập nhật startIndex và maxLength nếu cần thiết. 6. (*)Cho mảng A gồm n số nguyên tạo ngẫu nhiên. Tạo mảng B gồm các phần tử là số chẵn có trong A. 7. Cho ma trận vuông A[20][20], có kích thước N. Viết chương trình thực hiện sắp xếp lại ma trận tăng dần theo dòng và cột, tức là: A[0][0] < A[0][1] < … < A[0][N-1] < A[1][0] < … < A[N-1][N-1] Ví dụ: N = 3 1 5 6 1 2 3 4 9 7 ==> 4 5 6 3 8 2 7 8 9 Page 6/9 Page 6/9 Bài tập thực hành ngôn ngữ C Nguyễn Trần Thi Văn Bài tập thực hành số 4 (Chương trình con – hàm) 1. (*)Xây dựng các hàm kiểm tra (mỗi câu viết thành một hàm) a. Một số nguyên dương n có phải là số nguyên tố không? b. Một số nguyên dương n có phải là số chính phương không? c. Một mảng số nguyên a (có n phần tử) có phải là mảng có thứ tự (tăng/giảm) không? Hướng dẫn: Ví dụ mẫu: int Nguyento( unsigned int n) /****************************** n : so can kiem tra neu n la so nguyen to, ham tra ve tri 1 nguoc lai tra ve 0. *******************************/ { int i; for (i=2; i<int(sqrt(n))+1; i++) if (n%i==0) return 0; return 1; } Lưu ý: Câu lệnh return <giá trị> sẽ trả giá trị tương ứng về cho chương trình gọi và kết thúc chương trình con đang thực hiện, bỏ qua tất cả các câu lệnh phía sau nó trong đoạn chương trình con này (điều này đảm bảo chương trình con luôn chỉ có một giá trị trả về). a. Số chính phương là số mà căn bậc 2 của nó là một số nguyên, vd: 4, 9, 16, 25 b. Prototype: int MangTang(int a[], int n, int tang); /*********************** a : mang can kiem tra n : so phan tu cua mang tang: dùng để kiểm tra tăng hay giảm, nếu muốn kiểm tra xem mảng có tăng không, truyền tang = 1, ngược lại, để kiểm tra giảm, truyền trị 0. neu mang co thu tu (tang/giam), ham tra ve tri 1 nguoc lai tra ve 0. ***********************/ 2. Xây dựng các hàm tính toán: a. Tìm ước số chung lớn nhất của 2 số nguyên dương a, b. b. Tìm bội số chung nhỏ nhất của 2 số nguyên dương a, b. c. Tìm số lớn nhất (nhỏ nhất) trong mảng số nguyên a, có n phần tử. d. Hàm tính n! (n giai thừa), không dùng đệ quy. e. Tính tổ hợp chập k của n C(k, n) f. Tính chỉnh hợp chập k của n A(k, n) Page 7/9 Page 7/9 Bài tập thực hành ngôn ngữ C Nguyễn Trần Thi Văn Hướng dẫn: a. Prototype: unsigned int USCLN( unsigned a, unsigned b); /******************************************** a, b : 2 so can tim uoc chung Ham tra ve mot so nguyen duong la UCLN cua 2 so a, b. *********************************************/ b. Tương tự a c. Tương tự câu 1c. d. n! = 1.2.3 n e. C(k, n) = f. A(k, n) = 3. Các hàm liên quan đến mảng: a. Sắp xếp mảng tăng/giảm dần. b. Tìm vị trí đầu tiên của số x trong mảng. c. Tìm tất cả các vị trí xuất hiện của x, kết quả lưu trong mảng phụ. d. Xóa phần tử tại vị trí index trong mảng. e. Xóa tất cả các phần tử bằng x trong mảng. f. Xóa tất cả các phần tử trùng nhau trong mảng. g. Xóa các phần tử trùng nhau, chỉ chừa lại một phần tử đầu tiên. Ví dụ: trong mảng có 3 phần tử có giá trị là 10, xóa 2 phần tử phía sau, chỉ để lại một phần tử đầu tiên có giá trị bằng 10 mà thôi. h. Chèn một số x vào mảng tại vị trí index. i. Chèn x vào mảng A có thứ tự sao cho mảng sau khi chèn vẫn có thứ tự. j. Trộn 2 mảng A, B có thứ tự thành mảng C có thứ tự. k. Tách mảng A thành 2 mảng con B, C sao cho B chứa các số chẵn, C chứa các số lẻ. 4. Viết các hàm xử lý chuỗi như sau (khai báo trong tập tin tiêu đề mystring.h để sau này có thể sử dụng cho các chương trình khác ): a. strUpper: Đổi toàn bộ chuỗi thành chữ thường. b. strLower: Đổi toàn bộ chuỗi thành chữ hoa. Lưu ý, không dùng các hàm strlwr() và strupr() của thư viện string.h. c. strFind: Tìm vị trí xuất hiện đầu tiên của chuỗi con subs trong chuỗi s, nếu không tìm thấy trả về -1. d. strSub: Trả về chuỗi con của chuỗi s, lấy num ký tự, kể từ vị trí pos. Nếu số ký tự vượt quá chiều dài chuỗi thì chỉ lấy đến cuối chuỗi. Lưu ý không dùng hàm strstr(). e. strDel: Xóa num ký tự trong chuỗi s, kể từ vị trí pos, nếu số ký tự vượt quá chiều dài chuỗi thì chỉ xóa đến cuối chuỗi. f. strInsert: Chèn chuỗi con subs vào chuỗi s tại ví trí pos. g. Đưa thêm các hàm đã làm trong bài tập trước vào thư viện hàm này – hàm strWord (đếm số từ trong chuỗi), hàm strWordInverse (đảo ngược thứ tự các từ trong chuỗi), hàm strTrim (cắt bỏ các khoảng trắng thừa) 5. Viết hàm đổi số nguyên dương n từ hệ 10 sang hệ k (k từ 2 đến 16, tiêu biểu là 2, 8 và 16). Kết quả được in ra màn hình Page 8/9 Page 8/9 Bài tập thực hành ngôn ngữ C Nguyễn Trần Thi Văn 6. Xây dựng các hàm: a. Viết hàm kiểm tra xem một chuỗi nhập vào có phải là chuỗi biểu diễn một số hệ k hay không. VD: chuỗi biểu diễn số nhị phân chỉ gồm các kí tự là ‘0’ và ‘1’, chuỗi biểu diễn số hệ 16 chỉ gồm chữ số (0 9) và các chữ cái a f hay A F. b. Viết hàm đổi ngược một chuỗi biểu diễn số hệ k (k = 2, 8 hay 16) sang số hệ 10 (có sử dụng hàm trong câu a để kiểm tra chuỗi hợp lệ). Page 9/9 Page 9/9 . Chèn x vào mảng A c thứ tự sao cho mảng sau khi chèn vẫn c thứ tự. j. Trộn 2 mảng A, B c thứ tự thành mảng C có thứ tự. k. Tách mảng A thành 2 mảng con B, C sao cho B chứa c c số chẵn, C chứa. tổng trên c c dòng, c c cột, trên đường chéo chính, đường chéo phụ. b. Sắp xếp ma trận sao cho c c phần tử trên đường chéo chính dần. c. Sắp xếp ma trận sao cho c c phần tử trên đường chéo phụ giảm. nguồn c a C gần như hoàn toàn tương tự với trình soạn thảo c a Pascal 7.0, do đó c c bạn c thể làm quen dễ dàng. ● Tập tin chạy TC30BINTC.EXE (ho c BORLANDCBINBC.EXE) ● C c thao t c Edit