ࡱ> 13./0` Dbjbj *D& !.l.l.l.ll**zFmoooooooPzRzRzRzRzRzRz$|h~vzooooovzoozyyyo ooPzyoPzyyyom @RZ..ly.yz<z0zy7y"7y7y$ooyooooovzvzyooozoooo******B.l******.l."  How to Write a SIMPLE Interactive C (IC) Computer Program  Contents:  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "INTRO" Introduction  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "TALK" Can We Talk?  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "DIFF" The Difference between the HandyBoard and the RCX.  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "C" Programming In C.  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "TEST" Testing Code with a Robot  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "DISPLAYS" Displays, Variables, Conditionals, and Loops  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "FUN" Functions Introduction If you are interested in learning how to write a very simple computer program in Interactive C (IC), you have come to the right place. Youre going to learn how to write small sample programs which will get the robot computer's attention, move the robot forward for a few seconds, reverse its direction, and stop. Once you learn a few basic details, learning more sophisticated applications in IC depends upon how much time you want to spend on learning the two languages.  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "TOP" TOP Can We Talk? As most of you are aware, communication between other humans can be quite a challenge. Speaking the same language doesn't necessary mean you will communicate your point. For example, a few common phrases that often are garbled in the translation include, "Will you please clean your room?", "Do you mind putting the dishes away tonight?", and "Please do your homework." When these phrases don't work, parents may add a few words like, "grounded", "no car keys", and "your allowance." These words usually solve the problem and whomever is on the receiving end of the conversation will get the message. Communicating with computers, such as the HandyBoard and the RCX processor, offers similar challenges. One thing to keep in mind is that computers do exactly what you tell them to do. If a computer does not do what you think it should be doing, there are two possiblities: you have given faulty instructions, or someone else has given faulty instructions (perhaps the person who wrote your programming language). These faults in the program are called bugs.  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "TOP" TOP The Difference between the HandyBoard and the RCX. In the world of computer programming, there are a number of languages to chose from. One of the most commonly used computer languages is C. IC is a hybrid of C designed to run on small, self-contained robot controllers, namely the HandyBoard and the LEGO RCX brick. IC has the ability to accomplish certain tasks interactively with the user. Previously, users of the RCX who wanted to program in C had to use NQC, which is short for Not Quite C. NQC has some drawbacks that make more advanced programming difficult. In addition, the differences between the two languages confuse beginning programmers. As a result version 4.0 of IC is compatible with both the HandyBoard and the RCX; however, code written for the HandyBoard is not 100 per cent compatible with the RCX because of differences between the two controllers. The HandyBoard is more capable than the RCX. The HandyBoard has four motor outputs numbered from 0 through 3, while the RCX has three motor outpus which are physically lettered A, B, and C, but referred to as 1,2, and 3 in software. The HandyBoard also seperates analog inputs, which range from 2 through 6, from the digital inputs, which range from 7 through 15. An expansion board exists that adds additional analog inputs on ports 16 through 23, along with support for six servos. The RCX, which has three general purpose inputs (either digital or analog), cannot deal with servos at all. The HandyBoard also has a pretty snazzy LCD screen which can display up to 31 ASCII charactersin other words, up to 31 letters, numbers, or punctuation marks. Where example code designed to run on the RCX is different than example code designed to run on the HandyBoard, two versions of the code are included. The RCX code will always come second. Because both controllers are now programmed in the same language, the syntax, or grammar, of the code will not change. However, some commands may not exist, or will have different names under the RCX.  HYPERLINK "http://www.kipr.org/curriculum/handyboard/hb_setup.html" INCLUDEPICTURE "https://cmailint.gwu.edu/attach/class2_IC_Introduction_files/arrow_blue.gif" \* MERGEFORMAT Ha ndyBoard Starting Point  HYPERLINK "http://www.kipr.org/curriculum/rcx/Botball_RCX_Start.html" INCLUDEPICTURE "https://cmailint.gwu.edu/attach/class2_IC_Introduction_files/arrow_blue.gif" \* MERGEFORMAT RC X Starting Point  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "TOP" TOP Programming In C. C is a popular programming language. In recent years it has replaced Pascal and Fortran as the language of choice among students, hobbyists, scientists, and professional software developers. C itself is being replaced with C++, an object oriented language, for developing desktop computer programs; however, C++ is a bit too bulky and complicated for simple robotic applications. Cs advantages include fast execution speed and high degrees of flexibility, power, and control. C is a Compiled Language At the heart of any computer, be it is a robotic controller or the latest desktop personal computer, is a CPU or central processing unit. The CPU can operate on data values using numeric instruction codes stored in memory. Each code tells the processor to do one simple task, such as additon or multiplication, or retrieving or storing data. Whether you write in C, Assembler, or BASIC, the processor only understands this simple numeric language, which is called machine code. In a compiled language like C, a program is a text file containing source code which is then translated to machine code by a compiler. In other words, you type your program, then tell the computer to compile it (convert it to machine code). The computer doesnt understand the program until then, so it will not run. If the program contains an error, the computer wont tell you about it until you try to compile. This can be confusing because you may not remember making the error. To make matters worse, errors often confuse the compiler, so the error message that the compiler issues may not have anything to do with the error you made. Remember: only a program free of errors will compile, so type all example code exactly as it appears here. Beginning the Program When communicating with another person, the first thing you want to do is get their attention. Thus, the first words out of your mouth are very important. Here are some good ones: Hello Excuse me Hey! Watch out! Wake up All these words are good for getting someone's attention in one way or another. Computers are much the same way: they are idle until you do something to get their attention . Lets say you want to get the attention of an RCX or HandyBoard in IC. void main() Every C program must contain a function named main() that is run when the program is begun. What youre really saying to the computer when you type void main () is that this is where the program starts. Be careful, much of the text in IC is case sensitive. Notice that all the letters are lowercase. Statements And Statement Blocks You now need to tell the computer what you want it to do. All instructions to the computer, known as statements, exist inside statement blocks. Blocks begin with an { and end with an }. These are collectively known as curly braces. Like parenthesis, the one which marks the beginning of the block is said to be the opening curly brace, while the one which marks the end of a block is said to be the closing curly brace. A statement block contains a group of statements. What is a statement? A statement can be a variable declaration, int an_integer_variable; an assignment, an_integer_variable = 2; a function call, motor(1,50); an mathematical expression, foo = 2+(3/6)^5; or a combination of function calls, expressions, and assignments. foo = sqrt((a^2)+(b^2)); Important: All statements end with a semicolon (;). The reason for this is that the C compiler cannot distinguish between spaces, returns, or tabs (this is done intentionally for statements that wont fit on a single line). These characters are all collectively referred to as white space. The semicolon is the computer's way of determining where one statement ends and another begins. Its kind of like a period at the end of a sentence. Just as you can have more than one sentence on a line of English text, you can have more than one statement on a line of C code. You can even write a program that is all one line! However, it is not generally considered good programming practice to do so, because such code is hard for humans to read. Each statement in the program instructs the computer to do something. For example motor(1,50) instructs the controller to turn on motor port 1 at fifty per cent power in the forward direction. Computers are never asked questions: they are given commands given which are abreviations of English. So if you wanted to know what the value of sensor port 1 was, you would not say (conceptually), "What is the value of sensor 1?". You would say, "Tell me the value of sensor port 1". A computer cannot think; it can only try do what it is told. Comments, Indentation, and Readability To some, a human-readable C program might sound like an oxymoron, but programmers should go out of their way to make their code easier to understand. One way to do this is through indentation. In the programing examples given in this document, notice how the statements are indented. Each new statement block is indented one more level to the right, usually with the tab key. When the block ends, the indentation is returned to the previous level. While some compilers will do this automatically, indenting code is an important part of programming, so you should get into a habit of doing it. Another way to improve human readability is to add comments to help explain what certain parts of the code do. A comment is enclosed between /* and */. Everything inside those characters is completely ignored by the compiler. You can type whatever you want to help explain your code. Commenting is another very good practice. It helps you and other people understand what you wrote. Controlling a Motor The following program will run a motor in the forward direction. The function fd() will leave the motor running after it finishes executing. In other words, once you activate the motors in your program, they remain active until you deactivate them. This code will work on both the HandyBoard and the RCX. /* program to run motor on port 1 forward */ /* get the computers attention */ void main() { /* turn motor port 1 on forward at full power */ fd(1); } Now, I will walk you through the code. Take a look at the first four lines. The first line is a comment explaining the purpose of the program. While this is not strictly necessary, it is a good idea to include a few comments at the top of your program explaining who made it, what it does, when it was done, and why. The second line was left blank in order to visually separate the first few comments. The third line is a comment describing the line below it. You should recognize the fourth from earlier in this document. { /* turn motor port 1 on forward at full power*/ fd(1); } Next is the opening curly brace of the function, main(). The function main() contains a single statement consisting of a single function call to fd(). The fd() function is passed the parameter 1, which means that fd() performs its action on motor port 1. The last line is the closing curly brace of the function main(). The program ends when the function main() ends. Now its time for you to try this program yourself. Under IC, make a new document. Type the program, compile the program, and download the program. If you dont know how to do this, see the IC 4 users manual. If any errors occur, dont get discouraged! Just look at the above example, and make sure that you typed it exactly as it appears. Lets recap: Programs start with void main (). Instructions to the computer are called statements All statements exist inside { and }. All statements end with a semicolon. Comments start with /* and end with */. They exist to explain the code. Indentation is an important part of programming. Usually, Every time a new statement block is begun, the code is indented. The program is over when the main function is finished.  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "TOP" TOP Testing Code with a Robot At this point you should have a couple of robots that you can program. Assuming that you have never put a robot together, here is an example that is structurally sound. Click here for instructions on building a RCX or Handy Board demonstration robot. INCLUDEPICTURE "https://cmailint.gwu.edu/attach/class2_IC_Introduction_files/Composite_2motor_seq_small.jpe" \* MERGEFORMAT INCLUDEPICTURE "https://cmailint.gwu.edu/attach/class2_IC_Introduction_files/Composite_2motor_seq2_small.jpe" \* MERGEFORMAT  HYPERLINK "http://www.kipr.org/curriculum/lego_comp.html" \t "_blank" Click here to see larger pictures. Moving Forwards, Backwards, and Stopping Now that you have your robots built, let's make them move. To do this, we'll write a very simple program that tells the robot to go forward for 2 seconds, pause, reverse direction for 2 seconds and stop. In the previous code you were introduced to the fd() function: fd(motor); Now, well introduce you to some more vocabulary. bk(n); /* full reverse power to port n */ off(n); /* turn off motor port n (and leave the port connection open)*/ sleep(n); /* waits for specified number of seconds. Must be a floating point ( decimal ) number */ Heres the program. This program will also work on both the HandyBoard or RCX. /* program to go forwards and then backwards */ void main() { /* start motors forward */ fd(1); fd(2); /*wait for 2 seconds */ sleep(2.0); /* back motors */ bk(1); bk(2); /*wait for 2 seconds */ sleep(2.0); /* stop motors */ off(1); off(2); } Take a look at this: /* turn on motor ports 1 and 2 forward */ fd(1); fd(2); Its the same fd() from the first example. Again, once the motors are on, they stay on. sleep(2.0); The sleep() function causes the program to stop executing for a given period of time. Once the computer reaches this function nothing else happens until it exits. Note the decimal point. This is necessary because the input parameter is a floating point number. Even if you want to specify a whole number value, you must include a decimal point or the compiler will generate an error. More on this later. bk(1); bk(2); The function bk() works just like the fd() statement, except that the power is applied in reverse. /* turn off the motors */ off(1); off(2); } On the RCX and the RCX only, there is another function called brake(). It not only cuts power to the motors but also shorts the power terminals together. The result is that the motors stop rotating much more quickly, as if by brake. To use it, just put the number of the motor you want to break inside the parenthesis. The combined effect of all this is that the motors are turned on in the forward direction, the processor waits for 2.0 seconds and then reverses the motors. Two seconds later, the motors stop. If you didnt put in a wait, it would appear as though there never was a fd() in there because the motors would be powered in the forward direction for only a few milliseconds. If you leave out the fd(), the robot doesnt do anything at all for exactly 2 seconds, and then takes off in the reverse direction. If you leave out the off() statements, the motors continue to move backwards until you turn off the RCX. Still with me? Lets recap: The functions fd() and bk() all leave the motor ports in a particular state. Like light switches, they stay on until you switch them off using off(). The sleep() statement stops program execution for a given period of time. sleep() requires a decimal point, even for whole number values. Even though we are still in the basics of programming, you can have your robot accomplish a wide variety of tasks using just these functions. You might want to experiment with some of your own variations of this program for a while before moving on, by changing the order of statements, or the values passed to the different commands.  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "TOP" TOP Displays, Variables, Conditionals, and Loops At this point we have a simple program which gives the robot a highly-specific behavior. We will proceed to modify the program to allow you to change the robots behavior, and in the process, introduce you to more C programming basics. Displays In a desktop computer, displaying data on the screen is an essential part of any program. The HandyBoard has a 31 character LCD display which can display one line of ASCII text (either letters, numbers, or punctuation) in two rows of 16 characters each. The RCX has a screen too, but it isnt as nice. It is much smaller (it can display a maximum of 5 characters, plus some special symbols), and text looks funny because the screen is only designed to display numbers. To display information on the screen, IC is provided with a stripped down version of the C function printf(). This function is quite complex, and deserves a chapter of its own. The following is a very brief description of how to use it so that you will understand upcoming examples. To print text on the screen, put it inside the parenthesis, enclosed in double quotes. The text must come before any other parameters. printf("your text here"); Like the decimal point for the sleep() function, the quotes for printf() are mandatory. In the same manner that the decimal point tells the compiler to read a floating point number, the quotes tell the compiler to interpret the text between them as a string variable. To print the value of an integer, include a %d somewhere inside those quotes. For example to print two numbers, you would start out by typing something like printf("variable #1 %d variable #2 %d" Next, specify the variables in the order you wish them to be printed, outside the quotes. Be sure to separate all the arguments with commas. printf("variable #1 %d variable#2 %d",255,-100); The above code will display this message on the screen: variable #1 255 variable#2 -100 When you have filled up the LCD screen with text, you can clear it by typing. printf("\n"); Note that the \ in \n is a backslash not a forward slash (/). The sequence \n really tells the computer to begin a new line of text, but since the HandyBoard and RCX screens can only display one line at a time, it has the effect of clearing the screen. If the value you are printing is a floating point, then use %f instead of %d. printf("Floating %f, Integer %d",4.215,105); This would print: Floating 4.215, Integer 105 You may be wondering why you couldnt just type Printf(Floating 4.215, Integer 105); You can, and for numbers that dont change, you should. This funny notation allows you to print variables, which will be covered in the next section. This is printf() in a nutshell. If you would like to learn more about printf(), and why it works the way it does, pick up a book on C, find it in the IC help files, or check out some of the programming resources on the Internet. Variables We mentioned variables earlier, but this is where we really explain them in depth. A variable is a container for information that has a name. If youve taken algebra, then you should be familiar with variables that have single letter names like a, x, and n. These are letters which stand for numerical values that are unknown. In computer programs variables do much the same thing. When a variable contains a value, its name is replaced by this value when evaluating an expression. Variables are one way for computers to "remember" numbers. For example, foo = 10*2; would put the result of 10 * 2 (or 20) into the variable named foo. You can then use foo in your code: motor(1,foo); foo will be replaced with 20 during execution. It would be like saying: motor(1,20); Except that the value of foo can change during the course of the programthats why its called a variable. Declarations Before you can use a variable, you must tell the computer that you need one. In C you do this with a variable declaration at the beginning of each block of statements. You declare to the compiler that you want a variable with a certain name. Take a look at the following declaration. int foo; This tells the compiler that foo is a variable of type int. In C int means integer. We can now use foo in our code in place of any integer value. Variable Types In IC there are other types of variables besides int. The four types we are concerned with are integers, long integers, floating-points, and characters. Each is suited to one particular kind of information. Integers hold whole numbers. Each integer (declared by int) is 2 bytes in size and it can hold values that range from 32768 to +32767. For most purposes this is quite large enough, however, for holding a time in milliseconds a long 4 byte-integer is needed. The term long is used to declare long integer variables. Characters are special values for holding single letters. They are only one byte in size, and are thus perfectly suited to the ASCII character set, which defines some 220 possible characters. Arrays of characters form strings of text which can be displayed by the computer. Sometimes characters are used to hold numbers instead of letters, because characters are half the size of an int (one byte). When a character holds a number, that number can range from -128 to +127. Characters are declared with type char. Floating points hold decimal or fractional values. The number of places past the decimal point is not fixed, but it can "float" based on the number of significant figures. Significant figures are difficult to explain, and are beyond the scope of this document. If you do not understand them you should look either on the web, or in a chemistry or physics text book. Floating point values are used in IC for the sleep() and the seconds() functions. This is why the sleep function requires a decimal point in its parameter. To the compiler, a constant value without decimal point is an integer. Floating point variables are declared with type specifier float. Assignments foo = analog(6); /* store the value of sensor port 6 */ This code assigns the result of the function analog() to the variable foo. The value has been "remembered". When you want to assign a value to a variable, you use the = sign. The = sign is known in C as the assignment operator. Typecasting Generally, ints and floats and chars are incompatible. A value from one type cannot be assigned to another. You can force the compiler to put values from one variable into another by including a type specifier enclosed in parenthesis followed by the variable to be changed. MyInteger = (int) MyFloat; This is called typecasting. The value of one variable is cast into the type of another. If MyFloat had been equal to 6.6, My Integer would now be equal to 6. If you now type MyFloat = (float) MyInteger; MyFloat will be equal to 6.0. One use of typecasting on the HandyBoard is to put the integer knob value into a floating point function such as sleep(). Heres the example code for this section. It is long, but most of the length is in comments. This program will compile and run on the RCX, but due to the limitations of its screen, you will not be able to view any output. /* program to demonstrate use of variables */ void main (){ /* declare two variables */ /* an integer, myint, and */ /* a floating point, myfloat */ int myint=35; float myfloat; /* the result of this expression will be thrown away because it is not assigned to any variable */ 5+6-45*1/3; /* assign 5.6 to myfloat */ myfloat = 5.6; /* add 1000 to myint */ myint = myint + 1000; /* add myfloat to myint */ myint = myint + (int) myfloat; /* beep to alert user */ beep(); /* printf statement is spaced to print on two lines */ /* \n is used to clear screen before printing */ printf("\nSleeping for %f seconds",myfloat); /* sleep */ sleep(myfloat); /* multiply myfloat by .02 */ myfloat = myfloat * 0.02; /* beep to alert user */ beep(); /* print out variables */ printf("\nmyint: %d, myfloat:%f",myint,myfloat); } Conditional Statements The ability of the microprocessor to make decisions is what makes computers so usefull. So far, all the programs we have written are linear. They always execute the same statements in the same order, no matter what. In this next section, I will introduce you to conditional statements and how you can use them to control the flow of your program. If The real secret to programming lies in two words: "if" and "then". Now youre saying, "Dont give me that. Give me the real dirt!"but its true! If and then are all you need to know to write programs that make decisions. You may remember discussing algorithms in math. When you describe conditionals following pattern is used: If some condition is true, then do one action, otherwise do another. In C the word if represents if, and then is replaced by an opening curly brace. The following is an example conditional statement. if ( start_button()==1){ fd(1); fd(2); } else { ao(); } This translates out to "If the start button is pressed, then set motors one and two to full power, otherwise turn off all the motors.". If this statement were in a program, it would be activated if the start button were down when the program reached this statement. The conditional consists of an if keyword, followed by an expression in parenthesis, followed by one or more statements inside a statement block. If the expression in the parenthesis evaluates to anything other than zero, then the statements after the if are executed. If the expression evaluates to zero, then the statements after the else statement are executed. Heres another example. Handy Board if ( analog(2) > 12) { tone( 880.0,1.0); } else { tone( 440.0,1.0); } RCX if ( light(1) > 12) { tone( 880.0,1.0); } else { tone( 440.0,1.0); } When the program reaches this statement, if the value of the sensor attached to port 2 (one on the RCX) is greater than 12, it beeps a high A tone (880 Hz), otherwise, it beeps an A one octave lower. (440 Hz). Notice the curly braces after each if statement. These are only necessary when you have more than one statement to perform for each case. If you only have one statement, as above, the curly braces can be omitted; however, it is still considered good practice to indent the lines of each separate case, regardless of whether curly braces are used. Take a look at this example: Handy Board: if ( !digital(15)){ if ( digital(16)) bk(1); else beep(); } } RCX: if (!digital(1)){ if ( digital (2)){ bk(1); } else { beep(); } } This is an example of nested if statements. One if statement is placed inside another. This code first checks to see if the touch sensor on port 15 (1) isn't pressed, if this is true, then it checks to see if the touch sensor on port 16 (2) is pressed. If this sensor is pressed, then motor one is powered full reverse (what will the robot shown above do?), but if the sensor isn't, it will just beep. Notice that none of this will happen if the first sensor is pressed. You can nest to any level that you wish, but be sure to indent one more level for each statement (for better readability). In the HandyBoard example above, the nested conditional statement do not use curly braces, because there is only one statement to execute for each case. In the RCX example, these curly braces are left in the code. This should not be taken to mean that the curly braces are necessary only for the RCX, as the syntax for the two languages is identical. The examples are written this way to show that you can do it either way. Here are some of the logical operators you can use inside the parenthesis. > greater than < less than == is equal to >= greater than or equal to <= less than or equal to != is not equal to Note that =, the assignment operator, is perfectly legal inside an expression, but it is NOT is equal to. The assignment operator is commonly used inside these parenthesis to combine two statements into one. If you forget to type the double equal sign, you will not test for equality. Instead you will assign the value on the right to the variable on the left. If ( var1 = var2) is the same as var1 = var2; if ( var1) This brings up another point: In IC, one need not use an operator at all! Since any expression that evaluates to zero or nonzero will work, one can test for truth (non zero) by simply using the variable name in parenthesis. One can test for falsehood by inverting the answer first with the 'not' operator ( !). So assuming var1 holds a positive integer: if ( var1) is the same as if ( var1 == 1) and if ( !var1) is the same as if ( var1 == 0) The implications of this are that you can write efficient and compact conditionals, but also that the compiler will not generate any errors should you confuse the = and == operators. The following example requires a touch sensor to be attached to port 9 on the HandyBoard or port 1 on the RCX. The program uses an if statement to determine whether the touch sensor is pressed. If it is pressed, a motor will be activated. If it isnt, the program will beep once and deactivate the motor. In order for the motor to be activated, you must have the switch held down before you turn on the robot, or select run main from the tool bar. /* program to demonstrate use of a conditional statement. The sensor must be pushed in advance of running main. Why? */ void main () { /* if the start button is pressed */ /* turn on a motor */ if ( digital(9)==1){ fd(1); } /* otherwise, beep */ else { beep(); off(1); } } /* For the RCX substitute digital(1) for digital(9) */ Loops Program loops are pieces of code that execute repeatedly. They are used for performing a group of operations more than once. There are different kinds of loops, each of which has its own use. Suppose you wanted to print something 3 times: printf(Hi! ); printf(Hi! ); printf(Hi! ); Thats all well and good, but what if you wanted to print something fifty times? That would be one long program! Loops allow you to perform the same code without having copy the code over and over again. While loops The simplest and most common loop in C is the while loop. While loops express the idea that while a condition is true, a certain action should continue to take place. In C, while loops look like this. while ( expression) { statements } When the program reaches this code, it firsts checks to see wether the condition in the parenthesis is true. This condition is written as a numerical expression, which evaluates true (non-zero) or false (zero). If the condition is false, the program will continue after the closing curly brace. If it is true, the program will continue inside the curly brace, executing each statement inside until it reaches the end. When it reaches the end, the program goes back up to the top, and the process is repeated. Here is a program that will print the word Hi three times, using a loop. HandyBoard: /* program to print hi three times */ void main ( ) { int i; i = 0; while ( i <3){ /* note trailing space to separate words*/ printf("Hi "); i=i+1; } } RCX: /* the rcx screen isnt large enough to hold 3 his*/ /* this program beeps three times */ void main ( ){ int i; i = 0; while ( i < 3){ beep(); i=i+1; } } Lets examine this code. First, a variable, i, is declared. Then it is assigned the value of zero. We could use any number, but computers generally start counting at zero. In this case, I will follow convention. Then the program jumps into a while loop, the condition for which is that i be less than three (i<3). Inside the loop, the program prints Hi (or beeps), and then one is added to i. If we didnt add one to i, the program would loop forever, because i would remain at zero, which is less than three. If you want, you can try omitting this and see what happens. Note how the code is indented after the opening curly brace. Here is another, more useful example with a while loop. This program allows you to control the speed of a motor using the knob as a throttle. This is an example of an intentional infinite loop. The value of the knob is also printed on the screen so you can see it. Because this example uses the knob, it will not run on the RCX. void main ( ) { /* program to control the speed of a motor */ /* we never exit this loop, because one is always nonzero */ while (1) { /* the motor function allows you to set*/ /* the speed of the specified motor */ /* the second parameter is the power of */ /* the motor, which is the result of the */ /* knob function */ motor(1,knob()); /* clear the screen, and print the value */ /* of the knob */ printf("\n%d",knob()); } } The for loop How would you write a while loop to perform an action 10 times? Heres one example /* execute a while loop for 10 iterations */ int I=0; /* loop will beep 10 times in a row */ while ( I < 10 ){ beep(); /* the ++ operator increments the value of a variable by 1 */ I++; } The for loop makes this simpler. A for loop can be explained in a sentence as for a variable within a given range, do these actions and count (increment) until the number is out of range. A for loop looks like this in C. for ( I = 0; I < 10; I++){ beep(); } A for loop consists of 3 parts: The initialization part, the test part, and the increment part. In this example, the initialization is the "I = 0" part. The test is the "I < 10", and the increment is the "I++". You can also make a for or while loop count backwards. To count backwards from 20, set the initialization to "I = 20", the test to "I > 0", and the increment to "I--" (the -- operator decrements a variable). You can nest loops to any depth youd like. The following HandyBoard example shows a for loop nested inside a while loop: /* program to print all the sensors with resampling until the stop button is pushed. This example uses a for loop nested inside a while loop */ void main () { int I; while ( !stop_button() ){ for ( I = 2; I <=6; I++){ /* variable I is used as the parameter for analog()*/ printf ( " %d", analog(I)); /* slow to see sample displayed */ sleep(.1); } printf("\n"); } } The RCX example also features a for loop inside a while loop, which displays the value of three touch sensors repeatedly. Keep in mind that the only reason these two examples are different is because of the limitations of the RCX screen. /* program to print up to three touch sensors in sequence until the prgm (==stop) button is pushed; the for loop is inside a while loop */ void main () { int I; while ( !stop_button() ){ for ( I = 1; I <=3; I++){ printf ( " %d", touch(I)); sleep(.3); // slow to see each sample displayed } printf("\n"); } } Hopefully, you see the power of program loops, and how they can be used to perform otherwise tedious tasks, or impossible tasks.  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "TOP" TOP Functions Here we will explore C functions in more detail. Functions are one of Cs most important features. Functions are pieces of self-contained program code that can be called by name. You have already seen how functions are used. Most of the commands in C are functions, like stop_button(), start_button(), fd(), bk(), etc. In this next section we will see how functions are put together, by examining a function called get_knob(). Return Values The term function is borrowed from algebra. A function is used to express a relationship between two variables with an equation. In math, a function has a given output value for each input value. The same is true in C. C functions have the option of directly returning a value. In this respect, functions act a bit like variables. When the function is called in an expression, the functions name is replaced by its return value. For example: if ( start_button()) In this conditional, the function start_button() is called, and the name is effectively replaced by either a zero or a one, which is the status of the start button on the Handy Board. When you call the knob function, the name of the knob function is replaced by the value of the knob at that point in time. Functions can return any type of data supported by C. For us this means that functions may return ints, longs, floats, and chars. Some functions, like fd() do not return a value. In C, these functions have type of void. You already know about one function with type void. This is the function you define or, write, every time you create a C program. It is called main. This is why programs start with void main( because the function main returns no value. When you wish to have a function return a value, you type return followed by the value. This causes the function to exit (end its operation), and the functions name is replaced by this value wherever it is called. For functions of type void, simply type return. A function of type void will automatically exit when all its statemens have finished executing. Parameters Return values are essentially outputs for a function. Parameters, also known as arguments, are inputs for a function. Parameters are the values that go inside a functions parenthesis. Some functions, like fd(), bk(),sleep(),digital(),analog(), etc. take one parameter. Others take multiple parameters, like tone(), and motor(). Still others, like printf() take a variable number of parameters. When you write your own functions, they will all take a fixed number of parameters. Special magic is used on functions like printf. Defining functions Since you define main every time you write a program, you already know a little bit about defining functions. You start by declaring the type of the return value, then you state the functions name, followed by the parameter list inside parenthesis. When you define a function that returns no value, you use void as the return type. When you define functions that take no arguments, you simply put nothing inside the parenthesis. Then you list all the statements in the function inside { and }. The following example demonstrates one such function. Suppose you are getting a little tired of writing fd(1) and fd(2) every time you want to move both motors. Heres a function called go() that will do this for you. /* function to move both motors */ void go (){ fd(1); fd(2); } I can now use this function in my code. Whenever I call go() the computer will jump to the go function, execute all the code inside and return to the place just after where the function was called. Now lets suppose I want a function to return a value. This function will make it simpler to check the light level from a sensor on port 2. HandyBoard int light_on() { /* analog() returns a low value for high light */ if(analog(2)<100) return 1; else return 0; } RCX int light_on() { /* light_passive() returns a low value for high light */ if (light_passive(2)<100) return 1; else return 0; } Now lets write a function that accepts a parameter. Here is a function that waits for the specified touch sensor to be pushed. wait_digital( int port) { while ( !digital(port) ) { sleep(.1); } } Did you notice how the parameter is used like a variable? The parameters you declare inside the parenthesis are variables inside your function. They can be referenced by name, and their value is whatever the person who called the function put into them. This is how functions get information in and out. Now we will define a function which you may find useful in your code. It simplifies the process of getting information from the knob by using a while loop. It assumes the user will adjust the knob when they see the prompt and then push the stop button. All you as a programmer have to do to get useable information from the knob will be to call get_knob() with the appropriate parameter and use the return value in your program. Because there is no knob on the RCX, the following code is for the HandyBoard only. There is some special notation used inside this function. The parameter prompt is defined like this: int get_knob(char prompt[]) { Those brackets indicate that prompt is not merely a single character, but a string of characters of unknown length. Dont worry about what this really means at this point. The full meaning will become clear once you understand arrays. /* function to simplify knob input*/ /* this function takes one argument, which is */ /* a text string to printed along with the value */ /* of the knob. The brackets [] indicate that the */ /* variable prompt is not a single character but a */ /* string (an array of characters) of text */ int get_knob( char prompt[]) { /* this variable stores the value of the knob */ int value; /* while the stop button is not pushed */ while ( !stop_button()){ /* print the prompt */ printf(prompt); /* remember the knob and display it */ value = knob(); /*note initial space to keep separation between the prompt and the value*/ printf(" %d",value); /* refresh the screen */ sleep(.1); printf("\n"); } sleep(.3); return value; } This function can be used like this: int power; power = get_knob ("Power:"); The program will wait until the stop button is pushed and then the variable power will contain the value of the knob. Try using this function in a program you write yourself. The quotes can contain any text youd like, but they should say something about the information you want from the user. While this function is quite usefull, it has some limitations.  HYPERLINK "http://www.kipr.org/curriculum/get_knob.html" Follow the link to see how it can be expanded.  HYPERLINK "http://www.kipr.org/curriculum/programming.html" \l "TOP" TOP Start Investigating the World of Computer Science! Now that you have had a brief and simple explanation of the IC computer language, you should explore more advanced topics and see how the code can be applied to sensors and other components. For more advanced programming applications,you'll want to learn about Processes, Globals, Multi-Tasking, and how to use #define. Newton Labs provides an outstanding introduction to IC programming. 1.  HYPERLINK "http://www.newtonlabs.com/ic/ic_1.html" Interactive C Users Guide You can also download an Interactive C Manual hard copy. 2.  HYPERLINK "http://www.newtonlabs.com/ic/manual.html" Interactive C Users Guide Manual Dave Baum (the creator or NQC) has a page with all the NQC documentation you can digest. He also wrote a good instructional book called Definitive Guide to LEGO Mindstorms. 3.  HYPERLINK "http://www.enteract.com/~dbaum/nqc/doc/index.html" NQC Programmers Guide 4.  HYPERLINK "http://www.enteract.com/~dbaum/nqc/" The NQC home page 5. HYPERLINK "http://www.botball.org/teams-only/c-tutorial.html"  How about a C tutorial written by Dr. Charles Winton 9;<=FGHI? @ r s t u   / 0 1 2 } ~ / I J p ʼҼܼҼܼҼܼҼܼҼܼҼܼҼʢ& *hlB*CJ$OJQJ^JaJ$phhlB*OJQJ^Jphhl0JOJQJ^JjhlOJQJU^JhlCJaJhlOJQJ^JhljhlUhlCJ8aJ8 *hlCJ8OJQJ^JaJ86;=GHt 1 3 A e; d2$a$Dp q - . 1 2 3 A 07cdef;FG ѻѷ߯ѻǚǯq$jhlB*OJQJU^JphhlB*CJ$ph *hlB*CJ$ph *hlOJQJ^Jhl6B*phhlB*phhlhl0JOJQJ^JhlOJQJ^JjhlOJQJU^JhlB*OJQJ^Jph#hlB*CJ$OJQJ^JaJ$ph)DEFGHbcde0123yz}~Qu oнЮЃЮwiaiaiahlB*ph *hlB*CJ$aJ$phhl0JOJQJ^J$jhlB*OJQJU^JphhlOJQJ^JjhlOJQJU^Jhl0J6OJQJ]^J$jhlB*OJQJU^Jph$jhlB*OJQJU^JphhlB*OJQJ^JphhvLB*OJQJ^Jph ogS"i"###-#2#=#E#;$H$t%%9'l''''' ) ( Px 4 #\'o ) ( Px 4 #\'ooXeW \ 6">"S"h"i"""E##9$:$;$<$G$H$g$o$v$|$$$$%t%%%魙镌xna魙 *hlCJ$OJQJaJ$hlCJOJQJhlB*CJ$aJ$phhlCJ$aJ$ *hlCJ$aJ$hl&hl>*B*CJ,OJQJ^JaJ,ph) *hl>*B*CJ,OJQJ^JaJ,ph *hl6B*CJ$aJ$ph *hlB*CJ$aJ$phhl6B*phhlB*phhlB*OJQJ^Jph&%%&&"&$&9&:&K&L&n&{&&&#'+'9'j'l'''''''''''((.(@(((((((((~)))+++++++жжжħhl5B*CJ$aJ$ph *hl56B*CJ$aJ$ph *hl5B*CJ$aJ$ph *hlB*CJ$aJ$phhlCJ$aJ$hl *hlCJ$aJ$hlCJOJQJhl5B*phhl6B*phhlB*ph2'((.(@(((((+++H,--`.0112 3313=3 ) ( Px 4 #\'o ) ( Px 4 #\'o++,F,H,---.&/J0N0W0000000111122213?3r3z3{3ȴݥݘݘxtjt[[Mhl5B*CJ$aJ$ph *hl5B*CJ$aJ$phhlCJOJQJhlhl>*CJ$OJQJ^JaJ$ *hl>*CJ$OJQJ^JaJ$ *hlCJ$OJQJaJ$ *hl6B*CJ$aJ$ph&hl>*B*CJ$OJQJ^JaJ$ph) *hl>*B*CJ$OJQJ^JaJ$ph *hlB*CJ$aJ$phhlB*phhlB*CJ$aJ$ph=3?3q3y3{33555553788889 9;9<9n9o999 ) ( Px 4 #\'o ) ( Px 4 #\'o{3555566S6X6]6a666667&7,78888888889 9 9929398999;9<9=9I9n9o9p9|9999999M:N:O:[:::IJģңģģңңģģңģģhlCJ$aJ$ *hlCJ$aJ$ *hlCJ$OJQJ^JaJ$" *hlB*CJ$OJQJaJ$ph *hlB*CJ$aJ$ph *hlCJ$OJQJaJ$hlCJOJQJhlB*CJOJQJphhlB*ph69M:N::::;x<<$If ) ( Px 4 #\'o ) ( Px 4 #\'o ) ( Px 4 #\'o ) ( Px 4 #\'o::::::::;;;s<t<u<v<w<x<y<<<<<<<<<C=D=שiaIaש/j`hl6B*CJOJQJU^JaJphhlCJaJ/j"hl6B*CJOJQJU^JaJph&hl6B*CJOJQJ^JaJph&hvL6B*CJOJQJ^JaJph/jhl6B*CJOJQJU^JaJphhlB*phhlB*OJQJ^Jphhlhl0JOJQJ^JhlOJQJ^JjhlOJQJU^J<<h=i=j==>>t\D\B ) ( Px 4 #\'o ) ( Px 4 #\'o8kd$$If'634a$IfKkd%$$If0'634aD=f=g=h=i=j==>>>>>>>>> ????Y?_?`?b???@>@L@i@w@@@@ʺsbssbssbsVʂssshlB*CJ$aJ$ph *hl56B*CJ$aJ$ph *hl5B*CJ$aJ$ph *hlB*CJ$aJ$phhl6B*phhlCJOJQJhlB*phhlB*OJQJ^Jphhl6B*OJQJ^JphhlhlCJaJ/jhl6B*CJOJQJU^JaJph!hl0J6CJOJQJ^JaJ!>> ? ?M?X?Y???@>@J@L@h@p@x@@@@@@@@@A A ,^,` ) ( Px 4 #\'o@@@@@ A AAlApAAABBBkCtCxCCCCC9DAD:EEDFHFFFEGJGGGGGGGGGGOHVHWHXHbHfHƼƯƥơwwww *hlCJ$OJQJ^JaJ$" *hlB*CJ$OJQJaJ$ph *hlCJ$aJ$hlhl6B*ph *hlCJ$OJQJaJ$hlCJOJQJhlB*phhl5CJ$aJ$ *hl5CJ$aJ$ *hlB*CJ$aJ$ph *hl5B*CJ$aJ$ph. AA#ANAVA^AAAWC_CgCCCCCCC:EGVHWHHHH ) ( Px 4 #\'o ) ( Px 4 #\'ofHmHHHHHHHHIJKJLJJJJJJJKKKȺ㲨xcN:&hl>*B*CJ,OJQJ^JaJ,ph) *hl>*B*CJ,OJQJ^JaJ,ph)hl5B*CJOJQJ\^JaJph#hlB*CJ0OJQJ^JaJphhl0JOJQJ^JjhlOJQJU^JhlhlOJQJ^JhlCJ$aJ$ *hlB*CJ$aJ$ph" *hlB*CJ$OJQJaJ$ph *hlCJ$aJ$ *hlCJ$OJQJ^JaJ$ *hlCJ$OJQJaJ$HHKJJJKKLMN2OMOZPPQ}} ) ( Px 4 #\'o ) ( Px 4 #\'o ) ( Px 4 #\'o ) ( Px 4 #\'o ) ( Px 4 #\'o^`KLLMMMMMM3OLOMOOOOOOOHPXP]PzPPPPPPQQQQQQQRR6R8RRRSSSSSSSTT*TETFT=UݖhlCJ$aJ$ *hlCJ$aJ$hlhlB*CJaJph *hlB*CJaJphhl6B*phhDB*phhlCJOJQJ *hlCJ$OJQJaJ$hlB*CJ$aJ$ph *hlB*CJ$aJ$phhlB*ph4QQQR8RRRSST)TFTwTT5UV%VOX\XXX ) ( Px 4 #\'o ) ( Px 4 #\'o=UEU{UUV$V%VW W$W&WPX[X\XXXXXXXXXXX Y'Y(Y8YAYDYYYYYzzmzX) *hl>*B*CJ$OJQJ^JaJ$ph *hlCJ$OJQJaJ$hlCJ$aJ$ *hlCJ$aJ$" *hlB*CJ$OJQJaJ$phhlB*CJ$aJ$ph *hlB*CJ$aJ$phhl6B*phhlB*ph&hl>*B*CJ(OJQJ^JaJ(ph) *hl>*B*CJ(OJQJ^JaJ(phhlhlCJOJQJ!XY(YYYYZZ[[j[:\x]y_ bbQb5c ) ( Px 4 #\'o ) ( Px 4 #\'o ) ( Px 4 #\'od1$ ) ( Px 4 #\'o1$YYYZZJZNZVZZZZZZZ[ [ [+[.[[[j[[[:\q\t\u\\\H]L]v]s_w_y__a޽ޱޤ֚֚֐֚|j|֚a]hl *hlCJ$aJ$" *hlB*CJ$OJQJaJ$ph& *hlB*CJ$OJQJ^JaJ$phhlOJQJ^JhlCJOJQJ *hlCJ$OJQJaJ$hlB*CJ$aJ$ph *hl6B*CJ$aJ$phhl6B*phhlB*ph *hlB*CJ$aJ$ph&hl>*B*CJ$OJQJ^JaJ$ph$aa$a-ab b bbbbPbQb~bbc c3c5c@cAcvcccTdndodsdtd~ddddd ee:e;eXeeeYjͿyͿͿoooͿͿhl6B*ph#hlB*CJ$OJQJ^JaJ$ph& *hlB*CJ$OJQJ^JaJ$ph *hl6CJ$aJ$ *hlCJ$aJ$hlB*CJ$aJ$ph *hlB*CJ$aJ$phhlB*phhlCJ$OJQJ^JaJ$ *hlCJ$OJQJ^JaJ$hlhlCJOJQJ(5cAcSdode;ee0fffffg0gTgfgyggggh ) ( Px 4 #\'od1$ ) ( Px 4 #\'o ) ( Px 4 #\'oh*hFh`hhhhhh iAitiiiiiijjWjYjpjk ) ( Px 4 #\'o ) ( Px 4 #\'oYjpjkkmYmimkmmmn"op!pspwpppEqGqssEtMtyyA|||}~~GHVW DEG=MN^_opۯۯۯۯۯۯۯۯۯۯۯۯۯۯۯۯۯۯhlOJQJ^Jhl0JB*phhlB*CJOJQJphhlCJOJQJhlhl6B*phhlB*phhlB*OJQJ^JphCkkmmmn nnnn#oppppppppqq)q+q2q ) ( Px 4 #\'o ) ( Px 4 #\'o2qEqGqsssssssssssttt"t+t.t0tv*xuxxxx ) ( Px 4 #\'oxxxxUzhzxzzzzz{|| |%|1|A|Q|} }~~HW ) ( Px 4 #\'od1$ ) ( Px 4 #\'oW EGM=N_p< ) ( Px 4 #\'o ) ( Px 4 #\'o ) ( Px 4 #\'op<v{#'34523AEF|deÊĊŊƊ9:IJ{|݋ދ-.FGz{,oprɿٿٿٿٿhlhlOJQJ^Jhl6B*OJQJ^JphhlB*OJQJ^Jphhl6CJOJQJ^JhlCJOJQJ^JH<H'3536ŅDžυׅ+;?A ) ( Px 4 #\'od1$ ) ( Px 4 #\'o ) ( Px 4 #\'oAF|҆ۆehĊƊ:J| ) ( Px 4 #\'o1$ ) ( Px 4 #\'oދ.G{̌LU|֍܍ލ ) ( Px 4 #\'o ) ( Px 4 #\'o ) ( Px 4 #\'o1$ލ֎ߎܑ4Zhkz}pr ) ( Px 4 #\'o ) ( Px 4 #\'or-./HIJdef+,-.tuxyz/=@JkqGM uНٝɽ嫡יייhlCJOJQJhl6B*phhlB*phhl5B*ph#hlB*CJ0OJQJ^JaJphhl0JOJQJ^JjhlOJQJU^JhlB*OJQJ^JphhlhlOJQJ^JhlB*OJQJph4/Jf-oW ) ( Px 4 #\'o ) ( Px 4 #\'o^ ) ( Px 4 #\'o^` ) ( Px 4 #\'o^` ) ( Px 4 #\'o` ) ( Px 4 #\'o -z/= ԛ uȡl ) ( Px 4 #\'o ) ( Px 4 #\'o ) ( Px 4 #\'o ) ( Px 4 #\'o kl [eKQiqrTUͯίѯүӯEGñıݱޱRSst꿵ͅͅjhlUhl5B*ph#hlB*CJ OJQJ^JaJphhl0JOJQJ^JhlOJQJ^JjhlOJQJU^J hl0JjhlB*Uphhl6B*phhlhlB*phhlCJOJQJ2s NbmtФ ͥХ ) ( Px 4 #\'oХҥirȪ3i9Sdʬ$0? ) ( Px 4 #\'o?BN]_ӯ߱u"}Ƴ@CD ) ( Px 4 #\'o ) ( Px 4 #\'o %&ef{|ijųȳɳ  >?@CDhlB*OJQJ^Jphhl0J6] hl0JjhlUhl hl6](/ =!"#$% Dd!<P  3 3"((ADd  s AÜarrow_blueyK yK phttp://www.kipr.org/curriculum/handyboard/hb_setup.htmlbCS1CsnCS1CsPNG  IHDR(PLTEkkggffeeddccbbaa``^^]]\\[[ZZYYXXWWVVUUTTSS&эbKGDH cmPPJCmp0712HsIDATWe0CK]KT$3S|=dS2,M\J6BU74&ZEDo5v1D;v[zZrY@ܷ) A)fl|X_ޯ>e _IIENDB`EDd  s Aàarrow_blueyK yK thttp://www.kipr.org/curriculum/rcx/Botball_RCX_Start.htmlbCS1Cs!nCS1CsPNG  IHDR(PLTEkkggffeeddccbbaa``^^]]\\[[ZZYYXXWWVVUUTTSS&эbKGDH cmPPJCmp0712HsIDATWe0CK]KT$3S|=dS2,M\J6BU74&ZEDo5v1D;v[zZrY@ܷ) A)fl|X_ޯ>e _IIENDB`YDd@5 5 z  S VA6Composite_2motor_seq_smallRXY:xlhMXfFXY:xlhMJFIF,,C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?K˘myfpԓg%Vc|3<@?Tеjd[9ynP;XMh1÷6_ 6n!+ ;WOMQH(otyT(r{}k&ƫ%ܩ l,>W"1?9A'rY2<-ޢ:PE`j2tKv! m>?R?Z_- zp^9Xd``Yά!;p~"ވA}Wmuv.`dnN>=tY!{-ݤevpv=֎j 5/&'جlT ̛f@\ cj@(@QEoK4k>?z?z@2sGno)B;cQǝE؇V Ś}Ӽ6wWP{B7l(*:yNO=s^UqZd{D<:],I+J}VTμSzc)bƚwm{iPMȤ{~BFӹ;jW/$^d lJ,G9ҵ4jyHhW36%#w9ZRr;}zi:ukFQ]azzuNj{u[Lg}~KI7%oQPwor x7`J}*j4!ES((ҖzRH)i6(r bYG`5Er{Gҵ+wxom IUkc4ZyF]BN6D8#$dtk,Smq]=zGQ_5j>:Wl<ɤ`ňp#{t=Ɲz↶x)88? @zֵ`-nP8`ҼWgȃr *W8QR&t|]e)r)^;9 v]n>[H8@\ O9{0}'Hխċ%\M'=r8<v Z$d2QXt<ʬ#tv0[ٷnčFV_$\Ӟ@s{_񞫨[J>]ڙ|00lOӥfj1^۴S觀@Hg_>H&]M9?-$S ђ@*=3׶8 H&ds3c΍ʏv8l oW~NRzxڭyh/pFW|7T}m.=E򩓅vKC#_p_!e, 9CQiW2DBsvwYc/- ? }OS`S(&yX^aN2m}pmOfc *Նg\ 遁^(HzҎGW[isKZ4+Q,FN&_6p.I I J[wr;rou{sq,Mq, ӹrxnC"vאN:LKފ'O+O5~GxWSöXr1CqŢB7|y]{0r2@ iiڈvCpsfy:QUkbfaioZܩ"eC~o ğ>$ oN|U⋛dw"+@GNrHluHbJ oT&.w_;aRxG4,4mp8U-o˩\4L\d3Eٿ#e;\(ݲ  ~5qvNcWG 9llxZIkbG^(d!#xRb%g_ӛˡ)+v+\xgGcasGZ-%/m`,ETPMgsX4 G麮xI xW fz5 q*I!i=8W SMIpU~5Jw4Jg":eH/ݻ֟PkotnE2@:0#v?7T4atF1n;¨͡?=REd6W?:zZD7\JcAHxP=zd sE &۷GB_\&t+嫜9%W$RGJV̈B)Ӝ`t=)z#$m;mu9X:mjZ}ēKJ,ǞJ+2A(f EO׵=8]v 0zd=]T^8{_ꖌx3ZqckKؤa$snޞp$6ۛ2g6F~_@Xu¤fs&؛Hk}26`B&Kc#r?&2icm H ֹxv%rKgfV68䏧[o5kTi#\6<6y''hMOmv2fx@|;z%H@Ps2 nR/L54,1 뎧#w~7ahs67$̢I$*][967IMj Yp̸c vᨥjpb9z-u[WY0p =@Z6ZIlI;XKsWj 5kh|'NC yEv9QU ʌ~U18f3')2jbKm#aԪq.8Yo,Qpv2}=jhmo4ǴxF+q RI<Ҽ9&HT(V4w6<F ȧ5Je"2h^>@#NNIp&B <>}pi̪M[S +GC2py#֮%T'q ;Z6Hst>qjY-n<"$P ~z ]1ҔVs R{\^g^ H-:v-m[h|ʯ @p;c5qx/ðH΂Q&98 }hi1011,G^; xЩ%tbiEٳ^46x3Hr@qCfN]F.Qdaq^GcZy )UyUAV6Ԭ5iK7eUu%Wԁ 3i!Җ)Ց̟Z2i(UM?U{sqZieAʒ3ȫy3Fhњ(4f0v~3yɫ0M6XvjZJòz*Vm9]Z 8:uηD$vV5,& ֵz\c挾;|?zR p 'jIc+YH)k#,e=F!Hc|/=9j  oZ>/-VRryK @rsI6mw2ĝy''-Ey֭F([~DA! v/ORߤ.Ӓ>i#@ΦzU{Jڬj[tu yfQc d<~Pzt}xe-P?wx{*IV?9n~R +|`}‹'ę _iJʹ9lxKᏈ?Eq\0#1)8\zfF×su4w1L$%n$g^yj8tAUBtD0WʀJ˷Y}GEy΃=g׬/ gi99zjl/P[{،LN9sJ5a&zٚ4V54+mbb2ŝU& 2#U)F[1XZ(((RS'Ϸ-Ԯr:=3UmmRwyS HVC +;kO xU׵i-m@AXH |^M۠ E%Z)(Z)(Z{j1m`A"QE]|.&[ul5pہ#IUhحA h3&? b*NU#7tgPKSvxp&ʑ|JӼ e{%BןJ>nQ:Y5kIEwR1N]j!]$p7Y&rFV5;ѓ=Ov&d $c>!> u@f*gba sFI1^+?TF-RH8'3w}[u'*"'$` qrJ̸#XnUyʁ}S/ty-3B7q4cF?cZqE\L>yQ=C2E`8mbI~۰Ҵ31ʊsB'Ԛ ,r(/ԋhŔ1 v?i_>YqS0Ailp %[!+?ҶH%9#EEsYTEʆq"MpY'?Vܱ.2iRx[kA|#`XpX FH\Kk< Oה&Hh!O.dP gk&:kF˻8+(.Qwd}Cowob3#5kÞ0ҼM]k8 *8GNA=Fq_6D3m= 9zK8M]QHaEPEɠc] wܫ6ؑԃ )Gp0>|9q%O$vyNAnFzv:3xZQR^[UF.۷x0xuewԨqRq;5bgfMwPy.ߘ$s^/ŭ:CXMKV4fd vX{80l*qsڙW3o-T?$~<c]Sd}:_qj/} *8.;15՛a %842kٍŕʍ$p=~KfEc,ck1ni jCP?˭FZբg'JN>J!zwQgRU*zSHlzc_j#+yȮYw8ciQYMMm  OM8գ9-R:pxQ^n/U}WHGOo7m, lYpfeoQFU8{n$\t` so8>{N [ATkNQV=ECF(@(/#ԭ.lۘQ8_1Bpp\w?JͱapN\˞~ls^3ƚkp,̇pq"m_>ip5eҥ@?6 񞠚=g]]Uԍ3o-z񞞔Q;y}JߒWRd2e[9ϩޫ$uI?Ο%+x\i `pXlY5ez8Fw2Uqol"7Q 6K"DsL6eH1z2Wo 'q;^2.ެqxrK.7'5j+It%0 X,"@Ǔ"?Ui p9e|g[5(ڔls8)ԗ5Y]]K_Daq@#0uJhn[o"'v>אE(mf8?^*ĖKm, N AGS_cE+l<X[ Qjw[Fx#װK40`"#f Xs m ǙH #];M͛8IzjVsg:O tt>>ǚ֝juK[hAEPEPEPvOEDG"=WiZvMͼaar:Y;ssk]!Gt3XңQƜkmRZ;y ~S0Wڬ7rb~ 8鑎k  L:ϘܲYN8޽,6c)MBߩ$ڭ2@ &#-O8IP{ 랺үTYU>wX5vg,)IZ9T qEzCyTSa` uAqW 35xs\o^I|5HݸusI[ٟK)ÚJ/JmnkTuZb22<8:g!h*1M39 W!:O!a1-G׊ꭃQ^%\d+8iF2cR=Jp-+ |vl NV S-y~v SEEt*IԪ䞌ɂyUޜׂq-fle$Q ָ[mݝI%:{41jͥqC }y'*څOs ,p7p$?Ŝ T|-D)nӇIWہO_Z݋e0LWo9jfx4  :/qMt;uNh2u+On=<_jBcmo;K8tQ_?6ְ#\䟧v5 "Ymݏ@sG1^c#\$(vnm?h dvcS͕I 1OzƻS0(>g^j," pa~fO$+iQL(( KDӵho-Q.an&k(6P \Eg~k+oiZsWn>Pw/UFd|\!R`z!ʽv嫗ѩV~_Z$xwxd#}ϥ\m᾵,% kS/1y|uֹ%#(Ǩ\p˫F[EkmInč9_\ѷ2FX39#?ŜuOZ<j[cjB1 sv ij:-A1ԑ+_SIdTnWosR3E`c lS$]x+\[[MNWqHH'ʣMe$XՐn@ t]b5fnizm[K8ԖL|Ő@9QPj5MUb,#+q?SnܳMp=pB-Zai6ۚkc+$lJ']O8FnK>ui;a>lkpǣ1k wtG>@g= '=뮬i[߱EOf-ơ:; aUF{zuYj֦9';\t8# ]'ᦓbx^̹mh$Wk^}z>8:uJ@}gG2>?Z/[BѦb*8~mֽbȕ?j*ҕ&i4)jily 0+ʼn73p0H=MGĞmï~1^*;{Ȅo(Ҵ,gԀO(8Ԁq|j ɷ/wP\I-^{gx;6"t+tvrxJd.>ڠTt_.[?+7s3ZT3 ѻJfջȏs#*06?6:TB m8| cB6L`qɷH(S˫cgㅖ@qֽ|62ݒ1NMNm{Ym^8߬Ӽq]Gw{/r^ao[w(waœ)'դRh d e>3F:{WY4fg ow ,l=="QŜq'z|~9_jF'ӞkI xoucj>>ԞIe[ɕ1tG '(+¡ۚA?L5q[XQH ]eZ6ڭ̊>iJN|6A!'fz9>!*!=;~SY]eA6( -4BQT$uRMPc17J6 bib&{l?t,O $`G@st~l?$s7 |8W/cdfٙv$,da*Gӏj\6R&IA9z~}6ekpgPg>WLֺ8dVHnWC֪P~%bc(gqho3ϕSv:'14sĒ"n0==Ivv1jݽ흌0-L+z0r+非wiWhfz<@'5GV*^w̙vw ($ٻaw\gZM-,||O=k!cl-~ [lq鎘i7Ijr XH pGb? bqwi/. u[یc#ױh>Td`@w3Znh6E +3=zw_F+&PVHcy\09y _ưk\ 0g\Hszg}zU8~qZO*$~}?QxC󌟼P??Z pGrww)g*kWMZ6RR(5B'jc[324Wi=2;~ֶ!Q5+Ic>Z:41*6g?+jԹ&LѓװmƲ7HSq^jqnPu9*ߒ83DXFjݚ;<ȅ@Ą0H޶2K:&0K<>K+M @ *p7wW8$.Hul*ȊH=ufG;0)?Qmά&pQW\:EM(+&:R9neRY!͐nC׌ם^3DvйcEZ{wLGl?S_ETiYul\ ;kHFh .n<<;W\=jSE-D\g}QGo$f1}U|?  YV\Sڼ~w \.]̌`ֻm3X9ioMp=QTPwp֠[P1gF0197hlIEw{sz!F._$ K?EzmQ Y;pהK,h"0c8J,~F RD{3]8wM5ͥ^+aix&g{،yB rO8cvu'DžsEKQE%Q@Q@Q@#}ZCҀE.>"Tdц ?IF Ѯ/Rɀsm>Ñv#5fE ,x#V>ٮU\Ϲ:/|P kr_Bk9hUa8t'W`V~麨MfPHW^+ϫEVz*ϩ)UñYzY}̤bYO< CW i-Ie;q@pyUXK 绞HZmPc:WՈR,wg[iڴa /!!rzs{VcE"E~\^T{,l(3-j{qTy#&f9TrŒ9}.>RQ@ E.>( ( +B;zc `N-M0SRtܠHV JFacEPdۧ2?11 ƈsBڠyd܅цk+.1\[d>ŕP }i$Brr~ah+ PzJWO0\?2f.ߪ/*>Wm<1H 皷m#kEcml*H bT=m48$a_lxxE5MY.私rwM$H%LrNpT8K/)5)#m$c~l/こ^l/ d-a\j~Z] 6@$.X):g [c*+4k-2=N<ĸ H.qo~" @ckxI9F'3">(x@BGY%GIaC#y8l0FӪq8wÖ_e]ӣn܍rіWҼYOi-dVUkDB$cӧzb޻ MRH8فr`m\:~3;ʲ*g#+J,_8Z*Gc"8$1΄v҃EO5Քmq֤0B-pHڜԞz.y>' He_2=!Mi`e3mF pVlʖ r=zS^i$I=CmR'> W~kΔ;IY-&9*΢er8O9]{;7dXՊnv 3A#mfeans]Αu%R'Bϟ;9'N0qr856ۻp#cRK pFIT"$~iY8T|\kKƪdb 0N#ܛb/9$1n>[/SXcHkFgQ ab͜;}! rq\s4ڵan#R$N#U@+3*A+-gi†;X[ "2A=0=>'xh >e>.|:321.! .6 2'ǹתwC2y4y2s~{+E̅:UGUUQ#l 0F׏cWGK,mggV2^GRdt 8_L5 tn"ALYw#nZ220P{E4wBi5fxZҕAA۩)׿׊bKͻн0GPO5o\#N'uS4hȌ*䳮cu1xXMR=Zđ2NX կO+]" yqw bĆ e2$!}:=95XUDbX~ Pzu|;|RLrK(?A\RxӢrZ#hQEQEQEQEQEQEQEQEQEQEU=Zɵ-d5rR3Px10-˿'ύ'uq]FȤM26V1[7n}9Ri5fx61i9 FRP 篧'޼&\Jțvi1(x^Ux&խzw,q7`m'V{yU$Hc qFiN ɥܹNIm \$e2:_3ӊg7V&ௗ~d\;FH<אkJH#, LQw(*@-Lu]1 ` 7u5x5zjA l@жt\><֕,Nc 2yr `cy 3ޟ{ITVJr s{FMʨ~\=jY6j{*OuSQVPx79\*=;p2h-Տ`a`sLdrT8'7ϵ\VъWӮvbTu 6X誜fv9#m5i AC$z9ⱑ E cV/*ff,Y+6MmerY[n]njp{V*G.^J[dU3$pC}0<]Z*GjH*q!)oWϽ|_ KrG^tTv,D[4߯ZJUfjTP:BCL.tN{ӏj|_$v0 l䀣aYia)ff19=j#TP`yaWG-y˫R rH5XK$L~^qӼ?Y7L_t 6Bv,9x>湱/ 8C#zXk]"."%e!K`s9\_^]%%P;+1݁Np uv֖Qm2ŊDFOS,<GWt`+aQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@׆D0[rHŞB #q yş i^{we< PK3¡{{"ʁg#yĎTG9$~\u cR2ESZY%G$ܰ'@KKl`)$.g=A럺=pđDhU`(aIx[J]e〤pxOJ'uD7q*\(8e:}+۱KS)Iݛ{gnCk1f.$/sOa؝fK32O;Z#*q޽ ӯm/`g1ݱd=15kֿ07ki!u(|@ଊzu*;zW+ԣu&ʼ,vv3Eu bp.BH𼃏STwiY.n(s5bmݥbT9e$(.+<m<,Č+lJrFVj%-rmm2;UqIUyVQҽFZqrR2rO18/Ѵ]܎X298{{=}.~m/sCrk)GW_M>!8XǩTK@$'\#b9.FNxǩM"44U`(>*_],=: +YiZlF++XmМu>f+(/>)x+OסFXre]Ip5漗Sh{$lFH*d {kA}5TdO yw t.| oW;for=k]f-#u찃W n}k&^LMuHg;V[2y(o 8ȧ\F^#Cjwً܋V=NıiV ŗ៖+E5qcu%kK.* A!F %rϠMbEKF`Xc拝cO,4ۋK3I]σpy5 R}vbE3$GC#p3pvO2yP5 ]j->͚[V@cxr=h#Su_xWo֦)wIVA<#EPH zCVvQE((((((($,Pb}O:,@ȻAH<|uҊ+ zuζ{h?,,#ԂI:Ƙ3WcO5 hgȴv ryRuH},lQEQ@Q@Q@Q@Q@&P( 1Eb((%ke%ėܾdY<`t3Ԓw( (?7ADd5 5 |  S XA8Composite_2motor_seq2_smallRg@`uEC@2aF;@`uEJFIF,,C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( (96RrO{tӈcRzAڊI㜍  1ө-W1*%HFJ< &𵧉Okqatv7*Vs# 𗇭K 'ܹWs˜ǵ=,QH(kƌUFKyƫQljDQ:p{uPIsj-fz—70?™ڹx< Oxr9b : G񎯫9bO&-C $Hqo79&t'hc'Ws_I-pQV-E\_:֣kfb8e"$1 g8+IR2yH$.U6@ڽ_^9Q]vhQ3 O88#^u)JKSХNV:*֗]F9o2,3A>ƲFee9֧( ( ( ( ( ( ( ( ( ( ( ( ( ( 5Xh (P u:ޝrDs| wxC ,$ԟzaU-px+ A2+_FAjabb޿O3M<ڴ.:eI{~5 nRչY$sq"-|Fp^?KpHf '@y&{bd8e9n:z \‘AKyʃ#p;s67a'?+=VSIƛiYZ*pF[̔ +Ӝo[[YP,ЃooKK+KI ."=s:H[Fi06>sߍsׯ|^ LDii.RWJiZYu=]Jyg$2yF z^kwQlV\:8\`8\&R;om@x:zs=YɧغM$Sg8:c5s_X>]th .15p dv oUQEQX%SCӋF7 p?#92 cR10Žk t'*+ko-eE܎!kqQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@xw/ `jkydl.TB=9$b1gvVZukZ:19ݞµUӕWOK2%*;0QXe{Uؒs'C5E ڤƽ 887NJKg 3#2lݑá)p7Dɨ@HGd#g<P/#8"]9[몱GGF5!@dɶS 1b,מpzzԷw1:DUu\S81'Puڭ.Ȯ'8`2{^}ljurGuu[PU60HA$qr 3OQ1ǽ>WK;m2ጃ9 s z}kEziIe!v)vS8'Vw2WzZO"_ܵ; W O$~`qbc^OkvżPJ,˹ytG<KiMm{2/,< >((((((((((/VΎ-'cP=ǯNƻJjt7;WPp I֥*iE3Dw#q "HddL-jSi#tB9q6$g،V) aJ <]rՏ,ц дgT`/prrp' c+_R(#Fq(3Y7EJS}UV 1U9ͯ5R/ ]F)`qҲf,) ~5K9ıIG=kk[kh$LA=?v<>[[[pВzc9 n+(̷743Fs sxv8n5iݖ[!mj ln~ 4-NIxxт1zcǩ+Imqvy>ۥy{[9n$|=H wfOs;x牷G"FdT*斴QEQEQEQEQEQEQEQEQEQEVMԣp8 ;szq\^LV]*?bGX]{W}EcWJrƞúYįb|W?*7pG^+黻+[ DH&9uoZEK 屑!@FyWCEAXa&{W[XFPƿ|ʗ :#OoIoy1q*t'y'ⱼokK!{.bW-~#ƳU׹ц*K}`2,9y΢yb#r9Q3W8 rhiUW6 um՛-7͋qWnINj"$lg$}GAI=:C&Zw'!B6Ϸ5#}I@''Y]U$^@㧮G9()J-nsvs$ vK=US(TIu7͌KFg 9o+ۏry'/,bvwN0t]-oCKo3)$sI(|ZŽK2d9#9YOQz,5 8EF/s)IxcuSxv͈Ons9S4КrMLGH{F &KN%pC/&1{|=~e"?~#WU9¤b}c{L:3A u FEY޹iRiZ n"q9$cds謤2 \@QEQEQEQEQEQEQEQEQEQEQEQEQExo *0* d[ ՋcU\HÞ9ZRR Wk {^/yĖkn.mч8xp[ )\qgwo󃞣'¯E efy6gi$ϥt{.uUKhay}pOϷ^q|8M&7$L<|7/'9Ҽ\f[9Mգקo ֑)$Z~&H ] ?e9 0Є,OnzWq'|G ^OӕkKݩ< qTbi¼n?/(`gYVS*~n*`IO`Iǧ|Z(]' {tpXJW//n8]yP?yXg<צ*h6Oߠ'9Nsýl,:y=ϭtTTNj.Yǁ]A%խsB`lM坡\0x ?f_lqx }gVng#0A|zx,Zl]u0:11sܚ)ɸjU=" P2v?TJ;[{y,n dsǧjͱFWYзSӦ}{f2WM!3q*½kINba=TȇgE2}=qk0Bw8UX۩϶ mBd8O&Vq(b̜8|ֹVc*qҵ4]2S/۹,28ROw"|l)ԣ3Jpʗ̚I¾a`9O|U/;zʟ&q#, w\V$paGo w$qugaE bg'={{ߟHŤެm6*xY znےzxּWd[L6ŒkdJ͝ܕUInx=r)9FQEh0ӼI ok:}ʥ;kHRH΀4袊(zޕa?w6leVpMp:ŖNVXliC^zzs獼Zz^.U8f@N*v* d#$ddz \ѿme'XOp Qյ8H[[x, ԁ:YV2XS-VSf?*v8:tIޫ$wE`8$v<ՓfaE!b)xNS,0Grr{v֒Gk #Y@^ 㹁&#?B Er (";64cӒ a~a8SF*}v^\~=h@tQE0 ( ( >$h:K5K"De(;x^>+KFRX#'vwn@yy./k\D<.$!zw?lhF |""QK_ĥ&<}2!94'>n;-mn,(܍ӟq^yl5EӴ,ѫ wAE JdL8ݸ1 b:UӃww>cMg-y Q~v~׽_.Uu1irqߌ~uviwK<nvtxZLڈf˨ KqA#SgSMҫhNy*qP[O, bB2N0돧it_Ge egjBeSq <`qWi B'TAIs:T|IF?6R}Tw2\j-$rc͔ UYf0_n܀|{ԙC8Ghul;yZacb~P?^r>#b,7 )Cy:Ь&BHq߮4RFݒ ?Sln 9 zsX1V{ѐDpBy<Ͼ'(>:By5t'LįBFw:͜Q۬/Ơ43 TFL랃לORӭ}Fd`h~Ԥr;l'@c{ä_[nYa)B@#{zW;Z;ݺM?ӷmx~C"ڶ$Ƌ FSxW4}k;@$S2A9#\zE2p.$-fۄ\A'ڸ|jq~՛7%038 @Ĭx;GU*Q%}ŗfvn80v>!^5Yjk% T9峁8yMv}yӸ۽{g{ בBL <2:߻rEu[9!<#󝧐  qR5M:X6%GB1*A O9A\7HD̪f]񃑽V@ d`NSJ=2 XI"Jpw33N*OKWW}Ѽv]Ap8885]-8U6#<5ZQEQEQEQEQEkͼSkFk"HeNvw|F**SEi Q/\.ڞm<&@cU^`CPwAW!d X(:R[=^0A![ɈaO+2XZ{."<64KOnuvL9?SȺ;[<Lm:_ʊG =R:f{qos]Z$eB S"CҲn..igVaGb x[;c_,1 b g kIaVY8!rAmwc,yɍձf3ۊ4upS~aŤ0͓dNNr:qX"co,0O?iY0# simnyo;IԖr»=N8nFAAhag]csz[_a`g)=?BWVe+:<KIs\tn [,taԐg;zz]йxH[hq۟"UeMXŎР3|gI<"kݬZb(ai_(V1М r0ILV (//XN=HV}ƽ,0C na+ផWJHѠջ}MSi/uksn#fw~x펕jODHc=z?jn<оc4x]6;|j 4O]kftao4[R[XnUbG4-yn%-xC( xdd!Hߓ1@L[d#؛/@t `lq1w]zG=q~bm9ޙѠ6z+81b9Tq)wlN թwHy?/w2_4v#G{;OonUG!2L` cARؠ ѿgB>lԜci Q;@1#^@F=&ճDet XdޝU[%BEPEPEPEPEPEPEP{K.U(GB3iO*pn̫6s9995.1nMrX^P!YA`vA08̐-nbsԟ5?*躤 EK$``pqۚco:h16HCc>lR" +Qu~2.ypIʖwGkp$Ԗkdx 1>c۝8 6Oʊ~<5tuXT `˜pc޼L>gu L9TV4eS;O1 %C19ߓWo5. =J @^IQia+hBaA<95뷳-[9>ʿ3IPaT`)=r1M{-_C<#I,LNь ` V@ wTub\56yW6MA" Tt-3H6QD02c.C9b3}=+ǭNNiT}7U[#=2 reU@=y皉F(]1hѲ.R%Sm)e=vj5[˻-:eЃZ¾YV*5S[̷αss u鼕Lc'QӵvnSr60%[=x+6O2!\g?\R>ΤtKf%Ŵ7(#GX<95k$`ă3Sn! R8ϯZ_/|@_ڑ$yerAs,.dB#נx7Þ"-!m>)`|$dO ;8/IaWU3bNWIO@F;V>5cY#د9V8#9eZcq FlevQc89J[.oBONuy꺃HR6bzqT-љvGħSX-5z=hw 2FeYi 95ZGMn~Du%yN@#=럵׮ڼrH?Un/b<~8>[i$?1%*={y75 Oʏʼ&⎊sQEdlQEQEQEQEQEQEiu2,H @98 gT\ '2FI2R-JٿqeY#14*A`22y1[W:D3D~ΏzDucs׸jz %LKb,Y~0}xwB}3nx^62T374+M]I򜡏2=$proZhVeZ8ș#̹=X(EPss^p*$ ,:WE :1[Cg 2x{צx':E%oy,K#O(؟c޺XdO_> "]Kqq:*ܚ(%''yъ (((((((((((((((|]Vnu[XʹeHڡxzWq>٫CrZ0ME%cȉD HQT`*L@6L,rjׯZ3#J8ZPwSC*(c4v7zM ec\BO@=zw+ r-/Lcv7g>WKmgmekodȐ*N|,z[AIZ(t_ wo4.-)c;]NAC4 ]Ե VP&Po +٨} }dst/~+5QjV+ VO,O5zωex4sq5m{6X[pqzNMx櫯KcIXՊj͔K/gf'`uո"xM枖%閒٭UFJoRW8CǹQOG^-⏈[^E=6sE#vtA' 9|m3YBn-3CmHo. Mpx;rTx&\˰66D4MƫwN miDDzΛϹomfE hgEfp.Zފ`VlQSsQ]Òq+w,n.Ӎͽ吳WÑ#`3'*?.k(]C1h֪دrE2V8ۻzҝh^%Φe2qmC1\.3۰(̻:Wa -5lX\^ es:܅LCPD ci˓ú\ ]ݤ-ђg+a*R@2@Z-g$$If!vh55 #v#v :V 6,534Y$$If!vh5'#v':V 6,5348@8 Normal_HmH sH tH R@R Heading 1dd@&[$\$5CJ0KH$\aJ0N@"N Heading 2dd@&[$\$5CJ$\aJ$N@2N Heading 3dd@&[$\$5CJ\aJN@BN Heading 4dd@&[$\$5CJ\aJDA@D Default Paragraph FontVi@V  Table Normal :V 44 la (k(No List 6U@6 Hyperlink >*B*phD^@D Normal (Web) dd1$CJ~e@~ HTML Preformatted: 2( Px 4 #\'*.25@91$OJQJLO1"L Bulleted List d^` <B@2< Body Text d 1$CJ.X@A. Emphasis6]D z z z z z z z z z z z z z z z z z z z z z z z zWS`&-27_;BIPWT_#gMmu6}{pND":1( 8 H \ 5Ka ;=GHt1 3Ae ;  d2ogSi#-2=E;Ht9l  . @ ###H$%%`&())* ++1+=+?+q+y+{++-----3/00001 1;1<1n1o111M2N22223x444h5i5j55666 7 7M7X7Y7778>8J8L8h8p8x8888888889 99#9N9V9^999W;_;g;;;;;;;:=?V@W@@@@@KBBBCCDEF2GMGZHHIIIJ8JJJKKL)LFLwLL5MN%NOP\PPPQ(QQQQRR[SjS:TxUyW ZZQZ5[A[S\o\];]]0^^^^^_0_T_f_y____`*`F```````` aAataaaaaabbWbYbpbcceeef ffff#ghhhhhhhhii)i+i2iEiGikkkkkkkkkkklll"l+l.l0ln*pupppppppUrhrxrzrrrstt t%t1tAtQtu uvvHwWwwwwwwwwwx xxExGxMxy=yNy_ypy8J8L8h8p8x8888888889 99#9N9V9^999W;_;g;;;;;;;:=?V@W@@@@@KBBBCCDEF2GMGZHHIIIJ8JJJKKL)LFLwLL5MN%NOP\PPPQ(QQQQRR[SjS:TxUyW ZZQZ5[A[S\o\];]]0^^^^^_0_T_f_y____`*`F```````` aAataaaaaabbWbYbpbcceeef ffff#ghhhhhhhhii)i+i2iEiGikkkkkkkkkkklll"l+l.l0ln*pupppppppUrhrxrzrrrstt t%t1tAtQtu uvvHwWwwwwwwwwwx xxExGxMxy=yNy_ypy AHQX5chk2qxW<Aލ-Х?D\`cegikmoqsvwyz{|~D]H?rt/1}-1e EGbd02y}2223t4v4x4444C5f5KBBB-txTͧѧéݩRs%e{īȫ>DXXXXXXXXXXCXCXXCCXXXXXXXXXX[e y  ( K U  nxnxKS)3/ 2 $$&&))**r+t+--S.U.]._...66666678i8k8q8s88888O9Q9W9Y9l9n9X;Z;`;b;t;v;;;D>F>>>????D"DEE3G9GGGGGGGGGHHIIJJ0K:KKKxL~L=MCM{MMPPSPPPPPPPAQDQRRRRRR S S+S.SqTtTVVYZZZZZL[P[ \\T\]\a\d\f\m\\\]%]0]9];]B]w]]"_'_I_P_X_[_\_a_p_w_ ```"`=`B`J`O`R`W`k`r`v`{```````````EaKaNaWaaaqaaaaaaaaa#b)b,b2b;bTbbbeeeeffffkkllnnYucuww>yDyOyUy`yfyq{w{}}}}}}}}}}~"~4~5~M~P~u~y~~~~~~~~~~~ rsLOɈ(2lr (JP#+ /;גْQZNPTVݖ ՜[cilmu)4TZ17 F@r3CF::ppuFGGFvLlD3x444h5i5F@0nD@@UnknownGz Times New Roman5Symbol3& z Arial?5 z Courier NewO1 CourierCourier New"1hRR/W7/W7!24d}}t3QHX?D2:How to Write a SIMPLE Interactive C (IC) Computer Program ahmadichangyiOh+'0  0< \ h t<How to Write a SIMPLE Interactive C (IC) Computer Program ahmadiNormalchangyi2Microsoft Office Word@F#@kZ.@kZ./՜.+,D՜.+,h$ hp|  GWU7W} ;How to Write a SIMPLE Interactive C (IC) Computer Program Title$ 8@ _PID_HLINKSAZEN2http://www.botball.org/teams-only/c-tutorial.htmlw K$http://www.enteract.com/~dbaum/nqc/IWH2http://www.enteract.com/~dbaum/nqc/doc/index.html E)http://www.newtonlabs.com/ic/manual.html"^B'http://www.newtonlabs.com/ic/ic_1.htmlMB?0http://www.kipr.org/curriculum/programming.htmlTOP'<-http://www.kipr.org/curriculum/get_knob.htmlMB90http://www.kipr.org/curriculum/programming.htmlTOPMB60http://www.kipr.org/curriculum/programming.htmlTOPJh3.http://www.kipr.org/curriculum/lego_comp.htmlMB*0http://www.kipr.org/curriculum/programming.htmlTOPMB'0http://www.kipr.org/curriculum/programming.htmlTOP^!:http://www.kipr.org/curriculum/rcx/Botball_RCX_Start.html {8http://www.kipr.org/curriculum/handyboard/hb_setup.htmlMB0http://www.kipr.org/curriculum/programming.htmlTOPMB0http://www.kipr.org/curriculum/programming.htmlTOP_X0http://www.kipr.org/curriculum/programming.htmlFUN;&0http://www.kipr.org/curriculum/programming.html DISPLAYS>< 0http://www.kipr.org/curriculum/programming.htmlTESTZ- 0http://www.kipr.org/curriculum/programming.htmlC;"0http://www.kipr.org/curriculum/programming.htmlDIFF!'0http://www.kipr.org/curriculum/programming.htmlTALK$10http://www.kipr.org/curriculum/programming.htmlINTRO {F8http://www.kipr.org/curriculum/handyboard/hb_setup.html^:http://www.kipr.org/curriculum/rcx/Botball_RCX_Start.html  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$&'()*+,-2Root Entry F1Z.4Data 1Table7WordDocument*SummaryInformation(DocumentSummaryInformation8%CompObjq  FMicrosoft Office Word Document MSWordDocWord.Document.89q