25
IF1210 Dasar Pemrograman Sem. 2 2014/2015 Latihan UAS LATIHAN UAS Soal 1. Skema Traversal dan Pencarian Nilai Ekstrem [Soal Praktikum 07 Shift 1 No. 1] Diketahui kamus data dalam sebuah program sebagai berikut: const NMax = 100; type TabInt = record T : array [1..NMax] of integer; Neff : integer; { Bernilai >=0, merupakan nilai efektif array; Neff=0 berarti array kosong } end; Program membaca sebuah nilai integer N. 1. Jika N < 0 atau N > NMax, tuliskan ke layar “Masukan nilai efektif salah”. 2. Jika N = 0, maka dituliskan ke layar “Tabel kosong” 3. Jika 0 < N <= NMax, maka program menerima masukan nilai- nilai sebuah TabInt, misalnya T, sebanyak N elemen (T.Neff = N). Selanjutnya, program menerima masukan pilihan berupa integer. a. Jika pilihan = 1, tuliskan nilai maksimum yang tersimpan di T. b. Jika pilihan = 2, tuliskan nilai minimum yang tersimpan di T. c. Jika pilihan = 3, tuliskan nilai maksimum dan minimum yang tersimpan di T. d. Jika pilihan selain 1, 2, 3, tuliskan pesan “Pilihan salah”. Contoh input/output: Input Output N Elemen T pilihan -1 Masukan nilai efektif salah 200 Masukan nilai efektif salah 0 Tabel kosong 10 1 3 -1 1 Nilai maksimum = 10 FNA/3/12/2022 1

Solusi Latihan UAS.doc

Embed Size (px)

Citation preview

Diberikan dalam kamus umum definisi type sebagai berkut:

IF1210 Dasar Pemrograman Sem. 2 2014/2015

Latihan UAS

LATIHAN UASSoal 1. Skema Traversal dan Pencarian Nilai Ekstrem[Soal Praktikum 07 Shift 1 No. 1]

Diketahui kamus data dalam sebuah program sebagai berikut:const

NMax = 100;

type

TabInt = record

T : array [1..NMax] of integer;

Neff : integer; { Bernilai >=0, merupakan nilai efektif array;

Neff=0 berarti array kosong } end;Program membaca sebuah nilai integer N.1. Jika N < 0 atau N > NMax, tuliskan ke layar Masukan nilai efektif salah.

2. Jika N = 0, maka dituliskan ke layar Tabel kosong

3. Jika 0 < N NMax, tuliskan ke layar Masukan nilai efektif salah.

Jika N = 0, maka dituliskan ke layar Tabel kosong

Jika 0 < N =0, nilai efektif array;

Neff=0 berarti array kosong }

end;

var

T : TabInt;

N : integer;

i : integer;

pil : integer;

{ Fungsi Pencarian Nilai Ekstrim }

function MaxMin(T : TabInt; opt : integer) : integer;

{ Menghasilkan nilai maksimum elemen T jika opt = 1,

dan menghasilkan nilai minimum elemen T jika opt = 2 }

{ Prekondisi: T tidak kosong; opt = [1,2] }

{ KAMUS LOKAL }

var

ekstrim, i : integer;

{ ALGORITMA }

begin

ekstrim := T.T[1];

i := 2;

while (i ekstrim) then

begin

ekstrim := T.T[i];

end;

end else { opt = 2; cari nilai minimum }

begin

if (T.T[i] < ekstrim) then

begin

ekstrim := T.T[i];

end;

end;

i := i + 1;

end;

MaxMin := ekstrim;

end;

{ ALGORITMA PROGRAM UTAMA }

begin

readln(N);

if (N < 0) or (N > NMax) then

begin

writeln('Masukan nilai efektif salah');

end else if (N = 0) then { 0 1) then

begin { T.T[1] adalah terurut }

for Pass := 2 to N do

begin

Temp := T.T[Pass]; { Simpan harga T[Pass] sebelum pergeseran }

{ Sisipkan elemen ke Pass dalam T[1..Pass-1] sambil menggeser:}

i := Pass-1;

while (Temp < T.T[i]) and (i > 1) do

begin

T.T[i+1] := T.T[i];

{ Geser }

i := i - 1;

{ Berikutnya }

end;

{ Temp >= T[i] (tempat yg tepat) or i = 1 (sisipkan sbg elmt pertama) }

if (Temp >= T.T[i]) then

begin

