BÀI TẬP DÀI KỸ THUẬT LẬP TRÌNH K55
Alex đangthamgiamộtdựánđiềukhiểnRobot bằnggiọngnói. Robot đượcđiềukhiểnthông qua
cáckhẩulệnhcủa Alex.Mộttậplệnhmẫusẽđượcdạytrướccho Robot.Khẩulệnhcủa Alex
đượcthuvàomáytínhthông qua một Microphone
rồitruyềnxuốngchocáccơcấuchấphànhcủaRobot. Tuynhiên, do chấtlượngcủa Microphone
cũngnhưảnhhưởngcủamôitrườngxungquanh, lệnhthuđượccóchứarấtnhiềunhiễu.Nhiệmvụcủa
Alex làphảiviếtchươngtrìnhxửlýlệnhthuđượcxemnókhớpnhấtvớilệnhnàotrongtậplệnh.
Tậplệnhmẫudạytrướccho Robot đượclưuthànhcácchuỗicóđộdàikhôngquá 20 kýtự,
khôngphânbiệthoathường.Khẩulệnhthuđượctừ Microphone
đượclưuvàomáytínhdướidạngcácchuỗicóđộdàikhôngquá 100 kýtự,
khôngphânbiệthoathường. Mộtlệnh X đượcgọilàkhớpvớilệnh Y
trongtậplệnhmẫunếucáckýtựcủachuỗi Y xuấthiệntheođúngthứtựtrongchuỗi X
(khôngnhấtthiếtliềnnhau). Lệnh X đượcgọilàkhớpvớilệnh Y1 hơnlệnh
Y2nếusốlầnxuấthiệncủachuỗi Y1 nhiềuhơn so vớisốlầnxuấthiệncủachuỗi Y2 trongchuỗi X.
Cáclệnhcũngnhưtậplệnhđượclưutrữtrongmáytínhdướidạng file vănbản: VOICE.INcócấutrúc:
- Dòngđầutiênchứa 2 sốnguyên m, n (m ≤ 10; n ≤ 10)
- mdòngtiếptheochứacácchuỗitrongtậplệnhmẫu. Mỗilệnhtrên 1 dòngvàcókhôngquá 20
kýtự
- ndòngtiếptheochứacácchuỗitrongtậpkhẩulệnhcủa Alex. Mỗilệnhtrên 1
dòngvàcókhôngquá 100 kýtự
Kếtquảxửlýghira file vănbảnVOICE.OUTgồm n dòng.
Mỗidòngghi02sốnguyênbiểuthịsốthứtựcủalệnhmẫutrongtậplệnhkhớpvớilệnhtươngứngcủa Alex
vàsốlầnlặplạicủalệnhmẫuđó.Nếukhôngcólệnhmẫunàokhớpghi 0.Cácsốghicáchnhaubởidấucách.
Vídụ:
VOICE.IN VOICE.OUT
4 3
UP
DOWN
LEFT
RIGHT
UUUPPPPPPPUP
TURN
UDdOOPpPWNwNwnWn
1 3
0 0
2 2
ĐÁNH GIÁ VÀ CHO ĐIỂM
1. Việc chấm điểm được thực hiện một cách tự động bằng máy tính.
2. Có tất cả 10 Tests với mức độ từ dễ đến khó.
3. Mỗi Test chạy đúng (in đúng cả thứ tự của lệnh và số lần xuất hiện lệnh) sẽ được 10 điểm.
Nếu chỉ in đúng số thứ tự mà in sai số lần xuất hiện của lệnh sẽ được 5 điểm. Tráilại, được0
điểm.
4. Điểm của bài tập dài sẽ là tổng điểm thu được sau khi chạy 10 Tests.
5. Điểm thu được sau khi chia 10 và làm tròn sẽ được tính làm điểm quá trình
6. Mỗi người hoàn thành và nộp bài tập của mình một cách độc lập.
7. Mỗi sinh viên nộp bài tập của mình trong một thư mục có định dạng: Họ và tên sinh viên –
Mã số sinh viên. Ví dụ: Sinh viên Nguyễn Văn A có mã số sinh viên là 12345 thì tất cả các file
của mỗi bài tập sẽ lưu vào trong thư mục NguyenVanA-12345.
8. Sinh viên chỉ nộp các file .c và .h cần thiết. KHÔNG nộp cả thư mục Project.
9. Cả lớp copy vào 1 đĩa CD, ghi ngoài nhãn là: lớp “KTLT-K55-1”
10. Đĩa “KTLT-K55-1” nộp vào tuần 14 của học kỳ
11. Điểm giữa kỳ sẽ được công bố vào tuần 16 của học kỳ
12. Mỗi bài tập chỉ thu đúng 01 lần vào buổi học sáng thứ 6 của tuần 14. Không cho phép nộp
bổ sung.
13. Sinh viên thiếu bài trong đĩa “KTLT-K55-1” sẽ được 0 điểm quá trình.
14. Các bài giống nhau sẽ được chia đều số điểm theo số lượng giống tương ứng
//NguyễnVănNhân
//MSSV:20101962
//Lớp ĐK-TĐH-1 K55
//Bàitậpdàikĩthuậtlậptrình
#include<stdio.h>
#include"mystring.h"
intmlen( char *str)
{
inti=0;
while(str[i]!='\0') i++;
returni;
}
intxauconchung(char *x,char *y)
{
inti,j,m,n;
int a[101][101];
m=mlen(x);
n=mlen(y);
for(i=0;i<m+1;i++)
a[i][0]=0;
for(i=0;i<n+1;i++)
a[0][i]=0;
for(i=1;i<m+1;i++)
for(j=1;j<n+1;j++)
{
if (x[i-1]==y[j-1]) a[i][j]=a[i-1][j-1]+1;
else {
if(a[i-1][j]<a[i][j-1]) a[i][j]=a[i][j-1];
else a[i][j]=a[i-1][j];
}
}
return a[m][n];
}
void copy(char *s1,char *s2)
{
inti=0;
while(s2[i]!='\0')
{
s1[i]=s2[i];
i++;
s1[i]='\0';
}
}
voidchuthuong(char *x)
{
inti,m;
m=mlen(x);
for (i=0;i<m;i++)
{
if(x[i]>64&& x[i]<91) x[i]=x[i]+32;
}
}
void main()
{
inti,j,somau,solenh ;
char x[21],y[101];
charmau[10][21];
charlenh[10][101];
FILE *f,*g;
f=fopen("void.in","r");
g=fopen("void.out","w");
//doc du lieu tu file voi.in
fscanf(f,"%d %d",&somau,&solenh);
for(i=0;i<somau;i++)
{
fscanf(f,"%s",&mau[i]);
}
for(i=0;i<solenh;i++)
{
fscanf(f,"%s",&lenh[i]);
}
// xacdinhtronglenh co chuamaunao
for(i=0;i<solenh;i++)
{
intmang[10]={0,0,0,0,0,0,0,0,0,0};
int max=0,maux=0,h;
copy(y,lenh[i]); //copy khaulenh de so sanh
chuthuong(y);
for(j=0;j<somau;j++)
{
copy(x,mau[j]); //copy lenhmau
chuthuong(x);
h=xauconchung(x,y);
// neu co mautronglenhthithuchientim so mauxuathientronglenh do
if(h==mlen(x))
{
inti,n,l,a,td,daixc;
charxau[101];
int k=1;
n=mlen(x);
td=(int) 100/n;
// taomau de so sanh
while(k<=td)
{
for(a=0;a<n;a++)
for(i=0;i<k;i++)
xau[k*a+i]=x[a];
xau[k*n]='\0';
daixc=xauconchung(xau,y);
if(daixc==k*n) mang[j]=k;
else break;
k++;
}
//timlenhmauxuathiennhieunhatva so lanxuathientrongkhaulenh
for (l=0;l<10;l++)
if (mang[l]>max)
{
max=mang[l];
maux=l+1; // maux la lenhmauthui
}
}
}
fprintf(g,"%d %d\n",maux,max);
}
fclose(f);
fclose(g);
}