Bài 11. Kiểu mảng

Chia sẻ bởi Đoàn Đức Công | Ngày 10/05/2019 | 79

Chia sẻ tài liệu: Bài 11. Kiểu mảng thuộc Tin học 11

Nội dung tài liệu:

Đoàn Đức Công
Phù Lưu - HY-TQ
Kiểu mảng
Kiểu xâu
Kiểu bản ghi
Đoàn Đức Công
Phù Lưu - HY-TQ
Đoàn Đức Công
Phù Lưu - HY-TQ
Nhập vào nhiệt độ (trung bình) của mỗi ngày trong tuần. Tính và đưa ra màn hình nhiệt độ trung bình của tuần và số lượng ngày có nhiệt độ TB cao hơn nhiệt trung bình trong tuần?
* Dữ liệu nhập vào (INPUT): t1,t2,t3,t4,t5,t6,t7.
* Dữ cần tính và in ra (OUTPUT): tb, dem.
Hãy xác định Input, Output và viết chương trình giải bài toán trên ?
Bài toán đặt vấn đề:
Đoàn Đức Công
Phù Lưu - HY-TQ
Program vd1;
Uses crt;
Var
t1,t2,t3,t4,t5,t6,t7,tb : real;
dem : integer;
BEGIN
Clrscr;
write(` Nhap vao nhiet do 7 ngay : `);
readln(t1,t2,t3,t4,t5,t6,t7);
tb : = (t1+t2+t3+t4+t5+t6+t7)/7;
dem : = 0 ;
if (t1>tb) then dem := dem + 1;
if (t2>tb) then dem := dem + 1;
if (t3>tb) then dem := dem + 1;
if (t4>tb) then dem := dem + 1;
if (t5>tb) then dem := dem + 1;
if (t6>tb) then dem := dem + 1;
if (t7>tb) then dem : = dem + 1;
Writeln(` Nhiet do trung binh trong tuan = `,tb : 6 : 2);
Writeln(` so ngay co nhiet do cao hon nhiet do tb `, dem);
Readln;
END.
Đoàn Đức Công
Phù Lưu - HY-TQ
Quan sát chương trình, hãy cho biết nếu muốn tính nhiệt độ trung bình của N ngày trong năm (VD: N=365) thì sẽ gặp khó khăn gì ?
Khai báo quá lớn (t1,t2,t3,...,t365) và chương trình quá dài (với 365 lệnh IF) !!!!!

