Custom Search

03 Januari 2009

printf() :Bhg 3

Pos ni adalah sambungan dari printf() :Bhg 2


Pada bahagian kedua yang lepas, menunjukkan fungsi command printf() boleh mengawal format output sama ada perkataan ataupun nombor. Namun, apakah kegunaannya? Mungkin korang tak nampak lagi penggunaannya dan bila nak guna kawalan output pada fungsi printf(). Jadi sekarang kita akan lihat antara kegunaan kawalan format output bagi nombor perkataan dan nombor.

Kawalan jumlah titik perpuluhan

Korang pun dah tau contoh paling mudah ialah untuk kawal nilai output bagi nilai matawang. Contoh kalau korang reka program kira gaji pekerja, Ringgit Malaysia mestilah ada dua titik perpuluhan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Rujuk: 5.1,bahasa-c.blogspot.com
#include<stdio.h>
#include<stdlib.h>    // untuk gunakan command system("pause")

int main()
{
int hari;
double gaji, kadar;

kadar = 80.0;

printf("Masukkan bilangan hari bekerja dalam sebulan\n");
scanf("%d",&hari);
    gaji = hari * kadar;
    printf("\nJumlah gaji adalah RM%.2lf \n", gaji);  //perhatikan kod ni

system("pause");
return 0;
}

Output:

Kawalan ruang nombor

so macamana pulak dengan kawalan ruang untuk nombor atau perkataan dicetak? Ok, ruang diset untuk tujuan program kita nampak kemas. Selalunya yang melibatkan penyampaian dalam jadual. Contoh kalau program suruh kira nilai Y bagi setiap pertambahan 0.2 nilai X bagi persamaan Y = 9X4 + 5X - 7 bagi julat nilai 0.0 < X < 4.0 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//Rujuk: 5.2,bahasa-c.blogspot.com
#include<stdio.h>
#include<stdlib.h>    // untuk gunakan command system("pause")

int main()
{
double X, Y;

X = 0.0;

printf("   X         Y\n"
 "====================\n");

do
{
Y = 9*X*X*X*X + 5*X - 7;
printf(" %lf  %lf \n",X , Y); // perhatikan command ni
X = X + 0.2;
}
while( X < 4.0 );

printf("====================\n");

system("pause");
return 0;
}

Output:

Cuba perhatikan senarai nilai Y, nampak tak kemas kan? sebab tak straight. Macamana kalau nilai tu bertambah lagi drastik yang melibatkan jadual yang ada lagi banyak field contoh macam dalam gambar kat bawah nih:

Jadi untuk atasikan masalah nih kita setkan ruang untuk nombor secara tetap dan tidak akan mencacatkan jadual walaupun nilai nombor boleh bertambah digit demi digit:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//Rujuk: 5.3,bahasa-c.blogspot.com
#include<stdio.h>
#include<stdlib.h>    // untuk gunakan command system("pause")

int main()
{
double X, Y;

X = 0.0;

printf("   X         Y\n"
 "====================\n");

do
{
Y = 9*X*X*X*X + 5*X - 7;
printf(" %8.2lf  %8.2lf \n",X , Y); // perhatikan commannd ni
X = X + 0.2;
}
while( X < 4.0 );

printf("====================\n");

system("pause");
return 0;
}

Output:

Jadi kita boleh nampak hasil yang lebih kemas dan sedap mata memandang. Apa yang berbeza pada antara kod Rujuk 5.2 dengan Rujuk 5.3 ialah dalam statement printf() pada line ke-17 pada kedua-dua kod. Ungkapan %8.2lf bermaksud kita setkan ruang kotak sebanyak 8 dan nombor ada 2 titik perpuluhan. Dan bukan nombor je sebenarnya, untuk perkataan pun boleh dibuat benda yang sama. Try la sendiri.

Cetakkan nombor dalam format nombor piawai

Dah selesai satu masalah melibatkan pertambahan nombor bagi nombor yang dipapar secara jadual. Yeke? Are you sure? Sebenarnya tak. Tak semestinya. Benda ni bergantung pada program juga. Kelemahan yang ada pada kawalan ruang ialah kalau nombor yang hendak dioutput bilangan digitnya (termasuk titik perpuluhan) adalah melebihi ruang yang kita setkan. Contoh korang boleh tengok sendiri:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Rujuk: 5.4,bahasa-c.blogspot.com
#include<stdio.h>
#include<stdlib.h>    // untuk gunakan command system("pause")

int main()
{
printf("|%6.2lf| \n", 8.123);
printf("|%6.2lf| \n", 80.123);
printf("|%6.2lf| \n", 800.123);
printf("|%6.2lf| \n", 8000.123);
printf("|%6.2lf| \n", 80000.123);

system("pause");
return 0;
}

Output:

Korang nampakkan? So, sekarang ni macamana pulak? Kawalan ruang tu memang untuk nombor yang bertambah, tapi taklah nombor tu bertambah secara ekstrim. Contohnya kalau program melibatkan kira nilai Y bagi setiap pertambahan 0.2 nilai X bagi persamaan Y = 3 7X + 5X bagi julat nilai 0.0 < X < 4.0 . Kalau kita guna kaedah kawalan ruang untuk present jadual:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//Rujuk: 5.5,bahasa-c.blogspot.com
#include<stdio.h>
#include<stdlib.h>    // untuk gunakan command system("pause")
#include<math.h>      // untuk gunakan command pow()

