You will use Makefiles so that the graders and assistants can build your projects
from source, and are guided through your test suites.
You will given some test suites. The performance of your code on these test suits
define a basic level of correctness.
You will make additional test suites for your code, and your code maybe be tested
on reasonably considered correctness criteria, beyond those implied in the given
test suites. It is expected that you will anticipate these reasonably considered
correctness criteria, and your test suites will address those.
These are the three most important properties of a C variable,
It's type,
It's scope,
It's lifetime.
Thou shalt know, for every variable, and ever moment, know these three things.
Thou shalt not declare variables in the middle of a block. Reject this C99 feature.
A variable's scope and lifetime should be a block, end of story. Coding is hard enough.
Thy name and date shall be in comments at the top of all files. I consider this
your promise to me that this is your own work, or you have explained the source of
the code otherwise.
Thou shalt use only lower-case in filenames, with exceptions for strong historical precedence: Makefile, README.TXT,
maybe a few others. Never distinguish a file by case, and always refer to the file by the chosen case.
Thou shalt not use Variable Length Arrays (VLA). Reject this C99 feature.
They turn sizeof from a keyword into a function call, sometimes, and you now have run-time type
errors as well as run-time allocation errors.
Thou canst use C++ // style comments.
I'm conflicted on the use of zero-length arrays.
Harbison and Steele tells me I'm an outlaw,
page 98
but I can't seem to care. Thy choice.
Comment what isn't obvious. Comment what confused thou when thou wrote this code.
Comment assumptions on parameters at the top of the function block.
I prefer writing subroutines more basic first, so I don't need forward declarations. I consider
this a huge hint to debuggers about what depends on what. I recommend not doing forward
declarations unnecessarily.
Use header files. Consider them as declaring your API. What's in the .h file explains
what you intend to be the stable functions and types, as opposed to helper functions that
might change.