? Để khắc phục khó khăn đó ta sử dụng kiểu dữ liệu mảng một chiều.
Đoàn Đức Công
Phù Lưu - HY-TQ
a. KN: Mảng một chiều là một dãy hữu hạn các phần tử cùng kiểu
A
1 2 3 4 5 6 7
Trong đó :
Khi tham chiếu đến phần tử thứ i ta viết A[i].
Ví dụ: A[5] = 19.
? Tên mảng : A.
? Số phần tử của mảng: 7.
Ví dụ:
? Kiểu dữ liệu của các phần tử: Kiểu nguyên.
19
1. Ki?u m?ng m?t chi?u
Đoàn Đức Công
Phù Lưu - HY-TQ
b. Khai báo mảng một chiều trong PASCAL
* Cách 1: Khai báo gián tiếp
TYPE = array[..] of ;
Var : ;
Ví dụ: TYPE nhietdo = array[1..365] of integer;
Var A: nhietdo;
Trong đó : ? Chỉ số đầu, chỉ số cuối thường là các hằng hoặc biểu thức nguyên;
? Chỉ số đầu ? chỉ số cuối;
? Giữa 2 chỉ số là dấu ..
* Cách 2: Khai báo trực tiếp
Var : array[..] of ;
Var A,B : array[1..100] of real;
Ví dụ: Var nhietdo : array[1..365] of integer;
Đoàn Đức Công
Phù Lưu - HY-TQ
Đoàn Đức Công
Phù Lưu - HY-TQ
VD1: Tìm phần tử lớn nhất của dãy số nguyên
-Input: Số nguyên dương N ( N<=250) và dãy số A1, A2…AN
- Output: Chỉ số và giá trị của số lớn nhất trong dãy.
- Ý tưởng:
+ Đặt A1 là số lớn nhất (Max)
+ Cho i chạy từ 2 đến N, nếu A[i] > Max thì đổi chỗ cho A[i] và lưu lại vị trí i
c.Một vài ví dụ
Đoàn Đức Công
Phù Lưu - HY-TQ
VD1: Tìm Max
Program TimMax;
Uses crt;
Const Nmax=250;
Var A:array[1..250] of interger;
N, i, max, csmax: integer;
Begin
Clrscr;
Write(‘Nhap so luong phan tu cua day so, N=’);
Readln(N);
For i:=1 to N do
Begin
Write(‘phan tu thu ‘,i,’=’); {(‘A[‘,i,’]=’)}
Readln(A[i]);
End;
Đoàn Đức Công
Phù Lưu - HY-TQ
Max:=A[1]; csMax:=[1];
For i:=2 to N do
If A[i] > Max then
Begin
Max:=A[i]; csMax:=i;
End;
Write(‘gia tri lon nhat la:’,Max);
Write(‘Chi so cua ptu Max là:’,csMax);
Readln
End.
Đoàn Đức Công
Phù Lưu - HY-TQ
VD2: Sắp xếp dãy số nguyên bằng thuật toán tráo đổi.
- Input: Số nguyên dương N ( N<=250) và dãy số A1, A2…AN
- Output: Dãy A đc sắp xếp thành dãy ko giảm.
- Ý tưởng:
+ Với mỗi cặp số liền kề trong dẫy nếu số trước lớn hơn số sau thì đổi chỗ
+ Lặp lại cho tới khi không còn sự đổi chỗ nào.sảy ra nữa thì ta sẽ đc dãy sắp xếp.
Đoàn Đức Công
Phù Lưu - HY-TQ
Program sapxep;
Uses crt;
Const Nmax=250;
Var A:array[1..250] of interger;
N, i, j, tg: integer;
Begin
Clrscr;
Write(‘Nhap sluong ptu cua day so, N=’);
Readln(N);
For i=1 to N do
Begin
Write(‘phan tu thu ‘,i,’=’); {(‘A[‘,i,’]=’)
Readln(A[i]);
End;
Đoàn Đức Công
Phù Lưu - HY-TQ
For j:= N downto 2 do
For i:=1 to j-1 do
If A[i] > A[i+1] then
Begin
tg:= A[i]; A[i]:=A[i+1]; A[i+1]:=tg;
end;
Write(‘day sau khi sap xep:’);
For i:=1 to N do write(A[i]:4);
Readln
End.
Đoàn Đức Công
Phù Lưu - HY-TQ
VD3: Tìm kiếm nhị phân:
- Input: Dãy số A1, A2…AN đã đc sắp xếp tăng
- Output: Có hay không chỉ số i mà A[i]=k hoặc thông báo không tìm thấy.
- Ý tưởng: Ta tìm cách thu hẹp phạm vi tìm kiếm sau mỗi lần so sánh khóa k với số hạng đc chọn
+ Chọn Giưa [(đầu+cuối)/2]
+ Nếu Agiữa = k thi thông báo chỉ số giữa và kt
+ Nếu Agiữa>k ta chỉ tìm kiếm dãy từ A1..Agiữa -1
+ Nếu Agiữa < k ta tìm kiếm từ Agiữa+1 đến An
Đoàn Đức Công
Phù Lưu - HY-TQ
Program timkiem;
Uses crt;
Const Nmax=250;
Var A:array[1..250] of interger;
N, i, k: integer;
TK:boolean;
Begin
Clrscr;
Write(‘Nhap sluong ptu cua day so, N=’);
Readln(N);
For i=1 to N do
Begin
Write(‘phan tu thu ‘,i,’=’); {(‘A[‘,i,’]=’)
Readln(A[i]);
End.
Đoàn Đức Công
Phù Lưu - HY-TQ
Write(‘Nhập giá trị cần tìm k:’); Readln(k);
Dau:=1 ; Cuoi:=N; TK:=False;
While (Dau<=Cuoi) and Not TK do
Begin
Giưa:=(Dau+Cuoi] div 2;
If A[giưa]=k then TK= True
Else
If A[giưa]>k then Cuoi:=giưa -1
Else
Dau:=giưa+1
End;
If TK then write(‘chi so la:’,giưa)
Else Write(‘ khong tim thay’);
Readln
End.
Đoàn Đức Công
Phù Lưu - HY-TQ
Ghi nhớ!
? Mảng một chiều là một dãy hữu hạn các phần tử cùng kiểu.
? Khai báo: tên mảng, chỉ số đầu, chỉ số cuối, kiểu phần tử.
Tham chiếu phần tử mảng:
Tên biến mảng[chỉ số phần tử]
? Nhiều thao tác xử lí mảng dùng cấu trúc lặp FOR ..TO.. DO.
15 20 19 25 18 12 16
Var A:ARRAY[1..100] OF integer;
A[5] = 18
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...

Người chia sẻ: Đoàn Đức Công
Dung lượng: | Lượt tài: 0
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)