You are on page 1of 8

thi So 1

Mn : K thut lp trnh (IT3040) Thi gian: 90 pht SV c php s dng ti liu , nhng cm tuyt i : trao i ti liu, dng my tnh, in thoi d Cu 1 : (0.75) Cho bit hm sau y lm g : Cu 6: (1) Tinh chnh nng cao hiu nng ca void bitchange(int &x, int n) { chng trnh sau x &= ~(1 << (n - 1)); void my_func(float val, float *a, int n){ } int i=0,found = 0; Cu 2 : (0.75) Hy tin hnh Test v chnh while ((!found) && (i<n)) { sa on m sau : float testval = log(val)/log(2); if (a[i] == testval) found = 1; void process_data(char *s) { else i++; char cDest[32]; } strcpy(cDest,s); if (found) do_something; /* use cDest } ... */ } Cu 3 : (1) Mt LTV vit v cho chy CT Cu 7: (3.5) Cho cu trc d liu qun l sinh vin nh sau : sau : struct sinhvien { #include <stdio.h> struct hoso { void main(){ char malop[6]; int a,b,c=3; char hovaten[35]; int *p = &c; long sohieusv; /* divide c by itself */ float kqht; } data; a = c/*p; struct sinhvien *next; b = c /* set b to 3 */; } *ds; printf("a=%d, b=%d\n", a,b); D liu c nhp.Hy vit cc hm cn thit Sp } xp danh sch sinh vin theo lp , trong 1 lp theo th Khi thc hin , kt qu khng nh mun(a=1 t ABC ca tn, h v tn m (Yu cu : Tun th cc b=3).Hy tin hnh test v g ri CT. yu cu v phong cch lp trnh, thit k topdown v cc a- cu 4 : (0.75) Ti u on code sau : k thut Lt hiu qu) float f(float *a, float *b, int n) { float ta, tb , sum = 0.0; Cu 8: (1.5) Vit li on chng trnh sau c kt qu tng int i = 0; ng m khng d ng RETURN MainProgram ( thc cht l ta = a[i]; tb = b[i]; lnh Goto ) vi hm swap chun : for (i = 1; i < n; i++) { typedef int mang[MAX]; sum += ta + tb; void Sort1(mang &A, int n) { ta = a[i]; int i,j; tb = b[i]; int doicho; } for (i=0;i<n;i++) { sum += ta + tb; doicho = 0; return sum; for (j=n-1;j>0;j--) }

Cu 5 : (0.75) Cho bit ngha ca hm sau : if (A[j] < A[j-1]) { void sw(int *a, int *b) { swap (A[j], A[j-1]); *a ^=*b; doicho++; } *b ^=*a; if (doicho == 0) RETURN MainProgram; *a ^=*b; } } }

