SKKN Sử dụng một số khái niệm về chương trình con và các ví dụ để củng cố các kiến thức về kiểu dữ liệu xâu

SKKN Sử dụng một số khái niệm về chương trình con và các ví dụ để củng cố các kiến thức về kiểu dữ liệu xâu

 Sự phát triển như vũ bão của khoa học công nghệ - kỹ thuật hiện đại đã đặt giáo dục vào thử thách mới, đó là nhằm đào tạo ra thế hệ tương lai vừa có phẩm chất, vừa phải có năng lực tiếp cận khoa học hiện đại để hội nhập với xu thế chung của xã hội. Hiện nay trong các trường phổ thông đã chú trọng tới vấn đề này.

 Nếu như trước đây môn Tin học chủ yếu chỉ truyền đạt cho các em kiến thức lý thuyết, hàn lâm thì nay đã chú trọng tới thực hành và giải các bài tập, giúp các em làm quen với lập trình trên máy tính, do đó các trường phổ thông đã được trang bị cơ sở vật chất phục vụ dạy và học: phòng máy, phòng nghe nhìn đã được chuẩn hóa, học sinh ý thức được môn học nên tập trung hơn,.Tuy nhiên, nhưng thay đổi đó chưa thực sự mang lại hiệu quả cao trong việc tiếp thu và nhận thức bài học của học sinh và phần lớn học sinh chưa có điều kiện để tiếp cận với nhiều tài liệu, cũng như thời gian để làm việc với máy tính đang còn ít. Môn Tin học đối với học sinh là môn khó, đặc biệt là chương trình lớp 11 vì kiến thức lập trình đa số với nhiều học sinh là khó tiếp cận.

 

doc 16 trang thuychi01 4740
Bạn đang xem tài liệu "SKKN Sử dụng một số khái niệm về chương trình con và các ví dụ để củng cố các kiến thức về kiểu dữ liệu xâu", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ 
TRƯỜNG THPT NGA SƠN
SÁNG KIẾN KINH NGHIỆM
SỬ DỤNG MỘT SỐ KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON VÀ CÁC VÍ DỤ ĐỂ CỦNG CỐ CÁC KIẾN THỨC 
VỀ KIỂU DỮ LIỆU XÂU
Người thực hiện: Nguyễn Văn Hải
Chức vụ: Giáo viên
SKKN thuộc lĩnh vực môn: Tin Học
THANH HOÁ NĂM 2017
MỤC LỤC
NỘI DUNG
TRANG
I. Mở đầu.............................................................................................
1
 1.1 Lí do chọn đề tài......................................................................
1
 1.2 Mục đích nghiên cứu...............................................................
1
 1.3 Đối tượng nghiên cứu.............................................................
2
 1.4 Phương pháp nghiên cứu........................................................
2
II. Nội dung của sáng kiến kinh nghiệm..........................................
2
 2.1 Cơ sở lý luận của sáng kiến kinh nghiệm.................................
2
 a. Hàm (Function)....................................................................
2
 b. Thủ tục (Procedure).............................................................
3
 c. Tham số hình thức................................................................
3
 d. Tham số thực sự..................................................................
3
 e. Tham biến ...........................................................................
3
 g. Tham trị.................................................................................
3
 2.2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm....
3
 2.3 Các giải pháp giải quyết vấn đề................................................
4
 a. Thủ tục Delete(Var St:String; vt, n: Byte) ......................... 
4
 b. Thủ tục Insert(S1: String; Var S2: string; Vt : byte).............. 
5
 c. Hàm Copy(S: string; vt, N:byte) ..........................................
6
 d. Hàm length(s:string) ............................................................
7
 e. Hàm upcase(ch :char) ...........................................................
9
 g. Hàm Pos(s1,s2:string) .......................................................... 
9
 2.4 Kết quả thu được........................................................................
11
III.Kết luận, kiến nghị.........................................................................
11
 3.1 Kết luận.....................................................................................
11
 3.2 Kiến nghị...................................................................................
