Minggu, 14 November 2021

Tugas Praktikum 1 Algoritma dan Pemrograman

Artikel ini saya buat berdasarkan modul praktikum mata kuliah Algoritma dan Pemrograman di Universitas Ahmad Dahlan (UAD) Yogyakarta tahun 2015. Tujuan saya menulis artikel ini adalah untuk membantu mahasiswa jurusan Teknik Informatika yang sedang mengambil mata kuliah tersebut. Pada bagian akhir modul praktikum pertama, para praktikan diberikan tugas untuk membuat beberapa program, yaitu:

  1. Menghitung volume dan luas permukaan bola, dengan membaca jari-jari bola, kemudian menampilkan volume dan luas permukaan bola.
  2. Menghitung konversi suhu dengan membaca suhu dalam derajat Celcius, kemudian tampilkan konversinya dalam Fahrenheit, Reamur dan Kelvin.
  3. Menghitung tahanan total (Rt) dari 3 tahanan R1, R2 dan R3 yang dirangkai secara seri maupun paralel.
  4. Dibaca jam dalam detik kemudian menampilkan dalam bentuk jam, menit detik.
  5. Dibaca dua buah pecahan kemudian menampilkan operasi penjumlahan, pengurangan, perkalian dan pembagian pecahan tersebut.
  6. Dibaca dua buah titik kemudian menentukan dan menampilkan titik tengah kedua titik tersebut.

Soal 1 : Menghitung volume dan luas permukaan bola, dengan membaca jari-jari bola, kemudian menampilkan volume dan luas permukaan bola.

Pembahasan :
  • Input dari program tersebut adalah jari-jari bola
  • Output dari program tersebut nantinya adalah volume dan luas permukaan bola, sehingga kita perlu mencari rumus volume dan luas permukaan bola
  • Rumus volume bola = 4/3 π r3
  • Rumus luas permukaan bola = 4 π r2
  • Karena nilai dari π adalah 22/7 atau 3.14, maka tipe data yang akan kita gunakan nantinya adalah float
Source Code  :
Hasil running program

Soal 2 : Menghitung konversi suhu dengan membaca suhu dalam derajat Celcius, kemudian tampilkan konversinya dalam Fahrenheit, Reamur dan Kelvin.

Pembahasan :

Source Code :

Soal 3 : Menghitung tahanan total (Rt) dari 3 tahanan R1, R2 dan R3 yang dirangkai secara seri maupun paralel.

Pembahasan :

Source Code :

Soal 4 : Dibaca jam dalam detik kemudian menampilkan dalam bentuk jam, menit detik.

Pembahasan :

Source Code :

Soal 5 : Dibaca dua buah pecahan kemudian menampilkan operasi penjumlahan, pengurangan, perkalian dan pembagian pecahan tersebut.

Pembahasan :

Source Code :

Soal 6 : Dibaca dua buah titik kemudian menentukan dan menampilkan titik tengah kedua titik tersebut.

Pembahasan :

Source Code :

Rabu, 10 Juni 2020

Catatan SQL

Postingan ini saya gunakan sebagai catatan pribadi saja. Apabila Anda mau memberi masukan, silakan tuliskan di kolom komentar.

=======================================================================
Mengambil data dari tabel selain yang ada di tabel lain:

Saya ingin mengambil data di tabel item yang belum masuk ke dalam tabel level_hewan_item dengan data id_level_hewan = 2.

SQL:
SELECT * FROM item WHERE item.id NOT IN 
(SELECT level_hewan_item.id_item FROM level_hewan_item WHERE level_hewan_item.id_level_hewan=2) 
ORDER BY item.nama

Hasil:

=======================================================================

Senin, 01 Juni 2020

Aplikasi/Program Zodiak dengan bahasa C++

Aplikasi C++ yang saya share kali ini adalah aplikasi yang digunakan untuk mengetahui zodiak dari tanggal lahir kita. Nantinya, aplikasi ini memerlukan inputan berupa tanggal lahir dan bulan kelahiran. Setelah tanggal dan bulan kelahiran diinputkan, selanjutnya aplikasi akan memberitahu kita masuk ke dalam zodiak yang mana.

Dikutip dari Wikipedia, nama zodiak dan tanggalnya adalah sebagai berikut:
  • Aries (21 Maret - 19 April)
  • Taurus (20 April - 20 Mei)
  • Gemini (21 Mei - 20 Juni)
  • Kanser (21 Juni - 22 Juli)
  • Leo (23 Juli - 22 Agustus)
  • Virgo (23 Agustus - 22 September)
  • Libra (23 September - 22 Oktober)
  • Skorpio (23 Oktober - 21 November)
  • Sagitarius (22 November - 21 Desember)
  • Kaprikornus (22 Desember - 19 Januari)
  • Akuarius (20 Januari - 18 Februari)
  • Pises (19 Februari - 20 Maret)
Mungkin sumber lain berbeda mengenai nama zodiak atau tanggalnya, tetapi data yang saya gunakan untuk aplikasinya adalah data di atas. Jadi apabila Anda berbeda sumber, silakan nanti disesuaikan sendiri.

Source code simpel:
#include <iostream>
//develop251.blogspot.com
using namespace std;

int main(){
    int bulan, tanggal;
    
    cout << "Program Cek Zodiak" << endl;
    cout << "1. Januari     5. Mei         9. September" << endl;
    cout << "2. Februari    6. Juni        10. Oktober" << endl;
    cout << "3. Maret       7. Juli        11. November" << endl;
    cout << "4. April       8. Agustus     12. Desember" << endl;
    cout << "\nBulan kelahiran Anda?   : "; cin >> bulan;
    cout << "Tanggal kelahiran Anda? : "; cin >> tanggal;
    cout << "\nZodiak Anda adalah      : ";
    
    if((tanggal>=21 && tanggal<=31 && bulan==3) || (tanggal>=1 && tanggal<=19 && bulan==4)){
        cout << "ARIES" << endl;
    }else if((tanggal>=20 && tanggal<=30 && bulan==4) || (tanggal>=1 && tanggal<=20 && bulan==5)){
        cout << "TAURUS" << endl;
    }else if((tanggal>=21 && tanggal<=31 && bulan==5) || (tanggal>=1 && tanggal<=20 && bulan==6)){
        cout << "GEMINI" << endl;
    }else if((tanggal>=21 && tanggal<=30 && bulan==6) || (tanggal>=1 && tanggal<=22 && bulan==7)){
        cout << "KANSER" << endl;
    }else if((tanggal>=23 && tanggal<=31 && bulan==7) || (tanggal>=1 && tanggal<=22 && bulan==8)){
        cout << "LEO" << endl;
    }else if((tanggal>=23 && tanggal<=31 && bulan==8) || (tanggal>=1 && tanggal<=22 && bulan==9)){
        cout << "VIRGO" << endl;
    }else if((tanggal>=23 && tanggal<=30 && bulan==9) || (tanggal>=1 && tanggal<=22 && bulan==10)){
        cout << "LIBRA" << endl;
    }else if((tanggal>=23 && tanggal<=31 && bulan==10) || (tanggal>=1 && tanggal<=21 && bulan==11)){
        cout << "SKORPIO" << endl;
    }else if((tanggal>=22 && tanggal<=30 && bulan==11) || (tanggal>=1 && tanggal<=21 && bulan==12)){
        cout << "SAGITARIUS" << endl;
    }else if((tanggal>=22 && tanggal<=31 && bulan==12) || (tanggal>=1 && tanggal<=19 && bulan==1)){
        cout << "KAPRIKORNUS" << endl;
    }else if((tanggal>=20 && tanggal<=31 && bulan==1) || (tanggal>=1 && tanggal<=18 && bulan==2)){
        cout << "AKUARIUS" << endl;
    }else if((tanggal>=19 && tanggal<=29 && bulan==2) || (tanggal>=1 && tanggal<=20 && bulan==3)){
        cout << "PISES" << endl;
    }else{
        cout << "-" << endl;
        cout << "Tanggal dan/atau Bulan yang Anda masukkan salah" << endl;
    }
    
    return 0;
}

Hasil:


Source code dikembangkan:
#include <iostream>
#include <iomanip>
//develop251.blogspot.com
using namespace std;

string getNamaBulan(int i){
    switch(i){
        case 1: return "Januari";
        case 2: return "Februari";
        case 3: return "Maret";
        case 4: return "April";
        case 5: return "Mei";
        case 6: return "Juni";
        case 7: return "Juli";
        case 8: return "Agustus";
        case 9: return "September";
        case 10: return "Oktober";
        case 11: return "November";
        case 12: return "Desember";
        default: return "";
    }
}

int getTanggalMaks(int i){
    if(i==2){
        return 29;
    }else if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12){
        return 31;
    }else{
        return 30;
    }
}

