Đề thi Kỹ thuật lập trình (có lời giải)
- 페이지 수
- 26
- 형식
- 크기
- 5.2 MB
- 언어
- VI · Tiếng Việt
- 조회수
- 648
- 댓글
- 0
- Lượt tải
- 0
미리보기 생성 중...
- 문서명
- Đề thi Kỹ thuật lập trình (có lời giải)
- 목차
- 이 문서는 명확한 목차가 없습니다.
- 페이지 수
- 26 페이지
- 업로더
- ThiNganHang
상세 요약을 생성 중입니다. 잠시 후 다시 확인해주세요.
설명
Trích nội dung tài liệu
Đề thi số 1 Môn: Kỹ thuật lập trình (IT3040) Thời gian: 90 phút SV được phép sử dụng tài liệu, nhưng không được trao đổi tài liệu, máy tính, điện thoại dđ Câu 1 (0.75đ): Tinh chỉnh đoạn mã sau và giải thích: int letter_count(const char *buf, int size){ int count, i; count = 0; for (i = 0; i < size; i++) { if ((buf[i] >= 'A' && buf[i] <= 'Z') || (buf[i] <= 'z' && buf[i] >= 'a')) count++; } return count; } Câu 2 (1đ): Cho biết giá trị các phần tử của mảng B sau khi thực hiện đoạn lệnh dưới đây: int B[] = {2,4,7,8,9,15}; int c,*p=&B[1]; *p+=1; c=*p--; p+=3; *p+=c; Câu 3 (0.75đ): Phân tích đoạn mã lệnh sau, tìm các lỗi sai (nếu có) rồi sửa lại: i=0; do { putchar(s[i++]) ; putchar('\n'); ) while (s[i] != '\0'); Câu 4 (2.5đ): Viết hàm đệ quy void chuyenCoSo(int base, int number) để chuyển đổi một số nguyên number từ hệ cơ số 10 sang hệ cơ số bất kì base (từ 2 đến 16). Sau đó viết lại hàm dưới dạng không đệ quy. Câu 5 (1đ): Xây dựng cấu trúc phân số gồm tử số và mẫu số là các số nguyên. Thực hiện đa năng hoá toán tử ~ có chức năng giản ước phân số. Ví dụ: ~(10/6) = 5/3 Câu 6 (1đ): Tối ưu đoạn code sau: int i,m,n,p; float c,*a,*b,*c,*d; /* Gán giá trị các biến cần thiết */ for(int i=0; i<4*n; i++){ a[i]=b[i]+c[i]+d[i]+47-5*sin(c)+3*tan(c); m=16*n + 512*p – 17*sin(c); } Câu 7 (2đ): Cho một danh sách liên kết đơn với các nút được khai báo như sau: typedef struct node{ int data; node *pNext; }NODE; Viết hàm để tìm phần tử lẻ nhỏ nhất trong danh sách. Nếu không tìm thấy phần tử lẻ thì trả về 0. Câu 8 (1đ): Đoạn mã sau thực hiện việc copy xâu từ xâu nguồn src sang xâu đích dest. Phân tích, tìm và sửa các lỗi sai (nếu có): void strcpy(char *dest, char *src) { int i; for (i = 0; src[i] != '\O'; i++) dest[i] = src[i]; } ĐÁP ÁN ĐỀ THI SỐ 1 Câu 1 (0.75đ): Nhìn sơ qua đoạn code ta có thể thấy được đoạn code này đếm số kí tự là chữ cái. Tuy nhiên vấn đề ở chỗ các biểu thức logic trong vòng lặp if có thứ tự chưa được tối ưu lắm. Tổng quát như sau: giả sử ta có biểu thức logic dạng (E1 OR E2). Nếu E1 có giá trị TRUE thì cả biểu thức là TRUE và trình dịch sẽ không xem xét giá trị logic của E2 đằng sau nữa. Do đó ta nên đặt biểu thức có xác suất TRUE lớn nhất lên đầu đối với biểu thức dạng trên. Tương tự với biểu thức logic chứa AND: (E1 AND E2). Nếu E1 có giá trị FALSE thì cả biểu thức là FALSE. Do đó ta đưa biểu thức có xác suất FALSE lớn nhất lên đầu. Từ những lập luận trên, ta có đoạn code tối ưu như sau: int letter_count(const char *buf, int size) { int count, i; count = 0; for (i = 0; i < size; i++) { if ((buf[i] >= 'a' && buf[i] <= 'z') || (buf[i] >= 'A' && buf[i] <= 'Z')) count++; } return count; } Trong 1 đoạn văn bản thì xác suất gặp chữ thường là nhiều hơn cả, do đó đặt biểu thức kiểm tra chữ thường lên đầu. Chưa hết, trong 1 text file thì thường các ký tự có giá trị nhỏ hơn bằng 'z'. Và khi đó, rõ ràng biểu thức (buf[i] <= 'z' && buf[i] >= 'a') không tối ưu bằng (buf[i] >= 'a' && buf[i] <= 'z'). Câu 2 (1đ): Bài này đơn giản, để gỡ điểm. Ở đây ban đầu p trỏ tới B[1]. *p+=1 ~ B[1]+=1 => B[1] = 4+1=5. c=*p-- ~ c=*p và p-- => c=B[1]=5, p trỏ tới B[0]. p+=3 => p trỏ tới B[3]. *p+=c => B[3]+=5 => B[3] = 13. Vậy giá trị các phần tử mảng sau khi thực hiện đoạn lệnh là B[] = {2,5,7,13,9,15}. Câu 3 (0.75đ): Đoạn code này thực hiện việc in từng phần tử của chuỗi thành từng dòng. Ở đây sử dụng vòng lặp do-while. Do đó sẽ gặp lỗi nếu xâu s là xâu rỗng. Sửa lại như sau bằng cách đổi sang vòng lặp for: for (i = 0; s[i] != '\0'; i++){ putchar(s[i]); putchar('\n'); } Phát hiện lỗi: 0.5đ, sửa lỗi: 0.25đ. Câu 4 (2.5đ): Hàm đệ quy 1.25đ, hàm không đệ quy 1.25đ. //HÀM ĐỆ QUY void chuyenCoSo(int base, int number) { char digits[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; if(number<=0) { return; } //Gọi đệ quy hàm chuyenCoSo() chuyenCoSo(base,number/base); //Xuất kết quả ra màn hình printf("%c",digits[number%base]); } //HÀM KHÔNG ĐỆ QUY void chuyenCoSo_nonRec(int base, int number) { //Mảng chứa các chữ số của hệ 16 [hex] char digits[]={'
자주 묻는 질문
이 문서를 어떻게 다운로드하나요?
“Đề thi Kỹ thuật lập trình (có lời giải)” 문서의 가격은 20,000đ입니다. PayOS를 통해 지갑을 충전한 다음, '다운로드'를 클릭하여 원본 파일을 구매하고 저장하세요.
이 문서는 몇 페이지로 되어 있나요?
이 문서는 26페이지입니다. 다운로드하기 전에 온라인으로 미리 볼 수 있습니다.
다운로드하기 전에 미리 볼 수 있나요?
네. 이 페이지의 온라인 리더를 통해 문서를 미리 본 후 (처음 몇 페이지) 다운로드 여부를 결정할 수 있습니다.
Đề thi Kỹ thuật lập trình (có lời giải)
미리보기 생성 중...
Trích nội dung tài liệu
Đề thi số 1 Môn: Kỹ thuật lập trình (IT3040) Thời gian: 90 phút SV được phép sử dụng tài liệu, nhưng không được trao đổi tài liệu, máy tính, điện thoại dđ Câu 1 (0.75đ): Tinh chỉnh đoạn mã sau và giải thích: int letter_count(const char *buf, int size){ int count, i; count = 0; for (i = 0; i < size; i++) { if ((buf[i] >= 'A' && buf[i] <= 'Z') || (buf[i] <= 'z' && buf[i] >= 'a')) count++; } return count; } Câu 2 (1đ): Cho biết giá trị các phần tử của mảng B sau khi thực hiện đoạn lệnh dưới đây: int B[] = {2,4,7,8,9,15}; int c,*p=&B[1]; *p+=1; c=*p--; p+=3; *p+=c; Câu 3 (0.75đ): Phân tích đoạn mã lệnh sau, tìm các lỗi sai (nếu có) rồi sửa lại: i=0; do { putchar(s[i++]) ; putchar('\n'); ) while (s[i] != '\0'); Câu 4 (2.5đ): Viết hàm đệ quy void chuyenCoSo(int base, int number) để chuyển đổi một số nguyên number từ hệ cơ số 10 sang hệ cơ số bất kì base (từ 2 đến 16). Sau đó viết lại hàm dưới dạng không đệ quy. Câu 5 (1đ): Xây dựng cấu trúc phân số gồm tử số và mẫu số là các số nguyên. Thực hiện đa năng hoá toán tử ~ có chức năng giản ước phân số. Ví dụ: ~(10/6) = 5/3 Câu 6 (1đ): Tối ưu đoạn code sau: int i,m,n,p; float c,*a,*b,*c,*d; /* Gán giá trị các biến cần thiết */ for(int i=0; i<4*n; i++){ a[i]=b[i]+c[i]+d[i]+47-5*sin(c)+3*tan(c); m=16*n + 512*p – 17*sin(c); } Câu 7 (2đ): Cho một danh sách liên kết đơn với các nút được khai báo như sau: typedef struct node{ int data; node *pNext; }NODE; Viết hàm để tìm phần tử lẻ nhỏ nhất trong danh sách. Nếu không tìm thấy phần tử lẻ thì trả về 0. Câu 8 (1đ): Đoạn mã sau thực hiện việc copy xâu từ xâu nguồn src sang xâu đích dest. Phân tích, tìm và sửa các lỗi sai (nếu có): void strcpy(char *dest, char *src) { int i; for (i = 0; src[i] != '\O'; i++) dest[i] = src[i]; } ĐÁP ÁN ĐỀ THI SỐ 1 Câu 1 (0.75đ): Nhìn sơ qua đoạn code ta có thể thấy được đoạn code này đếm số kí tự là chữ cái. Tuy nhiên vấn đề ở chỗ các biểu thức logic trong vòng lặp if có thứ tự chưa được tối ưu lắm. Tổng quát như sau: giả sử ta có biểu thức logic dạng (E1 OR E2). Nếu E1 có giá trị TRUE thì cả biểu thức là TRUE và trình dịch sẽ không xem xét giá trị logic của E2 đằng sau nữa. Do đó ta nên đặt biểu thức có xác suất TRUE lớn nhất lên đầu đối với biểu thức dạng trên. Tương tự với biểu thức logic chứa AND: (E1 AND E2). Nếu E1 có giá trị FALSE thì cả biểu thức là FALSE. Do đó ta đưa biểu thức có xác suất FALSE lớn nhất lên đầu. Từ những lập luận trên, ta có đoạn code tối ưu như sau: int letter_count(const char *buf, int size) { int count, i; count = 0; for (i = 0; i < size; i++) { if ((buf[i] >= 'a' && buf[i] <= 'z') || (buf[i] >= 'A' && buf[i] <= 'Z')) count++; } return count; } Trong 1 đoạn văn bản thì xác suất gặp chữ thường là nhiều hơn cả, do đó đặt biểu thức kiểm tra chữ thường lên đầu. Chưa hết, trong 1 text file thì thường các ký tự có giá trị nhỏ hơn bằng 'z'. Và khi đó, rõ ràng biểu thức (buf[i] <= 'z' && buf[i] >= 'a') không tối ưu bằng (buf[i] >= 'a' && buf[i] <= 'z'). Câu 2 (1đ): Bài này đơn giản, để gỡ điểm. Ở đây ban đầu p trỏ tới B[1]. *p+=1 ~ B[1]+=1 => B[1] = 4+1=5. c=*p-- ~ c=*p và p-- => c=B[1]=5, p trỏ tới B[0]. p+=3 => p trỏ tới B[3]. *p+=c => B[3]+=5 => B[3] = 13. Vậy giá trị các phần tử mảng sau khi thực hiện đoạn lệnh là B[] = {2,5,7,13,9,15}. Câu 3 (0.75đ): Đoạn code này thực hiện việc in từng phần tử của chuỗi thành từng dòng. Ở đây sử dụng vòng lặp do-while. Do đó sẽ gặp lỗi nếu xâu s là xâu rỗng. Sửa lại như sau bằng cách đổi sang vòng lặp for: for (i = 0; s[i] != '\0'; i++){ putchar(s[i]); putchar('\n'); } Phát hiện lỗi: 0.5đ, sửa lỗi: 0.25đ. Câu 4 (2.5đ): Hàm đệ quy 1.25đ, hàm không đệ quy 1.25đ. //HÀM ĐỆ QUY void chuyenCoSo(int base, int number) { char digits[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; if(number<=0) { return; } //Gọi đệ quy hàm chuyenCoSo() chuyenCoSo(base,number/base); //Xuất kết quả ra màn hình printf("%c",digits[number%base]); } //HÀM KHÔNG ĐỆ QUY void chuyenCoSo_nonRec(int base, int number) { //Mảng chứa các chữ số của hệ 16 [hex] char digits[]={'
- 문서명
- Đề thi Kỹ thuật lập trình (có lời giải)
- 목차
- 이 문서는 명확한 목차가 없습니다.
- 페이지 수
- 26 페이지
- 업로더
- ThiNganHang
상세 요약을 생성 중입니다. 잠시 후 다시 확인해주세요.
댓글 (0)
댓글이 없습니다. 첫 댓글을 남겨보세요!
Bài tập Kinh tế học quốc tế (Có Đáp án)
15 bài tập Xác suất thống kê (có Lời giải)
Trắc nghiệm Đại số tuyến tính (Có Đáp án)
Bài tập Kinh tế nguồn nhân lực (KTNNL) 1 (Có lời giải)
So sánh nội dung trách nhiệm của người chuyên chở theo quy tắc Hague 1924, Hague Visby 1968 với quy tắc Hamburg 1978
Tiểu luận - Kinh tế phát triển - Phân tích nhận định "Việt Nam đã kiên định chọn hướng phát triển lấy con người làm trọng tâm ..."
Đề cương - Luật vận tải
600 Câu trắc nghiệm Tư tưởng Hồ Chí Minh
Tài liệu ôn tập Nguyên lý kế toán
Bài tập Xác suất thống kê đại học - có lời giải

댓글 (0)
댓글이 없습니다. 첫 댓글을 남겨보세요!