From 7944d22725b661bcf37bddb21856c38a2ec33a86 Mon Sep 17 00:00:00 2001 From: slowy07 Date: Wed, 6 Dec 2023 14:57:03 +0700 Subject: [PATCH] feat: menambahkan algoritma faktorial - menambahkan dokumentasi CONTRIBUTING Signed-off-by: slowy07 --- CONTRIBUTING.md | 41 +++++++++++++++++++++++++++++++++++++++++ README.md | 1 - build.zig | 10 ++++++++++ math/faktorial.zig | 33 +++++++++++++++++++++++++++++++++ runtest.sh | 1 + 5 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 math/faktorial.zig diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dffe98a..7b63453 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -62,6 +62,47 @@ zig fmt --check . zig test namaFile.zig ``` +## memasukkan file testing ke dalam ``build.zig`` + +kamu bisa menambahkan beberapa contoh kode algoritma selain dari basic, tetapi kamu harus mengikuti beberapa langkah antara lain: +- contoh dari kode kamu memiliki testing seperti contoh + ```zig + const std = @import("std"); + + // fungsi untuk menghitung faktorial secara rekursif + fn faktorialRekursif(comptime T: type, n: T) T { + if (n < 2 and n > 0) return 1 else return n * faktorial(T, n - 1); + } + + // testing faktorial rekursif + test "faktorial rekursif" { + try std.testing.expectEqual(@as(c_int, 720), faktorialRekursif(u64, 7)); + try std.testing.expectEqual(@as(u64, 5040), faktorialRekursif(u64, 7)); + } + ``` + memiliki testing yang dapat mengetest dari fungsi tersebut +- kemudian menempatkan struktur folder benar sebagai contoh + ``` + ├── math + │ ├── faktorial.zig + ``` +- kemudian masukan hasil yang sudah kamu buat ke dalam file ``build.zig`` agar melakukan testing semua file test + ```zig + if (std.mem.eql(u8, op, "kategori/nama_algo")) + buat_algo(b, .{ + .optimize = optimize, + .target = target, + .name = "nama_file_yang_kamu_tambahkan.zig", + .category = "nama_folder", + }) + ``` +- kemudian kamu bisa menambahkan running testingnya pada ``runtest.sh`` dengan menambahkan + ```sh + # runtest.sh + $ZIG_TEST_COMMAND -Dalgoritma=folder/nama_algo $argumen + ``` + + # *Pull Request* ***Pull request* yang baik** diff --git a/README.md b/README.md index 5204199..d457b66 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@

Part of Bellshade Project, managed by WPU Discord Community and Kelas terbuka Discord Community
- WPU Community is the fastest growing software developer forum initiated by Mr. Sandhika Galih and Mr. Faqihza Mukhlish

Repositori ini berisi kumpulan berbagai macam _source code_ struktur data, algorithm, analisis matematika, serta tutorial yang diimplementasikan dengan menggunakan bahasa pemograman Zig diff --git a/build.zig b/build.zig index 8b12d3b..2d932c5 100644 --- a/build.zig +++ b/build.zig @@ -17,6 +17,16 @@ pub fn build(b: *std.Build) void { .name = "gcd.zig", .category = "math", }); + + // memilih folder berdasarkan opsi algoritma + // jika opsi adalah 'math/faktorial' maka fungsi buat_algo dipanggil untuk membuat algoritma faktorial + if (std.mem.eql(u8, op, "math/faktorial")) + buat_algo(b, .{ + .optimize = optimize, + .target = target, + .name = "faktorial.zig", + .category = "math", + }); } // fungsi untuk membangun algoritma berdasarkan informasi yang diberikan diff --git a/math/faktorial.zig b/math/faktorial.zig new file mode 100644 index 0000000..349ecd7 --- /dev/null +++ b/math/faktorial.zig @@ -0,0 +1,33 @@ +const std = @import("std"); + +// fungsi untuk menghitung faktorial secara iteratif +fn faktorial(comptime T: type, n: T) T { + var hasil: T = @as(T, 1); + var i: T = @as(T, 2); + while (i <= n) : (i += 1) hasil *= i; + return hasil; +} + +// fungsi untuk menghitung faktorial secara rekursif +fn faktorialRekursif(comptime T: type, n: T) T { + if (n < 2 and n > 0) return 1 else return n * faktorial(T, n - 1); +} + +// fungsi untuk menghitung faktorial pada waktu kompilasi +pub fn faktorialWaktuKompilasi(comptime T: type, n: T) T { + comptime var i = @as(T, 0); + inline while (i < 12) : (i += 1) if (i == n) return comptime faktorial(T, i); + return 1; +} + +// testing untuk menguji fungsi faktorial pada saat kompilasi +test "faktorial pada waktu kompilasi" { + try std.testing.expectEqual(@as(u32, 120), faktorialWaktuKompilasi(u32, 5)); + try std.testing.expectEqual(@as(usize, 362880), faktorialWaktuKompilasi(usize, 9)); +} + +// testing faktorial rekursif +test "faktorial rekursif" { + try std.testing.expectEqual(@as(c_int, 720), faktorialRekursif(c_int, 6)); + try std.testing.expectEqual(@as(u64, 5040), faktorialRekursif(u64, 7)); +} diff --git a/runtest.sh b/runtest.sh index e316e03..7cb36c2 100644 --- a/runtest.sh +++ b/runtest.sh @@ -18,4 +18,5 @@ argumen='--summary all -freference-trace' # lakukan testing salah satu folder dengan menggunakan perintah # yang sudah dibuat $ZIG_TEST_COMMAND -Dalgoritma=math/gcd $argumen +$ZIG_TEST_COMMAND -Dalgoritma=math/faktorial $argumen