From 507355ec3b1066c707e19816b86ac1fb56fc0385 Mon Sep 17 00:00:00 2001 From: Dave Gauer Date: Sat, 6 Feb 2021 15:54:56 -0500 Subject: [PATCH] Added ex. 37,38 structs --- 37_structs.zig | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 38_structs2.zig | 53 ++++++++++++++++++++++++++++++++++++++++++++ README.md | 7 +++--- ziglings | 6 +++++ 4 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 37_structs.zig create mode 100644 38_structs2.zig 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 " __ __ _ "