Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.2 MB, 236 trang )
Giáo trình Tin học Đại cơng
KS.Đặng Quang Thanh
Ví dụ: Để lu trữ điểm của 50 học sinh trong một lớp học ta dùng mảng nh sau
TYPE
Hoc_sinh:array [1..60] of real;
Var
Diem:hoc_sinh;
Hoặc:
Var
Diem: array[1..60] of real;
3. Truy nhập một phần tử của mảng
Đợc thực hiện thông qua tên mảng và chỉ số của mảng
Giả sử để nhập điểm cho học sinh thứ i ta dùng lệnh Readln(diem[i]);
Muốn in điểm của học sinh thứ i ra màn hình ta dùng lệnh
writeln(diem[i]);
Write(diem[i]) hoặc
Chú ý: Nếu chỉ có một miền chỉ số của mảng thì mảng đó đợc gọi là mảng 1 chiều
Nếu có hai miền chỉ số của mảng thì mảng đó đợc gọi là mảng 2 chiều (ma trận là một
mảng hai chiều)
Nếu nhiều miền chỉ số của mảng thì mảng đó đợc gọi là mảng nhiều chiều
Giả sử ta có một ma trận biểu diễn bằng mảng:
Ma trận:
3 4 5 6
5
4 7 2
1 3 2 7
Khai báo:
TYPE
Mang:array[1..3,1..4] of integer;
Var
A:mang;
Hoặc
Var
A:array[1..3,1..4] of integer;
để truy nhập tới phần tử ở hàng 2 cột 3 thì ta viết nh sau: a[2,3]
Một số ví dụ về mảng
Ví dụ về mảng một chiều
Ví dụ 1: Nhập vào một mảng các số nguyên. In ra màn hình tất cả các số lớn nhất trong dãy.
Program VD1;
Uses CRT;
Var
a:array[1..100] of Integer;
80
Giáo trình Tin học Đại cơng
KS.Đặng Quang Thanh
i, max, n:Integer;
BEGIN
Write( Nap vao so phan tu cua mang n=);readln(n);
For i:=1 to n do
Begin
Write( Nhap vao phan tu thu a[,i,]=);
readln(a[i]);
end;
max:=a[1];
For i:=2 to n do
If max
For i:=1 to n do
If max=a[i] then Writeln( so lon nhat,max,nam o vi tri,i);
Readln;
END.
Ví dụ 2: Nhập vào một mảng các số nguyên. Sắp xếp mảng theo thứ tự tăng dần.
Program VD2;
Uses CRT;
Var
a:array[1..100] of Integer;
i, j, n,tg:Integer;
BEGIN
Write( Nap vao so phan tu cua mang n=);readln(n);
For i:=1 to n do
Begin
Write( Nhap vao phan tu thu a[,i,]=);
readln(a[i]);
end;
For i:=1 to n-1 do
For j:=i+1 to n do
if a[i]>a[j] then
Begin
tg:=a[i];
81
Giáo trình Tin học Đại cơng
KS.Đặng Quang Thanh
a[i]:=a[j];
a[j]:=tg;
end;
For i:=1 to n do
Write(a[i]:6);
Readln;
END.
Ví dụ 3: Nhập vào một mảng các số nguyên. In ra màn hình phần tử âm đầu tiên.
Program VD3;
Uses CRT;
Var
a:array[1..100] of Integer;
i, n:Integer;
BEGIN
Write( Nap vao so phan tu cua mang n=);readln(n);
For i:=1 to n do
Begin
Write( Nhap vao phan tu thu a[,i,]=);
readln(a[i]);
end;
For i:=1 to n do
If a[i]<0 then
Begin
Writeln(Phan tu am dau tien la:,a[i]);
break;
End;
Readln;
End.
Ví dụ 4: Nhập vào một mảng các số nguyên. In ra màn hình phần tử dơng cuối cùng.
Program VD4;
Uses CRT;
Var
a:array[1..100] of Integer;
82
Giáo trình Tin học Đại cơng
KS.Đặng Quang Thanh
i, n:Integer;
BEGIN
Write( Nap vao so phan tu cua mang n=);readln(n);
For i:=1 to n do
Begin
Write( Nhap vao phan tu thu a[,i,]=);
readln(a[i]);
end;
For i:=n downto 1 do
If a[i]>0 then
Begin
Writeln(phan tu duong cuoi cung la:,a[i]);
Break;
end;
Readln;
End.
Ví dụ 5: Nhập vào một mảng các số nguyên. Xoá phần tử thứ k của mảng.
Program VD5;
Uses CRT;
Var
a:array[1..100] of Integer;
i,k, n:Integer;
BEGIN
Write( Nap vao so phan tu cua mang n=);readln(n);
For i:=1 to n do
Begin
Write( Nhap vao phan tu thu a[,i,]=);
readln(a[i]);
end;
Repeat
Write(Nhap vao vi tri can loai bo k=);
readln(k);
Until (k>=1) and (k<=n);
For i:=k to n-1 do
83
Giáo trình Tin học Đại cơng
KS.Đặng Quang Thanh
a[i]:=a[i+1];
For i:=1 to n-1 do
Begin
Writeln(Day sau khi laoi bo phan tu thu, k, la:);
Write(a[i]:6);
End;
readln;
END.
Ví dụ 6: Nhập vào một mảng các số nguyên. Nhập vào một số nguyên, hãy chèn số nguyên đó vào
vị trí thứ k của mảng.
Program VD5;
Uses CRT;
Var
a:array[1..100] of Integer;
i,k, n:Integer;
BEGIN
Write( Nap vao so phan tu cua mang n=);readln(n);
For i:=1 to n do
Begin
Write( Nhap vao phan tu thu a[,i,]=);
readln(a[i]);
end;
Repeat
Write(Nhap vao vi tri can loai bo k=);
readln(k);
Until (k>=1) and (k<=n);
Write( Nhap vao so b=); readln(b);
For i:=n+1 downto k+1 do
a[i]:=a[i-1];
a[k]:=b;
For i:=1 to n+1 do
Begin
Writeln(Day sau khi chen them so,b, vao vij tri thu, k, la:);
Write(a[i]:6);
End;
readln;
END.
84
Giáo trình Tin học Đại cơng
KS.Đặng Quang Thanh
Bài tập về mảng
Bài 1: Viết chơng trình nhập một mảng các số nguyên. Tìm các giá trị nhỏ nhất, lớn nhất cùng vị trí
của chúng
Bài 2: Nhập vào một dãy số gồm n số thực. In ra màn hình những phần tử sai khác với trung bình
cộng của dãy không quá 1.
Bài 3: Viết chơng trình chèn thêm một số vào vị trí thứ n của một mảng các số nguyên.
Bài 4: Viết chơng trình xóa phần tử thứ n trong một mảng các số nguyên.
Bài 5: Viết chơng trình xếp thứ tự từ nhỏ tới lớn các phần tử của một mảng các số nguyên, sử dụng
thuật giải lựa chọn.
Bài 6: Viết chơng trình xếp thứ tự từ nhỏ tới lớn các phần tử của một mảng các số nguyên, sử dụng
thuật giải Chèn.
Bài 7: Viết chơng trình xếp thứ tự từ nhỏ tới lớn các phần tử của một mảng các số nguyên, sử dụng
thuật giải nổi bọt
Bài 8: Nhập danh sách gồm họ đệm và tên. Sắp xếp lại theo thứ tự abc của tên rồi in ra màn hình.
Bài 9: Nhập một mảng các số nguyên. Sau đó nhập vào một số và tìm xem số ấy có trong mảng hay
không sử dụng thuật giải tìm kiếm tuyến tính.
Bài 10: Nhập một mảng các số nguyên. Sau đó nhập vào một số và tìm xem số ấy có trong mảng
hay không sử dụng thuật giải tìm kiếm nhị phân.
Bài 11: Viết chơng trình nhập vào một dãy số nguyên, loạI bỏ những giá trị trùng nhau (Chỉ giữ lại
một) mà vẫn giữ nguyên thứ tự và in ra màn hình.
Bài 12: Nhập một dãy số nguyên và lu trong một mảng. Không dùng mảng trung gian, hãy in ra dãy
con tăng nghiêm ngặt có tổng các phần tử lớn nhất.
Ví dụ: 1 3 2 8 10 12 7 29 6 3
in ra: 7 29
Bài 13: Viết chơng trình cho phép cộng 2 số nguyên có độ dài 300 chữ số.
Bài 14: Viết chơng trình cho nhân 2 số nguyên có độ dài 300 chữ số
Bài 15: Một công ty buôn bán xe hơi hiện có ba ngời bán và 4 loại xe. Lập trình nhập số xe bán đợc
của từng ngời theo từng loại xe, sau đó tính tổng số xe bán đợc theo từng loại.
Bài 16: Viết chơng trình nhập vào một ma trận vuông nxn. In ra những dòng có tổng giá trị các phần
tử không kể các phần tử trên đờng chéo nhỏ hơn hay bằng giá trị của phần tử trên đờng chéo.
Bài 17: Viết chơng trình nhập vào một mảng các số nguyên 4x6, sau đó nhập vào một số và tìm
xem số đó xuất hiện mấy lần trong mảng, tại vị trí nào? In mảng theo dạng ma trận để kiểm
tra kết quả.
Bài 18: Viết chơng trình nhập vào hai mảng các số nguyên A,B có kích thớc 3x4 . In mảng C=A+B
ra màn hình theo dạng ma trận biết Cịj= Aịj+ Bịj
Bài 19: Ma trận ckuyển vị AT của A nxn là ma trận trong đó AịjT =Aji .Viết chơng trình nhập vào
một ma trận vuông rồi in ra ma trận chuyển vị của nó.
Bài 20: viết chơng trình nhập vào một dãy n số a[1],a[2],..,a[n] và in ra màn hình các thông tin sau:
Tổng các phần tử của dãy.
Số lợng số hạng dơng và tổng của các số hạng dơng.
Số lợng số hạng âm và tổng của các số hạng âm.
Trung bình cộng của dãy.
Chỉ số của số hạng dơng đầu tiên của dãy.
Chỉ số của số hạng âm đầu tiên của dãy.
Chỉ số của số hạng âm cuối cùng của dãy.
Chỉ số của số hạng dơng cuối cùng của dãy.
Số hạng lớn nhất của dãy và chỉ số của nó.
Số hạng nhỏ nhất của dãy và chỉ số của nó.
Số hạng âm lớn nhất của dãy và chỉ số của nó.
Số hạng dơng nhỏ nhất của dãy và chỉ số của nó.
Số lợng số hạng dơng liên tiếp nhiều nhất .
Số lợng số hạng dơng liên tiếp có tổng lớn nhất.
Số lợng số hạng âm liên tiếp nhiều nhất .
Số lợng số hạng âm liên tiếp có tổng lớn nhất .
85
Giáo trình Tin học Đại cơng
KS.Đặng Quang Thanh
Số lợng các số hạng liên tiếp đan dấu nhiều nhất (dãy số hạng liên tiếp đợc gọi là đan dấu
nếu tích hai số liên tiếp âm).
Bài 21: Viết trong cùng một chơng trình thực hiện các yêu cầu sau :
a. Nhập vào từ bàn phím một dãy số nguyên A có 10 phần tử và một số nguyên n thỏa mãn
tính chất: Chữ số tận cùng của n bằng 6 và - 180 < n 1200
b. In ra màn hình số phần tử trong dãy A thỏa tính chất:có hai chữ số chia đúng cho n.
c. Tính tích của các phần tử A[i] thỏa tính chất :
- 10
Bài 22: Viết chơng trình đổi một số nguyên dơng từ hệ cơ số 10 sang hệ cơ số 2.
Bài 23: Viết chơng trình tính điểm trung bình, xếp loại cho các học sinh trong một lớp với hai môn
thi Văn, Toán và in các thông tin thống kê sau;
Số lợng các học sinh đợc xếp loại Giỏi, Khá, Trung bình, yếu. Tỷ lệ phần trăm tơng ứng.
Số lợng các học sinh dới điểm trung bình môn Văn, Toán. Tỷ lệ phần trăm tơng ứng.
Bài 24: Viết chơng trình nhập vào từ bàn phím một dãy số có 10 phần tử và một số X. Dò tìm xem
trong dãy có hai phần tử liên tiếp nào mà tổng của chúng bằng X kkông?
Bài 25: Viết chơng trình nhập vào từ bàn phím một dãy số nguyên. In ra màn hình tần xuất (số lần
xuất hiện) của các số trong dãy số đó.
Bài 26: Nhập một số nguyên dơng n <= 200 và dãy n số nguyên a[1],..,a[n]. Thông báo ra màn hình
các thông tin sau: có bao nhiêu số khác nhau từng đôi trong dãy, giá trị của mỗi số đó và mỗi
số đó bằng những số hạng nào của dãy
Ví dụ với dãy 1,2,3,5,3,2,1,5,2,2,5,5 ta phải thông báo ra màn hình các thông tin sau: có 4 số
hạng khác nhau, số 1 là a[1] a[7], số 2 là a[2] a[6] a[9] a[10], số 3 là a[3] a[5], số 5 là a[4]
a[8] a[11] a[12].
Bài 27: Nhập một số nguyên dơng n <= 200 và hai dãy n số nguyên a[1],.., a[n] và b[1],.., b[n].
Thông báo ra màn hình xem hai dãy đó có cùng các số hạng nh nhau và chỉ khác nhau về thứ
tự sắp xếp hay không?
Bài 28: Viết chơng trình tạo và in ra màn hình ma trận đơn vị cấp 10.
Bài 29: Viết chơng trình nhập vào từ bàn phím một ma trận vuông và in ra màn hình tổng các phần
tử trên đờng chéo chính, tổng các phần tử trên đờng chéo thứ hai.
Bài 30: Nhập mảng hai chiều A gồm m hàng n cột.
- Tìm giá trị lớn nhất và nhỏ nhất trên mỗi hàng, mỗi cột cùng với vị trí (dòng, cột) của các
giá trị này.
- Tìm phần tử có giá trị lớn nhất và nhỏ nhất của mảng A cùng với vị trí (dòng, cột) của hai
phần tử này.
- Trong mảng A có bao nhiêu phần tử bằng phần tử lớn nhất.
Bài 31: Cho n điểm khác nhau trên mặt phẳng vuông góc pi =(xi,yi) 1 <= i <= n. Nhập các tọa độ
pi từ bàn phím. Xét đờng gấp khúc lần lợt nối các điểm p1,p2,..,pn,p1.
Đờng gấp khúc này có tự cắt không, tức là có hay không các đỉnh pi và pj sao cho đoạn
[pi,pi+1] cắt đoạn [pj,pj+1] tại điểm không là đầu mút của đoạn .
- Nếu đờng gấp khúc không là tự cắt thì nó có phải là đa giác lồi n đỉnh hay không?
- Nếu không hãy tìm trong số n điểm trên các điểm lập thành đa giác lồi bọc tất cả n điểm .
86
Giáo trình Tin học Đại cơng
KS.Đặng Quang Thanh
chơng VI
chơng trình con
hàm và thủ tục
Trong quá trình viết chơng trình có những đoạn chơng trình thực hiện một công việc nào đó
đợc xuất hiện nhiều lần. Để tránh viết lại đoạn chơng trình này, ta chuyển đoạn chơng trình thành
một chơng trình con, mỗi lần cần thì gọi nó.
Chơng trình con thờng đợc viết nhằm thực hiện một công việc. Ngời sử dụng chơng trình con
chỉ cần biết tên chơng trình và truyền đầy đủ số liệu cho các tham số là chơng trình con có thể thực
hiện mà không cần biết thuật toán và các phép sử lý trong thân chơng trình con.
Khi lập trình, ngời lập trình thờng phân bổ bài toán ra nhiều công việc cụ thể, mỗi công việc
cụ thể đợc viết dới dạng một chơng trình con. Cách viết này giúp cho ngời lập trình nhìn chơng trình
một cách thoáng đạt, dễ quản lý và gỡ rối đồng thời tiết kiệm tối đa bộ nhớ.
Ví dụ: Để tính tổng hai số nguyên, ngời lập trình viết ra một chơng trình con với tên là TONG(a,b),
avà b là hai tham số đại diện cho hai số nguyên bất kỳ. Khi muôn stinh stổng hai số 6 và 7 ta chỉ
việc gọi chơng trình con nh sau: TONG(6,7) là ta sẽ có kết quả là 11.
Chơng trình con trong Pascal đợc chia làm hai loại:
+ Loại 1: Hàm
+ Loại 2: Thủ tục
1. Hàm
Cấu trúc của hàm có dạng:
FUNCTION Ten_ham(Tham số 1; Tham số 2,......): kiểu trả về;
Var
Khai báo các biến cục bộ sử dụng trong hàm;
Begin
các lệnh tính toán;
Ten_ham:=giá trị hàm nhận;
End;
Lời gọi hàm:
Ten_ham(danh sách các tham số thực sự)
Ví dụ: Lập trình tính tổng diện tích hai hình tam giác. Viết hàm tính diện tích hình tam giác.
Program tam_giac;
Var
a1,h1,a2,h2 ,tong: real;
Function dientich(a,h:real):real;
Begin
dientich:=a*h/2;
end;
BEGIN
Write( Nhap vao canh day cho tam giac 1 a1=);Readln(a1);
87
Giáo trình Tin học Đại cơng
KS.Đặng Quang Thanh
Write( Nhap vao duong cao cho tam giac 1 h1=);Readln(h1);
Write( Nhap vao canh day cho tam giac 2 a2=);Readln(a2);
Write( Nhap vao duong cao cho tam giac 2 h2=);Readln(h2);
tong:=dientich(a1,h1)+dientich(a2,h2);
Writeln(tong dien tich hai hinh la:,Tong:8:2);
Readln;
END.
2. Thủ tục
Cấu trúc của thủ tục có dạng:
PROCEDURE Ten_thu_tuc(Tham so 1:kiểu;Tham số 2: Kiểu;.........;Var Tham số k: kiểu;
Var tham số (k+1);....);
Var
Khai báo các biến cục bộ;
Begin
Các lệnh tính toán;
End;
Lời gọi thủ tục:
Ten_thu_tuc(Danh sách các tham số thực sự);
Ví dụ:Viết thủ tục đổi chỗ hai số. Sau đó dùng để viết chơng trình sắp xếp ba số a, b, c theo thứ tự
tăng dần.
Program
sapxep;
Var
a,b,c:integer;
{**********************************************}
Procedure
doicho(Var a:integer;var b:integer);
Var
tg:integer;
Begin
tg:=a;
a:=b;
b:=tg;
end;
{Chuong trinh chinh}
BEGIN
Write( Nhap vao a=);Readln(a);
88
Giáo trình Tin học Đại cơng
KS.Đặng Quang Thanh
Write( Nhap vao b=);Readln(b);
Write( Nhap vao c=);Readln(c);
if a>b then doicho(a,b);
if a>c then doicho(a,c);
if b>c then doicho(b,c);
Writeln(ket qua la:,a,b,c);
readln;
END.
3. Sự khác nhau giữa thủ tục và hàm
Sự khác nhau cơ bản giữa hàm và thủ tục: hàm cho một giá trị thông qua tên hàm và hàm có
thể tham gia vào các biểu thức tính toán, thủ tục không cho một giá trị nào cả. Trong thân hàm bao
giờ cũng có giá trị gán cho tên hàm.
Các tham số khác sau tên hàm và tên thủ tục gọi là các tham số hình thức (hay còn gọi là
đối). Trong thủ tục, các tham số hình thức có các loại: các tham số đợc khai báo sau chữ Var gọi là
tham số biến (tham biến), các tham số khai báo không có chữ Var gọi là tham số giá trị (tham trị).
Trong hàm chỉ có tham số giá trị(tham trị).
Tham số thực sự là các tham số dùng trong lời gọi hàm hay thủ tục. Danh sách các tham số
thực sự trong lời gọi phải tơng ứng với danh sách các tham số hình thức trong khai báo chơng trình
con và chúng phải tơng ứng về kiểu.
Trong thủ tục, các tham số giá trị thờng là các biến để chứa dữ liệu đa vào thủ tục; các tham
số biến là các biến mà kết quả tính toán của thủ tục sẽ chứa vào đó khi ra khỏi thủ tục, ta có thể
dùng chúng để tính toán tiếp.
4. Biến toàn cục biến cục bộ
Biến toàn cục là biến khai báo ở đầu chơng trình chính, tồn tại trong suốt thời gian làm việc
của chơng trình. Có thể sử dụng và làm thay đổi giá trị của biến toàn cục nhờ các câu lệnh trong chơng trình chính cũng nh trong tất cả các chơng trình con.
Biến cục bộ là biến đợc khai báo ở đầu một chơng trình con. Chúng đợc cấp phát bộ nhớ khi
chơng trình con đợc gọi tới và bị xoá khi máy ra khỏi chơng trình con. Biến cục bộ có giá trị trong
chơng trình con và tất cả các chơng trình con khác nằm trong chơng trình con này.
Nếu tên biến cục bộ của một chơng trình con trùng với một tên biến toàn cục thì máy cũng
không bị nhầm lẫn, máy sẽ dùng hai ô nhớ khác nhau để lu trữ hai biến, khi ra khỏi chơng trình con
biến cục bộ bị xoá.
Khi gặp một lời gọi tới chơng trình con, máy sẽ thực hiện các bớc sau:
Cấp phát bộ nhớ cho các đối, các biến cục bộ.
Truyền giá trị của các tham số thực sự cho các tham số giá trị tơng ứng, truyền địa
chỉ của các tham số thực sự ứng với tham số biến cho các tham số biến của thủ tục.
Thực hiện các lệnh trong chơng trình con, trong khi thực hiện chơng trình con, các
biến cục bộ và các tham số giá trị có thể bị biến đổi nhng không ảnh hởng tới các
biến bên ngoài. Trái lại mọi thay đổi của tham số biến trong chơng trình con sẽ kéo
theo sự thay đổi của tham số thực sự tơng ứng (vì có sự truyền theo địa chỉ). Do đó,
khi ra khỏi chơng trình con, các tham số thực sự ứng với tham số biến vẫn giữ đợc giá
trị mới nhất do chơng trình con tạo ra.
89
Giáo trình Tin học Đại cơng
KS.Đặng Quang Thanh
Thực hiện xong các lệnh của chơng trình con, máy giải phóng các đối và các biến cục
bộ, trở về nơi gọi chơng trình con.
Lấy kết quả thực hiện chơng trình con: nếu là hàm thì lấy kết quả ở tên hàm, nếu là thủ tục
thì lấy kết quả ở tham số thực sự ứng với tham số biến. Khi cần lấy duy nhất một giá trị từ chơng
trình con thì ta lập một Function, khi cần lấy từ hai giá trị trở lên từ chơng trình con hoặc không lấy
giá trị nào thì ta phải lập Procedure.
5. Một số ví dụ về hàm
Ví dụ 1: Viết hàm tính tổng các số chẵn từ a đến b (a, b nguyên)
Bớc 1: Phân tích thuật toán
- Nhập vào hai số a và b
- Khởi động biến t:=0
- Dùng một vòng lặp với biến điều khiển là i chạy từ a cho đến b, trong quá trình chạy kiểm
tra xem i chẵn (i mod 2=0) thì cộng i thêm vào tổng (t:=t+i).
- Kết thúc
Bớc 2: Sơ đồ thuật toán (bạn đọc tự viết)
Bớc 3: Văn bản chơng trình
Program tinhtong;
Var
a,b:integer;
{**************************************************}
Function tong(a,b:integer):integer;
Var
i,t:integer;
Begin
t:=0;
For i:=a to b do
If i mod 2=0 then
t:=t+i;
tong:=t;
BEGIN
Write(Nhap a=);Readln(a);
Write(Nhap b=);Readln(b);
Writeln(Tong cua cac so chan trong doan a va b la tong=,tong(a,b));
Readln;
END.
Ví dụ 2: Viết chơng trình dạng menu:
90