Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: menambahkan algoritma faktorial #9

Merged
merged 2 commits into from
Dec 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/zig.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ jobs:
run: sh runtest.sh

- name: testing kode zig di windows
if: (startsWith(matrix.runs-on, 'windows')
if: (startsWith(matrix.runs-on, 'windows'))
run: ./runtest.cmd

linting-kode-zig:
Expand Down
41 changes: 41 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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**
Expand Down
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<p align="center">
Part of Bellshade Project, managed by <a href="http://discord.gg/S4rrXQU"> WPU Discord Community</a> and <a href="https://discord.gg/eavqxxTU"> Kelas terbuka Discord Community</a> <br>
WPU Community is the fastest growing software developer forum initiated by <a href="https://www.youtube.com/c/WebProgrammingUNPAS"> Mr. Sandhika Galih</a> and <a href="https://github.com/faqihza"> Mr. Faqihza Mukhlish <br>
</p>

Repositori ini berisi kumpulan berbagai macam _source code_ struktur data, algorithm, analisis matematika, serta tutorial yang diimplementasikan dengan menggunakan bahasa pemograman Zig
Expand Down
10 changes: 10 additions & 0 deletions build.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
33 changes: 33 additions & 0 deletions math/faktorial.zig
Original file line number Diff line number Diff line change
@@ -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));
}
1 change: 1 addition & 0 deletions runtest.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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