หน่วยที่2 โครงสร้างข้อมูล นาย...
TRANSCRIPT
หนวยท 2โครงสรางขอมล
• OUTLINE
–อารเรย (Array)
•1 มต และ 2 มต
– เรคอรด (Record)
– เซท (Set)
อารเรย (Array)
• อารเรย หรอ แถวล าดบ
เปนโครงสรางขอมลทประกอบดวยจ านวนสมาชกทมขนาด และ ประเภทขอมลเหมอนกน โดยทกตวในแถวล าดบใชชอเดยวกน ดงนนจงตองอาศยตวช (Index) ก ากบชออารเรยเพอระบถงสมาชกแตละตว
• อารเรยมตงแต 1มต ถงหลายมต
อารเรย
• อารเรย ชวยใหการเขยนโปรแกรมสนและประหยดเนอทตวแปร
• การใช อารเรย ตองก าหนดชนดและขนาดของอารเรย เพอเปนการจองเนอทในหนวยความจ า
• ตองมตวแปรทใชเปน Index
การก าหนดแบบอารเรย 1 มต
ก าหนดผาน TYPEType matrix = array[1..100] of integer;
VAR number:matrix;
หรอ ก าหนดตรงผาน VAR
VAR number: array[1..100] of integer;
การก าหนดแบบอารเรย 1 มต
– ตวอยาง
TYPE matrix = array[1..100] of integer;
letter = array[‘A’..’Z’] of real;
VAR number : matrix; index: integer;
scale : letter;
chindex : ‘A’..’Z’;
การอานคาเกบไวในอารเรย
• การอานคาเกบไวในอารเรย ตองอาศยลปในการน าคาเขาไปเกบไวในสมาชกแตละตว
• for index := 1 to 100 do
– read(number[index]);
• for chindex := ‘A’ to ‘Z’ do– scale[chindex] := ‘ ‘;
การอานคาเกบไวในอารเรย
• การน าคาจากอารเรย A ไปไวในอารเรย B
program array1;
uses Wincrt;
type arraynum = array['a'..'z'] of integer;
var a,b: arraynum;
i:'a'..'z';
การอานคาเกบไวในอารเรย
(* program put asiic code of character a-z into array A and copy to B*)
begin
for i:= 'a' to 'z' do
a[i] := ord(i);
for i:= 'a' to 'z' do
b[i] := a[i];
for i:='z' downto 'a' do
writeln(a[i],' and ',b[i]);
end.
หมายเหต
ภาษาปาลคาลใหใช b:= a ไดถาอารเรยทง2เหมอนกน
การคนหาคาสงสดต าสด
• การคนหาคาสงสดต าสด ของเลขจ านวนเตมบวก
• หลกการน าคาทงหมดเกบในอารเรย
• ก าหนดใหคาแรกในอารเรยเปนทงคาสงสด และ ต าสด
• จากนงจงท าการเปรยบเทยบคา
การคนหาคาสงสดต าสด
program maxmin;
uses wincrt;
const n_array = 5;
type number = array[1..5] of byte;
var x: integer;
num: number;
procedure readnum; {read data into array}
var i : integer;
begin
for i:= 1 to n_array do
begin
write('Enter positive number: ');
readln (num[i])
end;
end;
การคนหาคาสงสดต าสด
การคนหาคาสงสดต าสด
procedure find_max_min;
var max,min,i:integer;
begin
i:=1;
max:= num[i];
min:= num[i];
การคนหาคาสงสดต าสด
for i:=1 to n_array do
begin
if num[i] > max then
max := num[i];
if num[i] < min then
min := num[i];
end;
writeln('-----------------------------');
writeln('Max is = ',max,' Min is = ',min);
end;
การคนหาคาสงสดต าสด
begin {min}
readnum;
find_max_min;
end.
การหาความถ
ต าบลแหงหนงมผสมครเขาแขงขน อบต. จ านวน 3 คน เขยนโปรแกรมหาคะแนนเสยงของผแขงขนแตละคน
program freq;
uses wincrt;
const max = 3;
type arr = array [1..3] of integer;
var score : arr;
การหาความถ
procedure init;
var i: integer;
begin
for i:= 1 to max do
score[i] := 0;
end;
การหาความถ
procedure enternum;
var num : integer;
begin
write('Enter number you want to select 1-3 or -1
to end :');
readln (num);
การหาความถ
while num <> -1 do
begin
case num of
1 : score[num] := score[num] + 1;
2 : score[num] := score[num] + 1;
3 : score[num] := score[num] + 1;
else
การหาความถ
Writeln(' You enter a wrong number.');
end;{end case}
write('Enter number you want to select 1-3 or -1to end :');
readln (num);
end;{end while}
end;
การหาความถ
procedure write_score;
var i:integer;
begin
for i:= 1 to max do
writeln('Member number ',i,' is ',score[i]);
end;
การหาความถ
begin {main}
init;
enternum;
write_score;
end.
การคนหาแบบเสนตรง
• การคนหาขอมลแบบเสนตรง สามารถท าไดโดยการคนหาขอมลแตละตวตงแตตวแรกจนถงสมาชกตวสดทาย
• การคนหาสสดเมอพบขอมล หรอ หมดจ านวนสมาชกทจะคนหา(คอไมพบ)
การคนหาแบบเสนตรง
program search1;
uses wincrt;
const max = 3;
type arr = array [1..10] of string;
var
table : arr;
การคนหาแบบเสนตรง
procedure getnum;
var i: integer; code :string[3];
begin
for i:= 1 to max do
begin
write('enter student code: ');
readln(code);
table[i]:= code;
end; end;
การคนหาแบบเสนตรง
procedure search_code;
var i:integer; code :string[3]; flag : boolean;
begin
flag := false; i:= 1;
write('enter student code you want to search/ * to end ');
readln(code);
การคนหาแบบเสนตรง
while code <> '*' do
begin
while (flag = false) and (i <= max) do
begin
if table[i] = code then
flag := true
else
i:= i+1;
end;
การคนหาแบบเสนตรง
if flag = true then
begin
flag := false;
writeln('student code ',code,' is found');
end
else
writeln('student code ',code,' is not found');
การคนหาแบบเสนตรง
write('enter student code you want to search/ * to end ');readln(code);
end; {end while}end;{main} begingetnum;search_code;
end.
การเรยงขอมล (Sorting)
• การเรยงขอมล คอการจดล าดบขอมล จากนอยไปหามาก หรอ กลบกน
• การเรยงขอมลแบบ เชน Bubble Sort
Bubble Sort
• Bubble Sort เปนการเปรบเทยบสมาชก 2ตวทอยตดกน หากตวทสองมคานอยกใหท าการ swap คากน ท าการเปรยบเทยบจนครบทกตว (มการเปรยบเทยบ N-1 ครง)ถอ เปน 1 รอบ
• แตตองมการวนรอบ N-1 ครงจงจะสมบรณ
Bubble Sort
48 4656 80 90
48 5646 80 90
48 9056 46 80
46 48 56 80 90
รอบท 2
รอบท 1
รอบท 3
รอบท 4
Bubble Sort
program sort;
uses wincrt;
const max = 5;
type arr = array[1..5] of integer;
var list:arr;
Bubble Sort
procedure getnum;
var i: integer;
begin
for i:= 1 to max do
begin
write('enter number:');
readln(list[i]);
end; end;
Bubble Sort
procedure sorting;
var i,j,temp: integer;
begin
for i:= 1 to max-1 do
begin
for j:= 1 to max-1 do
begin
Bubble Sort
if list[j+1] < list[j] then
begin
temp := list[j];
list[j] := list[j+1];
list[j+1] := temp;
end;{end if}
end; {end for}
end; {end for} end;
Bubble Sort
procedure writelist;
var i : integer;
begin
writeln('---------------------------');
for i:= 1 to max do
writeln(list[i]);
end;
Bubble Sort
begin
getnum;
sorting;
writelist;
end.
อารเรย 2 มต
• อารเรย 2 มต แตตางจาก อารเรย 1 มต ทเราสามารถเหนไดทงดานกวาง และ ยาว ขณะท 1 มต จะม กวาง หรอ ยาว อยางเดยว
• ดงนน การประกาศ อารเรย ตองใช 2 มต และ ตองใชตวช 2 ตว
อารเรย 2 มต
การประกาศอารเรยท าไดดงน
Type row = array[1..90] of char;
column = array[1..80] of row;Var page : column;
หรอประกาศโดยตรง
VAR page : array[1..90,1..80] of char;
อารเรย 2 มต
• ถาตองการเขยนตวอกษรใหเตม 1 หนากระดาษ สามารถเขยนโปรแกรมดงน
for I := 1 to 90 dofor j := 1 to 80 do
page[j] := character;
Read Write คาในอารเรย
• เขยนโปรแกรมน าตวเลขเกบไวใน อารเรย 2 มต
program twodim;
uses wincrt;
const mrow= 4;
mcol= 3;
var table :array[1..4,1..3] of integer;
i,j:integer;
Read Write คาในอารเรย
procedure getnum;
begin
for I := 1 to 4 do
begin
for j := 1 to 3 do
beginwrite('Enter
number:');
read (table[i,j]);
end;
end;
end;
Read Write คาในอารเรย
procedure writenum ;
begin
writeln('--------------------------');
for I := 1 to 4 do
begin
for j := 1 to 3 do
Read Write คาในอารเรย
begin
write(table[i,j]:5);
end;
writeln;
end;
end;
Begin {main}
getnum;
writenum;
end.
การประมวลผลในอารเรย
• จงเขยนโปรแกรมท าการรบจ านวนนกเรยนและ จ านวน วชาสอบ แลวจงรบคะแนนของแตละวชา พมพรายงานในรปของตารางมลกษณะดงน
SUB1 SUB2 SUB3 AVGSTUDENT1 0.0 0.0 0.0 0.0
STUDENT2 0.0 0.0 0.0 0.0
AVERAGE 0.0 0.0 0.0 0.0
การประมวลผลในอารเรย
program students;
uses wincrt;
var nstd,nsub:integer;
table : array[1..50,1..10] of real;
i,j:integer;
avg_sub,avg_std,sum:real;
การประมวลผลในอารเรย
{**** init routine ****} procedure init(row,col:integer);
begin
for i:= 1 to row do
for j:= 1 to col do
table[i,j] := 0;
end;
การประมวลผลในอารเรย
{**** getnum routine ****}
procedure getnum(row,col:integer);
begin
for i:= 1 to row-1 do
begin
for j:= 1 to col-1 do
begin
write(i,'.','Enter score for each subject: ');
readln(table[i,j]);
end;
writeln('-------------------------');
end;
end;
การประมวลผลในอารเรย
การประมวลผลในอารเรย
{**** writeroutine ****}
procedure writenum(row,col:integer) ;
begin
{write column heading}
write('':12);
for i:=1 to col-1 do
write ('sub',i,'':2);
write ('avg');
writeln;
การประมวลผลในอารเรย
{write detail line}
for I := 1 to row do
begin
if i = row then
write('average ')
else
write('student# ',i,'');
การประมวลผลในอารเรย
for j := 1 to col do
write(table[i,j]:6:2);
writeln;
end;
end;
การประมวลผลในอารเรย
{**** compute routine ****}
procedure compute(row,col:integer);
begin
{compute averge for subject}
for i:= 1 to row-1 do
begin
sum := 0;
การประมวลผลในอารเรย
for j:= 1 to col-1 do
begin
sum := sum + table[i,j];
end;
avg_std := sum /(col-1);
table[i,col] := avg_std;
end;
การประมวลผลในอารเรย
{compute averge for students}
for i:= 1 to col-1 do
begin
sum := 0;
for j:= 1 to row-1 do
sum := sum + table[j,i];
avg_sub := sum /(row-1);
table[j+1,i] := avg_sub;
end;
end;
การประมวลผลในอารเรย
{**** main routin ****}
beginwrite('Enter number of
student and number of subject: ');
readln(nstd,nsub);
nstd := nstd +1;
nsub := nsub +1;
init(nstd,nsub);
getnum(nstd,nsub);
compute(nstd,nsub);
writenum(nstd,nsub);
end.{end main}
จดท าโดยนาย ธนพงษ นานกร เลขท 1
ชนมธยมศกษาปท 5