T.T[i+1] := Temp; { Menemukan tempat yg tepat }

end else { Temp < T[i] }

begin

T.T[i+1] := T.T[i];

T.T[i] := Temp; { sisipkan sbg elemen pertama }

end; { T.T[1..Pass] terurut membesar: T.T[1] 0) then

begin

{ loop sejumlah kuadran }

for i := 0 to 4 do

begin

writeln ('Kuadran ', i);

countKuadran := 0;

w1 := 0; w2 := 0; w3 := 0; w4 := 0; w5 := 0;

for j := 1 to A.Neff do

begin

if (Kuadran(A.Tab[j]) = i) then

begin

countKuadran := countKuadran + 1;

w := A.Tab[j].warna;

case w of

1 : w1 := w1 + 1;

2 : w2 := w2 + 1;

3 : w3 := w3 + 1;

4 : w4 := w4 + 1;

5 : w5 := w5 + 1;

end;

end;

end;

writeln ('Ada ', countKuadran, ' titik dengan:');

writeln ('Kode warna 1 sejumlah ', w1);

writeln ('Kode warna 2 sejumlah ', w2);

writeln ('Kode warna 3 sejumlah ', w3);

writeln ('Kode warna 4 sejumlah ', w4);

writeln ('Kode warna 5 sejumlah ', w5);

end;

end;

end;

{ ALGORITMA PROGRAM UTAMA }

begin

IsiArray(TA, 5);

KalkulasiDanCetakKuadran(TA);

end.

Soal 7. Penyimpanan Data Berkas[Soal UAS Sem. 2 2013/2014]File BERKAS.DAT digunakan untuk menyimpan daftar berkas dalam sebuah media penyimpanan. File BERKAS.DAT merupakan file sekuensial dengan elemen-elemen type rekaman sebagai berikut:

Nama (bertipe string, untuk menyimpan nama berkas),

Ukuran (bertipe integer, untuk menyimpan ukuran berkas),

Tanggal (bertipe Date, untuk menyimpan tanggal modifikasi terakhir berkas (last modified date)). Date adalah sebuah tipe bentukan yang terdiri atas 3 (tiga) elemen, yaitu: DD (hari, bertipe integer[1..31]), MM (bulan, bertipe integer[1..12]), dan YY (tahun, bertipe integer >0).

Sebagai penanda akhir rekaman, digunakan Mark berupa < "",0,>Buatlah sebuah program lengkap yang digunakan untuk melakukan hal-hal di bawah ini:

1. Membaca masukan sebuah Date, misalnya D1, dari keyboard (masukan pengguna). Diasumsikan pengguna memasukkan Date yang valid.

2. Membaca rekaman dalam file BERKAS.DAT dan menyalin isinya ke dalam sebuah array, misalnya TBerkas.

3. Menyimpan berkas yang dimodifikasi terakhir kali pada tanggal D1 atau tanggal setelah D1 ke dalam sebuah array lain, misalnya THasil. Buatlah (definisi, spesifikasi, dan implementasi) fungsi bernama IsLater yang menerima masukan dua buah Date, misalnya d1 dan d2, dan menghasilkan true jika d1 sama atau setelah d2 (false jika tidak).

4. Menyimpan isi array THasil ke dalam sebuah file lain HASIL.DAT.

5. Jika file BERKAS.DAT kosong, keluarkan pesan kesalahan File kosong. File HASIL.DAT menjadi file kosong.

Gunakan model proses sekuensial dengan mark, dengan penanganan kasus kosong.

Berikut adalah ilustrasi file sumber (BERKAS.DAT) dan file hasil (HASIL.DAT) jika D1 (Date yang dimasukkan pengguna) adalah .

Contoh isi BERKAS.DATContoh isi HASIL.DAT

Tuliskan jawaban Anda di sisa halaman di bawah ini dan halaman kosong sebaliknya. Alternatif Solusi:

Program BerkasMedia;

{ Membaca BERKAS.DAT, menyimpan hasilnya ke dalam TBerkas,

menyalin data berkas yang dimodifikasi terakhir pada/setelah tanggal D1 ke dalam THasil

dan menyalin isi THasil ke file HASIL.DAT }

{ KAMUS }

type

Date = record

DD : integer;{ hari }

MM : integer; { bulan }

YY : integer; { tahun }

end;

rekaman = record

Nama : string;

{ nama berkas }

Ukuran : integer; { ukuran berkas }

Tanggal : Date;

