// // The output on the console looks a bit rudimentary at first glance. // However, if you look at the development of modern computers, you can // see the enormous progress that has been made over the years. // Starting with monochrome lines on flickering CRT monitors, modern // terminal emulators offer a razor-sharp image with true color and // nearly infinite font size thanks to modern hardware. // // In addition, they have mastered ligatures and can represent almost // any character in any language. This also makes the output of programs // on the console more atractive than ever in recent years. // // This makes it all the more important to format the presentation of // results in an appealing way, because that is what users appreciate, // quick visual comprehension of the information. // // C has set standards here over the years, and Zig is preparing to // follow suit. Currently, however, it still lags a bit behind the model, // but the Zig community is working diligently behind the scenes on // further options. // // Nevertheless, it is time to take a closer look at the possibilities // that already exist. And of course we will continue this series loosely, // because Zig continues to grow almost daily. // // Since there is no proper documentation on the formatting yet, the most // important source here is the source code: // // https://github.com/ziglang/zig/blob/master/lib/std/fmt.zig#L29 // // // And in fact, you already discover quite a lot of useful formatting. // These can be used in different ways, e.g. to convert numerical values // into text and for direct output to the console or to a file. The latter // is useful when large amounts of data are to be processed by other programs. // // However, we are concerned here exclusively with the output to the console. // But since the formatting instructions for files are the same, what you // learn applies universally. // // Since we basically write to debug output in Ziglings, our output usually // looks like this: // // std.debug.print("Text {placeholder} another text \n", .{variable}); // // But how is the statement just shown formatted? // // This actually happens in several stages. On the one hand, escape // sequences are evaluated, there is the "\n" which means "line feed" // in the example. Whenever this statement is found, a new line is started // in the output. Escpape sequences can also be written one after the // other, e.g. "\n\n" will cause two line feeds. // // By the way, these formattings are passed directly to the terminal // program, i.e. escape sequences have nothing to do with Zig in this // respect. The formatting that Zig actually performs is found in the // curly bracket, the "placeholder", and affects the coresponding variable. // // And this is where it gets exciting, because numbers can have different // sizes, be positive or negative, with a decimal point or without, // and so on. // // In order to bring these then into a uniform format for the output, // instructions can be given to the placeholder: // // print("=> {x:0>4}", .{var}); // // This instruction outputs a hexadecimal number with leading zeros. // // => 0x0017 // // Let's move on to our exercise: we want to create a table that shows us // the multiplication of all numbers together from 1-15. So if you search // for the number '5' in the row and '4' in the column (or vice versa), // the result of '5 x 4 = 20' should be displayed there. // // const std = @import("std"); const print = std.debug.print; pub fn main() !void { // the max. size of the table const size = 15; // print the header: // // we start with a single 'X' for the diagonal, // that means there is no result print("\n X |", .{}); // header row with all numbers from 1 to size for (0..size) |n| { print("{d:>3} ", .{n + 1}); } print("\n", .{}); // row line var n: u8 = 0; while (n <= size) : (n += 1) { print("---+", .{}); } print("\n", .{}); // now the actual table for (0..size) |a| { print("{d:>2} |", .{a + 1}); for (0..size) |b| { // what formatting is needed here? print("{???} ", .{(a + 1) * (b + 1)}); } // after each row we use double line feed print("\n\n", .{}); } }