string getNamaZodiak(int tanggal, int bulan){
    if((tanggal>=21 && tanggal<=31 && bulan==3) || (tanggal>=1 && tanggal<=19 && bulan==4)){
        return "ARIES";
    }else if((tanggal>=20 && tanggal<=30 && bulan==4) || (tanggal>=1 && tanggal<=20 && bulan==5)){
        return "TAURUS";
    }else if((tanggal>=21 && tanggal<=31 && bulan==5) || (tanggal>=1 && tanggal<=20 && bulan==6)){
        return "GEMINI";
    }else if((tanggal>=21 && tanggal<=30 && bulan==6) || (tanggal>=1 && tanggal<=22 && bulan==7)){
        return "KANSER";
    }else if((tanggal>=23 && tanggal<=31 && bulan==7) || (tanggal>=1 && tanggal<=22 && bulan==8)){
        return "LEO";
    }else if((tanggal>=23 && tanggal<=31 && bulan==8) || (tanggal>=1 && tanggal<=22 && bulan==9)){
        return "VIRGO";
    }else if((tanggal>=23 && tanggal<=30 && bulan==9) || (tanggal>=1 && tanggal<=22 && bulan==10)){
        return "LIBRA";
    }else if((tanggal>=23 && tanggal<=31 && bulan==10) || (tanggal>=1 && tanggal<=21 && bulan==11)){
        return "SKORPIO";
    }else if((tanggal>=22 && tanggal<=30 && bulan==11) || (tanggal>=1 && tanggal<=21 && bulan==12)){
        return "SAGITARIUS";
    }else if((tanggal>=22 && tanggal<=31 && bulan==12) || (tanggal>=1 && tanggal<=19 && bulan==1)){
        return "KAPRIKORNUS";
    }else if((tanggal>=20 && tanggal<=31 && bulan==1) || (tanggal>=1 && tanggal<=18 && bulan==2)){
        return "AKUARIUS";
    }else if((tanggal>=19 && tanggal<=29 && bulan==2) || (tanggal>=1 && tanggal<=20 && bulan==3)){
        return "PISES";
    }else{
        return "-";
    }
}

int main(){
    int bulan, tanggal, tanggalMaks;
    
    cout << " ==============================================" << endl;
    cout << " | PROGRAM CEK ZODIAK                         |" << endl;
    cout << " ==============================================" << endl;
    cout << " | 1. Januari     5. Mei         9. September |" << endl;
    cout << " | 2. Februari    6. Juni        10. Oktober  |" << endl;
    cout << " | 3. Maret       7. Juli        11. November |" << endl;
    cout << " | 4. April       8. Agustus     12. Desember |" << endl;
    cout << " ==============================================" << endl << endl;
    
    cout << " ----------------------------------------------" << endl;
    do{
        cout << " Bulan kelahiran Anda? (1-12)   : "; cin >> bulan;
    }while(bulan<1 || bulan>12);
    cout << endl;
    
    tanggalMaks = getTanggalMaks(bulan);
    
    do{
        cout << " Tanggal kelahiran Anda? (1-" << tanggalMaks << ") : "; cin >> tanggal;
    }while(tanggal<1 || tanggal>tanggalMaks);
    cout << " ----------------------------------------------" << endl << endl;
    
    cout << " ==============================================" << endl;
    cout << " | HASIL PENGECEKAN                           |" << endl;
    cout << " ==============================================" << endl;
    cout << " | Tanggal lahir Anda : ";
    cout << setw(2) << setfill('0') << tanggal << ' ';
    cout << left << setw(19) << setfill(' ') << getNamaBulan(bulan) << "|" << endl;
    cout << " | Zodiak Anda        : ";
    cout << left << setw(22) << getNamaZodiak(tanggal, bulan) << "|" << endl;
    cout << " ==============================================" << endl;
    
    return 0;
}

Hasil:




Referensi:
  • https://id.wikipedia.org/wiki/Zodiak

Jumat, 29 November 2019

Segitiga Angka dan Bintang (analisis, algoritma, dan program C++)


Beberapa hari yang lalu saya lihat di salah satu grup C++ di Facebook ada yang posting mengenai permasalahan seperti pada gambar.

Baik, langsung kita bahas. Kalau kita lihat pada gambar, kita dapat petunjuk seperti berikut:
  • Setiap baris diawali dengan angka 1
  • Di akhir karakter tiap baris merupakan angka yang mewakili baris tersebut (baris kedua diakhiri dengan angka 2, baris ketiga diakhiri dengan angka 3, dan seterusnya)
  • Diantara angka awal dan angka akhir ada karakter bintang (1 bintang, 3 bintang, dan seterusnya)
Lalu bagaimana membuat algoritma untuk permasalahan tersebut?

Kita tahu bahwa permasalahan pada gambar tersebut membutuhkan perulangan bersarang (bahasa kerennya → nested loop) atau perulangan dalam perulangan. Perulangan yang luar untuk baris dan perulangan yang dalam untuk kolom atau bintangnya.

Kalau ada perulangan bersarang, kita pecahkan dulu masalah perulangan yang dalam atau kolomnya (dalam kasus ini untuk memecahkan masalah bintang).