12
I.MỞ ĐẦU
1.1. Lí do chọn đề tài.
 Sự phát triển như vũ bão của khoa học công nghệ - kỹ thuật hiện đại đã đặt giáo dục vào thử thách mới, đó là nhằm đào tạo ra thế hệ tương lai vừa có phẩm chất, vừa phải có năng lực tiếp cận khoa học hiện đại để hội nhập với xu thế chung của xã hội. Hiện nay trong các trường phổ thông đã chú trọng tới vấn đề này.
 Nếu như trước đây môn Tin học chủ yếu chỉ truyền đạt cho các em kiến thức lý thuyết, hàn lâm thì nay đã chú trọng tới thực hành và giải các bài tập, giúp các em làm quen với lập trình trên máy tính, do đó các trường phổ thông đã được trang bị cơ sở vật chất phục vụ dạy và học: phòng máy, phòng nghe nhìn đã được chuẩn hóa, học sinh ý thức được môn học nên tập trung hơn,...Tuy nhiên, nhưng thay đổi đó chưa thực sự mang lại hiệu quả cao trong việc tiếp thu và nhận thức bài học của học sinh và phần lớn học sinh chưa có điều kiện để tiếp cận với nhiều tài liệu, cũng như thời gian để làm việc với máy tính đang còn ít. Môn Tin học đối với học sinh là môn khó, đặc biệt là chương trình lớp 11 vì kiến thức lập trình đa số với nhiều học sinh là khó tiếp cận.
 Trong quá trình giảng dạy chương trình lớp 11 học sinh gặp rất nhiều khó khăn trong việc giải quyết các bài tập từ việc soạn thảo chương trình cho đến việc cho chương trình chạy được.Việc dạy học nội dung kiểu xâu, chương trình con là những khái niệm trừu tượng đối với học sinh, học sinh thường gặp khó khăn trong việc tiếp thu các kiến thức về lập trình. Do đó để phần nào giải thích cách sử dụng hàm và thủ tục trong xâu, tôi chọn sáng kiến kinh nghiệm : “Sử dụng một số khái niệm về chương trình con và các ví dụ để củng cố kiến thức về kiểu dữ liệu xâu”. Giúp học sinh nắm được các thủ tục và hàm để giải quyết một số bài toán đơn giản trong phần lập trình tin học 11. 
 	1.2. Mục đích nghiên cứu.
 Đưa ra cấu trúc cụ thể các hàm và thủ tục của xâu, giải thích việc sử dụng các hàm của xâu. Nâng cao kỹ năng sử dụng các hàm và thủ tục của xâu trong một số trường hợp cụ thể.
1.3. Đối tượng nghiên cứu.
- Nghiên cứu cấu trúc của thủ tục và hàm của xâu, một số ví dụ sử dụng hàm và thủ tục.
- Thực trạng học và làm bài tập môn Tin học của học sinh khối 11 tại trường THPT Nga Sơn.
1.4. Phương pháp nghiên cứu.
- Phương pháp nghiên cứu lý thuyết.
- Phương pháp nghiên cứu thực tiễn.
- Phương pháp thực nghiệm sư phạm.
- Phương pháp thống kê toán học.
II. NỘI DUNG SÁNG KIẾN KINH NGHIỆM
Khi học sinh học bài học Bài 12 “Kiểu xâu”, học sinh đã có rất nhiều khó khăn, nhầm lẫn trong việc xử lý dữ liệu vì các em đang quen với các bài toán xử lý dữ liệu kiểu số, các bài toán quen thuộc như tính tổng hoặc tích của 1 dãy số thoả mãn điều kiện nào đó.... Cách sử dụng các hàm và thủ tục của xâu, khi nào sử dụng hàm, khi nào sử dụng thủ tục sẽ được trình bày cụ thể qua các phần tiếp theo của sáng kiến kinh nghiệm này.
2.1 .Cơ sở lí luận
 Việc sử dụng các khái niệm về chương trình con để giải thích cho các thủ tục, hàm của xâu được thể hiện qua các khái niệm về chương trình con như sau:
 a. Hàm (Function) : Là chương trình con thực hiện một số thao tác nào đó và trả về một giá trị qua tên của nó[1].
 Ví dụ : Hàm sqrt(x), sqr(x), abs(x)....
 Trong mục 2.1 Khái niệm về hàm được tham khảo từ tài liệu tham khảo số 1 
 b. Thủ tục (Procedure) : Là chương trình con thực hiện các thao tác nhất định nhưng không trả về giá trị nào qua tên của nó[1].
 Ví dụ: Thủ tục Writeln, Readln, Delete.... 
 c. Tham số hình thức: 
 Các biến được khai báo cho dữ liệu vào/ra của chương trình con được gọi là tham số hình thức[1]
 d. Tham số thực sự :
 Trong lời gọi chương trình con, các biến và hằng thay thế tương ứng bởi tham số hình thức được gọi là tham số thực sự [1].
 e. Tham biến:
 Trong lời gọi chương trình con các tham số hình thức được thay thế tương ứng là tên các biến chứa dữ liệu ra được gọi là tham biến [1].
