To illustrate this, imagine that alongside your programming studies you were to work your way through a self-study book on elementary mathematics. You would soon find that functions which operate on numbers are so versatile, once you get to know them, that they could be applied to just about every mathematical problem in the book! With numeric functions, therefore, we get to the heart of the computer, in the literal sense of the word, as a tool for speeding up annotated calculation. Over and above that, however, BBC BASIC has the added feature of string functions, which can reduce complex operations on strings to relatively simple formulae.
Functions which operate on numbers are in fact automated "number-crunchers". Their key feature is that they produce a definite numeric result. It would not be wide of the mark to think of this "number-crunching machine" on the lines of a washing-machine: you put your numerical problems in, turn the dial to a given setting and get a definite result as the output. Admittedly this is a poetic image of what is going on. But it is more than that. The dial on a washing machine effectively selects different pre- programmed functions, in relation to factors such as time and temperature and speed of rotation, and the output from the selected functions gets converted into electrical signals, which then operate the mechanical devices in the machine. In the case of the personal computer, the output device which corresponds to the rotating drum in the washing machine is the screen or the printer.
Syntactically, functions are similar to procedures: they are usually "called" in the main body of the program, and are then "defined" after the END statement. (This is not always strictly necessary, but with functions, as with procedures, it is usually advisable to define the function after the END statement, so as to keep it self- contained in a complex program.) There is a potential drawback for the beginner in this arrangement, however, in that the syntax for calling the function, which occurs early in any program, does not make complete sense until you have linked it up to the definition of the function, which comes later, so the program has to be read several times over to make sense.
In the same way that the computer cannot use a variable until it has been defined, the programmer himself or herself cannot use a new routine in programming until it has itself been defined. So the plan in the following specimen programs, which illustrate simple addition, subtraction, multiplication and division, will be to study each program from bottom to top, i.e. from the definition to its implementation.
10 REM ADDITION
20 INPUT "Enter a figure to be added to another ",A
30 INPUT "Enter the figure you wish to add to it ",B
40 answer= FNSUM(A,B)
50 PRINT ' "The answer is ";answer
70 DEF FNSUM(X,Y)=X+Y
Let us, as indicated, start with the last line here, and let us go back to our definition of BASIC in the Introduction as "the use of written English, in tokenised form, for the purpose of programming a computer." Obviously, when the computer was invented, the Internet didn't yet exist, and the principal tool for the "online" transmission of documents was the telegram, which had to cram a lot of meaning into a small space. Effectively, BBC BASIC also uses "telegram language", compacted further by abbreviations. So line 70, when expanded into full English syntax, should read:
"The function of the sum of X and Y is defined as X+Y".
As with any other algebraic expression, the terms X and Y are variables. That means that whatever values are assigned to them in the early part of the program, the formula X+Y will always produce the correct answer from the values entered after the INPUT command earlier in the program.
Now let us look how the values are assigned in the program itself. The first thing to notice is that the variable names given in the body of the program are different from those in the formula. However, they do not have to be different: the formula at the end uses standardised algebraic variable names such as "x" and "y", which represent whatever values you assign to them in the body of the program. Within the main body of the program itself you can choose whatever variable names you like for these values, as long as you bear in mind that they are taken in sequence by the definition of the function after the END statement.
In Line 70, therefore, the END statement ensures that the statements are taken in strict sequence, and the number-crunching machine doesn't start until you have closed the door and pressed the RUN button.
Line 50 prints out the number that has been crunched.
Line 40 assigns the numbers-to-be-crunched, A and B, to the function SUM, which is defined after the END statement.
Our general knowledge of algebra supplies us with the presupposition that A and B need to represent values in order for the numbers to be crunched, and we find the opportunity to assign these in the INPUT statements at the beginning of the program.
Try to learn the program from memory, and get as much practice as you can with different variables.
10 REM SUBTRACTION
20 INPUT "Enter the figure from which to subtract ",A
30 INPUT "Enter the figure you are going to subtract from A ",B
50 PRINT "The answer is ";answer
70 DEF FNDIFF(X,Y)=(X-Y)
As with addition, get as much practice as you can with this program, using different quantities, until you can use it fluently from memory. As a check that the figures are taken in sequence in line 70, try giving A a smaller value than B.
10 REM multiplication
20 PRINT "Enter two figures to be multiplied"
30 INPUT A
40 INPUT B
60 PRINT "The answer is ";answer
80 DEF FNPRODUCT(X,Y)=(X*Y)
For the sake of simplicity, only two figures are given here to be multiplied. But there is no reason why you should not use a larger number of figures. When you are fully familiar with the routine, learn it from memory, then try to work out a division program for yourself. Then check it out against the example below.
10 INPUT "Enter the figure to be divided ",A
20 INPUT "Enter the figure by which you wish to divide it ",B
40 PRINT answer
60 DEF FNDIV(X,Y)=(X/Y)
Once the basic syntax for the use of numeric functions has been grasped, the sky is the limit for the applications that can be devised for speeding up annotated calculation. In the Introduction it was stressed that there is no need to go out and buy a huge industrial spreadsheet for routine jobs of the kind that are often done manually by the sole trader. We can now take a real-life example to illustrate this point with respect to functions. Yesterday I received the monthly bill from my milkman, who owns his own round. The bill evidently came from a page of A4 divided up to give four bills per page. The template of the page had been word-processed and then photocopied, leaving the details of each bill to be hand-written. Considering how many customers are likely to receive such a bill, that amounts to a great deal of labour in terms of writing, and there is no way of automatically numbering the bills. A PC had evidently been used to word-process the text, but the figures were entered in pen. With numeric functions, however, bills can be added and printed out automatically.
To move on progressively from the four rules of simple arithmetic to more complex applications of functions, herewith a short program which calculates VAT on any given price. Before reading it, try to work out the required program for yourself, as Assignment 2, then compare the example below with your own version:
10 REM VATMAN
30 PRINT'' "Enter the price less VAT"
40 INPUT price
50 rate=1.175:REM current rate of VAT
70 PRINT"The price plus VAT is ";total
Suppose a group of ten students is tested every month, and we want to find the average mark on a regular basis? Again try to work out a program for yourself, in such a way that once it is set up, only the marks have to be entered each time round. Then compare your version with the one below:
10 INPUT alice,betty,catherine,dick,eddy,fred,gertrude,hilary,irene,jim
30 CLS: PRINT "The average mark for this group is ";A
50 DEF FNaverage(Q,R,S,T,U,V,W,X,Y,Z)=(Q+R+S+T+U+V+W+X+Y+Z)/10
To conclude this introduction to the theory of numeric functions, herewith an application of the principle to Pythagoras' theorem. It points the way towards using functions for much more complex formulae in algebra:
5 REM Pythagoras' theorem
10 PRINT"Enter the length of the base"
20 INPUT base
30 PRINT "Enter the length of the perpendicular"
40 INPUT perpendicular
55 PRINT "The hypotenuse is ";hypotenuse
70 DEF FNPythagoras(Y,Z)
As was indicated earlier, you could at this point work your way through a book on algebra, in order to explore the potential of numeric functions as a means of obtaining a definite figure from given variables.
10 INPUT A
40 INPUT B
60 PRINT "TOTAL IS "T
70 UNTIL B=0
In this program, A represents the initial figure, B every subsequent figure in the column to be added up, and T the total. You may perhaps wonder why I have used single, upper case letters for the variable names, instead of the whole-word variable names made possible by BBC BASIC. There is a personal reason for this, relating to health and safety at work. A few years ago a judge in the United Kingdom ruled against a claim brought by a computer operator for "repetitive strain injury", since there was at that time inadequate medical evidence that the localised condition could be caused by the activities described. Typists, after all, had been using the physical actions of keyboard operation for decades before the invention of the PC. There is, however, another medical condition, fully recognised by doctors, which produces symptoms in the arms similar to those ascribed to RSI, but which originates elsewhere than in the arms and wrists themselves. It is called "cervical disc syndrome", from which I suffer myself, usually in conjunction with using a computer, and it arises from a repeated trauma to the discs between the vertebrae at the top end of the neck. This trauma gives rise to what is termed "referred pain" in the arms, including the lower arms and wrists, where the symptoms attributed to "RSI" are commonly felt. The problem can be considerably reduced, I have discovered, by determined reliance on touch-typing, since this eliminates the constant nodding of the head between screen and keyboard, an action which squeezes the cervical discs and causes referred pain in the arms.
However, even a good touch-typist will often have to search visually for the CAPS LOCK key, which is always differently located by different keyboard manufacturers. So, for the good of my health, I avoid switching between lower case and upper case when typing programs in BASIC, which means that I have to rely on old-fashioned, single-letter variable names in upper case.
For obvious reasons, the above discussion is a contribution to public debate on a common problem in computer use, and carries no legal or scientific guarantees. That said, the problem is a real one and deserves open debate.
Now let us return to our end-of-year accounting. Having added up our columns of figures, we can devise another program for working our averages - in this case quarterly returns. Try to work out such a program yourself, as Assignment 3, before consulting the one below. This one uses arrays as a means of viewing four financial quarters in one overall calculation.
20 DIM Q(4)
30 FOR J%=1 TO 4
40 PRINT' ' ' ' "Enter the total for Quarter ";J%
50 INPUT Q(J%)
110 PRINT' ' ' ' "Year total ",T
120 PRINT "Quarterly average ",AV
140 DEF FNT(A,B,C,D)=(A+B+C+D)
160 DEF FNAV(A,B,C,D)=(A+B+C+D)/4
The above program does not claim to be a spreadsheet, but it will certainly speed up the process of totalling and averaging columns of figures in a manually entered cash analysis book at then end of the financial year.