Các dạng bài tập về xâu kí tự trong c năm 2024

Bài tập 5.11. Cho tệp LINE.TXT, mỗi dòng chứa một xâu không quá 255 kí tự. Hãy lập trình tạo tệp LINE.DAT chứa các xâu ở tệp LINE.TXT, nhưng mỗi xâu đã được chuẩn hóa theo quy tắc sau:

Xóa tất cả các dấu cách đầu và cuối xâu;

Nhiều dấu cách liên tiép (nếu có) được thay bằng một dấu cách duy nhất.

include

include

include

using namespace std; ifstream fi("LINE.TXT"); ofstream fo("LINE.DAT"); int main() { string s; while (getline(fi,s)) { while (s[0]==' ') s.erase(0,1); while (s[s.length()-1]==' ') s.erase(s.length()-1,1); while (s.find("  ")!=string::npos) s.erase(s.find("  "),1); fo<

Bài tập 4.41. Xâu không chứa các kí tự phân cách ‘.’ (dấu chấm), ‘,’ (dấu phẩy),’ ‘ (dấu cách) được gọi là một từ. Câu là một xâu bao gồm một hoặc nhiều từ, nếu xâu có nhiều từ thì các từ được phân cách với nhau bởi một hoặc một số kí tự phân cách.

Ví dụ, theo định nghĩa trên ta có:

“Informatics”- câu có một từ;

“Olympiad in Informatics” – câu có 3 từ;

“Co anh ban xa nha, co co ban nho cha.” – câu có 10 từ.

Viết chương trình đếm số lượng từ trong câu

Cách 1

include

include

using namespace std; int main() { string s,s1; long d=0,n; getline(cin,s); n=s.length(); bool z=false; for (int i=0;i

Cách 2

include

include

using namespace std; int main() { string s,s1; long d=0,n; getline(cin,s); s=s+" "; s1=""; n=s.length(); for (int i=0;i

Hãy lập trình: Nhập xâu bất kì từ bàn phím.

Chuẩn hóa xâu theo quy tắc sau:

  • Xóa các dấu cách ở đầu xâu nếu có;
  • Xóa các dấu cách ở cuối xâu nếu có;
  • Thay dãy nhiều dấu cách liên tiếp bằng một dấu cách.

Đưa kết quả đã chuẩn hóa ra màn hình.

include

include

using namespace std; int main() {

string s;  
getline(cin,s);  
while(s[0]==' ')s.erase(0,1);  
while(s[s.size()-1]==' ')s.erase(s.size()-1,1);  
while(s.find("  ")!=string::npos)  
    s.erase(s.find("  "),1);
cout<
} Một chuỗi S gọi là chuỗi đối xứng liên tiếp nếu s[i]=s[length(s)+1-i] với mọi i thỏa mãn . Cho một chuỗi S dài không quá 255 kí tự. Hãy cho biết độ dài chuỗi con đối xứng liên tiếp dài nhất trong chuỗi S.

Dữ liệu vào: File văn bản PALIND. INP gồm một dòng ghi chuỗi kí tự S.

Dữ liệu ra: File PALIND.OUT gồm một số nguyên chỉ chiều dài lớn nhất của chuỗi con đối xứng dài nhất trong chuỗi S.

program palind; const

  fi='palind.inp';  
  fo='palind.out';  
var f:text;
s:string;  
max:integer;  
procedure nhap; begin
    assign(f,fi);  
    reset(f);  
    read(f,s);  
end; procedure xuly; var i,j,lj,k:integer;
ok:boolean;  
begin max:=1; for i:=1 to length(s) do
    begin  
    for j:=length(s) downto i+1 do  
            if s[i]=s[j] then  
            begin  
              ok:=true;  
              for k:=0 to (j-i) div 2 do  
                    if s[i+k]<>s[j-k] then  
                    begin  
                            ok:=false;  
                            break  
                    end;  
              if ok then  
                    if j-i+1>max then max:=j-i+1;  
            end;  
    end;  
end; procedure xuat; begin
    assign(f,fo);  
    rewrite(f);  
    write(f,max);  
    close(f);  
end; BEGIN nhap; xuly; xuat; END. Bài toán 1 sách giáo khoa Tin học lớp 11 trang 73. Nhập vào từ bàn phím một xâu. Kiểm tra xâu đó có phải là xâu đối xứng hay không. Xâu đối xứng có tính chất: đọc nó từ phải sang trái cũng thu được kết quả giống như đọc từ trái sang phải (còn được gọi là xâu palindrome) Bài toán này học sinh có hai cách tiếp cận: Cách tiếp cận thứ nhất là dựa trên tư duy phản chứng như sau: “Giả sử như lúc đầu xâu đó là xâu đối xứng, nếu có một tính chất nào đó khiến xâu đó không là xấu đối xứng, thì giả sử sẽ sai và ta kết thúc việc kiểm tra. Còn không thì xâu đó vẫn là xâu đối xứng” Cách 1:

program xaudoixung; uses crt; var s:string;

kiemtra:boolean;  
i:byte;  
begin
 write('Nhap vao xau s=');  
 readln(s);  
 kiemtra:=true;  
 for i:=1 to trunc(length(s)/2) do  
     if s[i]<>s[(length(s)+1)-i] then  
     begin  
     kiemtra:=false;  
     break;  
     end;  
 if kiemtra=true then write('Xau doi xung')  
    else write('xau khong doi xung');
 readln;  
end. Cách tiếp cận thứ hai dựa trên việc phát triển thuật toán đếm số lượng các phần tử trong một mảng hoặc một xâu, và dựa vào tính chất của xâu đối xứng. Nếu xâu đó là xâu đối xứng thì với i từ 1 tới [length(s)/2], ta luôn có tính chất s[i]=s[(length(s)+1-i]. Vậy ta tìm cách đếm xem từ 1 tới [length(s)/2] có bao nhiêu lần tính chất s[i]=s[(length(s)+1-i] này đúng, Nếu có [length(s)/2] lần tính chất này đúng thì xâu đó là xâu đối xứng, còn nếu có <[length(s)/2] lần tính chất này đúng thì xâu không đối xứng Cách 2:

program xaudoixung; uses crt; var s:string;

kiemtra:boolean;  
i,m:byte;  
begin
 clrscr;  
 write('Nhap vao xau s=');  
 readln(s);  
 m:=trunc(length(s)/2);  
 i:=1;  
 while (i<=m) and(s[i]=s[length(s)+1-i]) do  
       i:=i+1;  
 if (m =i-1) then write('Xau doi xung')  
    else write('xau khong doi xung');  
 readln;  
end. Bài 2. Trang 73 Sách giáo khoa Tin học lớp 11

Viết chương trình nhập vào từ bán phím một xâu kí tự S và thông báo ra màn hình số lần xuất hiện của mỗi chữ cái Tiếng Anh trong S (không phân biệt chữ hoa hay thường )

uses crt; var s:string[30];

ch,x:char;  
i:byte;  
dem:array['A'..'Z']of byte;  
BEGIN
 clrscr;  
 write('Nhap vao xau s=');  
 readln(s);  
 for ch:='A' to 'Z' do dem[ch]:=0;  
 for i:=1 to length(s) do  
     begin  
     x:=upcase(s[i]);  
     if (x>='A') and (x<='Z')  
        then  
        dem[x]:=dem[x]+1;  
     end;  
 for ch:='A' to 'Z' do  
     if dem[ch]<>0 then  
             writeln('So luong ki tu',ch,'la',dem[ch]);  
 readln;  
END. Những sai lầm của học sinh không phải vì chúng dốt. Đó là một thực tế. Mà chúng đang nghĩ theo một con đường riêng chúng để có thể dẫn tới kết quả. Người giáo viên dựa vào đó để đánh giá và hiểu những điều sau: “Nguyên nhân sai lầm của học sinh, xuất phát từ đâu, từ phía học sinh hay từ phía giáo viên”. Từ đó giáo viên có cách điều chỉnh thêm trong lời nói, hành động, để tránh lặp lại những sai lầm đó. Chú ý, không bao giờ được phép coi thường những sai lầm của học sinh, mà hãy chỉ ra sai lầm để học sinh hiểu, và có định hướng đúng đắn. Bài toán 3 (Trang 73 sách giáo khoa Tin học lớp 11): Nhập vào từ bàn phím một xâu. Thay thế tất cả các cụm kí tự ‘anh’ bằng cụm kí tự ’em’ Tư duy của học sinh: Duyệt các kí tự của xâu, cho đến khi gặp kí tự ‘anh’ thì thay thế bằng kí tự ’em’

var s:string;

i:byte;  
begin
 write('Nhap vao xau s=');  
 readln(s);  
 for i:=1 to length(s) do  
     if (s[i]='a') and (s[i+1]='n')and(s[i+2]='h') then  
     begin  
     s[i]:='e';  
     s[i+1]:='m';  
     end;  
 write('Xau tiep theo la',s);  
     readln;  
end. Phân tích sai lầm của học sinh: Cách này không đúng vì kí tự ‘h’ đã không bị loại bỏ, do vậy mặc dù từ ‘anh’ đã được thay thế thành từ ’em’ nhưng chữ h đã không bị xóa đi trong xâu. Mà theo yêu cầu của đề bài là phải xóa cả chữ ‘anh’ đi. Tuy nhiên đây là tư duy của học sinh khi mới học về xâu, đó là tư duy hết sức bình thường, hay có thể dành lời khen tặng cho những học sinh nào có thể nghĩ ra cách này. Cách làm đúng Giáo viên thuyết trình: Trước hết cần tìm vị trí đầu tiên của cụm kí tự ‘anh’ trong xâu s, nếu không có thì vị trí sẽ trả về là 0. Nếu vị trí đó khác 0 thì ta tiến hành xóa xấu ‘anh’ đi, thay thế bằng xâu ’em’, rồi tiếp tục tìm xem có còn cụm kí tự nào trong xâu s không. Quá trình này được lặp đi lặp lại cho đến khi vị trí của cụm kí tự ‘anh’ trong xâu s bằng 0. Khi đó ta đưa ra xâu s sau khi đã được thay thế hết !!

program bai3; uses crt; var s:string;

i,vitri:byte;  
begin
 write('Nhap vao xau s=');  
 readln(s);  
 vitri:=pos('anh',s);  
 while vitri<>0 do  
       begin  
       delete(s,vitri,3);  
       insert('em',s,vitri);  
       vitri:=pos('anh',s);  
       end;  
 write('Xau da sua la',s);  
 readln;  
end. Tuy nhiên, học sinh lại đặt câu tiếp câu hỏi ngược lại: “Vậy liệu em có thể thêm s[i+2]=” là một kí tự rỗng vào cách của em được không? Câu hỏi này quả thực rất là thông minh. Nhưng khi lập trình Pascal lại không chấp nhận một kí tự là rỗng. Do vậy cách này không được chấp nhận: