Teknik Elektro LinksThermostat, Panel Bel, Board Mikro, Driver Relay.

Tutorial Pemrograman C: Bahasa C – Satu Bahasa Sejuta Cara

Tulisan ini pernah saya posting di blog Teknik Elektro Links dengan tampilan program versi Windows. Dan saya memutuskan untuk membaginya di blog Linux Forte dengan sedikit modifikasi agar sesuai dengan platform linux. Harapan saya semoga akan ada lebih banyak pembaca yang dapat mengambil manfaat dari tulisan ini.

C – Satu Bahasa Sejuta Cara

Terus-terang bingung juga menentukan judul yang cocok untuk postingan ini. Kelamaan mikir judul, akhirnya saya putuskan untuk memilih judul seperti di atas – Satu Bahasa Sejuta Cara. Memang agak berlebihan kesannya, tapi kira-kira begitulah kesan saya terhadap bahasa pemrograman C. Dengan bahasa C kita bisa menyelesaikan permasalahan pemrograman dengan banyak cara. Dengan C programmer bebas berekspresi dan membuat program sesuai dengan gayanya. Namun demikian bahasa C juga termasuk bahasa pemrograman yang sulit dikuasai. Jika tidak berhati-hati, programmer dapat dengan mudah membuat kesalahan atau bug tanpa disadari. Manajemen memori C harus dikerjakan secara manual, oleh karenanya harus ekstra hati-hati.

Saya adalah pengguna bahasa C. Saya lebih banyak menggunakan C daripada C++, baik untuk pemrograman komputer maupun mikrokontroler. Oleh karenanya, pada postingan ini semua program yang saya berikan menggunakan bahasa C. Namun demikian, karena C adalah subset dari C++, maka program-program yang saya berikan di sini juga valid untuk kompiler C++.

Bagaimana Membuat Program Dengan Tampilan Seperti Screenshot Di Atas?

Baiklah, kita langsung saja mencoba membuat program dengan tampilan seperti screenshot di atas.

Program I

Pada program pertama ini, kita akan menggunakan cara yang sederhana.

#include <stdio.h>
 
int main()
{
    int i, j, n;
    printf("Masukkan nilai n = ");
    scanf("%d", &n);
    for (i=1; i<=n; i++)
    {
        for (j=1; j<=i; j++) printf("%3d", i);
        for (j=1; j<=n-i; j++) printf("%3d", 0);
        printf("\n\n");
    }
    return 0;
}

Ketik dan simpan kode program di atas dengan nama file sejuta1.c dan lakukan kompilasi dengan perintah:

$ gcc -o sejuta1 sejuta1.c

Dan lakukan testing dengan mengeksekusinya menggunakan perintah:

$ ./sejuta1

Cara kompilasi dan eksekusi ini berlaku untuk program-program berikutnya dengan nama file yang disesuaikan, misalnya: sejuta2, sejuta3 seterusnya.

Program II

Sedikit modifikasi dari Program I dengan mengganti perulangan for dengan while.

#include <stdio.h>
 
int main()
{
    int i, j;
    int n;
 
    printf("Masukkan nilai n = ");
    scanf("%d", &n);
 
    i = 1;
    while (i<=n)
    {
        for (j=1; j<=i; j++) printf("%3d", i);
        for (j=1; j<=n-i; j++) printf("%3d", 0);
        printf("\n\n");
        i++;
    }
    return 0;
}

Program III

Masih menggunakan perulangan for dengan menambahkan pengkondisi if.

#include <stdio.h>
 
int main()
{
    int i, j;
    int n;
 
    printf("Masukkan nilai n = ");
    scanf("%d", &n);
 
    i = 1;
    for (i=1; i<=n; i++)
    {
        for (j=1; j<=n; j++)
            if (j<=i)
                printf("%3d", i);
            else
                printf("%3d", 0);
        printf("\n\n");
    }
    return 0;
}

Program IV

Tidak ada salahnya juga menggunakan variabel array seperti program berikut ini.

[code language="cpp"]
#include <stdio.h>
 
int main()
{
    int i, j, n;
    int mat[11][11];
     
    for (i=1; i<=10; i++)
        for (j=1; j<=10; j++)
            mat[i][j] = 0;
         
    printf("Masukkan nilai n = ");
    scanf("%d", &n);
     
    for (i=1; i<=n; i++)
        for (j=1; j<=i; j++) mat[i][j] = i;
 
    for (i=1; i<=n; i++)
    {
        for (j=1; j<=n; j++)
            printf("%3d", mat[i][j]);
        printf("\n\n");
    }
    return 0;
}
[/code]

Program V

Dan tidak ada larangan untuk membuat program yang sedikit rumit untuk menyelesaikan masalah yang mudah seperti program berikut ini.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    int i, j, n;
    char *s[25];
     
    printf("Masukkan nilai n = ");
    scanf("%d", &n);
     
    if (n<1 || n>9) exit(1);
     
    for (i=0; i<n; i++)
    {
        s[i] = (char *)calloc(n+1, sizeof(char));
        memset(s[i], '0', n);
        memset(s[i], '1'+i, i+1);
        for (j=0; s[i][j]; j++) printf("%3c", s[i][j]);
        printf("\n\n");
        free(s[i]);
    }
    return 0;
}

