aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--37_structs.zig59
-rw-r--r--38_structs2.zig53
-rw-r--r--README.md7
-rwxr-xr-xziglings6
4 files changed, 122 insertions, 3 deletions
diff --git a/37_structs.zig b/37_structs.zig
new file mode 100644
index 0000000..dd4b633
--- /dev/null
+++ b/37_structs.zig
@@ -0,0 +1,59 @@
+//
+// Being able to group values together lets us turn this:
+//
+// point1_x = 3;
+// point1_y = 16;
+// point1_z = 27;
+// point2_x = 7;
+// point2_y = 13;
+// point2_z = 34;
+//
+// into this:
+//
+// point1 = Point{ .x=3, .y=16, .y=27 };
+// point2 = Point{ .x=7, .y=13, .y=34 };
+//
+// The Point above is an example of a "struct" (short for "structure").
+// Here's how it could have been defined:
+//
+// const Point = struct{ x: u32, y: u32, z: u32 };
+//
+// Let's store something fun with a struct: a roleplaying character!
+//
+const std = @import("std");
+
+// We'll use an enum to specify the character class.
+const Class = enum{
+ wizard,
+ thief,
+ bard,
+ warrior,
+};
+
+// Please add a new property to this struct called "health" and make
+// it a u8 integer type.
+const Character = struct{
+ class: Class,
+ gold: u32,
+ experience: u32,
+};
+
+pub fn main() void {
+ // Please initialize Glorp with 100 health.
+ var glorp_the_wise = Character{
+ .class = Class.wizard,
+ .gold = 20,
+ .experience = 10,
+ };
+
+ // Glorp gains some gold.
+ glorp_the_wise.gold += 5;
+
+ // Ouch! Glorp takes a punch!
+ glorp_the_wise.health -= 10;
+
+ std.debug.print("Your wizard has {} health and {} gold.", .{
+ glorp_the_wise.health,
+ glorp_the_wise.gold
+ });
+}
diff --git a/38_structs2.zig b/38_structs2.zig
new file mode 100644
index 0000000..9a67c25
--- /dev/null
+++ b/38_structs2.zig
@@ -0,0 +1,53 @@
+//
+// Grouping values in structs is not merely convenient. It also allows
+// us to treat the values as a single item when storing them, passing
+// them to functions, etc.
+//
+// This exercise demonstrates how we can store structs in an array and
+// how doing so lets us print them all (both) using a loop.
+//
+const std = @import("std");
+
+const Class = enum{
+ wizard,
+ thief,
+ bard,
+ warrior,
+};
+
+const Character = struct{
+ class: Class,
+ gold: u32,
+ health: u8,
+ experience: u32,
+};
+
+pub fn main() void {
+ var chars: [2]Character = undefined;
+
+ // Glorp the Wise
+ chars[0] = Character{
+ .class = Class.wizard,
+ .gold = 20,
+ .health = 100,
+ .experience = 10,
+ };
+
+ // Please add "Zump the Loud" with the following properties:
+ //
+ // class bard
+ // gold 10
+ // health 100
+ // experience 20
+ //
+ // Feel free to run this program without adding Zump. What does
+ // it do and why?
+
+ // Printing all RPG characters in a loop:
+ for (chars) |c, num| {
+ std.debug.print("Character {} - G:{} H:{} XP:{}\n",
+ .{num+1, c.gold, c.health, c.experience});
+ }
+
+ std.debug.print("\n", .{});
+}
diff --git a/README.md b/README.md
index be0b269..61d02fb 100644
--- a/README.md
+++ b/README.md
@@ -11,9 +11,10 @@ project for the [Rust](https://www.rust-lang.org/) language.
## Intended Audience
-This will probably be quite difficult if you've _never_ programmed before.
-However, no specific programming experience is required. And in particular,
-you are _not_ expected to know C or other "systems programming" language.
+This will probably be difficult if you've _never_ programmed before.
+But no specific programming experience is required. And in particular,
+you are _not_ expected to have any prior experience with "systems programming"
+or a "systems" level language such as C.
Each exercise is self-contained and self-explained. However, you're encouraged
to also check out these Zig language resources for more detail:
diff --git a/ziglings b/ziglings
index 93b6819..b328b81 100755
--- a/ziglings
+++ b/ziglings
@@ -68,6 +68,10 @@ function check_it {
fi
}
+# I've chosen to explicitly number AND list each exercise rather than rely
+# on sorting. Though it does mean manually renaming things to remove/insert,
+# it's worked out well so far because its explicit and foolproof.
+
check_it 01_hello.zig "Hello world" "Note the error: the source file has a hint for fixing 'main'."
check_it 02_std.zig "Standard Library"
check_it 03_assignment.zig "55 314159 -11" "There are three mistakes in this one!"
@@ -104,6 +108,8 @@ check_it 33_iferror.zig "2<4. 3<4. 4=4. 5>4. 6>4." "Seriously, what's the deal w
check_it 34_quiz4.zig "my_num=42" "Can you make this work?"
check_it 35_enums.zig "1 2 3 9 8 7" "This problem seems familiar..."
check_it 36_enums2.zig "#0000ff" "I'm feeling blue about this."
+check_it 37_structs.zig "Your wizard has 90 health and 25 gold."
+check_it 38_structs2.zig "Character 2 - G:10 H:100 XP:20"
echo
echo " __ __ _ "