String ====== This section shows a couple of tricks to work with strings. There are 4 operations with strings .. image:: string_ops.png - **join(apple) (banana)** returns ``apple banana`` (there is a space after apple) - **letter (1) of (apple)** returns ``a`` - **length of (apple)** returns ``5`` - **(apple) contains (a)** returns ``True`` Detect a key press ------------------ .. raw:: html https://scratch.mit.edu/projects/381350556 Scratch can react to key presses. It can react to a specific key such as: - space key - arrow keys - letter keys - number keys .. image:: when_key.png It also can react to *any* key, which includes: - symbols - punctuation - parenthesis Unfortunately Scratch has no reporter block to tell you which key was pressed with the *any* option. However it has the boolean function **key X pressed**. .. image:: key_pressed.png To find out which key was pressed, we iterate inside a loop through the characters of interest. .. image:: key_c_pressed.png Iterate through a string ------------------------ Our string functions will use two special variables to which we give short (one-letter) names: - the index **i** pointing to a character inside a string - the caracter **c** inside the string .. image:: string_var.png We create the following function **iskey** which has two parameters - the **characters** of interest - the name of that **category** The function shows the general alogrithm: - set the index **i** to 1 (pointing to the first caractor of text) - repeat for the length of the text - set **c** to each consecutive letter of the text - do something with the caracter **c** - increment the index **i** .. image:: string1b.png In the example below we detect: digits, punctuation, symbols and letters. .. image:: string1.png Our cat Scratchy annonunces the category and the key it recognizes. This method can be used to start a specific action when certain keys are pressed. String comparison ----------------- Scratch uses the ASCI code to compare characters. Upper case letters (A..Z) are first transformed into lower-case letters (a..z). There is no easy way to distinguish between upper-case and lower-case letters. .. image:: string_comp.png Repeat a string --------------- The **repeat** function repeats a text n times. Scratch functions do not allow a return value. In order to return a result we define a variable which we call **result**. The **split** function will requires two return strings, so we define these two variables. .. image:: string_var.png The algorithm is quite simple: - erase the **result** variable - repeat and iterate **n** times - join the text at the end of the result .. image:: repeat.png Reverse a string ---------------- To reverse a string we extract letter by letter and assemble them backwards. - erase the **result** variable - set the index **i** to the first character - repeat for the lenght of text - join the i-th letter in front of the result - increment index **i** .. image:: reverse.png Extract a sub-string -------------------- To extract a substring from position **i** for a length **n** we: - set the index **i** to the start character - set the result to empty - repeat **n** times - copy a character to the result string - increment index **i** .. image:: substring.png Split a string -------------- The **split** function splits a text into 2 sub-strings at position **n**: - The frist n-1 letters are in **result** - The remaining letters from n onwards are in **result2** We use the function **substring** twice. Be careful to extract the second part first, as the **substring** function uses **result**. .. image:: split.png Demo ---- .. raw:: html https://scratch.mit.edu/projects/390866776 The following demo program shows the effect of the 5 string manipulation functions. .. image:: string2.png Imitate a typewriter -------------------- Sometimes written conversation looks more natural if it is paced like the text appearing on a typewriter. .. raw:: html https://scratch.mit.edu/projects/390908846 The fonction **typewriter** has a text argument, and a second **ask** argument. If it is 1 the text is asked as a question, and the user is invited to give an answer. .. image:: string3.png The following text displays 3 phrases and asks a question. The answer is integrated into the 3rd phrase. .. image:: string3b.png