{ tanggal modifikasi terakhir }

end;

ArrayBerkas = record

Tab : array[1..100] of rekaman;

Neff : integer;

end;

const

Mark : rekaman = (Nama : ''; Ukuran : 0;

Tanggal : (DD : 31; MM : 12; YY : 1990));

var

fBerkas, fHasil : file of rekaman;

TBerkas, THasil : ArrayBerkas;

rekBerkas : rekaman;

D1 : Date;

i, j : integer;

{ Deklarasi dan Implementasi Fungsi }

function IsLater (D1, D2 : Date) : boolean;

{ menghasilkan true jika D1 >= D2 }

{ KAMUS LOKAL }

{ ALGORITMA }

begin

if (D1.YY > D2.YY) then

begin

IsLater := true;

end else if (D1.YY < D2.YY) then

begin

IsLater := false;

end else { D1.YY = D2.YY }

begin

if (D1.MM > D2.MM) then

begin

IsLater := true;

end else if (D1.MM < D2.MM) then

begin

IsLater := false;

end else { D1.MM = D2.MM }

begin

if (D1.DD >= D2.DD) then

begin

IsLater := true;

end else { D1.DD < D2.DD }

begin

IsLater := false;

end;

end;

end;

end;

function IsMark (rek : rekaman) : boolean;

{ Menghasilkan true jika rek merupakan mark }

{ ALGORITMA }

begin

IsMark := (rek.Nama = Mark.Nama) and

(rek.Ukuran = Mark.Ukuran) and

(rek.Tanggal.DD = Mark.Tanggal.DD) and

(rek.Tanggal.MM = Mark.Tanggal.MM) and

(rek.Tanggal.YY = Mark.Tanggal.YY);

end;

{ ALGORITMA PROGRAM UTAMA }

begin

{ Membaca BERKAS.DAT dan memindahkan ke TBerkas }

assign(fBerkas,'BERKAS.DAT');

reset(fBerkas);

read(fBerkas,rekBerkas);

TBerkas.Neff := 0;

if (IsMark(rekBerkas)) then

begin

writeln('File kosong');

end else { fBerkas tidak kosong }

begin

{ Membaca fBerkas dan memindahkan ke TBerkas }

i := 1;

repeat

TBerkas.Tab[i] := rekBerkas;

TBerkas.Neff := TBerkas.Neff + 1;

read(fBerkas,rekBerkas);

until(IsMark(rekBerkas));

end;

close(fBerkas);

{ Membaca D1 dan memindahkan ke THasil nilai TBerkas dengan tanggal >= D1 }

readln(D1.DD, D1.MM, D1.YY);

if (TBerkas.Neff > 0) then

begin

j := 1;

for i:=1 to TBerkas.Neff do

begin

if (IsLater(TBerkas.Tab[i].Tanggal,D1)) then

begin

THasil.Tab[j] := TBerkas.Tab[i];

j := j + 1;

end;

end;

THasil.Neff := j-1;

end else { TBerkas.Neff = 0 }

begin

THasil.Neff := 0;

end;

{ Menuliskan THasil ke HASIL.DAT }

assign(fHasil,'HASIL.DAT');

rewrite(fHasil);

if (THasil.Neff > 0) then

begin

for i:=1 to THasil.Neff do

begin

write(fHasil,THasil.Tab[i]);

end;

end;

{ Tulis Mark }

write(fHasil,Mark);

close(fHasil);

end.

Soal 8. Tracking Pengguna pada Layanan Telekomunikasi SelulerSebuah perusahaan layanan telekomunikasi seluler melakukan tracking (pelacakan) terhadap pergerakan pengguna melalui hubungan sinyal telepon selulernya ke Base Transceiver Station (BTS) terdekat. Antena pada BTS mengirimkan sinyal kepada telepon seluler secara berkala, dan telepon seluler mengembalikan sinyal tersebut untuk ditangkap kembali oleh antena. Sistem pada antena di BTS selanjutnya dapat menentukan posisi koordinat pengguna, dan meneruskan data posisi pengguna (telepon seluler tsb.), waktu pengambilan data, dan nomor identifikasi pengguna ke kantor pusat layanan telekomunikasi seluler. Nomor identifikasi pengguna adalah nomor unik yang membedakan satu pengguna dengan pengguna lainnya. Untuk kesederhanaan persoalan, ditentukan hal-hal sbb:

