Browse Source

Added ex 19,20 functions and pop quiz

Dave Gauer 4 years ago
parent
commit
08ec029f20
5 changed files with 82 additions and 4 deletions
  1. 5 1
      18_functions.zig
  2. 28 0
      19_functions2.zig
  3. 45 0
      20_quiz3.zig
  4. 2 2
      README.md
  5. 2 1
      ziglings

+ 5 - 1
18_functions.zig

@@ -12,7 +12,11 @@ pub fn main() void {
 
 //
 // We're just missing a couple things here. One thing we're NOT missing is the
-// keyword 'pub', which is not needed here. Can you guess why?
+// keyword "pub", which is not needed here. Can you guess why?
+//
+// Functions need to specify the type of value they return. The main() function
+// above has a special return type "void", which means it returns nothing. This
+// function returns something. What might that be?
 //
 ??? deepThought() ??? {
     return 42; // Number courtesy Douglas Adams

+ 28 - 0
19_functions2.zig

@@ -0,0 +1,28 @@
+//
+// Now let's use a function that takes a parameter.
+//
+const std = @import( "std" );
+
+pub fn main() void {
+    std.debug.print("Powers of two: {} {} {} {}\n", .{
+        twoToThe(1),
+        twoToThe(2),
+        twoToThe(3),
+        twoToThe(4),
+    });
+}
+
+//
+// Oops! We seem to have forgotten something here. Function
+// parameters look like this:
+//
+//   fn myFunction( number: u8, is_lucky: bool ) {
+//       ...
+//   }
+//
+// As you can see, we declare the type of the parameter, just
+// like we declare the types of variables, with a colon ":".
+//
+fn twoToThe(???) u32 {
+    return std.math.pow(u32, 2, my_number);
+}

+ 45 - 0
20_quiz3.zig

@@ -0,0 +1,45 @@
+//
+// Let's see if we can make use of some of things we've learned so far.
+// We'll create two functions: one that contains a "for" loop and one
+// that contains a "while" loop.
+//
+// Both of these are simply labeled "loop" below.
+//
+const std = @import( "std" );
+
+pub fn main() void {
+    const my_numbers = [4]u16{ 5,6,7,8 };
+
+    printPowersOfTwo(my_numbers);
+    std.debug.print("\n", .{});
+}
+
+//
+// You won't see this every day: a function that takes an array with
+// exactly four u16 numbers. This is not how you would normally pass
+// an array to a function. We'll learn about slices and pointers in
+// a little while. For now, we're using what we know.
+//
+// This function prints, but does not return anything.
+//
+fn printPowersOfTwo(numbers: [4]u16) ??? {
+    loop (numbers) |n| {
+        std.debug.print("{} ", .{twoToThe(n)});
+    }
+}
+
+//
+// This function bears a striking resemblance to twoToThe() in the last
+// exercise. But don't be fooled! This one does the math without the aid
+// of the standard library!
+//
+fn twoToThe(number: u16) ??? {
+    var n: u16 = 0;
+    var total: u16 = 1;
+
+    loop (n < number) : (n += 1) {
+        total *= 2;
+    }
+
+    return ???;
+}

+ 2 - 2
README.md

@@ -65,9 +65,9 @@ Planned exercises:
 * [x] If
 * [x] While
 * [x] For
-* [ ] Functions
-* [ ] Defer
+* [x] Functions
 * [ ] Errors
+* [ ] Defer
 * [ ] Switch
 * [ ] Runtime safety
 * [ ] Unreachable

+ 2 - 1
ziglings

@@ -68,7 +68,6 @@ function check_it {
     fi
 }
 
-
 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!"
@@ -87,6 +86,8 @@ check_it 15_for.zig "A Dramatic Story: :-)  :-)  :-(  :-|  :-)  The End."
 check_it 16_for2.zig "13"
 check_it 17_quiz2.zig "8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16" "This is a famous game!"
 check_it 18_functions.zig "Question: 42" "Can you help write the function?"
+check_it 19_functions2.zig "2 4 8 16"
+check_it 20_quiz3.zig "32 64 128 256" "Unexpected pop quiz! Help!"
 
 echo
 echo "    __   __          _ "