Thursday, May 1, 2014

Perkalian Matriks

Pak Dengklek memberikan Anda dua buah matriks. Matriks pertama berukuran A x B sedangkan matriks kedua berukuran C x D (1 ≤ A, B, C, D ≤ 75; B = C). Tiap elemen pada kedua matriks tersebut adalah sebuah bilangan bulat antara 1 sampai 100. Kalikan kedua matriks tersebut lalu cetak hasilnya.

Format Masukan

Baris pertama berisi dua buah bilangan bulat A dan B. A baris berikutnya masing-masing berisi B buah bilangan bulat, yaitu elemen-elemen pada matriks pertama. Baris berikutnya berisi dua buah bilangan bulat C dan D. C baris berikutnya masing-masing berisi D buah bilangan bulat, yaitu elemen-elemen pada matriks kedua.

Format Keluaran

A buah baris, masing-masing berisi D buah bilangan bulat yaitu elemen-elemen pada matriks hasil perkalian matriks pertama dan matriks kedua.

Contoh Masukan

2 3
1 1 1
1 1 2
3 4
1 1 1 1
1 1 1 1
1 1 1 2

Contoh Keluaran

3 3 3 4
4 4 4 6

Petunjuk

Dalam matematika, matriks A dan matriks B dapat diperkalikan. Syaratnya: jika ukuran matriks A adalah m x n, maka ukuran matriks B haruslah n x p. Matriks baru hasil perkalian, misalnya C, akan berukuran m x p. Rumus perkaliannya sebagai berikut (C[i,j] adalah elemen C pada baris ke-i dan kolom ke-j):

Jawabannya adalah :

Matriks

Pak Dengklek memberikan Anda sebuah matriks berukuran N x M (1 ≤ N, M ≤ 100). Elemen pada baris ke-i dan kolom ke-j adalah aij (1 ≤ aij ≤ 100). Cetak kembali matriks tersebut setelah diputar 90 derajat searah jarum jam.

Format Masukan

Baris pertama berisi dua buah bilangan bulat N dan M. N baris berikutnya masing-masing berisi M buah bilangan bulat aij.

Format Keluaran

M buah baris, masing-masing berisi N buah bilangan bulat yang menyatakan matriks pada masukan setelah diputar.

Contoh Masukan

4 3
34  87  15
66  71  52
47  47  48
45  75  35

Contoh Keluaran

45  47  66  34
75  47  71  87
35  48  52  15

Petunjuk

Anda akan belajar menggunakan array dua dimensi yang berguna misalnya untuk menyimpan sebuah matriks. Array dua dimensi adalah array yang diakses menggunakan dua indeks. Misalnya, Tabel[a,b] adalah elemen dari array dua dimensi bernama Tabel pada baris berindeks a dan kolom berindeks b. Deklarasi array dua dimensi mirip dengan array satu dimensi, kecuali bagian <jangkauan harga indeks> berisikan dua jangkauan yang dipisahkan tanda koma (','). Misalnya
Tabel: array[0..99, 0..99] of integer;
adalah array dua dimensi (membentuk matriks dua dimensi) berukuran 100 x 100.
Harga-harga matriks dapat dibaca dengan urutan baris masukan sesuai dengan urutan baris matriks, dan pada setiap baris masukan harga elemen-elemen matriks dalam satu baris dituliskan dari kiri ke kanan dengan dipisahkan satu spasi. Untuk membaca satu baris, program Anda harus membaca satu demi satu harga dengan for-loop. Agar pembacaan masih pada baris yang sama, maka jangan gunakan perintah readln, tetapi gunakan read. Jadi program Anda perlu menggunakan dua nested for loop: for loop luar untuk per baris, dan for loop dalam untuk elemen-elemen dalam satu baris.
Demikian juga, saat penulisan keluaran diperlukan dua nested for loop tetapi dengan iterator yang berbeda. Penulisan setiap elemen bukan dengan writeln tetapi dengan write, agar dapat menuliskan beberapa harga dalam satu baris. Setelah selesai menuliskan harga-harga dalam satu baris, gunakan writeln untuk turun ke baris berikutnya. Jangan lupa menyertakan satu spasi untuk memisahkan satu elemen dengan elemen berikutnya, dan jangan ada spasi yang berlebih di akhir setiap baris.
Jawabannya adalah :