1. Koordinat pengguna adalah koordinat kartesian 2 dimensi (sumbu x, sumbu y), dengan satuan per 100 meter, dengan nilai positif, di mana titik origin adalah posisi paling selatan dan paling timur dari wilayah yang dilacak.

2. Waktu pengamatan adalah waktu dalam 1 hari tertentu, sehingga waktu hanya diwakili oleh jam, menit, detik, sedangkan tanggal, bulan, dan tahun tidak dicatat.

Tabel (a) menggambarkan pencatatan data tracking posisi telepon seluler dan BTS terdekatnya. Perhatikan bahwa pencatatan dilakukan berdasarkan urutan waktu tracking sehingga ID Pengguna tercatat pada Tabel (a) secara bergantian (selang-seling, interleaving).

ID PenggunaWaktu (jam: menit:detik) Posisi Pengguna (x, y)ID PenggunaWaktu (jam: menit:detik) Posisi Pengguna (x, y)

100107:00:00(100, 150)100107:00:00(100, 150)

100207:00:20(120, 170)100107:50:05(125, 175)

100307:05:00(95, 200)100108:00:00(100, 150)

100307:20:25(100, 180)100108:20:25(110, 140)

100107:50:05(125, 175)100108:25:05(115, 120)

100207:50:20(110, 150)100207:00:20(120, 170)

100108:00:00(100, 150)100207:50:20(110, 150)

100308:15:20(120, 170)100208:15:20(90, 120)

100208:15:20(90, 120)100307:05:00(95, 200)

100108:20:25(110, 140)100307:20:25(100, 180)

100108:25:05(115, 120)100308:15:20(120, 170)

100308:30:40(125, 145)100308:30:40(125, 145)

(a) Terurut Waktu(b) Terurut Pengguna, Terurut Waktu

Tugas Anda (dengan mengikuti instruksi untuk melengkapi program dan menuliskan jawaban di bawah ini):

1. Definisikan type Waktu, type Posisi, type Tracking, dan type TabelTracking. Type Tracking mewakili sebuah tracking pengguna yang terdiri atas: ID pengguna, waktu tracking, dan posisi pengguna. Type TabelTracking adalah sebuah array of Tracking yang merepresentasikan tipe seperti Tabel (a) di atas dengan kapasitas maksimal 1000.2. Implementasikan function FindMaxDistance yang menerima sebuah TabelTracking T dengan jumlah elemen yang terisi (efektif) N dan sebuah nomor identifikasi pengguna ID dan mengembalikan nilai jarak terjauh posisi pengguna dari titik origin. Apabila tidak ditemukan pengguna dengan ID tsb. di tabel T, maka fungsi akan mengembalikan nilai -1. Perhatikan bahwa Anda tidak perlu membuat fungsi jarak, tetapi langsung dapat memakai fungsi JarakOrigin seperti yang dijelaskan dalam spesifikasi pada program di bawah.

3. Implementasikan procedure SortPengguna yang menerima T (sebuah TabelTracking) yang terurut menaik berdasarkan waktu dengan jumlah elemen yang terisi (efektif) N. Prosedur ini digunakan untuk mengurutkan T berdasarkan ID pengguna secara terurut menaik dengan tetap mempertahankan urutan waktu untuk masing-masing pengguna. Contohnya: dengan masukan T seperti Tabel (a) di atas, maka setelah pemanggilan procedure SortPengguna, T akan berubah menjadi seperti pada Tabel (b).

Program TrackingPengguna;{ Program untuk melakukan pelacakan pengguna dalam suatu layanan telekomunikasi selular }

{ KAMUS } { Lengkapi deklarasi type-type di bawah ini }

type

Waktu = ...

Posisi = ...

Tracking = ...

TabelTracking = ...{ Deklarasi fungsi/prosedur }

function JarakOrigin (P: Posisi) : real;{ Menerima sebuah posisi P dan menghasilkan jarak P terhadap origin . }

{ Fungsi ini tidak perlu diimplementasi, hanya tinggal dipakai. }

{ Implementasikan fungsi FindMaxDistance dan procedure SortPengguna }

function FindMaxDistance (T: TabelTracking; N: integer; ID: integer) : real;{ Menerima tabel tracking (T) dengan jumlah elemen yang terisi/efektif N, dan identitas pengguna (ID), dan menghasilkan jarak posisi terjauh pengguna ID dari titik origin . }

{ Jika ID tidak ditemukan, fungsi mengembalikan nilai -1. }

{ Gunakan fungsi JarakOrigin. }

