You are on page 1of 15

thi s 1

Mn: K thut lp trnh (IT3040)


Thi gian: 90 pht
SV c php s dng ti liu, nhng khng c trao i ti liu, my tnh, in thoi d

Cu 1 (0.75): Tinh chnh on m sau v gii thch:


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;
}

Cu 2 (1): Cho bit gi tr cc phn t ca mng B sau khi thc hin on lnh di y:
int B[] = {2,4,7,8,9,15};
int c,*p=&B[1];
*p+=1; c=*p--;
p+=3; *p+=c;

Cu 3 (0.75): Phn tch on m lnh sau, tm cc li sai (nu c) ri sa li:


i=0;
do {
putchar(s[i++]) ;
putchar('\n');
) while (s[i] != '\0');

Cu 4 (2.5): Vit hm quy void chuyenCoSo(int base, int number) chuyn i mt


s nguyn number t h c s 10 sang h c s bt k base (t 2 n 16). Sau vit li
hm di dng khng quy.
Cu 5 (1): Xy dng cu trc phn s gm t s v mu s l cc s nguyn. Thc hin
a nng ho ton t ~ c chc nng gin c phn s.
V d: ~(10/6) = 5/3
Cu 6 (1): Ti u on code sau:
int i,m,n,p;
float c,*a,*b,*c,*d;
/* Gn gi tr cc bin cn thit */
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);
}

Cu 7 (2): Cho mt danh sch lin kt n vi cc nt c khai bo nh sau:


typedef struct node{
int data;
node *pNext;
}NODE;

Vit hm tm phn t l nh nht trong danh sch. Nu khng tm thy phn t l th tr


v 0.
Cu 8 (1): on m sau thc hin vic copy xu t xu ngun src sang xu ch dest.
Phn tch, tm v sa cc li sai (nu 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
Cu 1 (0.75): Nhn s qua on code ta c th thy c on code ny m s k t l ch
ci. Tuy nhin vn ch cc biu thc logic trong vng lp if c th t cha c ti u lm.
Tng qut nh sau: gi s ta c biu thc logic dng (E1 OR E2). Nu E1 c gi tr TRUE th c
biu thc l TRUE v trnh dch s khng xem xt gi tr logic ca E2 ng sau na. Do ta
nn t biu thc c xc sut TRUE ln nht ln u i vi biu thc dng trn.
Tng t vi biu thc logic cha AND: (E1 AND E2). Nu E1 c gi tr FALSE th c biu thc
l FALSE. Do ta a biu thc c xc sut FALSE ln nht ln u.
T nhng lp lun trn, ta c on code ti 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 on vn bn th xc sut gp ch thng l nhiu hn c, do t biu thc kim tra
ch thng ln u. Cha ht, trong 1 text file th thng cc k t c gi tr nh hn bng 'z'. V
khi , r rng biu thc (buf[i] <= 'z' && buf[i] >= 'a') khng ti u bng (buf[i] >= 'a' && buf[i] <=
'z').
Cu 2 (1): Bi ny n gin, g im.
y ban u p tr ti B[1]. *p+=1 ~ B[1]+=1 => B[1] = 4+1=5.
c=*p-- ~ c=*p v p-- => c=B[1]=5, p tr ti B[0].
p+=3 => p tr ti B[3].
*p+=c => B[3]+=5 => B[3] = 13.
Vy gi tr cc phn t mng sau khi thc hin on lnh l B[] = {2,5,7,13,9,15}.
Cu 3 (0.75): on code ny thc hin vic in tng phn t ca chui thnh tng dng. y
s dng vng lp do-while. Do s gp li nu xu s l xu rng.
Sa li nh sau bng cch i sang vng lp for:
for (i = 0; s[i] != '\0'; i++){
putchar(s[i]);
putchar('\n');
}
Pht hin li: 0.5, sa li: 0.25.
Cu 4 (2.5): Hm quy 1.25, hm khng quy 1.25.
//HM 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;
}
//Gi quy hm chuyenCoSo()
chuyenCoSo(base,number/base);
//Xut kt qu ra mn hnh
printf("%c",digits[number%base]);
}

//HM
KHNG
void chuyenCoSo_nonRec(int base, int number)

QUY

{
//Mng cha cc ch s ca 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--;
//Xut ra kt qu
for(;i>=0;i--)
{
printf("%c",output[i]);
}
}

Cu 5 (1): y bi yu cu phi ti gin phn s. Do ta cn a vo hm tm c


chung ln nht ca t s v mu s.
Xt 2 hm tm UCLN (s dng quy cho nhanh gn) nh di y. (0.25)

//Cch
int UCLN(int a, int b)
{
return b ? UCLN(b, a % b) : a;
}
//Cch 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);
}

1:

Xy dng cu trc phn s (0.25):


typedef struct PhanSo{
int TuSo, MauSo;
}PS;
a nng ho ton t ~ c chc nng ti gin phn s (0.5)
PS operator ~ (PS &a){
a.TuSo/=UCLN(a.TuSo, a.MauSo);
a.MauSo/=UCLN(a.TuSo, a.MauSo);
return a;
}

