Đến nội dung


Chú ý

Do trục trặc kĩ thuật nên diễn đàn đã không truy cập được trong ít ngày vừa qua, mong các bạn thông cảm.

Nếu các bạn đăng kí thành viên mà không nhận được email kích hoạt thì hãy kiểm tra thùng thư rác (spam). Nếu không biết cách truy cập vào thùng thư rác thì các bạn chịu khó Google hoặc đăng câu hỏi vào mục Hướng dẫn - Trợ giúp để thành viên khác có thể hỗ trợ.


Hình ảnh

Chuỗi gần đúng

pascal

  • Please log in to reply
Chủ đề này có 5 trả lời

#1 The Dark Hunter

The Dark Hunter

    Binh nhất

  • Thành viên mới
  • 20 Bài viết
  • Giới tính:Nam

Đã gửi 13-08-2016 - 00:30

Hai chuỗi gọi là gần đúng khi các ký tự của chuỗi gốc xuất hiện trong chuỗi kia
theo đúng thứ tự như chuỗi gốc. Số kí tự sai khác được tính thành tỉ lệ phần trăm so
với chuỗi có độ dài lớn hơn. Nếu tỉ lệ % sai khác không lớn hơn m% thì ta gọi đây
là 2 chuỗi gần đúng.
Ví dụ: xem hình sau:
Trong hình trên, độ sai lệch giữa mispeld misspelled là 3 kí tự; tỉ lệ là 3/10
tức 30%.
* Yêu cầu: Viết chương trình tìm các chuỗi gần đúng so với chuỗi gốc.
Fie dữ liệu vào cho trong File BAI2.INP. Hàng đầu tiên là m (số nguyên giá trị
từ 1 đến 50). Hàng kế tiếp là chuỗi gốc; các hàng còn lại là các chuỗi cần xác định
có gần đúng với chuỗi gốc đã cho hay không. Chuỗi chỉ gồm các kí tự chuẩn trong
bảng mã ASCII và không có khoảng trắng trong chuỗi; chiều dài chuỗi không quá
254 kí tự.
Kết quả ghi trong File dữ liệu ra BAI2.OUT; gồm chuỗi gốc và các chuỗi gần
đúng với chuỗi gốc (không phân biệt chữ hoa/thường). Mỗi chuỗi được ghi trên 1
hàng.
Ví dụ:
BAI2.INP BAI2.OUT
30 mispeld
mispeld misspelled
misplace
misspelled
mislead

 

M.n giúp tìm lỗi sai với:

uses crt;
var f1,f2:text;n:integer;s1,s2:string;
function sai_so(s1,s2:string):integer;
var a:string;k1,k2,i,b,c,S,H:integer;
begin
k1:=length(s1);
k2:=length(s2);
S:=0;a:=s2;
for i:=1 to k1 do
    begin
    c:=pos(s1[i],a);
    b:=k2-length(a)+c;
    if c>0 then
       begin
       S:=S+c-1;
       a:=copy(s2,b+1,k2-b);
       end
       else
       begin
       S:=0;break;
       end;
    end;
sai_so:=S;
 
end;
begin
clrscr;
assign(f1,'input.txt');
reset(f1);
assign(f2,'output.txt');
rewrite(f2);
while not eof(f1) do
begin
     read(f1,n,s1,s2);
     writeln(f2,sai_so(s1,s2));
end;
close(f1);close(f2);
readln
end.

File gửi kèm


Đức HD Trần:  :icon6:  :D  :like 

 

AK36 Trường THPT Quang Trung tỉnh Hải Dương


#2 NTL2k1

