SlideShare a Scribd company logo
1 of 26
Download to read offline
Đề 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[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
char output[100];
int i=0;
while(number>0)
{
output[i++] = digits[number%base];
number = number/base;
}
i--;
//Xuất ra kết quả
for(;i>=0;i--)
{
printf("%c",output[i]);
}
}
Câu 5 (1đ): Ở đây đề bài yêu cầu phải tối giản phân số. Do đó ta cần đưa vào hàm tìm ước chung lớn nhất của tử số và mẫu số.
Xét 2 hàm tìm UCLN (sử dụng đệ quy cho nhanh gọn) như dưới đây. (0.25đ)
//Cách 1:
int UCLN(int a, int b)
{
return b ? UCLN(b, a % b) : a;
}
//Cách 2:
int UCLN( int x, int y)
{ if(x==y)
return x;
else if(x>y)
return UCLN(x-y,y);
else
return UCLN(x,y-x);
}
Xây dựng cấu trúc phân số (0.25đ):
typedef struct PhanSo{
int TuSo, MauSo;
}PS;
Đa năng hoá toán tử ~ có chức năng tối giản phân số (0.5đ)
PS operator ~ (PS &a){
a.TuSo/=UCLN(a.TuSo, a.MauSo);
a.MauSo/=UCLN(a.TuSo, a.MauSo);
return a;
}
Câu 6 (1đ): Tối ưu đoạn code…
+ Đặt các biểu thức bất biến là hằng số (0.25đ):
float temp1=47-5*sin(c)+3*tan(c);
Có thể một số bạn sẽ đặt thêm:
float temp2=17*sin(c); .Tuy nhiên biểu thức m = … không phụ thuộc vòng lặp for nên ta không cần dùng biến temp2 mà chỉ
cần bỏ biểu thức m = … ra khỏi vòng lặp for là xong.
+ Thay đổi các phép nhân với 2k
bằng các phép dịch bit để tăng tốc độ tính toán (0.25đ):
16*n+512*p = n<<4 + p<<9
+ Nhìn vào vòng lặp for ta thấy cận trên và bước nhảy là 4*n, i++, tức là phải thực hiện 4*n lần lặp. Có thể tối ưu bằng cách giảm bớt
số lần lặp xuống còn n lần như sau: (kĩ thuật này còn gọi là kĩ thuật Loop Unrolling, các bạn có thể tìm hiểu thêm trên Google) (0.5đ)
for(i=0; i<4*n; i+=4){
a[i]=b[i]+c[i]+d[i]+temp1;
a[i+1]=b[i+1]+c[i+1]+d[i+1]+temp1;
a[i+2]=b[i+2]+c[i+2]+d[i+2]+temp1;
a[i+3]=b[i+3]+c[i+3]+d[i+3]+temp1;
}
Tổng hợp lại ta có đoạn code tối ưu hơn như sau:
int i,m,n,p;
float c,*a,*b,*c,*d;
/* Gán giá trị các biến cần thiết */
float temp1=47-5*sin(c)+3*tan(c);
m=n<<4 + p<<9 – 17*sin(c);
for(i=0;i<4*n;i+=4){
a[i]=b[i]+c[i]+d[i]+temp1;
a[i+1]=b[i+1]+c[i+1]+d[i+1]+temp1;
a[i+2]=b[i+2]+c[i+2]+d[i+2]+temp1;
a[i+3]=b[i+3]+c[i+3]+d[i+3]+temp1;
}
Câu 7 (2đ): Đề yêu cầu đưa ra phần tử lẻ nhỏ nhất của danh sách. Sử dụng ý tưởng sau:
+ Duyệt toàn bộ danh sách và đếm số phần tử lẻ trong danh sách. Nếu không có phần tử lẻ thì trả về 0 ngay.
+ Nếu có phần tử lẻ thì lưu các phần tử lẻ này vào 1 mảng cấp phát động với kích thước = số phần tử lẻ (cho tiết kiệm bộ nhớ)
+ Duyệt mảng này và tìm phần tử nhỏ nhất. Cái này thì quá đơn giản và quen thuộc.
//Hàm đếm số phần tử lẻ trong danh sách
int demSoPtLe(node *head){
int k=0;
node *tmp;
for(tmp=head; tmp!=NULL; tmp=tmp->next){
if (tmp->data % 2 == 1)
k++;
}
return k;
}
//Hàm tìm phần tử lẻ nhỏ nhất
int minOdd(node *head){
if (demSoPtLe(head) == 0) return 0;
else{
node *tmp;
int m=demSoPtLe(head);
int *a=new int [m];
int i=0,min;
for(tmp=head;tmp!=NULL;tmp=tmp->next){
if((tmp->data)%2==1)
a[i++]=tmp->data; //nếu gặp phần tử lẻ thì lưu vào mảng a
}
min=a[0];
for(i=0; i<m; i++){
if(a[i]<min)
min=a[i];
}
return min;
}
}
Câu 8 (1đ): Hàm strcpy là hàm mà chúng ta thường sử dụng dưới dạng ‘mì ăn liền’. Tuy nhiên việc hiểu bản chất của hàm này thì
chỉ có 1 số bạn làm được.
Chép chuỗi được trỏ bởi con trỏ src vào một mảng được trỏ bởi con trỏ dest, bao gồm cả kí tự NULL (kí tự kết thúc xâu, 0).
Để tránh tràn thì kích thước của mảng được trỏ bởi con trỏ dest phải đủ lớn để chứa xâu trỏ bởi con trỏ src bao gồm cả kí tự NULL
và không được chồng lên vùng nhớ được trỏ bởi src.
Do đó ta sửa lại như sau bằng cách chỉnh lại điều kiện trong vòng lặp. (có thể dùng kiểu void và không trả về giá trị dest như đoạn
code ban đầu cũng được):
char* strcpy(char * dest, const char *src);
{
int i,n;
n=strlen(src);
for(i=0; i<=n; ++i)
dest[i] = src[i];
return dest;
}
Đề thi số 2
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 calc(int subkey, int bitoff){
subkey = subkey >>
(bitoff - ((bitoff >> 5) << 5));
return subkey;
}
Câu 2 (1đ): Cho biết giá trị các phần tử của mảng A sau
khi thực hiện đoạn lệnh dưới đây:
int A[] = {5,7,19,1,2,6};
int b, *p=A+2;
b=*p++;
*p+=2*b;
p++;
*p+=1;
Câu 3 (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 4 (1đ): Xây dựng cấu trúc số phức gồm phần thực
và phần ảo là các số thực. Thực hiện đa năng hoá toán
tử ~ có chức năng đưa ra số phức liên hợp của số phức
ban đầu.
Ví dụ: ~(4-3i) = 4+3i
Câu 5 (1đ): Tối ưu đoạn code sau:
int x,y,z,i,n,*p,*q,*s;
float *m,d;
/* Gán giá trị cho các biến cần thiết */
for(i=0; i<3*n; i++){
m[i]=p[i]+q[i]+s[i]+127+6*tan(d)-13*sin(d);
y=8*x + 128*z + 35*sqrt(d);
}
Câu 6 (0.75đ): Phân tích đoạn mã lệnh sau, tìm các lỗi
sai (nếu có) và sửa lại cho đúng:
char *p, buf[256];
gets(buf);
p = malloc(strlen(buf));
strcpy(p, buf);
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ử chẵn lớn nhất trong danh sách.
Nếu không tìm thấy phần tử chẵn thì trả về 0.
Câu 8 (1đ):
a. Đoạn mã sau thực hiện việc tính giai thừa của một số
nguyên n. Phân tích đoạn mã, tìm các lỗi sai và sửa
lại cho đúng (0.5đ):
void factorial(int n){
int fac=1;
while (n--)
fac *= n;
return fac;
}
b. Đoạn mã sau thực hiện việc tính trung bình cộng các
phần tử trong mảng a[]. Phân tích, tìm các lỗi sai và
sửa lại (0.5đ):
double avg(double a[], int n){
int i;
double sum;
sum = 0.0;
for (i=0; i<n; i++)
sum += a[i];
return sum/n;
}
ĐÁP ÁN ĐỀ THI SỐ 2
Câu 1 (0.75đ): Ta có thể thấy ngay đoạn code này chẳng có gì ngoài việc trả về giá trị của subkey. Do đó việc tinh chỉnh
chỉ đơn giản là tinh chỉnh các biểu thức toán học sao cho máy có thể thực hiện nhanh hơn. Dễ dàng nhận thấy như sau:
Ở đây, giá trị bitoff đầu tiên dịch phải 5bit, sau đó lại được dịch trái 5bit. Như vậy biểu thức (bitoff>>3)<<3 sẽ chuyển
5bit cuối của bitoff thành 00000. Giả sử bitoff = ****..**abcde (abcde là các bit)
Do đó, bitoff - ((bitoff >> 5) << 5)) = ****..**abcde - ****..**00000 = 0000..00abcde
= bitoff & 0000..0011111 = bitoff & 0x1F
Vì vậy ta có đoạn code tối ưu như sau:
int calc(int subkey, int bitoff){
subkey >>= bitoff & 0x1F;
return subkey;
}
Câu 2 (1đ): Bài này khá đơn giản và quen thuộc:
Ở đây ban đầu p trỏ tới A[2].
b=*p++ ~ b=*p và p++ => b=A[2]=19, p trỏ tới A[3].
*p+=2*b => A[3]+=2*19 => A[3] = 39.
p++ => p trỏ tới A[4].
*p+=1 => A[4] +=1 => A[4] = 3.
Vậy giá trị các phần tử mảng sau khi thực hiện đoạn lệnh là A[] = {5,7,19,39,3,6}.
Câu 3 (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[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
char output[100];
int i=0;
while(number>0)
{
output[i++] = digits[number%base];
number = number/base;
}
i--;
//Xuất ra kết quả
for(;i>=0;i--)
{
printf("%c",output[i]);
}
}
Câu 4 (1đ): Xây dựng cấu trúc số phức như sau: (0.5đ)
typedef struct SoPhuc{
float Thuc, Ao;
}SP;
Đa năng hoá toán tử ~ có chức năng trả về số phức liên hợp với số phức ban đầu: (0.5đ)
SP operator ~ (SP &a){
a.Ao = - a.Ao;
return a;
}
Câu 5 (1đ): Tối ưu đoạn code…
+ Đặt các biểu thức bất biến là hằng số (0.25đ):
float temp1=127+6*tan(d)-13*sin(d);
Có thể một số bạn sẽ đặt thêm:
float temp2=35*sqrt(d); .Tuy nhiên biểu thức y = … không phụ thuộc vòng lặp for nên ta không cần dùng biến
temp2 mà chỉ cần bỏ biểu thức y = … ra khỏi vòng lặp for là xong.
+ Thay đổi các phép nhân với 2k
bằng các phép dịch bit để tăng tốc độ tính toán (0.25đ):
8*x+128*z = x<<3 + z<<7
+ Nhìn vào vòng lặp for ta thấy cận trên và bước nhảy là 3*n, i++, tức là phải thực hiện 3*n lần lặp. Có thể tối ưu bằng
cách giảm bớt số lần lặp xuống còn n lần như sau: (kĩ thuật này còn gọi là kĩ thuật Loop Unrolling, các bạn có thể tìm
hiểu thêm trên Google) (0.5đ)
for(i=0; i<3*n; i+=3){
m[i]=p[i]+q[i]+s[i]+temp1;
m[i+1]=p[i+1]+q[i+1]+s[i+1]+temp1;
m[i+2]=p[i+2]+q[i+2]+s[i+2]+temp1;
}
Tổng hợp lại ta có đoạn code tối ưu hơn như sau:
int x,y,z,i,n,*p,*q,*s;
float *m,d;
/* Gán giá trị các biến cần thiết */
float temp1=127+6*tan(d)-13*sin(d);
y=x<<3 + z<<7 + 35*sqrt(d);
for(i=0; i<3*n; i+=3){
m[i]=p[i]+q[i]+s[i]+temp1;
m[i+1]=p[i+1]+q[i+1]+s[i+1]+temp1;
m[i+2]=p[i+2]+q[i+2]+s[i+2]+temp1;
}
Câu 6 (1đ): Thoạt nhìn đây có vẻ là một câu khá ‘hiểm’ và khó phát hiện ra lỗi. Tuy nhiên, nếu tinh ý thì câu này quá
đơn giản. Ở đây ta nhận thấy biến p cấp phát động sai do hàm strlen không tính kí tự kết thúc xâu (‘0’). Do đó ta sửa lại
đoạn code như sau:
char *p, buf[256];
gets(buf);
p = malloc(strlen(buf)+1); //thay vì chỉ strlen(buf) như code gốc
strcpy(p, buf);
Hoặc:
char *p, buf[256];
gets(buf);
p = new char [strlen(buf)+1];
strcpy(p, buf);
Câu 7 (2đ): Đề yêu cầu đưa ra phần tử chẵn lớn nhất của danh sách. Sử dụng ý tưởng sau:
+ Duyệt toàn bộ danh sách và đếm số phần tử chẵn trong danh sách. Nếu không có phần tử chẵn thì trả về 0 ngay.
+ Nếu có phần tử chẵn thì lưu các phần tử chẵn này vào 1 mảng cấp phát động với kích thước = số phần tử chẵn (tiết
kiệm bộ nhớ)
+ Duyệt mảng này và tìm phần chẵn lớn nhất. Cái này thì quá đơn giản và quen thuộc.
//Hàm đếm số phần tử chẵn trong danh sách
int demSoPtChan(node *head){
int count=0;
node *tmp;
for(tmp=head; tmp!=NULL; tmp=tmp->next){
if (tmp->data % 2 == 0)
count++;
}
return count;
}
//Hàm tìm phần tử chẵn lớn nhất
int maxEven(node *head){
if (demSoPtChan(head) == 0) return 0;
else{
node *tmp;
int m=demSoPtChan(head);
int *a=new int [m];
int i=0, max;
for(tmp=head; tmp!=NULL; tmp=tmp->next){
if((tmp->data)%2==0)
a[i++]=tmp->data; //nếu gặp phần tử chẵn thì lưu vào mảng a
}
max=a[0];
for(i=0; i<m; i++){
if (a[i]>max)
max=a[i];
}
return max;
}
}
Câu 8 (1đ):
a. Đoạn code này sẽ gặp vấn đề khi n=1. Cụ thể: với n=1 thì trong vòng lặp while, n=0, do đó fac = 0 => sai.
Sửa lại code như sau:
int factorial (int n){
int fac=1;
for( ; n>0; n--)
fac *= n;
return fac;
}
b. Đoạn code này chưa xét trường hợp mảng có 0 phần tử. Do đó chỉ cần sửa lại lệnh return như sau là ok.
return (n<=0) ? 0.0 : sum/n;
Tải bản FULL (49 trang): bit.ly/2Ywib4t
Dự phòng: fb.com/KhoTaiLieuAZ
Tải bản FULL (49 trang): bit.ly/2Ywib4t
Dự phòng: fb.com/KhoTaiLieuAZ
3369966

More Related Content

What's hot

Hướng dẫn giải bài tập chuỗi - Toán cao cấp
Hướng dẫn giải bài tập chuỗi - Toán cao cấpHướng dẫn giải bài tập chuỗi - Toán cao cấp
Hướng dẫn giải bài tập chuỗi - Toán cao cấpVan-Duyet Le
 
Mẫu báo cáo bài tập lớn
Mẫu báo cáo bài tập lớnMẫu báo cáo bài tập lớn
Mẫu báo cáo bài tập lớnJohn MacTavish
 
12.ma trận và dịnh thức
12.ma trận và dịnh thức12.ma trận và dịnh thức
12.ma trận và dịnh thứcTrinh Yen
 
Toán cao cấp a2
Toán cao cấp a2Toán cao cấp a2
Toán cao cấp a2bookbooming
 
Nhập môn công nghệ thông tin
Nhập môn công nghệ thông tinNhập môn công nghệ thông tin
Nhập môn công nghệ thông tinThanh Lee
 
các phân phối xác xuất thường gặp
các phân phối xác xuất thường gặpcác phân phối xác xuất thường gặp
các phân phối xác xuất thường gặpKhoa Nguyễn
 
Giáo trình xử lý ảnh
Giáo trình xử lý ảnhGiáo trình xử lý ảnh
Giáo trình xử lý ảnhTùng Trần
 
Phương pháp nhánh cận
Phương pháp nhánh cậnPhương pháp nhánh cận
Phương pháp nhánh cậnDiên Vĩ
 
BÀI TẬP LỚN PHÂN TÍCH THIẾT KẾ HỆ THỐNG: Hệ thống quản lý phòng máy thực hành...
BÀI TẬP LỚN PHÂN TÍCH THIẾT KẾ HỆ THỐNG: Hệ thống quản lý phòng máy thực hành...BÀI TẬP LỚN PHÂN TÍCH THIẾT KẾ HỆ THỐNG: Hệ thống quản lý phòng máy thực hành...
BÀI TẬP LỚN PHÂN TÍCH THIẾT KẾ HỆ THỐNG: Hệ thống quản lý phòng máy thực hành...nataliej4
 
tổng hợp bài tập java có đáp án chi tiết
 tổng hợp bài tập java có đáp án chi tiết tổng hợp bài tập java có đáp án chi tiết
tổng hợp bài tập java có đáp án chi tiếtHoàng Trí Phan
 
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UML
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UMLPHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UML
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UMLDang Tuan
 
Thuật toán mã hóa rsa
Thuật toán mã hóa rsaThuật toán mã hóa rsa
Thuật toán mã hóa rsaBảo Điệp
 
Bài tiểu luận Kỹ năng thuyết trình - Học viện công nghệ bưu chính viễn thông
Bài tiểu luận Kỹ năng thuyết trình - Học viện công nghệ bưu chính viễn thôngBài tiểu luận Kỹ năng thuyết trình - Học viện công nghệ bưu chính viễn thông
Bài tiểu luận Kỹ năng thuyết trình - Học viện công nghệ bưu chính viễn thôngHuyen Pham
 
Báo cáo đồ án tốt nghiệp "Ứng dụng trí tuệ nhân tạo nhận dạng chữ viết tay xâ...
Báo cáo đồ án tốt nghiệp "Ứng dụng trí tuệ nhân tạo nhận dạng chữ viết tay xâ...Báo cáo đồ án tốt nghiệp "Ứng dụng trí tuệ nhân tạo nhận dạng chữ viết tay xâ...
Báo cáo đồ án tốt nghiệp "Ứng dụng trí tuệ nhân tạo nhận dạng chữ viết tay xâ...The Boss
 
Bài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winformBài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winformMasterCode.vn
 
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"Tú Cao
 
Hệ thống quản lý bán hàng online
Hệ thống quản lý bán hàng onlineHệ thống quản lý bán hàng online
Hệ thống quản lý bán hàng onlineHan Nguyen
 

What's hot (20)

Hướng dẫn giải bài tập chuỗi - Toán cao cấp
Hướng dẫn giải bài tập chuỗi - Toán cao cấpHướng dẫn giải bài tập chuỗi - Toán cao cấp
Hướng dẫn giải bài tập chuỗi - Toán cao cấp
 
Bài giảng Assembly
Bài giảng AssemblyBài giảng Assembly
Bài giảng Assembly
 
Mẫu báo cáo bài tập lớn
Mẫu báo cáo bài tập lớnMẫu báo cáo bài tập lớn
Mẫu báo cáo bài tập lớn
 
12.ma trận và dịnh thức
12.ma trận và dịnh thức12.ma trận và dịnh thức
12.ma trận và dịnh thức
 
Đề tài: Tìm hiểu và sử dụng Facebook API, HAY, 9đ
Đề tài: Tìm hiểu và sử dụng Facebook API, HAY, 9đĐề tài: Tìm hiểu và sử dụng Facebook API, HAY, 9đ
Đề tài: Tìm hiểu và sử dụng Facebook API, HAY, 9đ
 
Bai tap chia_dia_chi_ip
Bai tap chia_dia_chi_ipBai tap chia_dia_chi_ip
Bai tap chia_dia_chi_ip
 
Toán cao cấp a2
Toán cao cấp a2Toán cao cấp a2
Toán cao cấp a2
 
Nhập môn công nghệ thông tin
Nhập môn công nghệ thông tinNhập môn công nghệ thông tin
Nhập môn công nghệ thông tin
 
các phân phối xác xuất thường gặp
các phân phối xác xuất thường gặpcác phân phối xác xuất thường gặp
các phân phối xác xuất thường gặp
 
Giáo trình xử lý ảnh
Giáo trình xử lý ảnhGiáo trình xử lý ảnh
Giáo trình xử lý ảnh
 
Phương pháp nhánh cận
Phương pháp nhánh cậnPhương pháp nhánh cận
Phương pháp nhánh cận
 
BÀI TẬP LỚN PHÂN TÍCH THIẾT KẾ HỆ THỐNG: Hệ thống quản lý phòng máy thực hành...
BÀI TẬP LỚN PHÂN TÍCH THIẾT KẾ HỆ THỐNG: Hệ thống quản lý phòng máy thực hành...BÀI TẬP LỚN PHÂN TÍCH THIẾT KẾ HỆ THỐNG: Hệ thống quản lý phòng máy thực hành...
BÀI TẬP LỚN PHÂN TÍCH THIẾT KẾ HỆ THỐNG: Hệ thống quản lý phòng máy thực hành...
 
tổng hợp bài tập java có đáp án chi tiết
 tổng hợp bài tập java có đáp án chi tiết tổng hợp bài tập java có đáp án chi tiết
tổng hợp bài tập java có đáp án chi tiết
 
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UML
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UMLPHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UML
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG DÙNG UML
 
Thuật toán mã hóa rsa
Thuật toán mã hóa rsaThuật toán mã hóa rsa
Thuật toán mã hóa rsa
 
Bài tiểu luận Kỹ năng thuyết trình - Học viện công nghệ bưu chính viễn thông
Bài tiểu luận Kỹ năng thuyết trình - Học viện công nghệ bưu chính viễn thôngBài tiểu luận Kỹ năng thuyết trình - Học viện công nghệ bưu chính viễn thông
Bài tiểu luận Kỹ năng thuyết trình - Học viện công nghệ bưu chính viễn thông
 
Báo cáo đồ án tốt nghiệp "Ứng dụng trí tuệ nhân tạo nhận dạng chữ viết tay xâ...
Báo cáo đồ án tốt nghiệp "Ứng dụng trí tuệ nhân tạo nhận dạng chữ viết tay xâ...Báo cáo đồ án tốt nghiệp "Ứng dụng trí tuệ nhân tạo nhận dạng chữ viết tay xâ...
Báo cáo đồ án tốt nghiệp "Ứng dụng trí tuệ nhân tạo nhận dạng chữ viết tay xâ...
 
Bài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winformBài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winform
 
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
 
Hệ thống quản lý bán hàng online
Hệ thống quản lý bán hàng onlineHệ thống quản lý bán hàng online
Hệ thống quản lý bán hàng online
 

More from nataliej4

đồ áN xây dựng website bán laptop 1129155
đồ áN xây dựng website bán laptop 1129155đồ áN xây dựng website bán laptop 1129155
đồ áN xây dựng website bán laptop 1129155nataliej4
 
Nghệ thuật chiến tranh nhân dân việt nam trong công cuộc xây dựng và bảo vệ t...
Nghệ thuật chiến tranh nhân dân việt nam trong công cuộc xây dựng và bảo vệ t...Nghệ thuật chiến tranh nhân dân việt nam trong công cuộc xây dựng và bảo vệ t...
Nghệ thuật chiến tranh nhân dân việt nam trong công cuộc xây dựng và bảo vệ t...nataliej4
 
Quản lý dịch vụ ô tô toyota 724279
Quản lý dịch vụ ô tô toyota 724279Quản lý dịch vụ ô tô toyota 724279
Quản lý dịch vụ ô tô toyota 724279nataliej4
 
Từ vựng tiếng anh luyện thi thpt quốc gia
Từ vựng tiếng anh luyện thi thpt quốc giaTừ vựng tiếng anh luyện thi thpt quốc gia
Từ vựng tiếng anh luyện thi thpt quốc gianataliej4
 
Công tác dược lâm sàng tại bv cấp cứu trưng vương
Công tác dược lâm sàng tại bv cấp cứu trưng vươngCông tác dược lâm sàng tại bv cấp cứu trưng vương
Công tác dược lâm sàng tại bv cấp cứu trưng vươngnataliej4
 
Bài giảng nghề giám đốc
Bài giảng nghề giám đốcBài giảng nghề giám đốc
Bài giảng nghề giám đốcnataliej4
 
đề Cương chương trình đào tạo trình độ trung cấp kế toán tin học
đề Cương chương trình đào tạo trình độ trung cấp kế toán   tin họcđề Cương chương trình đào tạo trình độ trung cấp kế toán   tin học
đề Cương chương trình đào tạo trình độ trung cấp kế toán tin họcnataliej4
 
Giáo trình kỹ thuật an toàn và bảo hộ lao động
Giáo trình kỹ thuật an toàn và bảo hộ lao độngGiáo trình kỹ thuật an toàn và bảo hộ lao động
Giáo trình kỹ thuật an toàn và bảo hộ lao độngnataliej4
 
Lựa chọn trong điều kiện không chắc chắn
Lựa chọn trong điều kiện không chắc chắnLựa chọn trong điều kiện không chắc chắn
Lựa chọn trong điều kiện không chắc chắnnataliej4
 
Thực trạng phân bố và khai thác khoáng sét ở đồng bằng sông cửu long 4857877
Thực trạng phân bố và khai thác khoáng sét ở đồng bằng sông cửu long 4857877Thực trạng phân bố và khai thác khoáng sét ở đồng bằng sông cửu long 4857877
Thực trạng phân bố và khai thác khoáng sét ở đồng bằng sông cửu long 4857877nataliej4
 
Sổ tay hướng dẫn khách thuê tòa nhà ree tower
Sổ tay hướng dẫn khách thuê   tòa nhà ree towerSổ tay hướng dẫn khách thuê   tòa nhà ree tower
Sổ tay hướng dẫn khách thuê tòa nhà ree towernataliej4
 
Phân tích tác động của thiên lệch hành vi đến quyết định của nhà đầu tư cá nh...
Phân tích tác động của thiên lệch hành vi đến quyết định của nhà đầu tư cá nh...Phân tích tác động của thiên lệch hành vi đến quyết định của nhà đầu tư cá nh...
Phân tích tác động của thiên lệch hành vi đến quyết định của nhà đầu tư cá nh...nataliej4
 
Bài giảng giáo dục hoà nhập trẻ khuyết tật
Bài giảng giáo dục hoà nhập trẻ khuyết tậtBài giảng giáo dục hoà nhập trẻ khuyết tật
Bài giảng giáo dục hoà nhập trẻ khuyết tậtnataliej4
 
đồ áN thiết kế quần âu nam 6838864
đồ áN thiết kế quần âu nam 6838864đồ áN thiết kế quần âu nam 6838864
đồ áN thiết kế quần âu nam 6838864nataliej4
 
Tài liệu hội thảo chuyên đề công tác tuyển sinh – thực trạng và giải pháp 717...
Tài liệu hội thảo chuyên đề công tác tuyển sinh – thực trạng và giải pháp 717...Tài liệu hội thảo chuyên đề công tác tuyển sinh – thực trạng và giải pháp 717...
Tài liệu hội thảo chuyên đề công tác tuyển sinh – thực trạng và giải pháp 717...nataliej4
 
Bài giảng dịch tễ học bệnh nhiễm trùng
Bài giảng dịch tễ học bệnh nhiễm trùngBài giảng dịch tễ học bệnh nhiễm trùng
Bài giảng dịch tễ học bệnh nhiễm trùngnataliej4
 
Bài giảng môn khởi sự kinh doanh
Bài giảng môn khởi sự kinh doanhBài giảng môn khởi sự kinh doanh
Bài giảng môn khởi sự kinh doanhnataliej4
 
Giới thiệu học máy – mô hình naïve bayes learning intro
Giới thiệu học máy – mô hình naïve bayes   learning introGiới thiệu học máy – mô hình naïve bayes   learning intro
Giới thiệu học máy – mô hình naïve bayes learning intronataliej4
 
Lý thuyết thuế chuẩn tắc
Lý thuyết thuế chuẩn tắcLý thuyết thuế chuẩn tắc
Lý thuyết thuế chuẩn tắcnataliej4
 
Bài giảng thuế thu nhập (cá nhân, doanh nghiệp)
Bài giảng thuế thu nhập (cá nhân, doanh nghiệp)Bài giảng thuế thu nhập (cá nhân, doanh nghiệp)
Bài giảng thuế thu nhập (cá nhân, doanh nghiệp)nataliej4
 

More from nataliej4 (20)

đồ áN xây dựng website bán laptop 1129155
đồ áN xây dựng website bán laptop 1129155đồ áN xây dựng website bán laptop 1129155
đồ áN xây dựng website bán laptop 1129155
 
Nghệ thuật chiến tranh nhân dân việt nam trong công cuộc xây dựng và bảo vệ t...
Nghệ thuật chiến tranh nhân dân việt nam trong công cuộc xây dựng và bảo vệ t...Nghệ thuật chiến tranh nhân dân việt nam trong công cuộc xây dựng và bảo vệ t...
Nghệ thuật chiến tranh nhân dân việt nam trong công cuộc xây dựng và bảo vệ t...
 
Quản lý dịch vụ ô tô toyota 724279
Quản lý dịch vụ ô tô toyota 724279Quản lý dịch vụ ô tô toyota 724279
Quản lý dịch vụ ô tô toyota 724279
 
Từ vựng tiếng anh luyện thi thpt quốc gia
Từ vựng tiếng anh luyện thi thpt quốc giaTừ vựng tiếng anh luyện thi thpt quốc gia
Từ vựng tiếng anh luyện thi thpt quốc gia
 
Công tác dược lâm sàng tại bv cấp cứu trưng vương
Công tác dược lâm sàng tại bv cấp cứu trưng vươngCông tác dược lâm sàng tại bv cấp cứu trưng vương
Công tác dược lâm sàng tại bv cấp cứu trưng vương
 
Bài giảng nghề giám đốc
Bài giảng nghề giám đốcBài giảng nghề giám đốc
Bài giảng nghề giám đốc
 
đề Cương chương trình đào tạo trình độ trung cấp kế toán tin học
đề Cương chương trình đào tạo trình độ trung cấp kế toán   tin họcđề Cương chương trình đào tạo trình độ trung cấp kế toán   tin học
đề Cương chương trình đào tạo trình độ trung cấp kế toán tin học
 
Giáo trình kỹ thuật an toàn và bảo hộ lao động
Giáo trình kỹ thuật an toàn và bảo hộ lao độngGiáo trình kỹ thuật an toàn và bảo hộ lao động
Giáo trình kỹ thuật an toàn và bảo hộ lao động
 
Lựa chọn trong điều kiện không chắc chắn
Lựa chọn trong điều kiện không chắc chắnLựa chọn trong điều kiện không chắc chắn
Lựa chọn trong điều kiện không chắc chắn
 
Thực trạng phân bố và khai thác khoáng sét ở đồng bằng sông cửu long 4857877
Thực trạng phân bố và khai thác khoáng sét ở đồng bằng sông cửu long 4857877Thực trạng phân bố và khai thác khoáng sét ở đồng bằng sông cửu long 4857877
Thực trạng phân bố và khai thác khoáng sét ở đồng bằng sông cửu long 4857877
 
Sổ tay hướng dẫn khách thuê tòa nhà ree tower
Sổ tay hướng dẫn khách thuê   tòa nhà ree towerSổ tay hướng dẫn khách thuê   tòa nhà ree tower
Sổ tay hướng dẫn khách thuê tòa nhà ree tower
 
Phân tích tác động của thiên lệch hành vi đến quyết định của nhà đầu tư cá nh...
Phân tích tác động của thiên lệch hành vi đến quyết định của nhà đầu tư cá nh...Phân tích tác động của thiên lệch hành vi đến quyết định của nhà đầu tư cá nh...
Phân tích tác động của thiên lệch hành vi đến quyết định của nhà đầu tư cá nh...
 
Bài giảng giáo dục hoà nhập trẻ khuyết tật
Bài giảng giáo dục hoà nhập trẻ khuyết tậtBài giảng giáo dục hoà nhập trẻ khuyết tật
Bài giảng giáo dục hoà nhập trẻ khuyết tật
 
đồ áN thiết kế quần âu nam 6838864
đồ áN thiết kế quần âu nam 6838864đồ áN thiết kế quần âu nam 6838864
đồ áN thiết kế quần âu nam 6838864
 
Tài liệu hội thảo chuyên đề công tác tuyển sinh – thực trạng và giải pháp 717...
Tài liệu hội thảo chuyên đề công tác tuyển sinh – thực trạng và giải pháp 717...Tài liệu hội thảo chuyên đề công tác tuyển sinh – thực trạng và giải pháp 717...
Tài liệu hội thảo chuyên đề công tác tuyển sinh – thực trạng và giải pháp 717...
 
Bài giảng dịch tễ học bệnh nhiễm trùng
Bài giảng dịch tễ học bệnh nhiễm trùngBài giảng dịch tễ học bệnh nhiễm trùng
Bài giảng dịch tễ học bệnh nhiễm trùng
 
Bài giảng môn khởi sự kinh doanh
Bài giảng môn khởi sự kinh doanhBài giảng môn khởi sự kinh doanh
Bài giảng môn khởi sự kinh doanh
 
Giới thiệu học máy – mô hình naïve bayes learning intro
Giới thiệu học máy – mô hình naïve bayes   learning introGiới thiệu học máy – mô hình naïve bayes   learning intro
Giới thiệu học máy – mô hình naïve bayes learning intro
 
Lý thuyết thuế chuẩn tắc
Lý thuyết thuế chuẩn tắcLý thuyết thuế chuẩn tắc
Lý thuyết thuế chuẩn tắc
 
Bài giảng thuế thu nhập (cá nhân, doanh nghiệp)
Bài giảng thuế thu nhập (cá nhân, doanh nghiệp)Bài giảng thuế thu nhập (cá nhân, doanh nghiệp)
Bài giảng thuế thu nhập (cá nhân, doanh nghiệp)
 

Recently uploaded

FAIL REKOD PENGAJARAN.pptx fail rekod pengajaran
FAIL REKOD PENGAJARAN.pptx fail rekod pengajaranFAIL REKOD PENGAJARAN.pptx fail rekod pengajaran
FAIL REKOD PENGAJARAN.pptx fail rekod pengajaransekolah233
 
TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...
TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...
TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...Nguyen Thanh Tu Collection
 
مختصر علم احكام القرآن فقه القرآن وفق منهج العرض
مختصر علم احكام القرآن فقه القرآن وفق منهج العرضمختصر علم احكام القرآن فقه القرآن وفق منهج العرض
مختصر علم احكام القرآن فقه القرآن وفق منهج العرضأنور غني الموسوي
 
TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...
TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...
TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...Nguyen Thanh Tu Collection
 

Recently uploaded (6)

Energy drink .
Energy drink                           .Energy drink                           .
Energy drink .
 
FAIL REKOD PENGAJARAN.pptx fail rekod pengajaran
FAIL REKOD PENGAJARAN.pptx fail rekod pengajaranFAIL REKOD PENGAJARAN.pptx fail rekod pengajaran
FAIL REKOD PENGAJARAN.pptx fail rekod pengajaran
 
TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...
TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...
TUYỂN TẬP 25 ĐỀ THI HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2023 CÓ ĐÁP ÁN (SƯU...
 
مختصر علم احكام القرآن فقه القرآن وفق منهج العرض
مختصر علم احكام القرآن فقه القرآن وفق منهج العرضمختصر علم احكام القرآن فقه القرآن وفق منهج العرض
مختصر علم احكام القرآن فقه القرآن وفق منهج العرض
 
TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...
TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...
TUYỂN TẬP 20 ĐỀ THI KHẢO SÁT HỌC SINH GIỎI MÔN TIẾNG ANH LỚP 6 NĂM 2020 (CÓ Đ...
 
LAR MARIA MÃE DE ÁFRICA .
LAR MARIA MÃE DE ÁFRICA                 .LAR MARIA MÃE DE ÁFRICA                 .
LAR MARIA MÃE DE ÁFRICA .
 

Đề thi Kỹ thuật lập trình có lời giải

  • 1. Đề 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]; }
  • 2. ĐÁ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
  • 3. 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[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; char output[100]; int i=0; while(number>0) { output[i++] = digits[number%base]; number = number/base; } i--; //Xuất ra kết quả for(;i>=0;i--) { printf("%c",output[i]); } } Câu 5 (1đ): Ở đây đề bài yêu cầu phải tối giản phân số. Do đó ta cần đưa vào hàm tìm ước chung lớn nhất của tử số và mẫu số. Xét 2 hàm tìm UCLN (sử dụng đệ quy cho nhanh gọn) như dưới đây. (0.25đ) //Cách 1: int UCLN(int a, int b) { return b ? UCLN(b, a % b) : a; } //Cách 2: int UCLN( int x, int y) { if(x==y) return x; else if(x>y) return UCLN(x-y,y); else return UCLN(x,y-x); } Xây dựng cấu trúc phân số (0.25đ): typedef struct PhanSo{
  • 4. int TuSo, MauSo; }PS; Đa năng hoá toán tử ~ có chức năng tối giản phân số (0.5đ) PS operator ~ (PS &a){ a.TuSo/=UCLN(a.TuSo, a.MauSo); a.MauSo/=UCLN(a.TuSo, a.MauSo); return a; } Câu 6 (1đ): Tối ưu đoạn code… + Đặt các biểu thức bất biến là hằng số (0.25đ): float temp1=47-5*sin(c)+3*tan(c); Có thể một số bạn sẽ đặt thêm: float temp2=17*sin(c); .Tuy nhiên biểu thức m = … không phụ thuộc vòng lặp for nên ta không cần dùng biến temp2 mà chỉ cần bỏ biểu thức m = … ra khỏi vòng lặp for là xong. + Thay đổi các phép nhân với 2k bằng các phép dịch bit để tăng tốc độ tính toán (0.25đ): 16*n+512*p = n<<4 + p<<9 + Nhìn vào vòng lặp for ta thấy cận trên và bước nhảy là 4*n, i++, tức là phải thực hiện 4*n lần lặp. Có thể tối ưu bằng cách giảm bớt số lần lặp xuống còn n lần như sau: (kĩ thuật này còn gọi là kĩ thuật Loop Unrolling, các bạn có thể tìm hiểu thêm trên Google) (0.5đ) for(i=0; i<4*n; i+=4){ a[i]=b[i]+c[i]+d[i]+temp1; a[i+1]=b[i+1]+c[i+1]+d[i+1]+temp1; a[i+2]=b[i+2]+c[i+2]+d[i+2]+temp1; a[i+3]=b[i+3]+c[i+3]+d[i+3]+temp1; } Tổng hợp lại ta có đoạn code tối ưu hơn như sau: int i,m,n,p; float c,*a,*b,*c,*d; /* Gán giá trị các biến cần thiết */ float temp1=47-5*sin(c)+3*tan(c); m=n<<4 + p<<9 – 17*sin(c); for(i=0;i<4*n;i+=4){ a[i]=b[i]+c[i]+d[i]+temp1; a[i+1]=b[i+1]+c[i+1]+d[i+1]+temp1; a[i+2]=b[i+2]+c[i+2]+d[i+2]+temp1; a[i+3]=b[i+3]+c[i+3]+d[i+3]+temp1; } Câu 7 (2đ): Đề yêu cầu đưa ra phần tử lẻ nhỏ nhất của danh sách. Sử dụng ý tưởng sau: + Duyệt toàn bộ danh sách và đếm số phần tử lẻ trong danh sách. Nếu không có phần tử lẻ thì trả về 0 ngay. + Nếu có phần tử lẻ thì lưu các phần tử lẻ này vào 1 mảng cấp phát động với kích thước = số phần tử lẻ (cho tiết kiệm bộ nhớ) + Duyệt mảng này và tìm phần tử nhỏ nhất. Cái này thì quá đơn giản và quen thuộc. //Hàm đếm số phần tử lẻ trong danh sách int demSoPtLe(node *head){ int k=0;
  • 5. node *tmp; for(tmp=head; tmp!=NULL; tmp=tmp->next){ if (tmp->data % 2 == 1) k++; } return k; } //Hàm tìm phần tử lẻ nhỏ nhất int minOdd(node *head){ if (demSoPtLe(head) == 0) return 0; else{ node *tmp; int m=demSoPtLe(head); int *a=new int [m]; int i=0,min; for(tmp=head;tmp!=NULL;tmp=tmp->next){ if((tmp->data)%2==1) a[i++]=tmp->data; //nếu gặp phần tử lẻ thì lưu vào mảng a } min=a[0]; for(i=0; i<m; i++){ if(a[i]<min) min=a[i]; } return min; } } Câu 8 (1đ): Hàm strcpy là hàm mà chúng ta thường sử dụng dưới dạng ‘mì ăn liền’. Tuy nhiên việc hiểu bản chất của hàm này thì chỉ có 1 số bạn làm được. Chép chuỗi được trỏ bởi con trỏ src vào một mảng được trỏ bởi con trỏ dest, bao gồm cả kí tự NULL (kí tự kết thúc xâu, 0). Để tránh tràn thì kích thước của mảng được trỏ bởi con trỏ dest phải đủ lớn để chứa xâu trỏ bởi con trỏ src bao gồm cả kí tự NULL và không được chồng lên vùng nhớ được trỏ bởi src. Do đó ta sửa lại như sau bằng cách chỉnh lại điều kiện trong vòng lặp. (có thể dùng kiểu void và không trả về giá trị dest như đoạn code ban đầu cũng được): char* strcpy(char * dest, const char *src); { int i,n; n=strlen(src); for(i=0; i<=n; ++i) dest[i] = src[i]; return dest; }
  • 6. Đề thi số 2 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 calc(int subkey, int bitoff){ subkey = subkey >> (bitoff - ((bitoff >> 5) << 5)); return subkey; } Câu 2 (1đ): Cho biết giá trị các phần tử của mảng A sau khi thực hiện đoạn lệnh dưới đây: int A[] = {5,7,19,1,2,6}; int b, *p=A+2; b=*p++; *p+=2*b; p++; *p+=1; Câu 3 (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 4 (1đ): Xây dựng cấu trúc số phức gồm phần thực và phần ảo là các số thực. Thực hiện đa năng hoá toán tử ~ có chức năng đưa ra số phức liên hợp của số phức ban đầu. Ví dụ: ~(4-3i) = 4+3i Câu 5 (1đ): Tối ưu đoạn code sau: int x,y,z,i,n,*p,*q,*s; float *m,d; /* Gán giá trị cho các biến cần thiết */ for(i=0; i<3*n; i++){ m[i]=p[i]+q[i]+s[i]+127+6*tan(d)-13*sin(d); y=8*x + 128*z + 35*sqrt(d); } Câu 6 (0.75đ): Phân tích đoạn mã lệnh sau, tìm các lỗi sai (nếu có) và sửa lại cho đúng: char *p, buf[256]; gets(buf); p = malloc(strlen(buf)); strcpy(p, buf); 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ử chẵn lớn nhất trong danh sách. Nếu không tìm thấy phần tử chẵn thì trả về 0. Câu 8 (1đ): a. Đoạn mã sau thực hiện việc tính giai thừa của một số nguyên n. Phân tích đoạn mã, tìm các lỗi sai và sửa lại cho đúng (0.5đ): void factorial(int n){ int fac=1; while (n--) fac *= n; return fac; } b. Đoạn mã sau thực hiện việc tính trung bình cộng các phần tử trong mảng a[]. Phân tích, tìm các lỗi sai và sửa lại (0.5đ): double avg(double a[], int n){ int i; double sum; sum = 0.0; for (i=0; i<n; i++) sum += a[i]; return sum/n; }
  • 7. ĐÁP ÁN ĐỀ THI SỐ 2 Câu 1 (0.75đ): Ta có thể thấy ngay đoạn code này chẳng có gì ngoài việc trả về giá trị của subkey. Do đó việc tinh chỉnh chỉ đơn giản là tinh chỉnh các biểu thức toán học sao cho máy có thể thực hiện nhanh hơn. Dễ dàng nhận thấy như sau: Ở đây, giá trị bitoff đầu tiên dịch phải 5bit, sau đó lại được dịch trái 5bit. Như vậy biểu thức (bitoff>>3)<<3 sẽ chuyển 5bit cuối của bitoff thành 00000. Giả sử bitoff = ****..**abcde (abcde là các bit) Do đó, bitoff - ((bitoff >> 5) << 5)) = ****..**abcde - ****..**00000 = 0000..00abcde = bitoff & 0000..0011111 = bitoff & 0x1F Vì vậy ta có đoạn code tối ưu như sau: int calc(int subkey, int bitoff){ subkey >>= bitoff & 0x1F; return subkey; } Câu 2 (1đ): Bài này khá đơn giản và quen thuộc: Ở đây ban đầu p trỏ tới A[2]. b=*p++ ~ b=*p và p++ => b=A[2]=19, p trỏ tới A[3]. *p+=2*b => A[3]+=2*19 => A[3] = 39. p++ => p trỏ tới A[4]. *p+=1 => A[4] +=1 => A[4] = 3. Vậy giá trị các phần tử mảng sau khi thực hiện đoạn lệnh là A[] = {5,7,19,39,3,6}. Câu 3 (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[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
  • 8. char output[100]; int i=0; while(number>0) { output[i++] = digits[number%base]; number = number/base; } i--; //Xuất ra kết quả for(;i>=0;i--) { printf("%c",output[i]); } } Câu 4 (1đ): Xây dựng cấu trúc số phức như sau: (0.5đ) typedef struct SoPhuc{ float Thuc, Ao; }SP; Đa năng hoá toán tử ~ có chức năng trả về số phức liên hợp với số phức ban đầu: (0.5đ) SP operator ~ (SP &a){ a.Ao = - a.Ao; return a; } Câu 5 (1đ): Tối ưu đoạn code… + Đặt các biểu thức bất biến là hằng số (0.25đ): float temp1=127+6*tan(d)-13*sin(d); Có thể một số bạn sẽ đặt thêm: float temp2=35*sqrt(d); .Tuy nhiên biểu thức y = … không phụ thuộc vòng lặp for nên ta không cần dùng biến temp2 mà chỉ cần bỏ biểu thức y = … ra khỏi vòng lặp for là xong. + Thay đổi các phép nhân với 2k bằng các phép dịch bit để tăng tốc độ tính toán (0.25đ): 8*x+128*z = x<<3 + z<<7 + Nhìn vào vòng lặp for ta thấy cận trên và bước nhảy là 3*n, i++, tức là phải thực hiện 3*n lần lặp. Có thể tối ưu bằng cách giảm bớt số lần lặp xuống còn n lần như sau: (kĩ thuật này còn gọi là kĩ thuật Loop Unrolling, các bạn có thể tìm hiểu thêm trên Google) (0.5đ) for(i=0; i<3*n; i+=3){ m[i]=p[i]+q[i]+s[i]+temp1; m[i+1]=p[i+1]+q[i+1]+s[i+1]+temp1; m[i+2]=p[i+2]+q[i+2]+s[i+2]+temp1; } Tổng hợp lại ta có đoạn code tối ưu hơn như sau: int x,y,z,i,n,*p,*q,*s;
  • 9. float *m,d; /* Gán giá trị các biến cần thiết */ float temp1=127+6*tan(d)-13*sin(d); y=x<<3 + z<<7 + 35*sqrt(d); for(i=0; i<3*n; i+=3){ m[i]=p[i]+q[i]+s[i]+temp1; m[i+1]=p[i+1]+q[i+1]+s[i+1]+temp1; m[i+2]=p[i+2]+q[i+2]+s[i+2]+temp1; } Câu 6 (1đ): Thoạt nhìn đây có vẻ là một câu khá ‘hiểm’ và khó phát hiện ra lỗi. Tuy nhiên, nếu tinh ý thì câu này quá đơn giản. Ở đây ta nhận thấy biến p cấp phát động sai do hàm strlen không tính kí tự kết thúc xâu (‘0’). Do đó ta sửa lại đoạn code như sau: char *p, buf[256]; gets(buf); p = malloc(strlen(buf)+1); //thay vì chỉ strlen(buf) như code gốc strcpy(p, buf); Hoặc: char *p, buf[256]; gets(buf); p = new char [strlen(buf)+1]; strcpy(p, buf); Câu 7 (2đ): Đề yêu cầu đưa ra phần tử chẵn lớn nhất của danh sách. Sử dụng ý tưởng sau: + Duyệt toàn bộ danh sách và đếm số phần tử chẵn trong danh sách. Nếu không có phần tử chẵn thì trả về 0 ngay. + Nếu có phần tử chẵn thì lưu các phần tử chẵn này vào 1 mảng cấp phát động với kích thước = số phần tử chẵn (tiết kiệm bộ nhớ) + Duyệt mảng này và tìm phần chẵn lớn nhất. Cái này thì quá đơn giản và quen thuộc. //Hàm đếm số phần tử chẵn trong danh sách int demSoPtChan(node *head){ int count=0; node *tmp; for(tmp=head; tmp!=NULL; tmp=tmp->next){ if (tmp->data % 2 == 0) count++; } return count; } //Hàm tìm phần tử chẵn lớn nhất int maxEven(node *head){ if (demSoPtChan(head) == 0) return 0; else{ node *tmp; int m=demSoPtChan(head); int *a=new int [m]; int i=0, max; for(tmp=head; tmp!=NULL; tmp=tmp->next){ if((tmp->data)%2==0)
  • 10. a[i++]=tmp->data; //nếu gặp phần tử chẵn thì lưu vào mảng a } max=a[0]; for(i=0; i<m; i++){ if (a[i]>max) max=a[i]; } return max; } } Câu 8 (1đ): a. Đoạn code này sẽ gặp vấn đề khi n=1. Cụ thể: với n=1 thì trong vòng lặp while, n=0, do đó fac = 0 => sai. Sửa lại code như sau: int factorial (int n){ int fac=1; for( ; n>0; n--) fac *= n; return fac; } b. Đoạn code này chưa xét trường hợp mảng có 0 phần tử. Do đó chỉ cần sửa lại lệnh return như sau là ok. return (n<=0) ? 0.0 : sum/n;
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23. Tải bản FULL (49 trang): bit.ly/2Ywib4t Dự phòng: fb.com/KhoTaiLieuAZ
  • 24.
  • 25. Tải bản FULL (49 trang): bit.ly/2Ywib4t Dự phòng: fb.com/KhoTaiLieuAZ