[C con Clase] Lo + básico
Steven Davidson
srd4121 en njit.edu
Lun Mar 30 18:02:25 CEST 2009
Hola Bettina,
BETTINA CANTERO wrote:
> Buenas necesito ayuda con este pequeño código. Estoy comenzando mi
> estudio en esto de la programación, y estoy estancada en esto. La
> idea es cargar un número determinado de caracteres a leer y luego
> contar cuántas "a" se cargaron. Mi problema es que la iteración del
> código no anda bien, y el contador me muestra un resultado de cuatro
> dígitos cuando he cargado solo 5 iteraciones para hacer. Sé que es
> muy básico pero no puedo continuar con otra práctica sino puedo
> resolver esta que creo es muy sencilla pero no sé cuál es mi error.
> Este es el código:
Veamos el código fuente.
> #include<conio.h>
> #include<stdio.h>
> void main()
> {
> int i,n,cont;
Aquí tienes parte del error que tienes. Declaras 'cont', pero no la
inicializas. Por lo tanto, 'cont' contiene arbitrariamente un número
cualquiera; solemos decir que contiene "basura". Al usar 'cont', estás
operando con "basura" y por consiguiente obtendrás "basura".
La solución, en tu caso, es inicializar 'cont' a 0 (cero).
> char car;
> clrscr();
> printf("Ingrese la cantidad de caracteres a leer \n");
> scanf("%i",&n);
> /*car=getch();*/
> for(i=0;i<=n;i++)
Esto implica que realizarás n+1 iteraciones. Sospecho que esto es un
error, pero quizá te interese iterar tantas veces.
> {
> car=getch();
> printf("ingrese un caracter \n");
> scanf("%c",&car);
No entiendo por qué tienes dos lecturas por iteración. Supongo que
querías "arreglar" los problemas que te estaba dando este programa.
El problema es que 'getch()' no busca en el canal o "búfer" del teclado,
sino directamente al teclado desde la BIOS, mientras que 'scanf()' sí
lee desde el canal, el cual almacena los caracteres introducidos.
> printf("el caracter ingresado es: %c\n",car);
> /*car=getch();*/
> if(car=='a')
> {
> cont++;
> /*car=getch();*/
> };
> };
> printf("la cantidad de 'a' encontradas es de: %i \n",cont);
> getch();
> }
>
En cuanto al comportamiento problemático de permitir introducir
caracteres algunas alternándose, esto radica en que el canal de entrada
(el teclado) contiene los caracteres introducidos. En el primer caso del
ejemplo que nos diste, escribes: 5, pero el canal del búfer realmente
contiene lo siguiente: "5\n", ya que pulsaste [ENTER]. Al leer el primer
número, se extrae '5', pero deja '\n'. Por lo tanto, al llegar a la
siguiente lectura, el programa simplemente lee y extrae el carácter '\n'
que está en el canal de entrada, sin preguntar.
Las lecturas del canal de entrada sólo piden datos si el canal está
vacía; si no lo está, entonces lee y extrae caracteres del canal. Esto
es lo que está ocurriendo en tu programa. Pide leer un carácter, pero
para la segunda lectura, ya tiene un '\n' a leer, y por tanto no pide
leerlo.
Una solución es leer el carácter que quieres con 'scanf()' y luego
extraer el carácter '\n' del canal de entrada para preparar este canal
para la siguiente iteración. Por ejemplo,
for(...)
{
scanf( "%c", &car );
getchar(); /* para extraer '\n' */
...
}
Otra solución es leer todos los caracteres de golpe en una cadena de
caracteres, si el usuario los introduce como una cadena. Por ejemplo,
char caracteres[1024]; /* máximo de 1024 */
...
scanf( "%s", caracteres );
Ahora puedes aplicar cualesquier criterios que quieras a la cadena.
Espero haber aclarado las dudas.
Steven
Más información sobre la lista de distribución Cconclase