NTL2k1

    Hạ sĩ

  • Thành viên
  • 99 Bài viết
  • Giới tính:Nam
  • Đến từ:Đắk Lắk
  • Sở thích:$\left[ {\begin{array}{*{20}{c}} {All} \\ {Nothing} \\ \end{array}} \right.$

Đã gửi 13-08-2016 - 13:31

 

Hai chuỗi gọi là gần đúng khi các ký tự của chuỗi gốc xuất hiện trong chuỗi kia
theo đúng thứ tự như chuỗi gốc. Số kí tự sai khác được tính thành tỉ lệ phần trăm so
với chuỗi có độ dài lớn hơn. Nếu tỉ lệ % sai khác không lớn hơn m% thì ta gọi đây
là 2 chuỗi gần đúng.
Ví dụ: xem hình sau:
Trong hình trên, độ sai lệch giữa mispeld misspelled là 3 kí tự; tỉ lệ là 3/10
tức 30%.
* Yêu cầu: Viết chương trình tìm các chuỗi gần đúng so với chuỗi gốc.
Fie dữ liệu vào cho trong File BAI2.INP. Hàng đầu tiên là m (số nguyên giá trị
từ 1 đến 50). Hàng kế tiếp là chuỗi gốc; các hàng còn lại là các chuỗi cần xác định
có gần đúng với chuỗi gốc đã cho hay không. Chuỗi chỉ gồm các kí tự chuẩn trong
bảng mã ASCII và không có khoảng trắng trong chuỗi; chiều dài chuỗi không quá
254 kí tự.
Kết quả ghi trong File dữ liệu ra BAI2.OUT; gồm chuỗi gốc và các chuỗi gần
đúng với chuỗi gốc (không phân biệt chữ hoa/thường). Mỗi chuỗi được ghi trên 1
hàng.
Ví dụ:
BAI2.INP BAI2.OUT
30 mispeld
mispeld misspelled
misplace
misspelled
mislead

 

M.n giúp tìm lỗi sai với:

uses crt;
var f1,f2:text;n:integer;s1,s2:string;
function sai_so(s1,s2:string):integer;
var a:string;k1,k2,i,b,c,S,H:integer;
begin
k1:=length(s1);
k2:=length(s2);
S:=0;a:=s2;
for i:=1 to k1 do
    begin
    c:=pos(s1[i],a);
    b:=k2-length(a)+c;
    if c>0 then
       begin
       S:=S+c-1;
       a:=copy(s2,b+1,k2-b);
       end
       else
       begin
       S:=0;break;
       end;
    end;
sai_so:=S;
 
end;
begin
clrscr;
assign(f1,'input.txt');
reset(f1);
assign(f2,'output.txt');
rewrite(f2);
while not eof(f1) do
begin
     read(f1,n,s1,s2);
     writeln(f2,sai_so(s1,s2));
end;
close(f1);close(f2);
readln
end.

 

Lỗi ở đây là không đọc được file. Dạo này đang chán và mệt nên nhác nghĩ, mình cho bạn coi cái code của mình về bài này hồi ôn.Nhưng chưa chuẩn xác lắm đâu nhưng nhìn đơn giản hơn nhiều.Bạn có gắng tự xử nhé, lúc nào rảnh thì mình làm cho :]

Code:

 

program chuoi_gan_dung;
uses crt;
var a,b:array[1..100] of string;
s,st:string;
i,n,m,k,p,l,j:integer;
begin
clrscr;
write('Nhap so % :');readln(m);
write('Nhap xau goc :');readln(s);
write('Nhap so xau can xac dinh :');readln(n);
p:=0;
for i:=1 to n do
        begin
        write('nhap xau a[',i,']=');readln(a[i]);
        st:=a[i];
        l:=1;
        j:=1;
        k:=0;
        while (l<=length(s))and(j<=length(st)) do
        if s[l]=st[j] then
        begin
        l:=l+1;
        j:=j+1;
        end else
                begin
                j:=j+1;
                k:=k+1;
                end;
        if (k/length(st))*100<=m  then
        begin
        p:=p+1;
        b[p]:=st;
        end;
        end;
for i:=1 to p do
writeln(b[i]);
readln
end.
P/s: Bạn sửa lại nội dung ví dụ nhé .Thân !

Bài viết đã được chỉnh sửa nội dung bởi NTL2k1: 13-08-2016 - 15:13

Bình tĩnh - Tự tin - Chiến thắng

Không phải là tôi quá thông minh, chỉ là tôi chịu bỏ nhiều thời gian hơn với rắc rối .

Cứ làm việc chăm chỉ trong im lặng - Hãy để thành công trở thành tiếng nói của bạn .

 


#3 The Dark Hunter

The Dark Hunter

    Binh nhất

  • Thành viên mới
  • 20 Bài viết
  • Giới tính:Nam

Đã gửi 13-08-2016 - 22:20

thuật toán mình làm dc rồi nhưng ko biết phải thao tác với file thế nào thôi

uses crt;
var n:integer;s1,s2:string;
function sai_so(s1,s2:string):integer;
var a:string;k1,k2,i,b,c,S,H:integer;
begin
k1:=length(s1);
k2:=length(s2);
S:=0;a:=s2;
for i:=1 to k1 do
    begin
    c:=pos(s1[i],a);
    b:=k2-length(a)+c;
    if c>0 then
       begin
       S:=S+c-1;
       a:=copy(s2,b+1,k2-b);
       end
       else
       begin
       S:=0;break;
       end;
    end;
H:=trunc(S/k2*100);
sai_so:=H;
end;
begin
clrscr;
write('nhap xau:');readln(s1);
write('nhap xau can kiem tra:');readln(s2);
write('% sai so:');readln(n);
if sai_so(s1,s2)<n then writeln('ok')
else writeln(':(');
readln
end.

Đức HD Trần:  :icon6:  :D  :like 

 