Modus Terbesar

Dalam ilmu statisika, dikenal suatu ukuran sebaran yang disebut dengan modus. Modus adalah data yang paling banyak muncul dalam suatu kumpulan data. Sebuah kumpulan data bisa jadi memiliki lebih dari satu modus, yaitu ketika terdapat lebih dari satu data yang jumlah kemunculannya sama.
Pak Dengklek memberikan Anda N (1 ≤ N ≤ 100.000) buah bilangan bulat yang masing-masing di antara 1 sampai 1.000. Tentukanlah modus terbesar dari bilangan-bilangan tersebut.

Format Masukan

Baris pertama berisi sebuah bilangan bulat N. N baris berikutnya berisi bilangan-bilangan tersebut.

Format Keluaran

Sebuah baris berisi modus terbesar dari kumpulan bilangan tersebut.

Contoh Masukan

6
1
3
2
4
1
4

Contoh Keluaran

4
Jawabannya adalah :

Array

Pak Dengklek memberikan Anda banyak data dalam beberapa baris, masing-masing berisi sebuah bilangan bulat. Cetak kembali bilangan-bilangan tersebut dalam urutan terbalik.

Format Masukan

Banyak baris, antara 0 sampai 25.000 baris, masing-masing berisi sebuah bilangan bulat antara -10.000 sampai 10.000.

Format Keluaran

Sebanyak baris pada masukan, berisi bilangan-bilangan tersebut dalam urutan terbalik.

Contoh Masukan

1
2
3
4
5

Contoh Keluaran

5
4
3
2
1

Petunjuk

Anda diminta untuk belajar menggunakan suatu jenis variabel yang lebih kompleks yang dapat menyimpan sejumlah nilai, yang dikenal dengan nama array. Variabel tersebut memiliki elemen-elemen yang masing-masing dapat menyimpan nilai tersendiri. nilai-nilai yang tersimpan dalam elemen-elemen array dapat diakses menggunakan indeks yang didefinisikan pada deklarasi array tersebut. Dalam Pascal, indeks dapat berupa suatu jangkauan nilai integer apapun, misalnya dari -5 s.d. 5 atau dari 100 s.d. 200. Tetapi untuk memudahkan berpindah ke bahasa pemrograman yang lain (seperti C, C++, atau Java) maka sebaiknya membiasakan diri agar setiap indeks yang digunakan memiliki jangkauan bilangan bulat nonnegatif yang dimulai dari 0.
Suatu variabel array didefinisikan pada bagian deklarasi variabel sbb
<nama variabel> : array [<jangkauan indeks>] of <jenis data>;
Aturan nama variabel array mengacu pada aturan penamaan variabel yang umum. Tipe data elemen array dapat memakai jenis-jenis data sederhana yang ada dalam Pascal seperti integer, longint, real, dll. Jangkauan indeks jika dimulai dari A sampai B (catatan: A dan B adalah bilangan dengan A ≤ B) ditulis dengan A..B. Dengan demikian nilai pada suatu elemen array tersebut dapat diakses melalui indeksnya mulai dari A, A+1, A+2, ..., B dengan menggunakan kurung siku <nama variabel>[<indeks>]. Jadi misalnya array string dengan deklarasi sebagai berikut:
Tabel : array[0..10] of string;
Untuk menyimpan nilai "Viva TOKI" pada elemen ke-5 array ditulis
Tabel[5] = 'Viva TOKI';
Sayangnya menurut aturan resmi dalam Pascal, jumlah elemen array harus dideklarasikan secara tetap, yaitu dari awal hingga akhir berjalannya program, ukuran array tersebut tidak berubah (suatu ketika akan dibahas cara menggunakan array dengan ukuran dinamis dalam Pascal). Selain itu, hati-hati dengan Turbo Pascal versi DOS (7.0 dan sebelumnya) yang tidak mampu menyimpan array string > 256 elemen (total ukuran array > 64 KB). Dengan FreePascal untuk Windows tidak ada masalah tersebut.
Program Anda harus membaca seluruh baris masukan ke dalam array kemudian mencetak mundur mulai dari baris yang terakhir dibaca hingga yang pertama. Ingat: dalam latihan ini Anda harus menggunakan array, meskipun sebenarnya ada cara lain tanpa menggunakan array.
Mengingat array harus berukuran tetap maka masukan dijamin tidak akan berisi lebih dari 25000 bilangan sehingga Anda deklarasikan array penyimpan integer dengan jangkauan 0..24999. Hal yang program Anda harus lakukan juga adalah menghitung jumlah bilangan saat bilangan demi bilangan dibaca. Setelah bilangan bilangan terakhir (bilangan ke-N) dibaca, pencetakan dilakukan mundur mulai dari elemen berindeks N-1 hingga 0.
Berikut ini contoh menggunakan loop for dengan nilai iterator menurun sebagai berikut
for <iterator> := <nilai-awal> downto <nilai-akhir> do
begin
    <perintah-perintah>
