Código y resultado de ejecución
Navega hasta el directorio ~/project
y crea un archivo de proyecto llamado typing3.c
:
cd ~/project
touch typing3.c
El programa escrito de acuerdo con las pautas anteriores se muestra a continuación:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "getputch.h"
#define NO 30 /* Number of exercises */
#define KTYPE 16 /* Number of blocks */
int main(void)
{
char *kstr[] = {"12345", "67890-^\\", /* Layer 1 */
"!\"#$%", "&'() =~|", /* Layer 1 [Shift] */
"qwert", "yuiop@[", /* Layer 2 */
"QWERT", "YUIOP`{", /* Layer 2 [Shift] */
"asdfg", "hjkl;:]", /* Layer 3 */
"ASDFG", "HJKL+*}", /* Layer 3 [Shift] */
"zxcvb", "nm,./\\", /* Layer 4 */
"ZXCVB", "NM<> _", /* Layer 4 [Shift] */
};
int i, stage;
clock_t start, end; /* Start and end times */
init_getputch();
srand(time(NULL)); /* Set the seed for random number generation */
printf("Start typing association exercises.\n");
printf("Please enter the hidden character indicated by '?'.\n");
printf("Press the space key to start.\n");
fflush(stdout);
while (getch()!= ' ')
;
start = clock(); /* Start time */
for (stage = 0; stage < NO; stage++) {
int k, p, key;
char temp[10];
do {
k = rand() % KTYPE;
p = rand() % strlen(kstr[k]);
key = kstr[k][p];
} while (key == ' ');
strcpy(temp, kstr[k]);
temp[p] = '?';
printf("%s", temp);
fflush(stdout);
while (getch()!= key)
;
putchar('\n');
}
end = clock(); /* End time */
printf("Time taken: %.1f seconds.\n", (double)(end - start) / CLOCKS_PER_SEC);
term_getputch();
return 0;
}
La macro KTYPE
representa el número de bloques, que es 16, y la matriz kstr
se utiliza para almacenar las cadenas formadas por los caracteres de cada bloque dispuestos de izquierda a derecha.
En términos de propósitos de entrenamiento, la pregunta no contendrá el carácter ?
, por lo que la última cadena declarada para el bloque es NM<> _
en lugar de NM<>?_
(dado que el programa no utiliza la tecla de espacio para generar preguntas, no producirá un error).
Si el layout de tu teclado es diferente al mostrado en este ejemplo, modifica la declaración de la matriz kstr
en consecuencia.
El primer bucle do while
se encarga de generar la pregunta.
- La variable
k
indica de qué bloque se generará la pregunta. Dado que este valor corresponde al índice de la matriz kstr
, se establece como un número aleatorio mayor o igual a 0 y menor que KTYPE
.
Dado que el número de bloques KTYPE
es 16, el número aleatorio generado estará en el rango de 0 a 15.
- La variable
p
indica qué carácter dentro del bloque debe ocultarse para generar la pregunta. Dado que este valor corresponde al índice de la cadena utilizada para generar la pregunta dentro del bloque, se establece como un número aleatorio mayor o igual a 0 y menor que el número de caracteres dentro del bloque.
Suponiendo que k
es 0, el bloque consta de 5 caracteres, '12345'
, por lo que p
se establece como un número aleatorio en el rango de 0 a 4. Además, si k
es 3, el bloque consta de 8 caracteres, '&'()=~|'
, por lo que p
se establece como un número aleatorio en el rango de 0 a 7.
- La variable
key
representa el carácter oculto.
Por ejemplo, si k
es 0 y p
es 2, el carácter '3'
en el bloque '12345'
es la key
. Dado que el programa ya ha asignado el carácter de espacio ''
a los caracteres que no deben utilizarse para generar preguntas, se utiliza el bucle do-while para regenerar la pregunta si el carácter oculto key
es un carácter de espacio.
A continuación, la función strcpy
copia kstr[k]
a temp
, y asigna '?' a temp[p]
. Esto genera la cadena 12?45
que se mostrará en la pantalla.
Si el programa es capaz de mostrar la cadena temp
y leer el carácter key
ingresado desde el teclado, es correcto. Al igual que los programas de ejercicios de escritura anteriores, este programa no acepta caracteres mal escritos. Después de 30 rondas de entrenamiento, el programa terminará su ejecución.
Compila y ejecuta utilizando los siguientes comandos:
cd ~/project
gcc -o typing3 typing3.c -lcurses
./typing3
Start typing association exercises.
Please enter the hidden character indicated by '?'.
Press the space key to start.
AS?FG
?m,./\
67890-?\
?XCVB
zx?vb
!"?$%
ZXC?B
hjk?;:]
…(omit)…