AK36 Trường THPT Quang Trung tỉnh Hải Dương


#4 The Dark Hunter

The Dark Hunter

    Binh nhất

  • Thành viên mới
  • 20 Bài viết
  • Giới tính:Nam

Đã gửi 13-08-2016 - 22:30



 

Lỗi ở đây là không đọc được file. Dạo này đang chán và mệt nên nhác nghĩ, mình cho bạn coi cái code của mình về bài này hồi ôn.Nhưng chưa chuẩn xác lắm đâu nhưng nhìn đơn giản hơn nhiều.Bạn có gắng tự xử nhé, lúc nào rảnh thì mình làm cho :]

Code:

 

program chuoi_gan_dung;
uses crt;
var a,b:array[1..100] of string;
s,st:string;
i,n,m,k,p,l,j:integer;
begin
clrscr;
write('Nhap so % :');readln(m);
write('Nhap xau goc :');readln(s);
write('Nhap so xau can xac dinh :');readln(n);
p:=0;
for i:=1 to n do
        begin
        write('nhap xau a[',i,']=');readln(a[i]);
        st:=a[i];
        l:=1;
        j:=1;
        k:=0;
        while (l<=length(s))and(j<=length(st)) do
        if s[l]=st[j] then
        begin
        l:=l+1;
        j:=j+1;
        end else
                begin
                j:=j+1;
                k:=k+1;
                end;
        if (k/length(st))*100<=m  then
        begin
        p:=p+1;
        b[p]:=st;
        end;
        end;
for i:=1 to p do
writeln(b[i]);
readln
end.
P/s: Bạn sửa lại nội dung ví dụ nhé .Thân !

 

thuật toán dễ hiểu đấy


Đức HD Trần:  :icon6:  :D  :like 

 

AK36 Trường THPT Quang Trung tỉnh Hải Dương


#5 NTL2k1

NTL2k1

    Hạ sĩ

  • Thành viên
  • 99 Bài viết
  • Giới tính:Nam
  • Đến từ:Đắk Lắk
  • Sở thích:$\left[ {\begin{array}{*{20}{c}} {All} \\ {Nothing} \\ \end{array}} \right.$

Đã gửi 14-08-2016 - 12:24

 

thuật toán mình làm dc rồi nhưng ko biết phải thao tác với file thế nào thôi

uses crt;
var n:integer;s1,s2:string;
function sai_so(s1,s2:string):integer;
var a:string;k1,k2,i,b,c,S,H:integer;
begin
k1:=length(s1);
k2:=length(s2);
S:=0;a:=s2;
for i:=1 to k1 do
    begin
    c:=pos(s1[i],a);
    b:=k2-length(a)+c;
    if c>0 then
       begin
       S:=S+c-1;
       a:=copy(s2,b+1,k2-b);
       end
       else
       begin
       S:=0;break;
       end;
    end;
H:=trunc(S/k2*100);
sai_so:=H;
end;
begin
clrscr;
write('nhap xau:');readln(s1);
write('nhap xau can kiem tra:');readln(s2);
write('% sai so:');readln(n);
if sai_so(s1,s2)<n then writeln('ok')
else writeln(':(');
readln
end.

 

Nhận xét:

- Các TH khác thì không biết thế nào nhưng nếu nhập từ kiểm tra là "misspelled" và từ gốc là "mispeld" , sai số là 30. Thì kết quả ra là sai !

* Nói chung thuật toán vẫn chưa chính xác lắm !


Bài viết đã được chỉnh sửa nội dung bởi NTL2k1: 14-08-2016 - 21:10

Bình tĩnh - Tự tin - Chiến thắng

Không phải là tôi quá thông minh, chỉ là tôi chịu bỏ nhiều thời gian hơn với rắc rối .

Cứ làm việc chăm chỉ trong im lặng - Hãy để thành công trở thành tiếng nói của bạn .

 


#6 The Dark Hunter

The Dark Hunter

    Binh nhất

  • Thành viên mới
  • 20 Bài viết
  • Giới tính:Nam

Đã gửi 15-08-2016 - 22:45

Nhận xét:

- Các TH khác thì không biết thế nào nhưng nếu nhập từ kiểm tra là "misspelled" và từ gốc là "mispeld" , sai số là 30. Thì kết quả ra là sai !

* Nói chung thuật toán vẫn chưa chính xác lắm !

cái chỗ:

else
       begin
       S:=0;break;
       end;
quên ko để ý S:=100 mới đúng 

Đức HD Trần:  :icon6:  :D  :like 

 

AK36 Trường THPT Quang Trung tỉnh Hải Dương






1 người đang xem chủ đề

0 thành viên, 1 khách, 0 thành viên ẩn danh