end;
Perbedaannya terletak pada kata downto menggantikan to. Ingat bahwa <nilai-awal> harus tidak lebih kecil dari <nilai-akhir>.
Jawabannya adalah :

Var Parameter

Pak Dengklek memberikan Anda dua buah bilangan bulat A dan B (1 ≤ A, B ≤ 1.000). Tukar nilai kedua bilangan tersebut lalu cetak kembali kedua bilangan tersebut.

Format Masukan

Baris pertama berisi dua buah bilangan bulat A dan B.

Format Keluaran

Sebuah baris berisi dua buah bilangan bulat B dan A, dipisahkan oleh sebuah spasi.

Contoh Masukan

4 5

Contoh Keluaran

5 4

Petunjuk

Soal ini sebetulnya dapat dipecahkan dengan program yang sangat pendek seperti ini:
var
    a, b: integer;
begin
    readln(a, b);
    writeln(b, ' ', a);
end.
Namun, kali ini cobalah membuat sebuah prosedur Swap yang memiliki dua buah parameter integer, yang akan menukarkan nilai adan b, seperti berikut ini:
var
    a, b: integer;

// menukar nilai a dengan b
procedure Swap(a, b: integer);
var
    temp: integer;
begin
    temp := a;
    a := b;
    b := temp;
end;


// program utama
begin
    readln(a, b);
    Swap(a, b);
    writeln(a, ' ', b);
end.
Coba ujilah program itu dengan sebuah berkas yang berisi dua buah bilangan bulat. Apakah program ini mengeluarkan hasil yang benar? Ternyata program ini tidak berjalan dengan benar. Mengapa demikian? Dalam prosedur Swap di atas, parameter a dan bsebetulnya adalah local variable yang dideklarasikan di dalam prosedur Swap, sehingga a dan b ini sama sekali bukan variabel a dan byang dideklarasikan di awal program. Dengan demikian, menukarkan nilai a dan b yang berada di dalam prosedur Swap tidak akan berpengaruh apa-apa.

Oleh karena itu, kita harus mengubah sedikit prosedur Swap kita menjadi:
procedure Swap(var a: integer; var b: integer);
var
    temp: integer;
begin
    temp := a;
    a := b;
    b := temp;
end;
atau
procedure Swap(var a, b: integer);
var
    temp: integer;
begin
    temp := a;
    a := b;
    b := temp;
end;
var menunjukkan bahwa parameter a dan b bukanlah local variable di dalam prosedur tersebut, tetapi adalah referensi ke sebuah variabel yang nyata di luar prosedur tersebut. Karena Swap dipanggil dari program utama dengan parameter a dan b pada program utama, maka variabel-variabel global inilah yang direferensi oleh parameter prosedur Swap. Sehingga, jika nilai a dan b ditukarkan di dalam prosedur, sebetulnya nilai yang ditukarkan adalah nilai variabel global a dan variabel global b.
Untuk lebih jelasnya, meskipun kode prosedur Swap kita ganti menjadi:
procedure Swap(var c, d: integer);
var
    temp: integer;
begin
    temp := c;
    c := d;
    c := temp;
end;
program tetap berjalan dengan benar karena sekarang c mengacu pada variabel a global, dan d mengacu pada variabel b global. Sebuah prosedur atau fungsi dapat memiliki beberapa variabel 'dengan var' dan beberapa variabel 'tanpa var' sekaligus.
Jawabannya adalah :