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