Cu 6 (1): Ti u on code
+ t cc biu thc bt bin l hng s (0.25):
float temp1=47-5*sin(c)+3*tan(c);
C th mt s bn s t thm:
float temp2=17*sin(c); .Tuy nhin biu thc m = khng ph thuc vng lp for nn ta
khng cn dng bin temp2 m ch cn b biu thc m = ra khi vng lp for l xong.
+ Thay i cc php nhn vi 2k bng cc php dch bit tng tc tnh ton (0.25):
16*n+512*p = n<<4 + p<<9
+ Nhn vo vng lp for ta thy cn trn v bc nhy l 4*n, i++, tc l phi thc hin 4*n ln
lp. C th ti u bng cch gim bt s ln lp xung cn n ln nh sau: (k thut ny cn gi
l k thut Loop Unrolling, cc bn c th tm hiu thm trn 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;
}
Tng hp li ta c on code ti u hn nh sau:
int i,m,n,p;
float c,*a,*b,*c,*d;

/* Gn gi tr cc bin cn thit */
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;
}

Cu 7 (2): yu cu a ra phn t l nh nht ca danh sch. S dng tng sau:


+ Duyt ton b danh sch v m s phn t l trong danh sch. Nu khng c phn t l th
tr v 0 ngay.
+ Nu c phn t l th lu cc phn t l ny vo 1 mng cp pht ng vi kch thc = s
phn t l (cho tit kim b nh)
+ Duyt mng ny v tm phn t nh nht. Ci ny th qu n gin v quen thuc.
//Hm m s phn t l trong danh sch
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;
}
//Hm tm phn t l nh nht
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; //nu gp phn t l th lu vo mng a
}
min=a[0];
for(i=0; i<m; i++){
if(a[i]<min)
min=a[i];
}
return min;
}
}

Cu 8 (1): Hm strcpy l hm m chng ta thng s dng di dng m n lin. Tuy nhin


vic hiu bn cht ca hm ny th ch c 1 s bn lm c.
Chp chui c tr bi con tr src vo mt mng c tr bi con tr dest, bao gm c k t
NULL (k t kt thc xu, \0).
trnh trn th kch thc ca mng c tr bi con tr dest phi ln cha xu tr bi
con tr src bao gm c k t NULL v khng c chng ln vng nh c tr bi src.
Do ta sa li nh sau bng cch chnh li iu kin trong vng lp. (c th dng kiu void v
khng tr v gi tr dest nh on code ban u cng 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
Mn: K thut lp trnh (IT3040)
Thi gian: 90 pht
SV c php s dng ti liu, nhng khng c trao i ti liu, my tnh, in thoi d

Cu 1 (0.75): Tinh chnh on m sau v gii thch:


int calc(int subkey, int bitoff){
subkey = subkey >>
(bitoff - ((bitoff >> 5) << 5));
return subkey;
}

Cu 2 (1): Cho bit gi tr cc phn t ca mng A sau khi thc hin on lnh di y:
int A[] = {5,7,19,1,2,6};
int b, *p=A+2;
b=*p++;
*p+=2*b;
p++;
*p+=1;

Cu 3 (2.5): Vit hm quy void chuyenCoSo (int base, int number) chuyn i mt
s nguyn number t h c s 10 sang h c s bt k base (t 2 n 16). Sau vit li
hm di dng khng quy.
Cu 4 (1): Xy dng cu trc s phc gm phn thc v phn o l cc s thc. Thc hin
a nng ho ton t ~ c chc nng a ra s phc lin hp ca s phc ban u.
V d: ~(4-3i) = 4+3i
Cu 5 (1): Ti u on code sau:
int x,y,z,i,n,*p,*q,*s;
float *m,d;
/* Gn gi tr cho cc bin cn thit */
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);
}

Cu 6 (0.75): Phn tch on m lnh sau, tm cc li sai (nu c) v sa li cho ng:


char *p, buf[256];
gets(buf);
p = malloc(strlen(buf));
strcpy(p, buf);

Cu 7 (2): Cho mt danh sch lin kt n vi cc nt c khai bo nh sau:


typedef struct node{
int data;
node *pNext;
}NODE;

Vit hm tm phn t chn ln nht trong danh sch. Nu khng tm thy phn t chn
th tr v 0.
Cu 8 (1):
a. on m sau thc hin vic tnh giai tha ca mt s nguyn n. Phn tch on m, tm cc
li sai v sa li cho ng (0.5):
void factorial(int n){
int fac=1;
while (n--)
fac *= n;
return fac;
}

