A. Capaian Pembelajaran
Mampu menjelaskan dan menerapkan konsep pencarian dan pengurutan data menggunakan metode
tertentu (P3,KU1,KU5,KU9)
for(i=0;i<N;++i)
{
if(dataDicari == data[i])
{
posisi = i; //catat posisi data yg ditemukan
tanda = 1; //1 berarti TRUE artinya ditemukan
break; //keluar atau selesai pencarian
}
else tanda = 0; //0 berarti FALSE artinya tidak ditemukan
}
if(tanda) //jika ditemukan, maka tuliskan
{
printf("Data ditemukan, yaitu %d pada posisi %d\n ", data[posisi], posisi);
}
else //jika tidak ditemukan
{
printf("Data tidak ditemukan\n");
Bentuk kode lengkap dari penyelesaian masalah dapat dilihat dalam implementasi bahasa C/C++ berikut:
Penguraian masalah:
Masalah dalam contoh kasus ini dapat dibagi menjadi beberapa masalah lebih kecil, yaitu:
Masalah entri sejumlah data sesuai kebutuhan (atau ditetapkan sebagai ukuran array data. Kita
akan mengimplementasi fungsi entri data atau isiNilai( )
Masalah mencari data tertentu sesuai keinginan dan akan dijadikan fungsi pencarian, misal
bernama cariNilai( )
Masalah menampilkan seluruh isi array dapat diimplemetasikan sebagai fungsi untuk
menampilkan dapat diberi nama fungsi tampilkan( )
Kebutuhan konstanta : Konstanta yang didefinisikan bernama N dengan nilai tertentu, misal 11.
Kebutuhan variabel global :
Untuk menyimpan seluruh data dan dapat diakses dari seluruh tempat pada program, dibutuhkan
variabel array, misal bernama nilai[] bertipe double dengan jumlah elemen sebanyak N buah.
printf("\nDAFTAR NILAI\n\n");
for(i=0;i<N;++i)
{
printf("Nilai pada posisi %d: %0.2lf\n", i, nilai[i]);
}
printf("\nSelesai!!! Tekan tombol Enter...");
getch();
}
main() {
isiNilai();
tampilkan();
cariNilai();
}
void isiNilai() {
double nilainya; int i;
printf("\n\n PROGRAM PENCARIAN DATA DALAM LARIK (ARRAY) \n");
printf("\nMENGENTRI NILAI\n");
for(i=0;i<N;++i) {
printf("\nKetikkan nilai ke-%d: ", i);
scanf("%lf", &nilainya);
nilai[i] = nilainya;
}
printf("\nEntri Nilai selesai\n");
printf("Tekan tombol ENter!!!!");
getch();
}
void cariNilai() {
double nilainya;
int i, posisi, tanda;
printf("\nKetikan nilai yg dicari: ");
scanf("%lf", &nilainya);
//mulai mencari
for(i=0;i<N;++i) {
if(nilai[i] == nilainya) {
tanda = 1; //data ditemukan
posisi = i;
break;
}
else {
tanda = 0; //tdk ditemukan
continue;
}
}
if(tanda) {
printf("\nData ditemukan pada posisi: %d\n",posisi);
}
else {
printf("\nData tidak ditemukan\n");
}
}
void tampilkan() {
int i;
printf("\nDAFTAR NILAI\n\n");
for(i=0;i<N;++i)
{
printf("Nilai pada posisi %d: %0.2lf\n", i, nilai[i]);
}
printf("\nSelesai!!! Tekan tombol Enter...");
getch();
}
Bentuk program dalam bahasa C++ ( DEV_C++) sebagai berikut, dengan menyesuaikan
statemen getch(), diganti dengan statemen yang setara getchar(). Hasil eksekusi adalah :
Pencarian linier juga dapat digunakan untuk mencari semua data yang cocok pada sekelompok data.
Perhatikan perubahan pada fungsi cariNilai( ) yang akan menghasilkan jumlah data yang cocok
ditemukan, sebagai berikut:
void cariNilai()
{
double nilainya;
int i, konter, posisi, tanda;
printf("\nKetikan nilai yg dicari: ");
scanf("%lf", &nilainya);
//mulai mencari
konter = 0;
for(i=0;i<N;++i)
{
if(nilai[i] == nilainya)
{
konter++;
tanda = 1;
printf("\nData ke-%d ada pada posisi: %d",konter, i);
}
else
{
tanda = 0; //tdk ditemukan
continue;
}
}
if(konter)
{
printf("\nData ditemukan sebanyak %d buah...\n", konter);
}
else
{
printf("\nData tidak ditemukan... \n");
}
}
Fungsi ini akan menuliskan ke layar berapa banyak data yang cocok dengan data yang dicari.
main() {
isiNilai();
tampilkan();
cariNilai();
}
void isiNilai() {
double nilainya;
int i;
printf("\nMENGENTRI NILAI\n");
for(i=0;i<N;++i) {
printf("\nKetikkan nilai ke-%d: ", i);
scanf("%lf", &nilainya);
nilai[i] = nilainya;
}
printf("\nEntri Nilai selesai\n");
printf("Tekan tombol ENter!!!!");
getch();
}
void cariNilai() {
double nilainya;
int i, konter, posisi, tanda;
printf("\nKetikan nilai yg dicari: ");
scanf("%lf", &nilainya);
//mulai mencari
konter = 0;
for(i=0;i<N;++i) {
if(nilai[i] == nilainya) {
konter++;
tanda = 1;
printf("\nData ke-%d ada pada posisi: %d",konter, i);
}
else {
tanda = 0; //tdk ditemukan
continue;
}
}
if(konter) {
printf("\nData ditemukan sebanyak %d buah...\n", konter);
}
else {
printf("\nData tidak ditemukan... \n");
}
}
void tampilkan() {
int i;
printf("\nDAFTAR NILAI\n\n");
for(i=0;i<N;++i) {
printf("Nilai pada posisi %d: %0.2lf\n", i, nilai[i]);
}
printf("\nSelesai!!! Tekan tombol Enter...");
getch();
}
Buatlah program yang dapat digunakan untuk mencari data nomor induk mahasiswa dari sekelompok nim
yang tersimpan dalam suatu array.
Jawab:
Kebutuhan konstanta
Konstanta untuk menetapkan banyaknya data, beri nama N dengan nilai sembarang, misal 10.
Kebutuhan variabel global
Variabel untuk menyimpan data nim bertipe string atau char[ ] berbentuk array yang dapat
menampung N data dan setiap nim berukuran sama, misal 4 (atau 4 karakter), misalnya:
char nim[N][4];
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5
int cariData(char nimnya[]);
char nim[N][4]; //variable global berupa array sejumlah nim mahasiswa
void main() {
int i, status;
char nimnya[4];
Hasil eksekusi :
Kasus 2.
Buatlah suatu program yang memiliki fasilitas pencarian jamak, dimana setiap data yang ditemukan
bernilai sama, maka program akan menghitung jumlah data yang ditemukan tersebut.
Jawab:
Mirip dengan kasus pertama, hanya saja program dilengkapi dengan kounter untuk menghitung data
yang sama yang ditemukan selama pencarian. Perhatikan fungsi pencarian berikut ini:
void cariData(char namanya[]){
int i, jumlah = 0, posisi;
void main() {
int i;
char namanya[4];
printf("Inputkan dulu nama mahasiswa\n");
for(i=0;i<N;i++){
printf("Ketik nama ke-%d: ", i+1);
gets(namanya); fflush(stdin);
strcpy(nama[i], namanya);
}
printf("entri selesai... Tekan Enter...");
getch();
printf("\nKetik Nama yang akan dicari: ");
gets(namanya); fflush(stdin);
cariData(namanya); //cari di array
}
Fungsi pencarian cariData() hampir sama dengan fungsi pencarian yang pernah dibuat, hanya pada fungsi
cariData() ini nilai balik dari fungsi berupa nilai indeks atau posisi data tersebut pada array of struct.
Mari kita lihat bagaimana kode keseluruhan dalam C berikut:
/* Nama File: search3.c
Program ini merupakan pengembangan dari program sebelumnya
dan memperlihatkan penggunaan fungsi pencarian. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//kedua tipe MHS dan NILAI digunakan untuk tipe bentukan baru
//suatu stract of struct atau struct di dalam struct, sehingga
//struct yang baru memili seluruh data baik identitas maupun
//nilai2 mahasiswa, sbb:
typedef struct DATAMHS{
MHS mhs;
NILAI nilai;
} DATAMHS;
//deklarasi variabel global berupa array of struct dari tipe DATAMHS sbb:
DATAMHS dataMhs[N]; //banyak mahasiswa adalah N orang
void main(){
int i, posisi; //konter perulangan untuk menampilkan data mahasiswa
char nimnya[4];
printf("Contoh Pencarian\n\n");
//panggil fungsi judul()
judul();
//panggil fungsi bacaMhs()
bacaMhs();
printf("Menampilkan Identitas Seluruh Mahasiswa\n");
for(i=0;i<N;i++){
//panggil fungsi infoMhs() mulai dari i=0, atau yg pertama
infoMhs(i);//nilai i adalah passing parameter yng menyatakan no indeks array
printf("\n");
}
void judul(){
printf("================================================
==================\n");
printf("Program Pengolahan Data Mahasiswa\n");
printf("Programmer: Antu\n");
printf("Program ini digunakan untuk mencontohkan pembuatan fungsi tanpa nilai
balik\n");
printf("================================================
==================\n");
printf("Tekan tombol enter...");
getch();
}
void bacaMhs(){
int i; //variable konter perulangan
char namanya[30]; //penyimpan sementara nama mahasiswa
char nimnya[4]; //penyimpan sementara nim mahasiswa
strcpy(namanya, dataMhs[i].mhs.nama);
strcpy(nimnya, dataMhs[i].mhs.nim);
//tampung dulu nilai akhir dan nilai huruf
nAkhirnya = dataMhs[i].nilai.nAkhir;
nHurufnya = dataMhs[i].nilai.nHuruf;
//tampilkan informasi mahasiswa yang diminta
printf("Nama Mahasiswa : %s\n", namanya);
printf("Nomor Induk Mahasiswa : %s\n", nimnya);
printf("\tNilai Akhir : %0.1lf\n", nAkhirnya);
printf("\tNilai Huruf : %c\n", nHurufnya);
printf("========================================\n");
}
Namun, dalam beberapa algoritma pengurutan, program membutuhkan ruang yang lebih dari atau sama
dengan elemen yang diurutkan. Pengurutan yang menggunakan ruang yang sama atau lebih disebut Not-
in-place Sorting. Merge-sort adalah contoh Not-in-place Sorting.
Jika algoritme pengurutan, setelah menyortir konten, mengubah urutan konten serupa di mana mereka
muncul, itu disebut pengurutan tidak stabil.
Stabilitas suatu algoritma penting saat ingin mempertahankan urutan elemen asli, seperti dalam tupel.
2.2.2. Algoritma Sorting Adaptive dan Non-Adaptive
Algoritma pengurutan dikatakan adaptif, jika memanfaatkan elemen yang sudah 'diurutkan' dalam daftar
yang akan disortir. Artinya, saat menyortir jika daftar sumber memiliki beberapa elemen yang telah
diurutkan, algoritme adaptif akan mempertimbangkannya dan akan mencoba untuk tidak mengurut ulang.
Algoritm non-adaptif adalah algoritme yang tidak memperhitungkan elemen yang sudah disortir. Mereka
mencoba memaksa setiap elemen untuk diatur ulang untuk mengkonfirmasi urutannya.
Increasing Order
Urutan nilai dikatakan naik, jika elemen yang berurutan lebih besar dari yang sebelumnya. Misalnya, 1, 3,
4, 6, 8, 9 berada dalam urutan naik, karena setiap elemen berikutnya lebih besar dari elemen sebelumnya.
Decreasing Order
Suatu urutan nilai dikatakan dalam urutan menurun, jika elemen yang berurutan lebih kecil dari yang
sekarang. Misalnya, 9, 8, 6, 4, 3, 1 berada dalam urutan menurun, karena setiap elemen berikutnya lebih
kecil dari elemen sebelumnya.
Non-Increasing Order
Urutan nilai dikatakan dalam urutan tidak naik, jika elemen yang berurutan kurang dari atau sama dengan
elemen sebelumnya dalam urutan tersebut. Urutan ini terjadi ketika urutan berisi nilai duplikat. Misalnya,
9, 8, 6, 3, 3, 1 berada dalam urutan tidak bertambah, karena setiap elemen berikutnya kurang dari atau
sama dengan (dalam kasus 3) tetapi tidak lebih besar dari elemen sebelumnya.
Non-Decreasing Order
Urutan nilai dikatakan dalam urutan tidak menurun, jika elemen yang berurutan lebih besar dari atau sama
dengan elemen sebelumnya dalam urutan tersebut. Urutan ini terjadi ketika urutan berisi nilai duplikat.
Misalnya, 1, 3, 3, 6, 8, 9 berada dalam urutan tidak menurun, karena setiap elemen berikutnya lebih besar
dari atau sama dengan (dalam kasus 3) tetapi tidak kurang dari yang sebelumnya.
Ini adalah algoritme pengurutan berbasis perbandingan di tempat. Di sini, sub-daftar dipertahankan yang
selalu diurutkan. Misalnya, bagian bawah larik dipertahankan untuk diurutkan. Sebuah elemen yang akan
'disisipkan' dalam sub-daftar yang diurutkan ini, harus menemukan tempat yang sesuai dan kemudian
harus disisipkan di sana. Karenanya namanya, semacam penyisipan.
2.2.4. Selection Sorting
Array dicari secara berurutan dan item yang tidak diurutkan dipindahkan dan dimasukkan ke dalam sub-
list yang diurutkan (dalam array yang sama). Algoritme ini tidak cocok untuk kumpulan data besar karena
kompleksitas kasus rata-rata dan terburuk adalah Ο (n2), di mana n adalah jumlah item.
Untuk posisi pertama dalam daftar yang diurutkan, seluruh daftar dipindai secara berurutan. Posisi-1 di
mana 14 disimpan saat ini, kita mencari seluruh daftar dan menemukan 10 adalah nilai terendah.
Jadi kami mengganti 14 dengan 10. Setelah satu iterasi 10, yang kebetulan merupakan nilai minimum
dalam daftar, muncul di posisi pertama daftar yang diurutkan.
Untuk posisi kedua, di mana 33 berada, kita mulai memindai daftar lainnya secara linier.
Kami menemukan bahwa 14 adalah nilai terendah kedua dalam daftar dan seharusnya muncul di tempat
kedua. Kami menukar nilai-nilai ini.
Setelah dua iterasi, dua nilai terkecil ditempatkan di awal dengan cara yang diurutkan.
2.4.2. Algoritma
for i = 1 to n - 1
/* set elemen saat ini sebagai minimum*/
min = i
for j = i+1 to n
if list[j] < list[min] then
min = j;
end if
end for
Kasus 1:
Buatlah program untuk mngurutkan sejumlah data yang tersimpan dalam suatu array berukuran tertentu.
Hasil pengurutan ditampilkan ke layar.
Jawab:
Analisis Kebutuhan:
Kebutuhan konstanta
Perlu konstanta untuk menetapkan banyaknya elemen array, misal N dengan sembarang (misal nilai
10) sbb:
#define N 10
Int data[N];
Kebutuhan fungsi
Fungsi untuk mengurutkan data dapat mengimplementasikan algoritma selection sort yang sudah
disampaikan.
#include <stdio.h>
#include <stdlib.h>
void urutkan();
main(){
int i;
int datanya;
void urutkan() {
//metode selection sort
int indexMin,i,j;
int temp;
Kasus 2:
Buatlah program seperti pada kasus 1 tetapi urutannya dari besar ke kecil atau descending order.
Jawab:
Analisis kebutuhan untuk kasus ini relatif sama dengan kasus no 1, hanya saja fungsi untuk mengurutkan
data diubah dari pengurutan dengan sifat ascending atau dari kecil ke besar menjadi descending atau dari
besar ke kecil. Perubahan juga dilakukan pada penamaan variabel sesuai maksud dari isi variabel-variabel
tersebut. Perhatikan perubahan yang dilakukan pada fungsi urutkan().
Berikut:
void urutkan() {
//metode selection sort
int indexMaks,i,j;
int temp;
//loop untuk seluruh data
for(i = 0; i < N-1; i++) {
// elemen sekarang yang dianggap nilai maksimum
indexMaks = i;
//periksa elemen paling besar
for(j = i+1;j < N;j++) {
if(data[j] > data[indexMaks]) { //tanda '<' diganti dengan tanda '>'
indexMaks = j;
}
}
#include <stdio.h>
#include <stdlib.h>
void urutkan();
main()
{ int i;
int datanya;
main(){
int i;
int datanya;
void infokan(){
int i, datanya;
//data yg telah diurut ditampilkan ke layar
printf("\nData terurut\n");
for(i=0;i<N;i++){
//salin dulu data dari array
datanya = data[i];
printf("%d\t", datanya);
}
printf("\n");//pindah baris
printf("Selesai ...Tekan Enter...");
getch();
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//kedua tipe MHS dan NILAI digunakan untuk tipe bentukan baru
//suatu stract of struct atau struct di dalam struct, sehingga
//struct yang baru memili seluruh data baik identitas maupun
//nilai2 mahasiswa, sbb:
typedef struct DATAMHS{
MHS mhs;
NILAI nilai;
} DATAMHS;
//deklarasi variabel global berupa array of struct dari tipe DATAMHS sbb:
DATAMHS dataMhs[N]; //banyak mahasiswa adalah N orang
void main(){
int i, posisi; //konter perulangan untuk menampilkan data mahasiswa
char nimnya[4];
printf("Contoh Pengurutan\n\n");
//panggil fungsi judul()
judul();
//panggil fungsi bacaMhs()
bacaMhs();
printf("\nMenampilkan Identitas Seluruh Mahasiswa\n");
printf("Tekan Enter...");
getch();
for(i=0;i<N;i++){
//panggil fungsi infoMhs() mulai dari i=0, atau yg pertama
infoMhs(i);//nilai i adalah passing parameter yng menyatakan no indeks array
printf("\n");
}
void judul()
{ printf("=============================================\n");
printf("Program Pengolahan Data Mahasiswa\n");
printf("Programmer: Antu\n");
printf("Program ini digunakan untuk mencontohkan pembuatan fungsi tanpa nilai balik\n");
printf("==============================================\n");
printf("Tekan tombol enter...");
getch();
}
void bacaMhs()
{ int i; //variable konter perulangan
char namanya[30]; //penyimpan sementara nama mahasiswa
char nimnya[4]; //penyimpan sementara nim mahasiswa
E. Aktivitas Pembelajaran
1. Mempelajari Modul Bahan Ajar
2. Mencari Bahan yang relevan
3. Diskusi
4. Latihan Mandiri
5. Memahami tugas
F. Rangkuman
Konsep tentang searching dan sorting, merupakan konsep penting dalam aktivitas pemrograman.
Terdapat banyak metode yang bisa digunakan, baik untuk metode dalam pencarian maupun
pengurutan.
Metode pencarian paling sederhana adalah metode pencarian linier, dimana data yang akan dicari
disisir satu persatu dimulai dari data pertama hingga data terakhir. Apabila dalam pencarian
tersebut data yang dicari ditemukan, maka pencarian dihentikan , sebaliknya, pencarian
diteruskan dengan menelusuri data berikutnya.
Metode yang digunakan dalam pengurutan juga memiliki beragam metode, dimana setiap
metode memiliki kelebihan dan kekurangannya sendiri. Metode paling sederhana dalam
pengurutan data adalah metode selection sort. Metode ini melakukan pengurutan dengan cara
memilih data sementara dari sekumpulan data sebagai data pembanding terhadap data lain dalam
kelompok. Metode pengurutan dapat berupa pengurutan ascending atau descending yang akan
menentukan pilihan data dalam perbandingannya.
H. Tugas
1. Buat sebuah program yang dapat digunakan untuk mendata hasil pertandingan lompat
tinggi dari sejumlah peserta. Lalu urutkan peserta berdasarkan tinggi lompatan.
2. Buatlah program yang dapat digunakan untuk mengolah hasil pertandingan balap sepeda
sehingga program dapat menentukan dan menampilkan para juaran lomba.
Daftar Rujukan
1. Rinaldi Munir. (2016). Algoritma dan Pemrograman dalam Bahasa Pascal, C dan C++.
Bandung: Informatika.
2. Murali Chemutury. (2019). Computer programming for beginners- a step-by-step guide. CRC
Press.
3. https://www.tutorialspoint.com/cprogramming
4. https://www.javatpoint.com/c-programming-language-tutorial