Linux en Espanol
 
programas que no me corren, leng C, (tema #25088)
Publicar nuevo tema  Responder al tema    Foros de discusión -> Programación
Autor Mensaje
harofenix
Forista
Registrado: 2014-12-06
Mensajes: 39

Publicado: 2014-12-16 15:24:52    Asunto: programas que no me corren, leng C,

Que tal mis queridos eriditas de los codigos y los sistemas, son las 9:00 a.m. Caray se me fue una hora entera retocando mi KDE-plasma, pero al fin y al cabo ha quedado como me gusta shulo:
[img][url]https://drive.google.com/file/d/0BzgCNyNJ71m9VW15cE9Vdm9NRTA/view?usp=sharing[/url][/img]
Bueno pues ahora si las dudas: Resulta que ayer comenze a estudiar un librazo la verdad es que he visto unos cuantos de lenguaje C y este tiene wooo FEELING esta muy bien, van directo al grano y no se pierden mucho en detalles sosos, (ala par de este estoy estudiando uno que se llama aprende C en 21 dias, es bueno creo yo) pero este, wooooo este es buenisimo, pues nada mas y nada menos que "el lenguaje de programacion C" KERGINGAM Y RITCHIE. lo conocen, jejeje ya lo creo, bueno el punto esta que dentro de las primeras paginas aparecen unas muy claras y buenas practicas con getchar y putchar, y pues al momento de correr dichos programitas me dan errores lagicos, cuadno ingreso el caracter para salir del while -1 (EOF) pues si me saca del ciclo pero no me imprime lo el conteo de caracteres. Alguien me puede decir que esta sucediendo?

a ver siendo mas claro, el programa si detecta el -1 (EOF) me saca del ciclo while, sin embargo, no me imprime la suma de los caracteres ingresados, es decir, no efectua el printf...
codigo:
[code:1:79eb0e9d7b]#include <stdio.h>

int main(int argc, char **argv)
{
double nc;

for ( nc = 0; getchar() != EOF; ++nc)
;
printf("%.0lf \n", nc);

return 0;
}
[/code:1:79eb0e9d7b][/img]

inclusive lo modifico y nada:
[code:1:79eb0e9d7b]
#include <stdio.h>

int main(int argc, char **argv)
{
int nc;

for ( nc = 0; getchar() != EOF; ++nc)
;
printf("%d \n", nc);

return 0;
}[/code:1:79eb0e9d7b]
rafaxdrake
Forista


Registrado: 2004-02-21
Mensajes: 3928

Publicado: 2014-12-16 18:56:24    Asunto:

Pues s? que est? chulo tu escritorio y tu plasma. Para mi gusto s?lo falta que le a?adas el plasmoid de "Mostrar el escritorio" y uno que te informe del tiempo que va a hacer. Saludos.
AnimAlf
Forista


Registrado: 2008-08-18
Mensajes: 786

Publicado: 2014-12-16 19:08:45    Asunto:

haz un do while
harofenix
Forista
Registrado: 2014-12-06
Mensajes: 39

Publicado: 2014-12-17 00:58:49    Asunto:

[quote:bbe79c5b35="AnimAlf"]haz un do while[/quote:bbe79c5b35]

Modificado, usando do while, sin embargo, sigue sin fucionar, es decir si me pide el caracter e imprime enseguida cada caracter, el detalle es que no me imprime el contador "nc" al ingresar -1 simplemente lo toma como otro caracter mas, ya estoy dudando de mi gcc, jajaja talvez se crasheo o se da;o o algo, como ven ustedes???
[code:1:bbe79c5b35]#include <stdio.h>

int main(int argc, char **argv)
{
long nc;
nc = 0;
int c;



do
{

putchar(c);
++nc;

}
while( (c = getchar()) != -1 );

printf("%ld", nc);



return 0;
}[/code:1:bbe79c5b35]
harofenix
Forista
Registrado: 2014-12-06
Mensajes: 39

Publicado: 2014-12-17 01:01:34    Asunto:

[quote:1d50567f62="rafaxdrake"]Pues s? que est? chulo tu escritorio y tu plasma. Para mi gusto s?lo falta que le a?adas el plasmoid de "Mostrar el escritorio" y uno que te informe del tiempo que va a hacer. Saludos.[/quote:1d50567f62]

Cuando dices plasmoid te refieres al widget para mostrar el escritorio totalmente limpio, es decir, el que minimiza de un solo clic todas las ventanas que tengo abiertas, o cual es ese dichoso plasmoid?? Disculpa, soy totalmente nuevo en kde4, la ultima vez que utilize kde fue hace ya una decada aprox y fue en la difunta mandrake ! lol !
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2014-12-17 01:47:56    Asunto:

Hola.[quote:573c9b49c0="harofenix"]
[code:1:573c9b49c0]while( (c = getchar()) != -1 );[/code:1:573c9b49c0][/quote:573c9b49c0]
No creo que tal como se est? planteando pueda funcionar. Yo creo que getchar lee un car?cter cada vez y "-1" no es un car?cter, son dos "-" y "1". Nunca podr? ser -1 el resultado de getchar.
Por otra parte, getchar devuelve un car?cter y has puesto -1 sin comillas de ninguna clase, por lo que es un n?mero.
Supongo que C, que por lo que dicen es bastante permisivo con el tipado de variables (yo apenas toqu? C hace muuuuuchos a?os) estar? viendo si el car?cter devuelto por getchar tiene como c?digo ascii el -1, que no s? si le corresponder? al 254 o al 127 o ...

No s? si esto aclara o enturbia m?s el problema pero espero que sea lo primero.

Saludos.
harofenix
Forista
Registrado: 2014-12-06
Mensajes: 39

Publicado: 2014-12-18 00:09:35    Asunto:

Tienes razon, en todo caso sustituimos el -1 pof EOF (end of file) este ejemplo es tomado del libro de el lenguaje de programacion C de kernigahm y ritchie, sin embargo no me reconoce el EOF como carcter de salida de ciclo (valor por defecto de EOF es -1 ) ....

[code:1:da9e7debd4]#include <stdio.h>

int main(int argc, char **argv)
{
long nc;
nc = 0;
int c;



do
{

putchar(c);
++nc;

}
while( (c = getchar()) != EOF );

printf("%ld", nc);



return 0;
}[/code:1:da9e7debd4]
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2014-12-18 13:17:11    Asunto:

Hola.

Tu ?ltima versi?n [b:4fe46769c9][u:4fe46769c9][i:4fe46769c9]s?[/i:4fe46769c9][/u:4fe46769c9][/b:4fe46769c9] funciona. Si pulsas EOF el programa escribe la cuenta de caracteres y concluye correctamente.
S?lo debes tener en cuenta que el fin de fichero se puede teclear a mano con CTRL-D despu?s de un INTRO
Por ejemplo si tecleo:
qwerty
abc
^D
(con un intro despu?s de qwerty y otro despu?s de abc) resulta:
[code:1:4fe46769c9][yo@maquinita /tmp/eso]$ ./a.out
qwerty
qwerty
abc
abc
12[yo@maquinita /tmp/eso]$[/code:1:4fe46769c9]
El fuente del programa est? copiado y pegado de lo que t? has puesto en el foro.
Son 12 caracteres porque son: 6 de querty, 3 de abc, 2 intros y el EOF

Saludos.
harofenix
Forista
Registrado: 2014-12-06
Mensajes: 39

Publicado: 2014-12-19 16:31:54    Asunto:

[quote:eaa7458777="miguelgf"]Hola.

Tu ?ltima versi?n [b:eaa7458777][u:eaa7458777][i:eaa7458777]s?[/i:eaa7458777][/u:eaa7458777][/b:eaa7458777] funciona. Si pulsas EOF el programa escribe la cuenta de caracteres y concluye correctamente.
S?lo debes tener en cuenta que el fin de fichero se puede teclear a mano con CTRL-D despu?s de un INTRO
Por ejemplo si tecleo:
qwerty
abc
^D
(con un intro despu?s de qwerty y otro despu?s de abc) resulta:
[code:1:eaa7458777][yo@maquinita /tmp/eso]$ ./a.out
qwerty
qwerty
abc
abc
12[yo@maquinita /tmp/eso]$[/code:1:eaa7458777]
El fuente del programa est? copiado y pegado de lo que t? has puesto en el foro.
Son 12 caracteres porque son: 6 de querty, 3 de abc, 2 intros y el EOF

Saludos.[/quote:eaa7458777]

A ver ya me enrede, resulta que ya me bota el resutlado con ctrl+D como bien comentas, pero porque no terminal el ciclo al ingresar -1? si ese es el valor que tiene por defecto EOF (-1) al checarlo en su archivo de cabecera stdio.h donde esta declarado como constante simbolica
/[code:1:eaa7458777]* End of file character.
Some things throughout the library rely on this being -1. */
#ifndef EOF
# define EOF (-1)
#endif
[/code:1:eaa7458777]

mi duda es: para invocar EOF uno forzosamente debe teclear ctrl+D? no hay otra manera? en si usar EOF es para poner disponible un metacomando en el pgorama, no es asi?
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2014-12-19 17:10:29    Asunto:

Hola.[quote:b3e83f788a="harofenix"]A ver ya me enrede, resulta que ya me bota el resutlado con ctrl+D como bien comentas, pero porque no terminal el ciclo al ingresar -1? si ese es el valor que tiene por defecto EOF (-1) al checarlo en su archivo de cabecera stdio.h donde esta declarado como constante simbolica[/quote:b3e83f788a]
-1 escrito en el teclado no es un n?mero, son dos caracteres, el "-" y el "1". Nunca va a llegar "-1" a getchar, llegar? "-" a una ejecuci?n de getchar y "1" a otra ejecuci?n de getchar.
Modifica ligeramente tu programa y donde pone putchar para que escriba el car?cter, escribe justo antes y despu?s una almohadilla "#". As?:
[code:1:b3e83f788a]#include <stdio.h>
int main(int argc, char **argv)
{
long nc;
nc = 0;
int c;

do {
putchar('#');
putchar(c);
putchar('#');
++nc;
} while( (c = getchar()) != EOF );
printf("%ld", nc);
return 0;
}[/code:1:b3e83f788a]
Ejecuta, teclea -1 seguido de intro y Ctrl+D y ver?s como te escribe #-##1#
Ah? se ve claramente que el "-" y el "1" son independientes entre s? y no forman el n?mero negativo -1
[quote:b3e83f788a="harofenix"]mi duda es: para invocar EOF uno forzosamente debe teclear ctrl+D? no hay otra manera? en si usar EOF es para poner disponible un metacomando en el pgorama, no es asi?[/quote:b3e83f788a]
No s? por qu? hist?ricamente se escogi? -1 para EOF, pero es la manera est?ndar de hacerlo. Basar tu programa en EOF y no en otra cosa es una buena idea porque te permite que tu programa sea llamado aport?ndole como entrada la salida de otro as?:
[code:1:b3e83f788a]cat fichero_de_datos.txt | tu_programa[/code:1:b3e83f788a]
Tu programa leer? el contenido del fichero de datos de entrada como si se hubiera tecleado a mano.

Por ?ltimo, en
[quote:b3e83f788a="miguelgf"]Son 12 caracteres porque son: 6 de querty, 3 de abc, 2 intros y el EOF[/quote:b3e83f788a]
me equivoqu?. El EOF no te lo cuenta, los intros s?. El car?cter de m?s que te est? contando se debe a que hay un error en la l?gica del proceso. El tipo de bucle que has hecho escribe el primer car?cter antes de haber le?do ninguno y lo a?ade a la cuenta. Por eso cuenta un car?cter de m?s. Por si no se entiende, llega la primera vez a putchar antes de haber pasado ni una sola vez por getchar.
Esto se debe a que has elegido un bucle "do {...} while" que realiza la comprobaci?n a posteriori. Este bucle es conocido en muchos otros lenguajes como bucle "repeat ... until". Prueba a cambiar tu bucle por uno while "puro" (que me perdonen los programadores por haber escrito eso de while "puro") es decir con la sintaxis:
[code:1:b3e83f788a]while (condicion {
instrucciones
}[/code:1:b3e83f788a]

Saludos.





La marca registrada Linux (R) se usa siguiendo la sublicensia obtenida del "Linux Mark Institute",
el LICENCIATARIO exclusivo de Linus Torvalds, propietario de la marca en EEUU y otros países
The registered trademark Linux (R) is used pursuant to a sublicense from the Linux Mark Institute,
the exclusive LICENSEE of Linus Torvalds, owner of the mark in the U.S. and other countries