b. on m sau thc hin vic tnh trung bnh cng cc phn t trong mng a[]. Phn tch, tm
cc li sai v sa li (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
Cu 1 (0.75): Ta c th thy ngay on code ny chng c g ngoi vic tr v gi tr ca
subkey. Do vic tinh chnh ch n gin l tinh chnh cc biu thc ton hc sao cho my c
th thc hin nhanh hn. D dng nhn thy nh sau:
y, gi tr bitof u tin dch phi 5bit, sau li c dch tri 5bit. Nh vy biu
thc (bitof>>3)<<3 s chuyn 5bit cui ca bitof thnh 00000. Gi s bitoff = ****..**abcde
(abcde l cc bit)
Do , bitoff - ((bitoff >> 5) << 5)) = ****..**abcde - ****..**00000 = 0000..00abcde
= bitoff & 0000..0011111 = bitoff & 0x1F

V vy ta c on code ti u nh sau:
int calc(int subkey, int bitoff){
subkey >>= bitoff & 0x1F;
return subkey;
}

Cu 2 (1): Bi ny kh n gin v quen thuc:


y ban u p tr ti A[2].
b=*p++ ~ b=*p v p++ => b=A[2]=19, p tr ti A[3].
*p+=2*b => A[3]+=2*19 => A[3] = 39.
p++ => p tr ti A[4].
*p+=1 => A[4] +=1 => A[4] = 3.
Vy gi tr cc phn t mng sau khi thc hin on lnh l A[] = {5,7,19,39,3,6}.
Cu 3 (2.5): Hm quy 1.25, hm khng quy 1.25
//HM 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;
}
//Gi quy hm chuyenCoSo()
chuyenCoSo(base,number/base);
//Xut kt qu ra mn hnh
printf("%c",digits[number%base]);
}

//HM
KHNG
void chuyenCoSo_nonRec(int base, int number)

QUY

{
//Mng cha cc ch s ca 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--;
//Xut ra kt qu
for(;i>=0;i--)
{
printf("%c",output[i]);
}
}

Cu 4 (1): Xy dng cu trc s phc nh sau: (0.5)


typedef struct SoPhuc{
float Thuc, Ao;
}SP;

a nng ho ton t ~ c chc nng tr v s phc lin hp vi s phc ban u: (0.5)


SP operator ~ (SP &a){
a.Ao = - a.Ao;
return a;
}

Cu 5 (1): Ti u on code
+ t cc biu thc bt bin l hng s (0.25):
float temp1=127+6*tan(d)-13*sin(d);
C th mt s bn s t thm:
float temp2=35*sqrt(d); .Tuy nhin biu thc y = khng ph thuc vng lp for nn ta
khng cn dng bin temp2 m ch cn b biu thc y = ra khi vng lp for l xong.
+ Thay i cc php nhn vi 2k bng cc php dch bit tng tc tnh ton (0.25):
8*x+128*z = x<<3 + z<<7

+ Nhn vo vng lp for ta thy cn trn v bc nhy l 3*n, i++, tc l phi thc hin 3*n ln
lp. C th ti u bng cch gim bt s ln lp xung cn n ln nh sau: (k thut ny cn gi
l k thut Loop Unrolling, cc bn c th tm hiu thm trn 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;
}
Tng hp li ta c on code ti u hn nh sau:
int x,y,z,i,n,*p,*q,*s;
float *m,d;
/* Gn gi tr cc bin cn thit */
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;
}
Cu 6 (1): Thot nhn y c v l mt cu kh him v kh pht hin ra li. Tuy nhin, nu
tinh th cu ny qu n gin. y ta nhn thy bin p cp pht ng sai do
hm strlen khng tnh k t kt thc xu (\0). Do ta sa li on code nh sau:
char *p, buf[256];
gets(buf);
p = malloc(strlen(buf)+1); //thay v ch strlen(buf) nh code gc
strcpy(p, buf);
Hoc:
char *p, buf[256];
gets(buf);
p = new char [strlen(buf)+1];
strcpy(p, buf);
Cu 7 (2): yu cu a ra phn t chn ln nht ca danh sch. S dng tng sau:
+ Duyt ton b danh sch v m s phn t chn trong danh sch. Nu khng c phn t
chn th tr v 0 ngay.
+ Nu c phn t chn th lu cc phn t chn ny vo 1 mng cp pht ng vi kch thc =
s phn t chn (tit kim b nh)
+ Duyt mng ny v tm phn chn ln nht. Ci ny th qu n gin v quen thuc.
//Hm m s phn t chn trong danh sch
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;
}
//Hm tm phn t chn ln nht
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; //nu gp phn t chn th lu vo mng a
}
max=a[0];
for(i=0; i<m; i++){
if (a[i]>max)
max=a[i];
}
return max;
}
}

Cu 8 (1):
a. on code ny s gp vn khi n=1. C th: vi n=1 th trong vng lp while, n=0, do fac = 0 => sai.
Sa li code nh sau:
int factorial (int n){
int fac=1;
for( ; n>0; n--)
fac *= n;
return fac;
}
b. on code ny cha xt trng hp mng c 0 phn t. Do ch cn sa li lnh return nh sau l ok.
return (n<=0) ? 0.0 : sum/n;

You might also like