Dari gambar, kita ambil beberapa baris untuk dianalisa agar ketemu rumus bintangnya. Misal kita ambil baris kedua (1*2) dan baris ketiga (1***3) lalu kita cari hubungannya, jika baris kedua maka bintangnya ada 1, jika baris ketiga maka bintangnya ada 3. Sudah ketemu? Kalau saya (mungkin rekan-rekan beda rumusnya), antara 2 dengan 1, dan 3 dengan 3 adalah 2*2-3 = 1 dan 3*2-3 = 3. Sehingga rumus yang di dapat adalah jumlahBintang = baris * 2 - 3. Sehingga algoritma yang saya dapat adalah:
jumlahBintang ← baris * 2 - 3
write('1')
for bintang ← 1 to jumlahBintang do
    write('*')
endfor
write(baris)

Kemudian kita lakukan tes pada algoritma di atas, kita coba dengan baris keempat:
jumlahBintang = 4 * 2 - 3
jumlahBintang = 5
Sehingga hasil tes algoritma di atas untuk baris keempat adalah 1*****4 (sesuai gambar).

Untuk lebih baiknya, kita lakukan tes dengan data minimal, maksimal, dan data tengah. Data tengah bisa kita pakai yang baris keempat tadi, dan hasilnya sesuai.

Untuk baris kelima:
jumlahBintang = 5 * 2 - 3
jumlahBintang = 7
Hasil tes : 1*******5 (sesuai gambar)

Untuk baris pertama:
jumlahBintang = 1 * 2 - 3
jumlahBintang = -1 (tidak ada bintang, karena perulangan naik dari 1 ke jumlahBintang)
Hasil tes : 11
Kok hasilnya tidak sesuai, pada gambar baris pertama kan hanya angka 1? maka kita bisa siasati dengan barisnya kita mulai dari baris kedua (terkait perulangan yang luar).

Perulangan yang luar (baris) adalah mulai dari baris 1 sampai dengan 5, tetapi karena pada tes algoritma perulangan dalam untuk baris=1 tidak sesuai, maka untuk perulangan luar kita buat mulai dari baris 2, sehingga perulangan luarnya seperti berikut:
for baris ← 2 to banyakBaris do
    ...
endfor

Tinggal kita masukkan algoritma perulangan yang dalam ke dalam perulangan luar, dan hasilnya:
for baris ← 2 to banyakBaris do
    jumlahBintang ← baris * 2 - 3
    write('1')
    for bintang ← 1 to jumlahBintang do
        write('*')
    endfor
    write(baris)
endfor

Ketika kita tes algoritma ini dengan banyakBaris = 5, hasilnya adalah:
1*2
1***3
1*****4
1*******5

Lho kok 1 yang paling atas hilang? Maka kita tambahkan di luar perulangan: write('1'), yang hasil algoritmanya:
write('1')
for baris ← 2 to banyakBaris do
    jumlahBintang ← baris * 2 - 3
    write('1')
    for bintang ← 1 to jumlahBintang do
        write('*')
    endfor
    write(baris)
endfor

Kalau banyakBarisnya mau dibuat dinamis (inputan dari user), maka kita tambah read(banyakBaris):
read(banyakBaris)
write('1')
for baris ← 2 to banyakBaris do
    jumlahBintang ← baris * 2 - 3
    write('1')
    for bintang ← 1 to jumlahBintang do
        write('*')
    endfor
    write(baris)
endfor

Ketika banyakBaris diisi 1, hasilnya:
1

Ketika banyakBaris diisi 3, hasilnya:
1
1*2
1***3

Ketika banyakBaris diisi 0, hasilnya:
1
Lha? Harusnya kan tidak muncul apapun kalau 0 baris? Maka kita beri kondisi setelah baca inputan dari user:
read(banyakBaris)
if(banyakBaris>0) then
    writeln('1')
    for baris ← 2 to banyakBaris do
        jumlahBintang ← baris * 2 - 3
        write('1')
        for bintang ← 1 to jumlahBintang do
            write('*')
        endfor
        writeln(baris)
    endfor
endif

Nah, sekarang kalau user input kurangdari 1 tidak akan muncul apapun.

Untuk program C++ nya seperti di bawah ini, ingat! algoritma yang saya buat ini tidak mesti sama dengan yang dibuat orang lain. Tetapi selama bisa menyelesaikan permasalahan yang ada.. why not?? Yang sudah buat tetapi beda algoritma, bolehlah corat-coret di kolom komentar gan, biar rame.. 

Source code:
#include <iostream>
//develop251.blogspot.com
using namespace std;

int main(){
    int banyakBaris;
    
    cout << "Masukkan banyak baris : "; cin >> banyakBaris;
    
    if(banyakBaris>0){
        cout << '1' << endl;
        
        for(int baris=2; baris<=banyakBaris; baris++){
            int jumlahBintang = baris * 2 - 3;
            
            cout << '1';
            
            for(int bintang=1; bintang<=jumlahBintang; bintang++){
                cout << '*';
            }
            
            cout << baris << endl;
        }
    }
    
    return 0;
}

Hasil: