C/Visual C - Que hago mal

 
Vista:
sin imagen de perfil
Val: 185
Bronce
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Que hago mal

Publicado por Flash (95 intervenciones) el 29/03/2017 00:30:42
Estoy leyendo el libro de programación. -El lenguaje de programación de Kernighan y me sale este ejemplo

1
2
3
4
5
6
7
8
#include <stdio.h>
/* cuenta las líneas de la entrada */ main( ) I int c, ni;
ni = 0;
while ((c = getchar( )) != EOF)
 if (c = = 7n')
 ++nl;
printf("%d\n", ni);
}
Es un copy paste del libro.No lo entiendo ¿Es que no es c?Ninguno de los ejemplos del libro funcionan,porque para los programas anteriores a ese tuve que ingeniarmelas o cambiarlas para que mas o menos salieran y voy por la pagina 30 ¿Deberia empezar por otro libro?¿De ser asi que me recomendais? vengo de haber dado basico con c#

Estoy usando dev-c++ que tambien tiene soporte a c
http://www.subirimagenes.com/imagen-eof-9713744.html
No se si me explico
thump_9713744eof
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
sin imagen de perfil

Que hago mal

Publicado por Diego (150 intervenciones) el 29/03/2017 03:23:17
BUenas noches en tu codigo, linea 5 segun como lo veo en el if preguntas if (c = = 7n') cuando deberia ser if(c == '/n') si fu un copiar y pegar lo veo bastante dificil ya que acabo de verificar el cpodigo en le libro de Kernighan almenos en la segunda edicion el ejemplo de conteo de lineas es '/n' y no '7n' quizas hiciste intentaste colocar manualmente la barra / usando el shift + 7 numerico pero no salio bien.

Ya que lo que intenta preguntar el if es si hubo un salto de linea o no.

Prueba cambiando esa linea.
Tambien no tienes declarada la variable nl; lo que tienes declarado e inicializado es ni; eso tambien te producira un error.


SI la fotografia es una captura del libro que estas leyendo, puedo decirte que esa es una especie de copia del libro original con errores de sintaxis.


PD: usa el boton para codigo asi se respetara la indentacion que le hayas dado a tu codigo
boton </>(al lado de la carita sonrriente).
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
sin imagen de perfil
Val: 185
Bronce
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Que hago mal

Publicado por Flash (95 intervenciones) el 29/03/2017 14:33:07
Buenas ese es el libro que estoy usando pero es que me aparece tal cual,¿tal vez sea cosa del lector pdf? y no,en el libro me salia un 7

En la imagen que muestro a la derecha es el texto original del libro, probare a descargar alguna otra digitalización del libro porque me cuesta creer que aun haciendo copy paste de error

Gracias por responder
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
sin imagen de perfil
Val: 185
Bronce
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Que hago mal

Publicado por carlos (95 intervenciones) el 29/03/2017 15:18:54
Vale era el libro venia mal redactado (alguien lo modifico)

Ahora la cosa es, lo he modificado:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
/* cuenta las líneas de la entrada */
 
main( )
{
	int c, nl;
	c=0;
nl = 0;
while((c=getchar( ))!= EOF)
if(c=='/n')
++nl;
printf("%d\n",nl);
}
Se supone que con getchar coge la entrada ejemplo el 2 y al pulsar intro, si es diferente a EOF repetira infinitamente while al no saber cual es

no se cual es
Luego:
se hace el if
pero en el if no se como compara con la /n si es un salto de linea

Me he perdido con esto porque no logro entender como funciona, o que esta haciendo porque no imprime el if al no ser igual c a '/n' ya que no se con que lo compara si con decimales,string,double

Y yo que pense que viniendo de c# seria mas sencillo
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
Imágen de perfil de Dionicio
Val: 91
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re:Que hago mal

Publicado por Dionicio (22 intervenciones) el 29/03/2017 15:52:28
El carácter salto de línea es representado por '\n' no creo que sea '/n'(mejor dicho no lo es). Por otro lado en el while nunca terminará ya que nunca llega a encontrar EOF (el final de archivo) y te quedarás dentro de ese bucle.

Por ejemplo en el siguiente código solo leerá el carácter de salto de línea cualquier otro valor ingresado hará que el bucle termine. Presiona la tecla enter y luego presiona otra tecla para que pruebes lo que digo.
1
2
3
4
5
6
7
8
...
while((c = getchar()) != EOF && c == '\n'){
	if(c == '\n'){
		++nl;
	}
}
	printf("El número de líneas es %i\n",nl);
...

También podrías dejar la sentencia en
1
2
3
while((c = getchar()) == '\n'){
        ++nl;
}

Cualquier duda es bienvenida!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Que hago mal

Publicado por Diego (150 intervenciones) el 29/03/2017 19:23:06
Lo que responde dionicio es correcto, escrbir muy apurado, tanto que incluso justifique mal.

el salto de linea es: '\n' ; va con comillas simples ya que es un caracter si fuera una cadena de caracteres iria con comllas dobles"\n" pero esto serian 2 caracteres y no un salto de linea.

En cuanto al EOF es distinto de Sistema operativo a Sistema operativo
Windows CTRL + Z
Linux CTRL + D

http://stackoverflow.com/questions/20075114/what-is-are-the-eof-in-ubuntu-and-also-about-kernighan-and-ritchie
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
sin imagen de perfil
Val: 185
Bronce
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Que hago mal

Publicado por carlos (95 intervenciones) el 29/03/2017 21:48:07
Vale,gracias a los dos,solo una duda mas

Que diferencia hay entre " d" y ' d' quiero decir las comillas lo primero para comentarios o strings pero lo ¿2º? es que no se cuando usar cada cual y entonces como se cual es EOF si va cambiando.Esto ultimo de que me sirve

Gracias por responder mis dudas
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
Imágen de perfil de Dionicio
Val: 91
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Que hago mal

Publicado por Dionicio (22 intervenciones) el 29/03/2017 22:01:12
Las comillas dobles representa una cadena de caracteres por ejemplo
1
char cadena[] = "Soy una cadena"; // Aunque podría estar "d" y no habría problemas ya que es un arreglo de caracteres

Por el otro lado las comillas simples indican un carácter, es decir, una sola letra.
1
char letra = 'L';//Aquí una cadena como "hola" no cabría ya que los char ocupan por lo general un byte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 185
Bronce
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Que hago mal

Publicado por Flash (95 intervenciones) el 30/03/2017 00:58:58
Vuelvo a preguntar porque sigo sin entenderlo esto

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
/* cuenta las líneas de la entrada */
 
main( )
{
	int c, nl;
	c=0;
nl = 0;
char mono= 'L';
while((c=getchar( ))!= EOF && c == mono)
{
if(c ='d') {
++nl;
}
}
printf("%d\n",nl);
}
Lo he cambiado por L.¿No deberia ser que si pulso el L se repite en vez de salir?
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
Imágen de perfil de Dionicio
Val: 91
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Que hago mal

Publicado por Dionicio (22 intervenciones) el 30/03/2017 02:19:48
Lo que pasa es que luego de que introduces 'L' tienes que presionar la tecla ENTER y en el buffer o memoria intermedia se queda atrapado el salto de línea que se produjo cuando presionaste dicha tecla, por consiguiente cuando el bucle diga c = getchar() este tomará el salto de línea que hubo anteriormente. La comparación que haría el compilador sería la siguiente (explicado humanamente)

1. La función getchar() espera un carácter escribes 'L' luego presionas ENTER y compara y dice c diferente de EOF si, y c es igual a mono si.
2. Luego entra en el bucle, y entra en el if (por cierto está mal debería ser así c == 'd') y hace la comparación si es verdadera entrará en el if.
3. Entonces vuelve al punto uno donde está la función getchar() pero en el buffer ha quedado un salto de línea ('\n') entonces c es igual al salto de línea y compara de la siguiente manera: c('\n') es diferente de EOF si, y c('\n') es igual a mono pues no, entonces la condición es falsa y sale del bucle.

Para evitar esto podemos hacerlo de la siguiente manera:
1
2
3
4
5
6
7
8
9
10
11
12
...
while((c = getchar()) != EOF && c == mono)
  {
	  if(c == 'd')// == es de comparación y = es de asignación
	  {
		  ++nl;
	  }
 
	  //Tomará el salto de línea pero no lo almacenará en ninguna parte
	  getchar();
  }
...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 185
Bronce
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Que hago mal

Publicado por Flash (95 intervenciones) el 31/03/2017 00:12:52
Entonces es que lo hace para el L que escribo y otro para el salto de linea, O sea dos veces cuenta el primero en el while y el segundo no por no cumplirse y me imprimria el numero de caracteres

¿Lo he entendido bien?
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
Imágen de perfil de Dionicio
Val: 91
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Que hago mal

Publicado por Dionicio (22 intervenciones) el 31/03/2017 13:00:51
No entiendo muy bien lo que dices, pero lo que te expliqué simplemente es introducir un carácter luego cuando presionas enter se produce un salto de línea que queda esperando, cuando vuelve a pedir otro carácter el salto de línea anterior es asignado a la variable 'c' por lo tanto cuando comparas 'mono' con 'c' sale del bucle, entonces te brindé la solución introducir otro getchar() que este toma ese salto de línea y te permite seguir introduciendo el carácter 'mono' (que en tú código era L) que es el que hace en parte la condición verdadera.

Otra cosa más el if(c == 'd') no entiendo cual es el sentido de esto, ya que si solo introduces un carácter diferente de 'mono' el bucle terminará. Sí solo quieres que cuente cada vez que introduces el carácter equivalente a 'mono' deberías simplemente dejar ++nl dentro del bucle.


Ahora mi pregunta para ti es ¿estás entendiendo lo que estas haciendo? me refiero al código que escribes, ¿sabes el por qué de cada sentencia? Y no dudes en seguir preguntando si es necesario.
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

re: Que hago mal

Publicado por Flash (1 intervención) el 02/04/2017 20:33:27
Si,ya que algunas provienen del otro lenguaje de programación

Es que necesitaba saber el porque de cada cosa porque en c# era

string col ="algo escrito";
No sabia que aqui era

char[10] cus ='numero es 1" para introducir 10 caracteres

Y demas cosas como EOF
Este codigo era el ejemplo del libro que descargue
¿finalidad final? no se, es mas como ejemplo

No se si me he explicado

¿Hay otra manera u alguna clase que haga lo de char sin usar un array?
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