De 1 Cu 1. yu cu cho bit hm lm g ? y khng phi la m t hay gii thch cc ton t trong biu thc, m l cho bit n lm g. Xem lai bi v Programming style : khi m t hm, ta cn m t n lm g, m khng phi l lm nh th no. Hm trn truyn vo 2 tham s : tham bin x ( int & x ) v mt tham tr n ( int n). Vi dng ny ch tt nht ta a vo cc tham s c th v thc hin xem kt qu sau khi thc hin th hm lm bin i ci g ( y x l tham chiu, v vy ta cn quan st x trc v sau khi thc hin hm. Gi s ta c : int a=6; gi bitchange(a,2); => ta c x=6 v n=2 => x &= ~ ( 1<<(2-1)) => x=x & (~2) y l php ton v bit, v vy ta chuyn v dng nh phn => x= 0000 0000 0000 0110 & 0000 0000 0000 1101 = 0000 0000 0000 0100 => x= 0100 nh vy ban u x= 0110, sau khi thc hin hm, ta c x= 0100 => bt th 2 ( n) chuyn t 1 thnh 0. Tng t vi a=6, n=3 => x= 0110 & (~ 4) = 0110 & 1011 = 0010 => bit th 3 ( n) cung bi chuyn thnh 0. => kt lun : Hm ny t bt th n ca x thnh 0. ( hay xa bt th n ca x) iu ng bun y l : rt nhiu bn khng nh cc ton t trn bit ca c, cng nh khng bit a vo cc gi tr tm ra kt qu . ( c bit khi truyn tham chiu, thi ngha ca n l g !!! ) Cu 2. Cu ny yu cu Test 1 on code. Nhn s qua on code, ta thy ngay l phi test cc iu kin bin. y hm truyn vo 1 xu k t ( con tr xu), nhng li sao chep ( strcpy) vo 1 bin cc b l 1 xu khai bo tng minh. nu di xu vt qu 31=> li. Ta c th dng cp pht ng cho cDest nh 1 s bn lm, hoc kim tra nu di xu input < 32 thi mi copy. Tic rng : nhiu bn phn lung tung ( v du : strcpy(s1,s2) l hm copy ni dung s2 cho s1, nhng nhiu bn li phn l l copy tng k t, nn khng c=> sai c php ???. Mt s li sa thnh : strcpy(cDest,*s), v bn trn tham s l char * s ...

Thc ra bi ny v cng n gin, mc ch l g im, tic rng rt nhiu em khng lm c

Cu 3 1 : Vi cu ny, cc bn c th thy rng l cu duy nht c cc ch thch , d khng c cng khng sao trong khi cc cu khc vit rt gn v khng ch trn trang=> vy phi ch n c im ny ! Ta bit rng trong NNLT C, khi gp /* trnh dch s hiu l bt u ch thch, v on ch thch y s tip tc cho n khi gp */ u tin. Lnh gn : a= c/*p v tnh b trnh dch hiu nhm thnh bt u ch thch. V vy trong on code : a = c/*p; b = c /* set b to 3 */; printf("a=%d, b=%d\n", a,b); Ton b phn bi s bin thnh ch thch, kt qu chng trnh bin thnh void main(){ int a,b,c=3; int *p = &c; a = c ; printf("a=%d, b=%d\n", a,b); } vy nn kt qu in ra l a=3 v b khng xc nh. trnh s nhm ln trn ch cn thay a=c/*p; thanh a=c/(*p); n gin nh vy, xong tic rng rt nhiu bn li cho l khai bo : int *p = &c; l sai c php ( sai th sao CT chy v cho kt qu c !!!). Nhiu bn sa li thnh : int *p; p=&c; : thc cht khng thay i c g. Cn lu l khi ta vit int *p; th kiu d liu ( data_type ) y l int * v bin l p, ch khng phi kiu l int v bin l *p. ng bun nht l 1 s bn cho rng lnh : printf("a=%d, b=%d\n", a,b); sai c php, phi sa thnh printf("a=%d, b=%d\n", &a,&b); !!! bun thay cho SV ngnh CNTT !!!

cu 4 : (0.75) toi uu doan code sau : float f(float *a, float *b, int n) { float ta, tb , sum = 0.0; int i = 0; ta = a[i]; tb = b[i]; for (i = 1; i < n; i++) { sum += ta + tb; ta = a[i]; tb = b[i]; } sum += ta + tb; return sum; } R sot on code trn, ta thy bn cht ca on code l tnh tng n phn t ca 2 mng a v b. V vy ch cn loi b cc bin trung gian v tinh chnh nh sau :
float f(float *a, float *b, int n) { float sum = 0.0;

for (int i = n-1; i>=0 ; i--) sum += a[i] + b[i]; return sum; } Nhiu bn vn nguyn cc bin trung gian, ch thay vng lp tng thnh gim , hoc gim bt c 1,2 lnh ( v ch c 0.25)

Cu 5- 1 : Cu ny, ging nh cu 1, yu cu xc nh ngha ca hm, tc l gii thch hm lm g. y l 1 hm kiu void, v truyn con tr, vy n ch c th tc ng ti cc bin i s truyn vo. hiu c n tc ng th no, ta hy truyn vo 1 s bin c th. V d a=1,b=0 +. *a ^=*b; => *a=*a ^ *b => *a=0001 ^ 0000 =0001 *b ^=*a; => *b= *b ^ *a => *b =0000^0001=0001; => b=1 *a^=*b;=> *a=*a ^*b=> *b=0001^0001 =0000 => a=0 Vi a=2, b=3 => *a ^=*b; => *a=*a ^ *b => *a=0010 ^ 0011 =0001=> a=1 *b ^=*a; => *b= *b ^ *a => *b =0011^0001=0010; => b=2 *a^=*b;=> *a=*a ^*b=> *b=0001^0010 =0011 => a=3 Vy hm ny i o gi tr 2 bin truyn vo (m khng cn bin trung gian). iu ng bun y l khng t bn coi ton t ^ l php ly tha !!!! Bun thay SV ngnh CNTT BK

Cu 6 : (1) Tinh chnh nng cao hiu nng ca chng trnh sau void my_func(float val, float *a, int n){ int i=0,found = 0; while ((!found) && (i<n)) { float testval = log(val)/log(2); if (a[i] == testval) found = 1; else i++; } if (found) do_something; } Bi ny nu ch chuyn lnh gn float testval = log(val)/log(2); ra ngoi vng lp th ch c 0.5 . C nhiu p n, nhng ni chung u khng cn n bin found : a nu d ng linh canh ( khi phi m bo kch thc mng > n ) void my_function(float val, int*a, int n) {

int i=0; float testval = log(val) / log(2); a[n] = testval; while ( (a[i++] != testval)); if ( i < n) do_something(); } b : nu khng d ng lnh canh void my_function(float val, int*a, int n) { int i=0; float testval = log(val) / log(2); while ( (i < n) && (a[i] != testval)) i++; if ( i < n) do_something(); } C : void my_function(float val, int*a, int n) { int i=0; float testval = log(val) / log(2); while ( (i < n) { if ( a[i] == testval) { do_something; break; } i++; } }

Cu 7: (3.5) Cho cu trc d liu qun l sinh vin nh sau : struct sinhvien { struct hoso { char malop[6]; char hovaten[35]; long sohieusv; float kqht; } data; struct sinhvien *next; } *ds; D liu c nhp.Hy vit cc hm cn thit Sp xp danh sch sinh vin theo lp , trong 1 lp theo th t ABC ca tn, h v tn m (Yu cu : Tun th cc yu cu v phong cch lp trnh, thit k topdown v cc k thut Lt hiu qu) Phn tch : Bi cho 1 cu trc danh sch m c ni n, vi d liu c nhp. yu cu ch cn sp xp li danh sach, nhng theo th t ABC ca lp, tn, h v tn m. Trong cu trc d liu, ch c trng malop v hovaten, vy cn phi bin i hovaten thnh tenvahotendem ri mi so snh sp xp. Cc trng malop v hovaten u thuc kiu xu k t, mun sp xp theo th t ABC ca lp, tn, ho v tn m ta ch cn to 1 xu gm malop+tenvahotendem da vo malop va hovaten cua SV, so snh cc xu ca tng SV ta s sp xp c nh yu cu ca bi #include <string.h> #include <alloc.h>

struct sinhvien { struct hoso { char ml[6]; char ht[35]; long shsv; float kqht; } data; struct sinhvien *next; } *ds; /* hm gten, d ng ghp malop vi hovaten bin i o tn ln trc Hm nhn 2 tham s l malop v hovaten, v tr v 1 xu gm malop+ten+hovatendem V d : malop= CNPM1 v Hovaten= Tran Van Anh ta c : CNPM1AnhTran Van */ char *gten( char *l, char *t) { char tg[41]; int n=strlen(t); while ( n>=0 && t[n-1] !=' ') n--; // xc nh v tr du trng trc tn strcpy(tg,l); // copy malop vo bin xu tg strcat(tg,t+n); /* ghp ten vo xu tg. N l v tr ca du trng trc tn=> t+n chnh l a ch ca k t u tin ca tn, lnh trn s ghp tn sinh vin vo sau malop c copy vo xu tg. thay vi lenh nay, sv co the dung lenh for de gan cac ky tu thu n den het xau t vao cac ky tu thu strlen(l) cua tg nh sau : int m=strlen(tg); int k=strlen(t); for (i=0;i<=k-n;i++) tg[m+i]=t[k+i]; */ strncat(tg,t,n); // Ghp tip h v tn m vo xu tg. CO THE DUNG strcat(tg,t); return tg; } void sapxep(struct sinhvien *l) // Hm sp xp,Truyn vo a ch u ca danh sch { struct sinhvien *p,*q,*diachi,*tam; char s[41]; for(p=l;p!=NULL;p=p->next) { // Duyt danh sch t u strcpy(s,gten(p->data.ml,p->data.ht)); /* phi lu li malop va ten da bin i vo 1 bin tg v hm gten tr v a ch ca bin cc b tg */ diachi=p; for(q=p->next;q!=NULL;q=q->next) if(stricmp(s,gten(q->data.ml,q->data.ht)) > 0) { strcpy(s,gten(q->data.ml,q->data.ht)); diachi=q; // luu lai dia chi ca ptu c gten ln nht ln hn gten ca p } if ( diachi !=p) { // nu c ptu c gten > gten cua P thi swap data tam->data=diachi->data; diachi->data=p->data;

p->data=tam->data; } } } (N i chung khng c bt c 1 sv no lm c hon chnh cu ny. Mt s tin hnh sp xp theo lp, sau tin hnh sp xp theo hovaten ( nhung khng o tn). im cao nht 1 s SV t c cu ny l 2.5 nu cht th cao nht ch c 1 )
Cu 8: (1.5) Vit li on chng trnh sau sao cho khng d ng return m thc cht l Goto typedef int mang[MAX]; void Sort1(mang &A, int n){ int i,j; int doicho=0; for (i=0;i<n;i++) { doicho = 0; for (j=n-1;j>0;j--) if (A[j] < A[j-1]) { swap (A[j], A[j-1]; doicho++; } if (doicho == 0) return; } } Thc cht tng ca Thy Lng Mnh B khi ra ny l yu cu cc em sa i li on code trn, khng phi dung lnh return ( v c cu lnh if ) trong vng lp. lm c vic ta ch cn them 1 vng lp while . Thut ton ny trong mn CTDL& GT cc bn hc, y l thut ton sp xp ni bt ti u : Khi dy c sp xp ri th khng cn kim r sot ht, ch cn r sot 1 ln, hoc 1 s ln, cho n khi sp xp xong th lp tc kt thc lun. Ngoi ra, trong on code trn, ta thy vai tr ca I hon ton khng c ngha, v vy, nu c vng lp while th ch cn them 1 vng lp ca j m thi :

p n:
typedef int mang[MAX]; void Sort1(mang int while { if swap (A[j] for < (A[j], A[j-1]) &A, int n){ j,doicho=1; (doicho) (j=n-1;j>0;j--) { A[j-1]);

doicho++; } // neu doicho van =1 co nghia la mang da co thu tu, c sp xp ri if (doicho == 1) doicho =0; else doicho = 1; } }

Cc bn c th kim tra hiu qu ca thut ton trn, = cch xd them 1 hm, dung kiu ni bt bnh thng, nu mng c 10 phn t, thong thng ta phi kim tra 45 ln ( 9+8+7++2+1), nhng nu dung thu ton nh p n, th c th ch phi kim tra 9 ln u tin, nu khng phi swap ln no, th dng ngay. Bi ny 1.5, tic rng ch c rt t bn v lm bi ny- c th do ht thi gian ???

You might also like