หน่วยที่2 เรื่อง โครงสร้างข้อมูล...

Preview:

Citation preview

หนวยท 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

Recommended