g. Tham trị:
 Trong lời gọi chương trình con các tham số hình thức được thay thế tương ứng là các giá trị cụ thể được gọi là tham trị [1].
 Để phân biệt giữa tham trị và tham biến, ngôn ngữ lập trình pascal sử dụng từ khóa var để khai báo những tham số biến.
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm
 Mặc dù hiện nay công tác dạy và học môn Tin học tại các trường phổ thông đã được quan tâm, cơ sở vật chất được trang bị nhưng chất lượng học sinh vẫn chưa thực sự được nâng cao.
 Tại trường THPT Nga Sơn, phần lớn học sinh có ý thức học tập và hứng thú với môn Tin học. Trong những năm trở lại đây, ý thức được yêu cầu của xã hội, cũng như là điều kiện cơ sở vật chất được nâng lên nên các em học sinh càng dành nhiều thới gian cho môn học, từ đó mà chất lượng học sinh được nâng lên, đặc biệt ở lớp 
 Trong mục 2.1 Khái niệm về thủ tục, tham số hình thức, tham số thực sự, tham biến, tham trị được tham khảo từ tài liệu tham khảo số 1 
10 và lớp 12. Tuy nhiên, có một thực tế mà tôi và các đồng nghiệp trong tổ còn nhiều băn khoăn, trăn trở đó là chất lượng học sinh ở khối lớp 11 chưa cao, đặc biệt là các bài kiểm tra hay các bài tập khi được đề cập đến các em rất lúng túng, tỉ lệ giải quyết được các bài tập ở trong một lớp chỉ tính trên đầu ngón tay. 
 Một trong những bài tập các em gặp khó khăn là các bài tập kiểu xâu, đặc biệt là ở khâu thao tác khai báo biến, vì mục này chỉ cần sai một dấu chấm, hay dấu phẩy là đã không chạy được chương trình. Việc sử dụng các thủ tục và hàm cũng là vấn đề khó khăn với học sinh, các em không biết khi nào thì dùng thủ tục gì, khi nào thì dùng hàm gì. Từ những khó khăn đó, học sinh rất ngại làm các bài tập về kiểu xâu rói riêng và các bài tập ở chương trình tin học 11 nói chung. Từ chỗ không biết làm, ngại làm mà các em dần mất hứng thú dẫn đến sợ phải làm các bài tập và kết quả không cao.
2.3. Các giải pháp để giải quyết vấn đề
a. Thủ tục Delete(Var St:String; vt, n: Byte) thực hiện xóa n kí tự của biến xâu st bắt đầu từ vị trí vt [2]. 
Giá trị xâu St
Thực hiện thủ tục
Kết quả xâu St
'abcd'
Delete(St,2,2)
'ad'
Đúng như tên gọi thủ tục này thực hiện công việc là xóa xâu, không trả về giá trị nào qua tên của thủ tục. Khi thực hiện thủ tục nhiều học sinh viết Delete('abcd',2,2) ='ad' khi đó giáo viên sẽ giải thích cho học sinh là trường hợp này em viết như thế không đúng. Việc giải thích như thế đối với nhiều học sinh khá giỏi là chung chung, nhiều học sinh sẽ không phục. Bản chất của thủ tục xóa xâu có cấu trúc như sau Delete(Var St:String; vt, n: Byte).Khi học xong về phần chương trình con học sinh sẽ nhận ra xâu St ở đây được khai báo là tham biến, Vt và n là tham trị. Để hiểu rõ hơn về thủ tục delete ta cùng tìm hiểu qua ví dụ sau :
 Cấu trúc thủ tục Delete(Var St:String; vt, n: Byte) được tham khảo từ TLTK số 2 