int main()
{
double X, Y;

X = 0.0;

printf("   X         Y\n"
 "====================\n");

do
{
Y = pow( 3.0, 7*X) + 5*X - 7;
printf(" %8.2lf  %8.2lf \n",X , Y); // perhatikan commannd ni
X = X + 0.2;
}
while( X < 4.0 );

printf("====================\n");

system("pause");
return 0;
}

Output:

Memang kita boleh besarkan lagi kotak untuk nilai Y sampai nombor terakhir tu muat untuk fit dalam jadual tapi katakan la, kalau nombor tu besarnya makan ruang lebih dari 80 digit. Sebabnya default lebar output window adalah 80 digit. ( ini dah memang dasyat! tapi perkara nih memang kena consider! contoh orang yang selalu handle dengan nombor ekstrim adalah ahli fizik, astronomi, geologi, bla,bla..,sebab diorang pun guna programming dalam research diorang.).

Oleh itu, datanglah penyelesaian untuk mengendalikan nombor-nombor macam nih dengan formatkan nombor yamg keluar adalah nombor piawai. Contohnya:

  • 0.000000003245 ==> 3.245 x 10^(-9)
  • 0.0043 ==> 4.300 x 10^(-3)
  • 235.345 ==> 2.353 x 10^(2)
  • 12 400 000 000 000 ==> 1.240 x 10^(13)

Jadi mudahkan? sebab kalau kita tengok kelebihan jika nombor dipersembahkan secara nombor piawai, semua nombor mempunyai lebar ruang yang sama panjang. Dan jika variable yang digunakan bersifat double, nombor tersebut boleh menampung sehingga 1....x 10^(308). Dan cara C/C++ setkan nombor piawai pada output contohnya:

  • 3.234 x 10^4, menggunakan ungkapan %e, outputnya 3.234000e+004
  • 3.234 x 10^4, menggunakan ungkapan %.2e, outputnya 3.23e+004
  • 3.234 x 10^4, menggunakan ungkapan %.5E, outputnya 3.23400E+004
  • 2.650 x 10^( -7 ), menggunakan ungkapan %.8e, outputnya 2.65000000e-007
  • -3.45 x 10^( 12), menggunakan ungkapan %.2e, outputnya -3.45e+012

Simbol tambah (+) selepas e menunjukkan nilai positif bagi kuasa. Jadi penyelesaian bagi kod Rujuk 5.5 alah pada Rujuk 5.6:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//Rujuk: 5.6,bahasa-c.blogspot.com
#include<stdio.h>
#include<stdlib.h>    // untuk gunakan command system("pause")
#include<math.h>      // untuk gunakan command pow()

int main()
{
double X, Y;

X = 0.0;

printf("       X              Y\n"
 "=============================\n");

do
{
Y = pow( 3.0, 7*X) + 5*X - 7;
printf(" %13.3e  %13.3e \n",X , Y); // perhatikan commannd ni
X = X + 0.2;
}
while( X < 4.0 );

printf("=============================\n");

system("pause");
return 0;
}

Output:

Kemunculan tanda positif pada nombor positif

Kita perhatikan kalau nombor positif memang tak ditunjukkan tanda positif pun, termasuk dalam kehidupan seharian, cuma nombor negatif je. Jadi apa yang bagusnya nombor positif ditunjukkan tanda positifnya? Ha.... memang ada kegunaannya, kalau tidak buat apa orang reka kan? Jadi kita amik contoh program yang boleh menambah hasil dua nombor kompleks:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//Rujuk: 5.7,bahasa-c.blogspot.com
#include<stdio.h>
#include<stdlib.h>    // untuk gunakan command system("pause")

int main()
{
double real1, real2, ima1, ima2, real, ima;

printf("Masukkan nilai nyata nombor pertama:");
scanf("%lf",&real1);
printf("Masukkan nilai ilusi nombor pertama:");
scanf("%lf",&ima1);
printf("Masukkan nilai nyata nombor kedua:");
scanf("%lf",&real2);
printf("Masukkan nilai ilusi nombor kedua:");
scanf("%lf",&ima2);

real = real1 + real2;
ima = ima1 + ima2;

printf("Hasil tambah dua nombor adalah:\n\n");
printf("%   .2lf %+.2lfi \n\n", real, ima); //perhatikan command nih

system("pause");
return 0;
}

Output:

Perhatikan statement printf() pada line 22, ada %+.2lf kan? jadi kegunaannya kalau nilai bagi ima tu negatif akan ditunjukkan tanda negatif (ni memang lah) dan kalau nilai positif pun akan ditunjukkan tanda positif. Kan? try la copy dan run kan pada software C/C++ korang. Dan ini salah satunye lah, mungkin ada lagi kegunaanya saya pun tak tahu. Kepada yang tahu tu , ataupun ada apa-apa nak tambah lagi dalam petikan ni haaa. bolehla komenkan kat bawah kita share sama-sama.OK?


Pos ni adalah sambungan dari printf() :Bhg 2

Topik berkaitan: printf() :Bhg 1

1 ulasan:

  1. assalamualaikum.. emmm post ni dh lama . tpi bole tk sy nk email/ wasap encik? sy sngt bermint nk belja.. pliss. harap encik bce komen ni.

    BalasPadam