Soal Pengenalan Algoritma dan Pemrograman (6)

Soal 6/8

Tugas AO Computer Science

Dari delapan soal yang diberikan, semuanya meminta kita untuk mencetak output angka atau karakter lainnya dengan susunan/pola menyerupai bangun datar.

Soal Pengenalan Algoritma dan Pemrograman #6

Format masukan berupa sebuah bilangan ganjil N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah,
dengan panjang keluaran secara horizontal harus memenuhi lebar layar output secara dinamis (asumsikan lebar layar default CMD yaitu 80).

6

Berikut ini solusi untuk soal di atas :

#include <stdio.h>
#include <stdlib.h>
 
int main(){
    int N;
    int lebarBufferCMD;
 
    scanf("%d", &N);
    N /= 2;

    for(int a = -N; a <= N; a++){
        lebarBufferCMD = 79;
        for(int b = -N; b <= N; b++){
            if(lebarBufferCMD == 0) break;
            if(abs(a) == abs(b)) printf("x"); else printf(" ");
            if(b == N) b = -N;
            --lebarBufferCMD;
        }
        printf("\n");
    }
}

Penjelasan :

Soal menentukan bahwa input bilangan harus ganjil agar polanya lebih rapi, jadi kita akan mengakalinya dengan operasi pembagian. Cara ini dapat dimanfaatkan karena pembagian bilangan bulat pada C++ akan menghasilkan bilangan bulat juga dengan pembulatan ke bawahSehingga input bilangan genap atau ganjil misal (4 atau 5) akan diartikan sama oleh program.

Sebelum masuk ke for-loop, untuk soal ini diperlukan sebuah variabel tambahan.

Variabel lebarBufferCMD digunakan untuk membatasi banyak karakter yang dicetak pada tiap baris dengan mengisi variabel ini seusai lebar layar output.(salah satu solusi untuk memenuhi aturan soal yang meminta kita untuk mengisi penuh lebar layar output).

Pada baris 10, kita menginisialisasikan setiap nilai dari variabel lebarBufferCMD dengan nilai jumlah karakter yang dapat ditampung oleh lebar layar output (dalam kasus ini 80 berarti kita masukkan nilai 79, bukan 80 karena kita harus menyisihkan 1 karakter terakhir yang terisi otomatis oleh sistem pada saat run-time).

Untuk for-loop pada baris 9 dan 11, yang berindeks digunakan untuk mewakili banyaknya baris yang akan dicetak (mulai dari -N hingga +N), sedangkan yang berindeks digunakan untuk mewakili tiap karakter pada baris ke-a.

Bagian algoritma yang menyebabkan pola cetakan sesuai soal ini terletak pada baris 13, yaitu ketika nilai absolut dari indeks for-loop yang dan bernilai sama.

Pada baris 15, kita mengurangi nilai dari lebarBufferCMD agar kita dapat mengetahui kapan untuk berhenti mencetak (perhatikan statement break; pada baris 12) dan pindah baris ketika lebar layar output telah terpenuhi. 

Pada baris 17, kita hanya mengubah nilai dari indeks menjadi -N agar for-loop tidak berhenti sebelum lebar layar output terpenuhi (hingga kondisi pada baris 12 menjadi true).