Ví dụ 14:
 Lập trình nhập vào một xâu st. Yêu cầu xóa các dấu cách ở vị trí đầu xâu và cuối xâu. 
Program xoa_xau;
 Var s: string;
 Procedure xoa_xau_cach(Var st:string);
 Begin
 // Xoa dau cach dau xau 
 While St[1]= #32 Do delete(st,1,1);
 // Xoa dau cach cuoi xau
 While St[Length(st)]= #32 Do delete(st,length(st),1);
 Xoa_dau_cach:=st;
 End;
BEGIN
 Write('Nhap xau S:'); Readln(S);
 xoa_xau_cach(s);
 Writeln(s);
 Readln;
END.
b. Thủ tục Insert(S1: String; Var S2: string; Vt : byte) chèn xâu s1 vào xâu s2 bắt đầu từ vị trí vt[2]. 
Từ cấu trúc của thủ tục học sinh nhận thấy s1 và vt được khai báo là tham trị và s2 được khai báo là tham biến. Học sinh sẽ không được viết như sau Insert('add','he',2)='hadde' mà phải lấy giá trị từ xâu s2. Để hiểu rõ hơn về thủ tục chèn xâu là xem xét một số trường hợp sau :
 Cấu trúc Thủ tục Insert(S1: String; Var S2: string; Vt : byte) được tham khảo từ TLTK số 2 
 Ví dụ 1 được tham khảo từ TLTK số 4
Trường hợp 1: Chèn vào vị trí nhỏ hơn hoặc độ dài xâu s2
Giá trị xâu S1
Giá trị xâu S2
Thao tác
Kết quả xâu s2
'abcd'
'gha'
Insert(s1,s2,2)
'gabcdha'
Trường hợp 2: Chèn vào vị trí lớn hơn độ dài xâu s2
Giá trị xâu S1
Giá trị xâu S2
Thao tác
Kết quả xâu s2
'abcd'
'gha'
Insert(s1,s2,4)
'ghaabcd'
Trường hợp 3: Chèn vào xâu rỗng
Giá trị xâu S1
Giá trị xâu S2
Thao tác
Kết quả xâu s2
'abcd'
''
Insert(s1,s2,0)
'abcd'
c. Hàm Copy(S: string; vt, N:byte) tạo xâu gồm N kí tự liên tiếp bắt đầu từ vị trí vt của xâu s. 
Giá trị xâu S
Biểu thức
Kết quả 
'abcd'
Copy(s,2,2)
'ab'
Từ cấu trúc trên ta nhận thấy s,vt,n được khai báo là các tham trị. Do đó khi sử dụng hàm học sinh thay thế các tham số hình thức bằng các giá trị tương ứng. Hàm copy tham gia vào tính toán trong các biểu thức. Để hiểu rõ hơn ta xem xét ví dụ sau :
Ví dụ 14: Viết chương trình liệt kê các từ của một xâu ký tự được nhập vào từ bàn phím, mỗi từ phải được viết trên một dòng.
 Program liet_ke_tu;
Uses Crt;
 Cấu trúc Hàm Copy(S: string; vt, N:byte) được tham khảo từ TLTK số 2 
 Ví dụ 1 được tham khảo từ TLTK số 4
Var  St:String;
Procedure  XoaTrangThua(Var St:String);
Begin
    {Xóa các ký tự trắng ở đầu xâu}
    While St[1]=#32 Do Delete(St,1,1);
    {Xóa các ký tự trắng ở cuối xâu}
    While St[Length(St)]=#32 Do Delete(St,Length(St),1);
    {Xóa các ký tự trắng ở giữa xâu}
    While POS(#32#32,St)0 Do Delete(St,POS(#32#32,St),1);
End;
Begin
    Write('Nhap xau St:'); Readln(St);
    XoaTrangThua(St);
    St:=St+#32;
    Writeln('Liet ke cac tu trong xau: ');
    While POS(#32,St)0 Do
        Begin
           Writeln(Copy(St,1,POS(#32,St)));
           Delete(St,1,POS(#32,St));
        End;
    Readln;
End.
d. Hàm length(s:string) cho giá trị là độ dài xâu s [2].
Giá trị xâu S
Biểu thức
Kết quả 
'abcd'
Length(s)
4
Cấu trúc Hàm length(s:string) được tham khảo từ TLTK số 2 
Hàm trả về một giá trị là độ dài xâu s, nếu xâu s rỗng thì giá trị là 0.
Ví dụ 1[3]: 
Lập trình nhập vào hai xâu s1 và s2. Thông báo ra màn hình kí tự đầu tiên của xâu s1 có trùng với kí tự cuối cùng của xâu s2 hay không?
Program kiem_tra_trung;
Var st1,st2:string;
 Function ktt(s1,s2:string):boolean;
 Begin
 IF s1[1]= s2[length(s2)] then ktt:=true else ktt:=false;
 End;
 BEGIN
     Write('Nhap xau St1:'); Readln(St1);
     Write('Nhap xau St2:'); Readln(St2);
 IF ktt(st1,st2)=true then writeln('Trung nhau') else 
then writeln('Khac nhau') ;
Readln;
END.
Ví dụ 23: Lập trình nhập vào xâu s. Kiểm tra xâu có phải là xâu đối xứng hay không?
Program kiem_tra_doi_xung;
Var st:string; 
 Function dxx(s:string):boolean;
 Begin
 Dxx:=true; 
 Ví dụ 1 được tham khảo từ TLTK số 3, Ví dụ 2 được tham khảo từ TLTK số 3
 For i:=1 to length(s) div 2 Do 
 If s[i] s[ length(s)-i+1] then exit(false);
 End;
BEGIN
     Write('Nhap xau St:'); Readln(St);
 IF dxx(st)=true then writeln('Xau doi xung') else 
then writeln('Xau khong doi xung') ;
Readln;
END.
e. Hàm upcase(ch :char) cho chữ cái in hoa ứng với ch
Giá trị xâu ch
Biểu thức
Kết quả 
'a'
Upcase(ch)
'A'
'ab'
Upcase(ch)
Không có giá trị đối với chương trình dịch Turbo Pascal. Đối với Free Pascal chương trình có kết quả là 'AB'
Để hiểu rõ hơn về hàm upcase ta xem xét ví dụ sau đây:
Ví dụ 14: Lập trình nhập vào một xâu gồm các chữ cái in hoa. Chuyển xâu vừa nhập sang in thường.
Program doi_in_thuong;
Uses Crt;
Var  St:String;
        i:Byte;
Begin
    Write('Nhap xau St: '); Readln(St);
  Cấu trúc Hàm upcase(ch :char) được tham khảo từ TLTK số 2 , Ví dụ 1 được tham khảo từ TLTK số 4
 For i:=1 to length(St) do
         If St[i] IN ['A'..'Z'] Then St[i]:=CHR(ORD(St[i])+32);
 Write('Xau ket qua: ', St);
Readln;
End.
g. Hàm Pos(s1,s2:string) trả về vị trí đầu tiên của xâu s1 trong xâu s2 [2]
Giá trị xâu s1
Giá trị xâu s2
Biểu thức
Kết quả
'a'
'haa'
Pos(s1,s2)
2
'ab'
'cdde'
Pos(s1,s2)
0
Sử dụng khái niệm về chương trình con ta nhận thấy s1 và s2 là được khai báo là tham trị của hàm Pos. Hàm Pos được sử dụng nhiều trong các bài toán về xâu do đó để hiểu thêm về hàm Pos ta xét một số ví dụ sau đây:
 Ví dụ 13: 
 Lập trình nhập vào một xâu đưa ra màn hình xâu thu được khi loại bỏ hết dấu cách trong xâu.
Program xoa_cach_xau;
 Var st: string;
BEGIN
 Write('Nhap xau St:'); Readln(St);
 While Pos(#32,St) 0 Do delete(st,Pos(#32,st),1);
 Writeln(st);
 Readln; 
END.
Ví dụ 23:
Lập trình nhập vào một xâu. Đếm số từ trong xâu
Ví dụ 1, ví dụ 2 được tham khảo từ TLTK số 3; Cấu trúc Hàm Pos(s1,s2:string) được tham khảo từ TLTK số 2 
Program dem_so_tu_trong_xau;
 Var s:string;
 Function dem_tu(st:string):integer;
 Var i,d:integer; 
    Begin
 {Xóa các ký tự trắng ở đầu xâu}
    While St[1]=#32 Do Delete(St,1,1);
    {Xóa các ký tự trắng ở cuối xâu}
    While St[Length(St)]=#32 Do Delete(St,Length(St),1);
     {Xóa các ký tự trắng ở giữa xâu}
    While POS(#32#32,St)0 Do Delete(St,POS(#32#32,St),1);
 d:=0; st:=st + #32;
 For i:=1 to length(st) -1 Do 
 If ( St[i] #32) and ( st[i+1]= #32) then d:=d+1;
 Dem_tu:=d;
BEGIN
 Write('Nhap xau S:'); Readln(S);
 Writeln(dem_tu(s));
 Readln; 
END.
2.4. Kết quả thu được.
 Trong quá trình trao đổi, thảo luận, trình bày học sinh được thể hiện khả năng vận dụng, hiểu biết của mình nên các em tỏ ra hăng hái trong việc giơ tay phát biểu tranh luận. Đồng thời tiết học trở nên sinh động hơn và giáo viên không đóng vai trò là người xây dựng lý luận mà học sinh là người chủ động để giải quyết các vấn đề. 
 Tiến hành trong giảng dạy ở các lớp, tôi nhận thấy sau khi được hướng dẫn học sinh đã biết làm bài tập. Từ đó, kết quả kiểm tra, đánh giá đã có sự thay đổi theo hướng tích cực, kết quả cụ thể ở lớp áp dụng dạy và lớp đối chứng như sau:
Tỉ lệ (%)\Lớp
11A
(lớp dạy)
11E
(lớp đối chứng)
11C
(lớp dạy)
11D
(lớp đối chứng)
Giỏi
25
14
15
8
Khá
45
40
42
36
Trung bình
30
33
35
33
Yếu
0
13
8
20
Kém
0
0
0
3
III. KẾT LUẬN, KIẾN NGHỊ
3.1. Kết luận
Sau khi vận dụng vào để củng cố, hướng dẫn học sinh thực hiện, tôi nhận thấy:
- Học sinh tiếp thu bài tốt hơn, các em đã làm được bài tập, chạy được chương trình do đó tạo hứng thú trong học tập.
- Kết quả kiểm tra, đánh giá được nâng lên. Ở các lớp được hướng dẫn thực hiện, tỉ lệ đạt khá giỏi tăng lên, không còn học sinh yếu kém hoặc tỉ lệ này còn rất thấp.
- Khi vận dụng vào hướng dẫn cho học sinh đòi hỏi bản thân phải tiếp cận nhiều tài liệu để có nguồn tri thức phong phú, là điều kiện để tôi nâng cao tính tự học, nâng cao kiến thức.
3.2. Kiến nghị
- Đối với đồng nghiệp, cần tăng cường hướng dẫn học sinh làm nhiều bài tập để việc kiểm tra đánh giá học sinh bằng việc sử dụng bài tập, ngôn ngữ lập trình được đồng bộ.
- Đối với nhà trường, quan tâm; xây dựng cơ sở vật chất đạt chuẩn để việc giảng dạy tin học, đặc biệt là các giờ thực hành được thuận lợi.
- Đối với Sở Giáo dục, cần mở thêm các lớp tập huấn, tài liệu để nâng cao phương pháp giảng dạy của giaó viên.
XÁC NHẬN CỦA THỦ TRƯỞNG ĐƠN VỊ
Thanh Hóa, ngày 25 tháng 5 năm 2017
Tôi xin cam đoan đây là SKKN của mình viết, không sao chép nội dung của người khác.
Nguyễn Văn Hải
TÀI LIỆU THAM KHẢO
[1]. Sách giáo khoa tin học 11	 Hồ Sĩ Đàm chủ biên 
[2]. Turbo Pascal cẩm nang tra cứu	 Quách Tuấn Ngọc chủ biên 
[3]. Sách bài tập tin học 11	 Hồ Sĩ Đàm chủ biên 
[4]. Một số bài tập tham khảo trên Internet.

Tài liệu đính kèm:

  • docskkn_su_dung_mot_so_khai_niem_ve_chuong_trinh_con_va_cac_vi.doc