khi viết tên người hoặc tên đại lý Việt Nam được quy định viết hoa chữ cái đầu tất cae các âm tiết, còn lại là viết thường. Mỗi âm tiết cách nhau bởi một kí tự trắng. Yêu cầu: Hãy viết chương trình kiểm tra 1 xâu kí tự đã cho có đạt chuẩn danh từ hay không. Nếu chuẩn thì ghi kết quả là 1, ngược lại ghi kết quả là 0. Dữ liệu vào: Cho trong file văn bản DANHTU.INP, có cấu trúc: - dòng 1 ghi số tự nhiên n (n<10) - n dòng tiếp theo mỗi dòng ghi các xâu kí tự Dữ liệu ra: ghi ra file văn bản DANHTU.OUT, theo cấu trúc gồm n dòng, mỗi dòng ghi số 0 hoặc 1. VD DANHTU.INP DANHTU.OUT 3 1 Ton Ngo Khong 0 Tru Bat Gioi 0 SA tang HELPP

2 câu trả lời

uses crt;
var s: ansistring;
    i, n, t: longint;
    check: boolean;
begin
    clrscr;
    readln(t);
    while t > 0 do begin
        dec(t); readln(s);
        check:=s[1] in ['A'..'Z']; 
        n:=length(s);
        for i:=2 to n do 
            check:=check and( false
                         or ( (s[i] in ['a'..'z']) and (s[i - 1] <> #32) )
                         or ( (s[i] in ['A'..'Z']) and (s[i - 1]  = #32) )
                         or ( (s[i] = #32) and (s[i - 1] <> #32) )
            );
        if check then writeln(1) else writeln(0);
    end;
end.

Đây là bài của mình ko chắc là sẽ tối ưu.

Đầu tiên là mình sẽ kiểm tra các ký tự trong dãy xem có kí tự in hoa hay ko. Nếu có sẽ kiểm tra tiếp xem: 

+ Trước đó có dấu cách hay không + Không quá 1 dấu cách

+ Đằng sau là kí tự viết thường

Nếu  có 1 trong các điều kiện trên ko đúng thì sẽ dừng ngay vòng lặp và xuất ra là '0'; nếu đúng sẽ tiếp tục cho đến khi hết chuỗi và xuất ra là '1'

Chương trình

Program KT;
Var d : array[1..1000] of string;

i, n: integer;

fi, fo: text;

Function ktdt(s:string):boolean;

var i : integer;

a,b,c,d: boolean;

begin

ktdt := False;

If s[1] in ['A'..'Z'] then

For i := 1 to length(s)-1 do begin

a := s[i] in ['A'..'Z'];

b := s[i+1] in ['a'..'z'];

c := s[i-1] = ' ';

d := not(s[i-2]=' ');

if a then if b and c and d then ktdt := true

else begin ktdt := false; break; end;

end;

end;

BEGIN

assign(fi,'DANHTU.INP'); reset(fi);

assign(fo,'DANHTU.OUT'); rewrite(fo);

Readln(fi,n);

For i := 1 to n do readln(fi,d[i]);

For i := 1 to n do if ktdt(d[i]) then Writeln(fo, 1) else writeln(fo, 0);

close(fi); close(fo); 

END.

Câu hỏi trong lớp Xem thêm