procedure SortPengguna (var T: TabelTracking; N: integer);{ I.S.: T hanya terurut waktu, N adalah jumlah elemen tabel T yang terisi

Data Tracking (jumlah elemen efektif tabel). }{ F.S.: T terurut menaik berdasarkan ID pengguna dengan tetap mempertahankan

urutan waktu pelacakan masing-masing pengguna. }

{ ALGORITMA PROGRAM UTAMA }{ Diasumsikan ada, tidak diminta dibuat }

begin

....

end.

Tuliskan implementasi function FindMaxDistance dan procedure SortPengguna di bawah ini. Header fungsi/prosedur tetap harus ditulis, namun spesifikasi tidak perlu ditulis ulang. Tidak diperkenankan membuat type/fungsi/prosedur baru.

Alternatif Solusi:

1. Deklarasi Type:

type

Waktu = record

jam : integer;

menit : integer;

detik : integer;

end;

Posisi = record

x : integer;

y : integer;

end;

Tracking = record

IDPengguna : integer;

waktuTracking : Waktu;

posisiPengguna : Posisi;

end;

TabelTracking = array [1..1000] of Tracking;

2. Function FindMaxDistance

Spesifikasi tidak perlu ditulis ulang

function FindMaxDistance (T: TabelTracking; N: integer; ID: integer) : real;

{ Menerima tabel tracking (T) dengan jumlah elemen yang terisi/efektif N,

dan identitas pengguna (ID), dan menghasilkan jarak posisi terjauh pengguna ID

dari titik origin . }

{ Jika ID tidak ditemukan, fungsi mengembalikan nilai -1. }

{ Gunakan fungsi JarakOrigin. }

{ KAMUS LOKAL }

var

max : real;

i : integer;

{ ALGORITMA }

begin

if (N > 0) then

begin

{ mencari ID sekaligus mencari nilai max }

max := -1;

for i := 1 to N do

begin

if (T[i].IDPengguna = ID) then

begin

if (max < JarakOrigin(T[i].posisiPengguna)) then

begin

max := JarakOrigin(T[i].posisiPengguna);

end;

end;

end;

FindMaxDistance := max;

end else { N = 0, pasti tidak ditemukan }

begin

FindMaxDistance := -1;

end;

end;

3. Procedure SortPengguna

Spesifikasi tidak perlu ditulis ulang

procedure SortPengguna (var T: TabelTracking; N: integer);

{ I.S.: T hanya terurut waktu, N adalah jumlah elemen tabel T yang terisi

Data Tracking (jumlah elemen efektif tabel). }

{ F.S.: T terurut menaik berdasarkan ID pengguna dengan tetap mempertahankan

urutan waktu pelacakan masing-masing pengguna. }

{ Menggunakan Selection (minimum) sort }

{ KAMUS LOKAL }

var

i : integer;

Pass : integer; { tahapan pengurutan }

Temp : Tracking; { memorisasi harga untuk penukaran }

IMin : integer; { indeks, di mana T[Pass..N] bernilai maksimum }

jDetik1, jDetik2 : longint;

{ ALGORITMA }

begin

if (N > 1) then

begin

for Pass := 1 to N-1 do

begin

{ Tentukan Minimum [Pass..N] }

IMin := Pass;

i := Pass+1;

while (i N }

{ Tukar T[IMin] dengan T[Pass] }

if (IMin Pass) then

begin

Temp := T[IMin];

T[IMin] := T[Pass];

T[Pass] := Temp;

end;

end;

end;

end;PMB

Pengambilan MK

Entri Data Induk

Penetapan Kelas MK

Penetapan Asrama

Kuadran 0:

Ada 6 titik dengan:

Kode warna 1 sejumlah 0

Kode warna 2 sejumlah 1

Kode warna 3 sejumlah 0

Kode warna 4 sejumlah 0

Kode warna 5 sejumlah 5

Kuadran 1:

Ada 35 titik dengan:

Kode warna 1 sejumlah 10

Kode warna 2 sejumlah 5

Kode warna 3 sejumlah 4

Kode warna 4 sejumlah 8

Kode warna 5 sejumlah 8

Kuadran 2:

Ada 11 titik dengan:

Kode warna 1 sejumlah 1

Kode warna 2 sejumlah 5

Kode warna 3 sejumlah 2

Kode warna 4 sejumlah 3

Kode warna 5 sejumlah 0

PAGE 1FNA/5/6/2015