{"id":2997,"date":"2023-07-31T01:19:45","date_gmt":"2023-07-31T05:19:45","guid":{"rendered":"https:\/\/www.yorku.ca\/professor\/drsmith\/?p=2997"},"modified":"2023-08-11T18:12:44","modified_gmt":"2023-08-11T22:12:44","slug":"automated-student-evaluations-in-c-part-1","status":"publish","type":"post","link":"https:\/\/www.yorku.ca\/professor\/drsmith\/2023\/07\/31\/automated-student-evaluations-in-c-part-1\/","title":{"rendered":"Automated Student Evaluations in C (Part 1)"},"content":{"rendered":"\n<p>As with the Matlab and Java versions of this, I'm working on creating a set of C language exercises that can be assigned to students in an automated way, like on eClass (Moodle) using Virtual Programming Lab or the \"lab test mode\" that we use in the EECS department at York University.  Here, I'm focusing on providing a flowchart to students and asking them to replicate it. <\/p>\n\n\n\n<p>This page describes a proof of concept in which a professor or TA could set up flow chart examples for students to implement.  This was developed on Windows using the JetBrains CLion IDE, targetting C11 using cmake (internally).  As with the Java and Matlab versions of this, the flowcharts are in ASCII art and come from the Diagon project. <\/p>\n\n\n\n<p>I use the Unity unit-testing framework for this.  I posted a simple version here: <a href=\"https:\/\/www.yorku.ca\/professor\/drsmith\/2021\/08\/10\/vpl-simple-c-assignment-with-unit-testing\/\">VPL: Simple C Assignment with Unit Testing<\/a>.<\/p>\n\n\n\n<p>The following files are required:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>main.c (put in the source directory)<\/li><li>StudentSolution.c and .h (put in the source directory)<\/li><li>TeacherReferenceSolutions.c and .h (put in the source directory)<\/li><li>diagon_flowcharts.txt (put in the compile directory)<\/li><li>The unit test framework from <a href=\"https:\/\/github.com\/ThrowTheSwitch\/Unity\/tree\/master\/src\">GitHub<\/a>: <a href=\"https:\/\/github.com\/ThrowTheSwitch\/Unity\/blob\/master\/src\/unity.c\">unity.c<\/a>, <a href=\"https:\/\/github.com\/ThrowTheSwitch\/Unity\/blob\/master\/src\/unity.h\">unity.h<\/a>, as well as <a href=\"https:\/\/github.com\/ThrowTheSwitch\/Unity\/blob\/master\/src\/unity_internals.h\">unity_internals.h<\/a>  (all put in the source directory)<\/li><\/ul>\n\n\n\n<p>Here is <mark class=\"kt-highlight\">main.c<\/mark>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;stdio.h&gt;\n#include \"TeacherReferenceSolutions.h\"\n#include \"StudentSolution.h\"\n#include \"unity.h\"\n#include \"unity_internals.h\"\n#include &lt;stdlib.h&gt;\n#include &lt;wchar.h&gt;   \/\/ for printing characters to console...\n#include &lt;windows.h&gt; \/\/ for printing characters to console when in CLion \/ Windows.  Don't need in VPL \/ Linux.\n#include &lt;stdint.h&gt;\n#include &lt;time.h&gt; \/\/ for randomization.\n\n\/* references:\n * file location: https:\/\/stackoverflow.com\/questions\/31495311\/clion-c-cant-read-open-txt-file-in-project-directory\n * add these two b\/c https:\/\/github.com\/ThrowTheSwitch\/Unity\/blob\/master\/docs\/UnityGettingStartedGuide.md\n * and https:\/\/stackoverflow.com\/questions\/61114392\/linker-error-with-unity-c-unit-testing-framework\n * eclass example: https:\/\/eclass.yorku.ca\/mod\/vpl\/forms\/executionfiles.php?id=876284\n\n *\n * *\/\n\/* Manual testing.\n * Test solution 1 (index 0)  -&gt; 6 Test passed.  Flowchart: good (one). 2: ?  3: fail (good)  4: fail (good)\n * Test solution 2 (index 1)  -&gt; 6 Tests passed  Flowchart: good (two). 1: failed (good) 2: passed. (good)  3: failed (good) 4: fail (good)\n * Test solution 3 (index 2). -&gt; 6 tests passed  Flowchart: good (three). 1: failed (good) 2: failed (good) 3: passed (good) 4: fail (good)\n * Test solution 4 (index 3). -&gt; 6 tests passed Flowchart: good (four). 1: failed (good) 2: failed (good) 3: failed (good) 4: passed (good)\n *\/\n\n\n\/\/ Define the flowchart file name.\n#define FLOWCHARTFILE \"diagon_flowcharts.txt\" \/\/ needs to be in the directory where compiling happens.\n\/\/ define the six pairs of inputs for the six unit tests.\n#define TEST1_INPUT1 5                      \/\/ Unit test 1 inputs\n#define TEST1_INPUT2 4\n#define TEST2_INPUT1 7                      \/\/ Unit test 2 inputs\n#define TEST2_INPUT2 9\n#define TEST3_INPUT1 100                    \/\/ Unit test 3 inputs\n#define TEST3_INPUT2 52\n#define TEST4_INPUT1 1                      \/\/ Unit test 4 inputs\n#define TEST4_INPUT2 2\n#define TEST5_INPUT1 67                     \/\/ Unit test 5 inputs\n#define TEST5_INPUT2 23\n#define TEST6_INPUT1 1231                   \/\/ Unit test 6 inputs\n#define TEST6_INPUT2 10231\n\n\/* In a global context,\n * Define a function pointer type for functions that take two int32_t and return an int32_t\n * *\/\ntypedef int32_t (*referenceSolutions)(int32_t, int32_t);\n\/\/ Add more functions in the array if there are more... and align with TeacherReferenceSoloutions.c and diagon_flowcharts.txt\nreferenceSolutions teacherFunctions_g[] = {function1, function2, function3, function4};\nint32_t teacherFuncIndex_g = 0;\n\n\nvoid setUp(void){\n    \/\/ set stuff up here\n}\n\nvoid tearDown(void){\n    \/\/ clean stuff up here.\n}\n\n\n\/* Define Test 1: test the student function against the teacher function for inputs 5 and 3. *\/\nvoid test1(){\n    \/\/ The specific test types are found in unity.h\n    TEST_ASSERT_EQUAL_INT32(teacherFunctions_g[teacherFuncIndex_g](TEST1_INPUT1,TEST1_INPUT2), studentMethod(TEST1_INPUT1,TEST1_INPUT2));     \/\/ expected out vs. input\n}\n\n\/* Define Test 2: test the student function against the teacher function for inputs 7 and 9. *\/\nvoid test2(){\n    \/\/ The specific test types are found in unity.h\n    TEST_ASSERT_EQUAL_INT32(teacherFunctions_g[teacherFuncIndex_g](TEST2_INPUT1,TEST2_INPUT2), studentMethod(TEST2_INPUT1,TEST2_INPUT2));     \/\/ expected out vs. input\n}\n\n\/* Define Test 3: test the student function against the teacher function for inputs 100 and 52. *\/\nvoid test3(){\n    \/\/ The specific test types are found in unity.h\n    TEST_ASSERT_EQUAL_INT32(teacherFunctions_g[teacherFuncIndex_g](TEST3_INPUT1,TEST3_INPUT2), studentMethod(TEST3_INPUT1,TEST3_INPUT2));     \/\/ expected out vs. input\n}\n\n\/* Define Test 4: test the student function against the teacher function for inputs 1 and 2. *\/\nvoid test4(){\n    \/\/ The specific test types are found in unity.h\n    TEST_ASSERT_EQUAL_INT32(teacherFunctions_g[teacherFuncIndex_g](TEST4_INPUT1,TEST4_INPUT2), studentMethod(TEST4_INPUT1,TEST4_INPUT2));     \/\/ expected out vs. input\n}\n\n\/* Define Test 5: test the student function against the teacher function for inputs 67 and 23. *\/\nvoid test5(){\n    \/\/ The specific test types are found in unity.h\n    TEST_ASSERT_EQUAL_INT32(teacherFunctions_g[teacherFuncIndex_g](TEST5_INPUT1,TEST5_INPUT2), studentMethod(TEST5_INPUT1,TEST5_INPUT2));     \/\/ expected out vs. input\n}\n\n\/* Define Test 6: test the student function against the teacher function for inputs 1231 and 10231. *\/\nvoid test6(){\n    \/\/ The specific test types are found in unity.h\n    TEST_ASSERT_EQUAL_INT32(teacherFunctions_g[teacherFuncIndex_g](TEST6_INPUT1,TEST6_INPUT2), studentMethod(TEST6_INPUT1,TEST6_INPUT2));     \/\/ expected out vs. input\n}\n\n\n\n\/\/ Run the tests...\nint main(void)\n{\n\n    char *search_start_string = \"% ----- start ----\";\n    char *search_end_string = \"% ----- end ----\";\n    int32_t  numberOfStarts = 0;\n    int32_t  numberOfEnds = 0;\n    int32_t indexSpecificFlowchart = 0;\n    int32_t indexFlowchartTemp = 0;\n    int32_t specificFlowchartStart = 0;\n    int32_t specificFlowchartEnd = 0;\n    int32_t indexDrawFlowchart = 0;\n\n\n  \/* to-do: need to implement a method for choosing the flowchart and showing it to the student.\n   *\n   * -&gt; scan the diagon_flowcharts file to figure out the number of flowcharts\n   * -&gt; choose the index for the reference solution here.  Base it on the size of the teacher solution array.\n   * -&gt; print the flowchart here.\n   * *\/\n\n\n    \/* Set console code page to UTF-8 so console knows how to  UTF8 string data\n     * and Enable buffering to prevent VS from chopping up UTF-8 byte sequences\n     * From \/\/https:\/\/stackoverflow.com\/questions\/45575863\/how-to-print-utf-8-strings-to-stdcout-on-windows *\/\n    \/\/ Set console code page to UTF-8 so console known how to interpret string data\n    SetConsoleOutputCP(CP_UTF8);\n\n    \/\/ Enable buffering to prevent VS from chopping up UTF-8 byte sequences\n    setvbuf(stdout, NULL, _IOFBF, 1000);\n\n    \/\/ load flowchart from the directory in which the compiling happens.\n    FILE *file = fopen(FLOWCHARTFILE, \"r\");\n    if (file == NULL) {\n        printf(\"Error opening file\\n\");\n        return 1;\n    }\n\n    fseek(file, 0, SEEK_END);\n    long length = ftell(file);\n    fseek(file, 0, SEEK_SET);\n\n    char *buffer = malloc(length + 1);\n    if (buffer == NULL) {\n        printf(\"Error allocating memory\\n\");\n        fclose(file);\n        return 1;\n    }\n\n\n    fread(buffer, 1, length, file);\n    buffer[length] = '\\0';\n\n    \/\/printf(\"%s\\n\", buffer);\n\n    \/\/ Find all the \"starts\" in the flowchart file.\n    char *ptr1 = strstr(buffer, search_start_string);\n    while ((ptr1 = strstr(ptr1, search_start_string)) != NULL) {\n        int index = ptr1 - buffer;\n        \/\/printf(\"Index of '%s': %d\\n\", search_start_string, index);\n        ptr1 += strlen(search_start_string);\n        numberOfStarts = numberOfStarts +1;\n    }\n\n    \/\/ Find all the \"ends\" in the flowchart file.\n    char *ptr2 = strstr(buffer, search_end_string);\n    while ((ptr2 = strstr(ptr2, search_end_string)) != NULL) {\n        int index = ptr2 - buffer;\n        \/\/printf(\"Index of '%s': %d\\n\", search_end_string, index);\n        ptr2 += strlen(search_end_string);\n        numberOfEnds = numberOfEnds +1;\n\n    }\n\n\n    if( numberOfStarts != numberOfEnds){\n        printf(\"****** Warning! Flowchart file is wrong.  Mismatch in start vs. end. *******\");\n    }\n\n    \/\/ Choose a pseudo-random teacher solution. (not very random)\n    srand(time(NULL)); \/\/ Seed the randomization.\n    indexSpecificFlowchart = ((int32_t) rand()) % numberOfStarts + 1; \/\/ Returns a pseudo-random integer between 1 and 100.\n    teacherFuncIndex_g = indexSpecificFlowchart - 1;\n    \/\/printf(\"Choosing Flowchart number %d @ index %d \", indexSpecificFlowchart, teacherFuncIndex_g);\n\n    \/\/ Find the specific start for the specific desired flowchart.\n    char *ptr3 = strstr(buffer, search_start_string);\n    while ((ptr3 = strstr(ptr3, search_start_string)) != NULL) {\n        int index = ptr3 - buffer;\n        ptr3 += strlen(search_start_string);\n        indexFlowchartTemp = indexFlowchartTemp + 1;\n        if (indexFlowchartTemp == indexSpecificFlowchart)\n        {\n            \/\/ Note: actual start needs to include the length of the start string.\n            specificFlowchartStart = index + strlen(search_start_string);\n            \/\/printf(\"found the  START of flowchart  at %d\\n\", specificFlowchartStart);\n        }\n    }\n\n\n    \/\/ Find the specific end for the specific desired flowchart.\n    char *ptr4 = strstr(buffer, search_end_string);\n    indexFlowchartTemp = 0; \/\/ reset it.\n    while ((ptr4 = strstr(ptr4, search_end_string)) != NULL) {\n        int index = ptr4 - buffer;\n        ptr4 += strlen(search_end_string);\n        indexFlowchartTemp = indexFlowchartTemp + 1;\n        if (indexFlowchartTemp == indexSpecificFlowchart)\n        {\n            \/\/ Note: actual end begins BEFORE the end string.\n            specificFlowchartEnd = index;\n            \/\/printf(\"found the END of flowchart  at %d\\n\", specificFlowchartEnd);\n        }\n    }\n\n\n    printf(\"Dear student: implement this flowchart:\\n \");\n   for (int i = specificFlowchartStart; i &lt; specificFlowchartEnd; i++) {\n        printf(\"%c\", buffer[i]);\n    }\n\n    printf(\"------------ end of flowchart ------------\\n\");\n    printf(\"\\n\");\n    \/* run the unit tests *\/\n\n    printf(\"Multiple tests underway...\");\n    UNITY_BEGIN();\n    RUN_TEST(test1);\n    RUN_TEST(test2);\n    RUN_TEST(test3);\n    RUN_TEST(test4);\n    RUN_TEST(test5);\n    RUN_TEST(test6);\n    \/* add more RUN_TEST()s, as needed *\/\n\n\n    \/\/ wrap up and close down the file.\n\n    free(buffer);\n    fclose(file);\n\n    \/\/ wrap up the unity testing...\n    return UNITY_END();\n}\n\n<\/pre>\n\n\n\n<p>Here is <mark class=\"kt-highlight\">StudentSolution.h<\/mark>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#ifndef EXAMPLEFLOWCHART1_STUDENTSOLUTION_H\n#define EXAMPLEFLOWCHART1_STUDENTSOLUTION_H\n#include &lt;stdint.h&gt;\n\nint32_t studentMethod(int32_t s, int32_t t);\n#endif \/\/EXAMPLEFLOWCHART1_STUDENTSOLUTION_H\n<\/pre>\n\n\n\n<p>Here is an example <mark class=\"kt-highlight\">StudentSolution.c<\/mark>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include \"StudentSolution.h\"\n#include &lt;stdint.h&gt;\n\n\/* solution 4*\/\n\nint studentMethod(int s, int t) {\n    int a = 0;\n\n    int i = 1;\n\n    while(i &lt; 2)\n    {\n\n        if(s == 10){\n\n            if(t &gt; 5)\n            {\n                a = a+0;\n            }\n            else if(t &gt; 2)\n            {\n                a = a+2;\n            }\n            else\n            {\n                a = a+4;\n            }\n        }\n        else{\n\n            if(t &gt; 5)\n            {\n                a = a+32;\n            }\n            else if(t &gt; 1)\n            {\n                a = a+20;\n            }\n            else\n            {\n                a = a+11;\n            }\n\n        }\n\n\n        i = i+1;\n\n    }\n\n    return a;    }<\/pre>\n\n\n\n<p>And it's going to be compared against the <mark class=\"kt-highlight\">TeacherReferenceSolutions.c<\/mark>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include \"TeacherReferenceSolutions.h\"\n\nint function1(int s, int t) {\n\n\/* s and t are inputs *\/\n    int a = 0;\n\n    int i = 1;\n\n\n    while (i &lt; 10) {\n\n        if (s &gt;= 0) {\n\n            if (t &lt; 10) {\n                a = a + 2;\n            } else if (t &lt; 20) {\n                a = a + 4;\n            } else {\n                a = a + 5;\n            }\n        } else {\n\n            if (t &lt; 5) {\n                a = a + 3;\n            } else if (t &lt; 10) {\n                a = a + 2;\n            } else {\n                a = a + 1;\n            }\n\n        }\n\n\n        i = i + 1;\n\n    }\n\n\n    return a;\n}\n\nint function2(int s, int t) {\n\n\/* s and t are inputs *\/\n\n    int a = 0;\n\n    int i = 1;\n\n    while(i &lt; 5)\n    {\n\n        if(s &lt;= 10){\n\n            if(t &lt; 5)\n            {\n                a = a+1;\n            }\n            else if(t &lt; 10)\n            {\n                a = a+5;\n            }\n            else\n            {\n                a = a+2;\n            }\n        }\n        else{\n\n            if(t &gt; 20)\n            {\n                a = a+32;\n            }\n            else if(t &gt; 13)\n            {\n                a = a+20;\n            }\n            else\n            {\n                a = a+11;\n            }\n\n        }\n\n\n        i = i+1;\n\n    }\n\n    return a;    }\n\nint function3(int s, int t) {\n    int a = 0;\n\n    int i = 1;\n\n    while(i &lt; 10)\n    {\n\n        if(s &lt;= 5){\n\n            if(t &lt; 2)\n            {\n                a = a+3;\n            }\n            else if(t &lt; 8)\n            {\n                a = a+2;\n            }\n            else\n            {\n                a = a+1;\n            }\n        }\n        else{\n\n            if(t &gt; 10)\n            {\n                a = a+3;\n            }\n            else if(t &gt; 5)\n            {\n                a = a+2;\n            }\n            else\n            {\n                a = a+1;\n            }\n\n        }\n\n\n        i = i+1;\n\n    }\n\n\n\n    return a;\n}\n\nint function4(int s, int t) {\n\/* s and t are inputs *\/\n    int a = 0;\n\n    int i = 1;\n\n    while(i &lt; 2)\n    {\n\n        if(s == 10){\n\n            if(t &gt; 5)\n            {\n                a = a+0;\n            }\n            else if(t &gt; 2)\n            {\n                a = a+2;\n            }\n            else\n            {\n                a = a+4;\n            }\n        }\n        else{\n\n            if(t &gt; 5)\n            {\n                a = a+32;\n            }\n            else if(t &gt; 1)\n            {\n                a = a+20;\n            }\n            else\n            {\n                a = a+11;\n            }\n\n        }\n\n\n        i = i+1;\n\n    }\n\n    return a;    }\n\n\n\n<\/pre>\n\n\n\n<p>Which only has four solutions, but it could be more.  There is a corresponding header file, <mark class=\"kt-highlight\">TeacherReferenceSolutions.h<\/mark>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\n#ifndef EXAMPLEFLOWCHART1_TEACHERREFERENCESOLUTIONS_H\n#define EXAMPLEFLOWCHART1_TEACHERREFERENCESOLUTIONS_H\n\n#include &lt;stdint.h&gt;\n\nint function1(int s, int t);\nint function2(int s, int t);\nint function3(int s, int t);\nint function4(int s, int t);\n\n\/\/ Define a function pointer type for functions that take two ints and return an int\ntypedef int32_t (*referenceSolutions)(int32_t, int32_t);\n\n#endif \/\/EXAMPLEFLOWCHART1_TEACHERREFERENCESOLUTIONS_H\n<\/pre>\n\n\n\n<p>The four reference solutions are represented in the following flowchart file, <mark class=\"kt-highlight\">diagon_flowcharts.txt<\/mark>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">% diagon_flowcharts.txt\n% first\n% ----- start ----\n       \u250c\u2500\u2500\u2500\u2500\u2500\u2510\n       \u2502START\u2502\n       \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n       \u250c\u2500\u2500\u25bd\u2500\u2500\u2510\n       \u2502a = 0\u2502\n       \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n        \u250c\u2500\u25bd\u2500\u2510\n        \u2502i=1\u2502\n        \u2514\u2500\u252c\u2500\u2518\n          \u25bd___\n         \u2571    \u2572\n    ____\u2571 i&lt;10 \u2572____________________________________________________\n   \u2502 no \u2572      \u2571                                                    \u2502\n   \u2502     \u2572____\u2571                                                     \u2502\n   \u2502       \u2502yes                                                     \u2502\n   \u2502     __\u25bd___                        ______                       \u2502\n   \u2502    \u2571      \u2572                      \u2571      \u2572            \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n   \u2502   \u2571 s &gt;= 0 \u2572____________________\u2571 t &lt; 10 \u2572___________\u2502a = a+2\u2502 \u2502\n   \u2502   \u2572        \u2571yes                 \u2572        \u2571yes        \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518 \u2502\n   \u2502    \u2572______\u2571                      \u2572______\u2571                \u2502     \u2502\n   \u2502       \u2502no                           \u2502no                  \u2502     \u2502\n   \u2502     __\u25bd__                          _\u25bd__                  \u2502     \u2502\n   \u2502    \u2571     \u2572             \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2571    \u2572    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u2502     \u2502\n   \u2502   \u2571 t &lt; 5 \u2572____________\u2502a = a+3\u2502 \u2571 t&lt;20 \u2572___\u2502a = a+4\u2502    \u2502     \u2502\n   \u2502   \u2572       \u2571yes         \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518 \u2572      \u2571yes\u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518    \u2502     \u2502\n   \u2502    \u2572_____\u2571                 \u2502      \u2572____\u2571        \u2502        \u2502     \u2502\n   \u2502       \u2502no                  \u2502        \u2502no         \u2502        \u2502     \u2502\n   \u2502      _\u25bd__                  \u2502    \u250c\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2510       \u2502        \u2502     \u2502\n   \u2502     \u2571    \u2572    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u2502    \u2502a = a+5\u2502       \u2502        \u2502     \u2502\n   \u2502    \u2571 t&lt;10 \u2572___\u2502a = a+2\u2502    \u2502    \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518       \u2502        \u2502     \u2502\n   \u2502    \u2572      \u2571yes\u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518    \u2502        \u2502           \u2502        \u2502     \u2502\n   \u2502     \u2572____\u2571        \u2502        \u2502        \u2502           \u2502        \u2502     \u2502\n   \u2502       \u2502no         \u2502        \u2502        \u2502           \u2502        \u2502     \u2502\n   \u2502   \u250c\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2510       \u2502        \u2502        \u2502           \u2502        \u2502     \u2502\n   \u2502   \u2502a = a+1\u2502       \u2502        \u2502        \u2502           \u2502        \u2502     \u2502\n   \u2502   \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518       \u2502        \u2502        \u2502           \u2502        \u2502     \u2502\n   \u2502       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518     \u2502\n   \u2502                 \u250c\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2510                                      \u2502\n   \u2502                 \u2502i = i+1\u2502                                      \u2502\n   \u2502                 \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518                                      \u2502\n   \u2502                     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u250c\u2500\u25bd\u2500\u2510\n \u2502END\u2502\n \u2514\u2500\u2500\u2500\u2518\n% ----- end ----\n% second\n% ----- start ----\n       \u250c\u2500\u2500\u2500\u2500\u2500\u2510\n       \u2502START\u2502\n       \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n       \u250c\u2500\u2500\u25bd\u2500\u2500\u2510\n       \u2502a = 0\u2502\n       \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n       \u250c\u2500\u2500\u25bd\u2500\u2500\u2510\n       \u2502i = 1\u2502\n       \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n         _\u25bd___\n        \u2571     \u2572\n   ____\u2571 i &lt; 5 \u2572________________________________________________________\n  \u2502 no \u2572       \u2571                                                        \u2502\n  \u2502     \u2572_____\u2571                                                         \u2502\n  \u2502        \u2502yes                                                         \u2502\n  \u2502     ___\u25bd___                           _____                         \u2502\n  \u2502    \u2571       \u2572                         \u2571     \u2572              \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n  \u2502   \u2571 s &lt;= 10 \u2572_______________________\u2571 t &lt; 5 \u2572_____________\u2502a = a+1\u2502 \u2502\n  \u2502   \u2572         \u2571yes                    \u2572       \u2571yes          \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518 \u2502\n  \u2502    \u2572_______\u2571                         \u2572_____\u2571                  \u2502     \u2502\n  \u2502        \u2502no                              \u2502no                   \u2502     \u2502\n  \u2502      __\u25bd___                           __\u25bd___                  \u2502     \u2502\n  \u2502     \u2571      \u2572              \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2571      \u2572    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u2502     \u2502\n  \u2502    \u2571 t &gt; 20 \u2572_____________\u2502a = a+32\u2502\u2571 t &lt; 10 \u2572___\u2502a = a+5\u2502    \u2502     \u2502\n  \u2502    \u2572        \u2571yes          \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518\u2572        \u2571yes\u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518    \u2502     \u2502\n  \u2502     \u2572______\u2571                   \u2502     \u2572______\u2571        \u2502        \u2502     \u2502\n  \u2502        \u2502no                     \u2502        \u2502no          \u2502        \u2502     \u2502\n  \u2502      __\u25bd___                    \u2502    \u250c\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2510        \u2502        \u2502     \u2502\n  \u2502     \u2571      \u2572    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510     \u2502    \u2502a = a+2\u2502        \u2502        \u2502     \u2502\n  \u2502    \u2571 t &gt; 13 \u2572___\u2502a = a+20\u2502     \u2502    \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518        \u2502        \u2502     \u2502\n  \u2502    \u2572        \u2571yes\u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518     \u2502        \u2502            \u2502        \u2502     \u2502\n  \u2502     \u2572______\u2571         \u2502         \u2502        \u2502            \u2502        \u2502     \u2502\n  \u2502        \u2502no           \u2502         \u2502        \u2502            \u2502        \u2502     \u2502\n  \u2502   \u250c\u2500\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2510         \u2502         \u2502        \u2502            \u2502        \u2502     \u2502\n  \u2502   \u2502a = a+11\u2502         \u2502         \u2502        \u2502            \u2502        \u2502     \u2502\n  \u2502   \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518         \u2502         \u2502        \u2502            \u2502        \u2502     \u2502\n  \u2502        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518     \u2502\n  \u2502                   \u250c\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2510                                         \u2502\n  \u2502                   \u2502i = i+1\u2502                                         \u2502\n  \u2502                   \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518                                         \u2502\n  \u2502                       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u25bd\u2500\u2510\n\u2502END\u2502\n\u2514\u2500\u2500\u2500\u2518\n% ----- end ----\n% third\n% ----- start ----\n       \u250c\u2500\u2500\u2500\u2500\u2500\u2510\n       \u2502START\u2502\n       \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n       \u250c\u2500\u2500\u25bd\u2500\u2500\u2510\n       \u2502a = 0\u2502\n       \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n       \u250c\u2500\u2500\u25bd\u2500\u2500\u2510\n       \u2502i = 1\u2502\n       \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n         _\u25bd____\n        \u2571      \u2572\n   ____\u2571 i &lt; 10 \u2572___________________________________________________\n  \u2502 no \u2572        \u2571                                                   \u2502\n  \u2502     \u2572______\u2571                                                    \u2502\n  \u2502        \u2502yes                                                     \u2502\n  \u2502      __\u25bd___                        _____                        \u2502\n  \u2502     \u2571      \u2572                      \u2571     \u2572             \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n  \u2502    \u2571 s &lt;= 5 \u2572____________________\u2571 t &lt; 2 \u2572____________\u2502a = a+3\u2502 \u2502\n  \u2502    \u2572        \u2571yes                 \u2572       \u2571yes         \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518 \u2502\n  \u2502     \u2572______\u2571                      \u2572_____\u2571                 \u2502     \u2502\n  \u2502        \u2502no                           \u2502no                  \u2502     \u2502\n  \u2502      __\u25bd___                        __\u25bd__                  \u2502     \u2502\n  \u2502     \u2571      \u2572            \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2571     \u2572    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u2502     \u2502\n  \u2502    \u2571 t &gt; 10 \u2572___________\u2502a = a+3\u2502\u2571 t &lt; 8 \u2572___\u2502a = a+2\u2502    \u2502     \u2502\n  \u2502    \u2572        \u2571yes        \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518\u2572       \u2571yes\u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518    \u2502     \u2502\n  \u2502     \u2572______\u2571                \u2502     \u2572_____\u2571        \u2502        \u2502     \u2502\n  \u2502        \u2502no                  \u2502        \u2502no         \u2502        \u2502     \u2502\n  \u2502      __\u25bd__                  \u2502    \u250c\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2510       \u2502        \u2502     \u2502\n  \u2502     \u2571     \u2572    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u2502    \u2502a = a+1\u2502       \u2502        \u2502     \u2502\n  \u2502    \u2571 t &gt; 5 \u2572___\u2502a = a+2\u2502    \u2502    \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518       \u2502        \u2502     \u2502\n  \u2502    \u2572       \u2571yes\u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518    \u2502        \u2502           \u2502        \u2502     \u2502\n  \u2502     \u2572_____\u2571        \u2502        \u2502        \u2502           \u2502        \u2502     \u2502\n  \u2502        \u2502no         \u2502        \u2502        \u2502           \u2502        \u2502     \u2502\n  \u2502    \u250c\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2510       \u2502        \u2502        \u2502           \u2502        \u2502     \u2502\n  \u2502    \u2502a = a+1\u2502       \u2502        \u2502        \u2502           \u2502        \u2502     \u2502\n  \u2502    \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518       \u2502        \u2502        \u2502           \u2502        \u2502     \u2502\n  \u2502        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518     \u2502\n  \u2502                  \u250c\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2510                                      \u2502\n  \u2502                  \u2502i = i+1\u2502                                      \u2502\n  \u2502                  \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518                                      \u2502\n  \u2502                      \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u25bd\u2500\u2510\n\u2502END\u2502\n\u2514\u2500\u2500\u2500\u2518\n% ----- end ----\n% fourth\n% ----- start ----\n       \u250c\u2500\u2500\u2500\u2500\u2500\u2510\n       \u2502START\u2502\n       \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n       \u250c\u2500\u2500\u25bd\u2500\u2500\u2510\n       \u2502a = 0\u2502\n       \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n       \u250c\u2500\u2500\u25bd\u2500\u2500\u2510\n       \u2502i = 1\u2502\n       \u2514\u2500\u2500\u252c\u2500\u2500\u2518\n         _\u25bd___\n        \u2571     \u2572\n   ____\u2571 i &lt; 2 \u2572______________________________________________________\n  \u2502 no \u2572       \u2571                                                      \u2502\n  \u2502     \u2572_____\u2571                                                       \u2502\n  \u2502        \u2502yes                                                       \u2502\n  \u2502     ___\u25bd___                          _____                        \u2502\n  \u2502    \u2571       \u2572                        \u2571     \u2572             \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n  \u2502   \u2571 s == 10 \u2572______________________\u2571 t &gt; 5 \u2572____________\u2502a = a+0\u2502 \u2502\n  \u2502   \u2572         \u2571yes                   \u2572       \u2571yes         \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518 \u2502\n  \u2502    \u2572_______\u2571                        \u2572_____\u2571                 \u2502     \u2502\n  \u2502        \u2502no                             \u2502no                  \u2502     \u2502\n  \u2502      __\u25bd__                           __\u25bd__                  \u2502     \u2502\n  \u2502     \u2571     \u2572              \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2571     \u2572    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u2502     \u2502\n  \u2502    \u2571 t &gt; 5 \u2572_____________\u2502a = a+32\u2502\u2571 t &gt; 2 \u2572___\u2502a = a+2\u2502    \u2502     \u2502\n  \u2502    \u2572       \u2571yes          \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518\u2572       \u2571yes\u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518    \u2502     \u2502\n  \u2502     \u2572_____\u2571                   \u2502     \u2572_____\u2571        \u2502        \u2502     \u2502\n  \u2502        \u2502no                    \u2502        \u2502no         \u2502        \u2502     \u2502\n  \u2502      __\u25bd__                    \u2502    \u250c\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2510       \u2502        \u2502     \u2502\n  \u2502     \u2571     \u2572    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510     \u2502    \u2502a = a+4\u2502       \u2502        \u2502     \u2502\n  \u2502    \u2571 t &gt; 1 \u2572___\u2502a = a+20\u2502     \u2502    \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518       \u2502        \u2502     \u2502\n  \u2502    \u2572       \u2571yes\u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518     \u2502        \u2502           \u2502        \u2502     \u2502\n  \u2502     \u2572_____\u2571         \u2502         \u2502        \u2502           \u2502        \u2502     \u2502\n  \u2502        \u2502no          \u2502         \u2502        \u2502           \u2502        \u2502     \u2502\n  \u2502   \u250c\u2500\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2510        \u2502         \u2502        \u2502           \u2502        \u2502     \u2502\n  \u2502   \u2502a = a+11\u2502        \u2502         \u2502        \u2502           \u2502        \u2502     \u2502\n  \u2502   \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518        \u2502         \u2502        \u2502           \u2502        \u2502     \u2502\n  \u2502        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518     \u2502\n  \u2502                   \u250c\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2510                                       \u2502\n  \u2502                   \u2502i = i+1\u2502                                       \u2502\n  \u2502                   \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2518                                       \u2502\n  \u2502                       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u25bd\u2500\u2510\n\u2502END\u2502\n\u2514\u2500\u2500\u2500\u2518\n% ----- end ----<\/pre>\n\n\n\n<p>More to come, including how to put this into Virtual Programming Lab.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>James Andrew Smith is a Professional Engineer and Associate Professor in the Electrical Engineering and Computer Science\u00a0<a href=\"http:\/\/eecs.lassonde.yorku.ca\">Department<\/a>\u00a0of York University's\u00a0<a href=\"http:\/\/lassonde.yorku.ca\">Lassonde School<\/a>, with degrees in Electrical and Mechanical Engineering\u00a0from the University of Alberta and McGill University.\u00a0\u00a0Previously a program director in biomedical engineering, his research background spans robotics, locomotion, human birth and\u00a0engineering\u00a0education. While on sabbatical in 2018-19 with his wife and kids he lived in Strasbourg, France and\u00a0he\u00a0taught at the\u00a0<a href=\"https:\/\/www.insa-strasbourg.fr\/en\/\">INSA Strasbourg<\/a>\u00a0and\u00a0<a href=\"https:\/\/www.hs-karlsruhe.de\">Hochschule Karlsruhe<\/a>\u00a0and wrote about his\u00a0<a href=\"https:\/\/twitter.com\/search?q=(%23sabbaticallife)%20(from%3Aonnimikki)&amp;src=typed_query\">personal<\/a>\u00a0and\u00a0<a href=\"https:\/\/twitter.com\/search?q=insa%20(from%3Ajasmith_yorku)&amp;src=typed_query\">professional\u00a0<\/a><a href=\"https:\/\/twitter.com\/search?q=karlsruhe%20(from%3Ajasmith_yorku)&amp;src=typed_query\">perspectives<\/a>.\u00a0\u00a0James is a proponent of using social media to advocate for justice, equity, diversity and inclusion as well as evidence-based applications of research\u00a0in the public sphere.\u00a0You can find him on\u00a0<a href=\"https:\/\/twitter.com\/jasmith_yorku\">Twitter<\/a>. Originally from Qu\u00e9bec City, he now lives in Toronto, Canada.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As with the Matlab and Java versions of this, I'm working on creating a set of C language exercises that can be assigned to students in an automated way, like on eClass (Moodle) using Virtual Programming Lab or the \"lab test mode\" that we use in the EECS department at York University. Here, I'm focusing [&hellip;]<\/p>\n","protected":false},"author":762,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","footnotes":""},"categories":[46,47,53,294],"tags":[],"class_list":["post-2997","post","type-post","status-publish","format-standard","hentry","category-c-programming","category-eclass","category-moodle","category-vpl"],"taxonomy_info":{"category":[{"value":46,"label":"c programming"},{"value":47,"label":"eClass"},{"value":53,"label":"Moodle"},{"value":294,"label":"VPL"}]},"featured_image_src_large":false,"author_info":{"display_name":"drsmith","author_link":"https:\/\/www.yorku.ca\/professor\/drsmith\/author\/drsmith\/"},"comment_info":"","category_info":[{"term_id":46,"name":"c programming","slug":"c-programming","term_group":0,"term_taxonomy_id":46,"taxonomy":"category","description":"","parent":0,"count":50,"filter":"raw","cat_ID":46,"category_count":50,"category_description":"","cat_name":"c programming","category_nicename":"c-programming","category_parent":0},{"term_id":47,"name":"eClass","slug":"eclass","term_group":0,"term_taxonomy_id":47,"taxonomy":"category","description":"","parent":0,"count":32,"filter":"raw","cat_ID":47,"category_count":32,"category_description":"","cat_name":"eClass","category_nicename":"eclass","category_parent":0},{"term_id":53,"name":"Moodle","slug":"moodle","term_group":0,"term_taxonomy_id":53,"taxonomy":"category","description":"","parent":0,"count":27,"filter":"raw","cat_ID":53,"category_count":27,"category_description":"","cat_name":"Moodle","category_nicename":"moodle","category_parent":0},{"term_id":294,"name":"VPL","slug":"vpl","term_group":0,"term_taxonomy_id":294,"taxonomy":"category","description":"","parent":0,"count":25,"filter":"raw","cat_ID":294,"category_count":25,"category_description":"","cat_name":"VPL","category_nicename":"vpl","category_parent":0}],"tag_info":false,"_links":{"self":[{"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/posts\/2997","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/users\/762"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/comments?post=2997"}],"version-history":[{"count":2,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/posts\/2997\/revisions"}],"predecessor-version":[{"id":3054,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/posts\/2997\/revisions\/3054"}],"wp:attachment":[{"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/media?parent=2997"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/categories?post=2997"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/tags?post=2997"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}