Explores ways of clearing a table, from given starting point to end of line and entire following lines.
In [1]:
%%script bash
# Ignore this boring cell.
# It allows one to do C in Jupyter notebook.
cat >20170706_head.c <<EOF
#include <stdlib.h>
#include <stdio.h>
#define LINES (3)
#define COLUMNS (4)
void print_buf(char buf[LINES][COLUMNS])
{
for (int row = 0; row < LINES; row++) {
for (int column = 0; column < COLUMNS; column++)
putchar(buf[row][column]);
putchar('\n');
}
}
EOF
cat >20170706_tail.c <<EOF
int main(int argc, char *argv())
{
char buf[LINES][COLUMNS];
for (int row = 0; row < LINES; row++)
for (int column = 0; column < COLUMNS; column++)
buf[row][column] = '@';
blank(buf, 1, 2);
print_buf(buf);
}
EOF
program_name="${PATH%%:*}/20170706_c_foo"
echo $program_name
cat >"$program_name" <<EOF
#!/usr/bin/env sh
cat 20170706_head.c >20170706_blank.c
cat >>20170706_blank.c
cat 20170706_tail.c >>20170706_blank.c
cc 20170706_blank.c -o 20170706_blank
./20170706_blank | tr ' ' '.'
EOF
chmod +x "$program_name"
In [2]:
%%script 20170706_c_foo
void blank(char buf[LINES][COLUMNS], int row, int column)
{
goto MIDDLE;
for ( ; row < LINES; row++)
for (column = 0; column < COLUMNS; column++)
MIDDLE: buf[row][column] = ' ';
}
The above is what the output should look like.
In [3]:
%%script 20170706_c_foo
void blank(char buf[LINES][COLUMNS], int row, int column)
{
for ( ; row < LINES; row++) {
for ( ; column < COLUMNS; column++)
buf[row][column] = ' ';
column = 0;
}
}
In [4]:
%%script 20170706_c_foo
void blank_to_end_of_row(char buf[LINES][COLUMNS], int row, int column)
{
for ( ;column < COLUMNS; column++)
buf[row][column] = ' ';
}
void blank_row(char buf[LINES][COLUMNS], int row)
{
blank_to_end_of_row(buf, row, 0);
}
void blank(char buf[LINES][COLUMNS], int row, int column)
{
blank_to_end_of_row(buf, row++, column);
for ( ; row < LINES; row++)
blank_row(buf, row);
}
In [5]:
%%script 20170706_c_foo
void blank_to_end_of_row(char buf[LINES][COLUMNS], int row, int column)
{
for ( ;column < COLUMNS; column++)
buf[row][column] = ' ';
}
void blank(char buf[LINES][COLUMNS], int row, int column)
{
blank_to_end_of_row(buf, row++, column);
for ( ; row < LINES; row++)
blank_to_end_of_row(buf, row, 0);
}
Now for some Python.
In [6]:
LINES = 3
COLUMNS = 4
In [7]:
def foo(row=1, column=2):
buf = [
['@' for _ in range(COLUMNS)]
for _ in range(LINES)
]
blank(buf, row, column)
for row in buf:
print(''.join(row).replace(' ', '.'))
In [8]:
def blank(buf, row, column):
for row in range(row, LINES):
for column in range(column, COLUMNS):
buf[row][column] = ' '
column = 0
In [9]:
foo()
In [10]:
def blank_to_end_of_row(buf, row, column):
for column in range(column, COLUMNS):
buf[row][column] = ' '
def blank_row(buf, row):
blank_to_end_of_row(buf, row, 0)
def blank(buf, row, column):
blank_to_end_of_row(buf, row, column)
row += 1
for row in range(row, LINES):
blank_row(buf, row)
In [11]:
foo()
In [12]:
def blank_to_end_of_row(buf, row, column):
for column in range(column, COLUMNS):
buf[row][column] = ' '
def blank(buf, row, column):
blank_to_end_of_row(buf, row, column)
row += 1
for row in range(row, LINES):
blank_to_end_of_row(buf, row, 0)
In [13]:
foo()
In [14]:
%%script 20170706_c_foo
/* this is wrong: fails to clear beginning of following lines */
int blank(char buf[LINES][COLUMNS], int row_arg, int column_arg)
{
int row;
int column;
for (row = row_arg; row < LINES; row++)
for (column = column_arg; column < COLUMNS; column++)
buf[row][column] = ' ';
}