Untuk Program V ini akan saya berikan sedikit penjelasan mengenai bagaimana proses kerja programnya.

Variabel i dan j adalah variabel untuk index perulangan, sedangkan variabel n adalah variabel untuk menampung masukan nilai dari user. Variabel s adalah array pointer sebanyak 10. Cukup sepuluh karena kita akan membatasi masukan user tidak boleh lebih dari 9. Untuk membatasi masukan digunakan perintah if (n<1 || n>9) exit(1); Program akan exit jika user memasukkan nilai kurang-dari 1 atau lebih-dari 9. Jadi user harus memasukkan nilai bilangan bulat antara 1-9.

Pada perulangan for, perintah:

s[i] = (char *) calloc(n+1, sizeof(char));

akan mengalokasikan memori sebanyak n+1 dengan tipe char. Setelah perintah ini, maka sususan s[i] untuk n=8 adalah sebagai berikut:

index 0 1 2 3 4 5 6 7 8
s[i] null null null null null null null null null

Perintah selanjutnya, yakni:

memset(s[i], '0', n);

akan mengisi nilai s[i] dengan karakter ‘0’ sehingga susunan s[i] sekarang menjadi:

index 0 1 2 3 4 5 6 7 8
s[i] ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ null

Sekarang s telah menjadi null-terminated string bernilai “00000000”.

Perintah selanjutnya, yakni:

memset(s[i], ‘1’+i, i+1);

akan mengisi s[i] dengan karakter ‘1+i sebanyak i+1. Untuk i=0, maka karakter yang diisikan adalah ‘1’ sebanyak 1 karakter. Jadi untuk i=0, maka susunan s[0] adalah

index 0 1 2 3 4 5 6 7 8
s[0] ‘1’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ null

Untuk i=1, maka karakter yang diisikan adalah ‘2’ sebanyak 2 karakter, sehingga susunan karakter s[1] menjadi

index 0 1 2 3 4 5 6 7 8
s[1] ‘2’ ‘2’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ null

Dan seterusnya untuk s[2] hingga s[7] sehingga susunan karakter s[0]-s[7] menjadi

index 0 1 2 3 4 5 6 7 8
s[0] ‘1’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ null
s[1] ‘2’ ‘2’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ null
s[2] ‘3’ ‘3’ ‘3’ ‘0’ ‘0’ ‘0’ ‘0’ ‘0’ null
s[3] ‘4’ ‘4’ ‘4’ ‘4’ ‘0’ ‘0’ ‘0’ ‘0’ null
s[4] ‘5’ ‘5’ ‘5’ ‘5’ ‘5’ ‘0’ ‘0’ ‘0’ null
s[5] ‘6’ ‘6’ ‘6’ ‘6’ ‘6’ ‘6’ ‘0’ ‘0’ null
s[6] ‘7’ ‘7’ ‘7’ ‘7’ ‘7’ ‘7’ ‘7’ ‘0’ null
s[7] ‘8’ ‘8’ ‘8’ ‘8’ ‘8’ ‘8’ ‘8’ ‘8’ null

Selanjutnya, program akan membuat tampilan seperti screenshot di atas dengan menggunakan perintah:

for (j=0; s[i][j]; j++)
    printf("%3c", s[i][j]); dan printf(“\n\n”);

Perulangan j dimulai dari 0 hingga s[i][j] dengan penambahan j=j+1 pada setiap perulangan. Jika kita perhatikan, kondisi perulangan for j hanya ditulis s[i][j] tanpa operator pembanding.

Pertanyaan Menarik

Bagaimanakah kondisi s[i][j] yang tanpa operator pembanding seperti ==, <, atau > dapat menghentikan perulangan for j ?

Pada bahasa C, nilai logika FALSE direpresentasikan sebagai 0 (nol) dan selain nol akan dinyatakan sebagai logika TRUE. Jadi perulangan for j yang dimulai dari 0 dan akan terus diulang selama nilai s[i][j] tidak-sama-dengan nol. Inilah mengapa kita mengalokasikan sebanyak n+1 dan menginisialisasi setiap array-of-char dengan 0 (null).

Untuk lebih mudahnya, perulangan for j dapat ditulis menjadi for (j=0; s[i][j]!=0; j++) atau lebih mudah lagi menjadi for (j=0; j<n; j++).

Pada prakteknya, penulisan kode program yang rumit (less-readable) dipersilakan untuk kebutuhan pribadi, tapi sebaiknya tidak dipraktekkan pada kerja tim.

Jadi perulangan for j akan mencetak per karakter dari string s[i] dengan format “%3c” untuk memberikan jarak pada masing-masing karakter. Sedangkan printf(“\n\n”); berfungsi untuk memberi jarak baris pada masing-masing string.

Nah, saya rasa demikian penjelasan singkat untuk Program V. Dan saya rasa lima buah program cukup untuk mewakili judul di atas. Mungkin judul di atas perlu diganti menjadi Bahasa C, Satu Bahasa Lima Cara. Tapi sangat tidak menarik, bukan?

Semoga bermanfaat.

Add a Comment

Your email address will not be published. Required fields are marked *