C/Visual C - Ayuda con contadores

   
Vista:

Ayuda con contadores

Publicado por Diego (85 intervenciones) el 16/04/2014 20:03:36
Buenas tardes, tengo un problema cuando trto de contar los caracteres ingresado y las lineas. El problrma dice lo siguiente:

4) Escriba un programa que lea caracteres del teclado empleando getchar() y los cuente hasta
encontrar EOF. Luego debe imprimir la cantidad de caracteres y líneas encontradas.

Me hicieron esta aclaración: "Cuando escribís un texto, cada vez que apretás enter empieza una nueva línea."

Lo que tengo hasta ahora es:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# include <stdio.h>
int main()
{
	int lineas = 0;
	int caracteres = 0;
	char caracter;
	while (getchar() != EOF)
	{
		caracteres = caracteres +1;
	}
	printf("La cantidad de caracteres es: %d ", caracteres - 1);
	printf("\n La cantidad de lineas es: %d", lineas);
	return 0;
}

Tengo unas dudas:
1: ¿El EOF tambien cuenta como caracter leido?
2: ¿Por qué cuando lo ejecuto luego de leer el EOF(ingreso EOF y presiono enter) vuelve a solicitar que ingrese otro caracter?
3: ¿Como hago para saber si el caracter ingresado es enter? esto es para saber la cantidad de lineas; por cierto ya intenté asignarle a catacter el getchar() y compararlo con un entero con 0x0A, como me vi en un ejercicio parecido, pero no lo entendí muy bien porque no salia y lo dejé.
4¿El asignarle el getchar() a un entero le da la cantidad de caracteres leidos? de ser así no se si se puede hacer sin un contador aparte para los caracteres, simplemente usar getchar() para saber la cantidad; aunque por lo que ví cuando lee el EOF se vuelve -1 así que se perderia la cuenta de caracteres.

PD: solamente puedo usar la librería stdio.h, ya que recien emnpiezo el curso y no se vieron otras librerias.

Les agradezco por su tiempo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con contadores

Publicado por UnoPorAhi (15 intervenciones) el 16/04/2014 21:37:47
1 No


2 "ingreso EOF y presiono enter"
?????? EOF es Ctrl-D (Ctrl-Z en Windows) y en cuanto lo pulses el programa se termina


3 Te lo hemos explicado en tu duda anterior con muchos ejemplos. Parece que has cogido la solución y ni te has molestado en mirarlo.


4 No, getchar devuelve el código ASCII del caracter y -1 en caso de EOF. Me remito de nuevo a lo dicho en el punto anterior.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con contadores

Publicado por Diego (85 intervenciones) el 16/04/2014 22:54:27
Gracias por las aclaraciones, aunque lo acabo de volver a intertar con el caracter enter asignado a una variable en vez de compararlo directamente;
Me quedó así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# include <stdio.h>
int main()
{
	int ENTER_CHAR = 0x0A;
	int lineas = 0;
	int caracteres = 0;
	char caracter;
	while ((caracter = getchar()) != EOF)
	{
		caracteres = caracteres +1;
		if (caracter == ENTER_CHAR)
		{
			lineas = lineas + 1;
		}
	}
	printf("La cantidad de caracteres es: %d ", caracteres);
	printf("\n La cantidad de lineas es: %d", lineas);
	return 0;
}
ahora cuenta bien, las lineas y los caracteres, pero lo que no entiendo bien es porque me permite ingresar el EOF (ctrl + z = ^z(en pantalla)).
Por ejemplo:
una entrada seria: qwertyyu(enter)fdf(enter)gfg(EOF = ctrl + z), pero luego de apretar EOF me deja seguir escribiendo hasta que escriba EOF luego de haber ingresado enter previamente (osea EOF en una sola linea), si hago ctrl + z durante la escritura de una linea simplemente se omite el contarlo como caracter.

¿me podrían decir por qué sucede esto?.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con contadores

Publicado por chema (187 intervenciones) el 16/04/2014 23:55:44
Prueba a cambiar char caracter;
por
int caracter

Si te fijas en mis ejemplos anteriores verás que uso int, no char.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con contadores

Publicado por Diego (85 intervenciones) el 17/04/2014 00:45:17
Gracias, realizé la modificación, supongo que al ser del mismo tipo la comparacion se realiza más rapido;
En cuanto al porque me toma el ctrl +z y me permite ingresar mas caracteres no lo comprendo muy bien:
Ejmplo: carga de la siguiente manera
as(EOF)dfg(enter)
dyu(EOF)(enter)
asd(enter)
(EOF) {recien cuando el EOF esta solo en una linea es que apreto enter y muestra el resultado}

caracteres: 11 (al parecer todo lo que le sigue al EOF en la misma linea se considera invalido excepto el enter; ese era el porque de mi pregunta de si toma al eof como caracter)

lineas: 3
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con contadores

Publicado por Chema (187 intervenciones) el 17/04/2014 01:30:12
Sobre el tema de cambiar char por int. ( no es por rapidez, ni son del mismo tipo)

http://www.eskimo.com/~scs/c-faq.com/stdio/getcharc.html

Deja pulsada la combinación control + z mas de un segundo, puede ser que la terminal tenga un retardo en ciertas combinaciones o teclas , ejemplo escape.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con contadores

Publicado por Diego (85 intervenciones) el 17/04/2014 15:02:11
Muchas gracias, ya comprendí un poco mejor, aunque jaja, lo del ctrl + z sigue estando igual;
mantenerlo apretado hace que aparezcan varios EOF(^z), pero no importa, ya comprendi mejor como funciona.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar