Autor Tema: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)

0 Usuarios y 1 Visitante están viendo este tema.

05 Enero, 2013, 09:24 pm
Respuesta #40

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,305
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino


Tendrías que colgar acá tu programa, si querés que entienda el problema.


Por ejemplo, copié el programa de este vídeo y no iba; puede, quizá que yo interprete mal un símbolo que hay dentro del "scanf", delante de la "a" parece que hay un "&", pero a lo mejor es que es otra cosa y por eso no va.
 Míralo a ver qué puede ser, es un programa muy corto, se copia enseguida.

Gracias.

06 Enero, 2013, 12:37 am
Respuesta #41

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,282
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
No sirve de nada que copie un programa de ese video de Youtube, porque el programa que tiene errores es el tuyo.

Por eso tengo que ver tu programa.

Además, aunque el programa del video es corto, no lo pienso copiar a mano, porque encima lo va cambiando durante todo el video, y tengo que comerme toda la explicación hasta ver qué diablos es lo que hace.

No voy a mirar videos...

06 Enero, 2013, 01:11 am
Respuesta #42

pierrot

  • pabloN
  • Moderador Global
  • Mensajes: 3,395
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
El tipo de datos básico asociado en C a las strings es char*.
Otro día les explico qué es ese asterisco: *::)

Estoy ansioso de que llegue ese día  :laugh:.
$_="loe  hnachaPkr erttes,urJ";$j=0;for($i=0;s/(.)(.{$j})$//;$i++){$_=$2.$_,$j+=1-$i%2,print$1}print

06 Enero, 2013, 01:27 am
Respuesta #43

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,282
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
El tipo de datos básico asociado en C a las strings es char*.
Otro día les explico qué es ese asterisco: *::)

Estoy ansioso de que llegue ese día  :laugh:.

Ese día me huele a lejano...

Me acuerdo del asterisco maldito que la pantera rosa no podía sacarse de encima:

*

Y encima vino el papá asterisco y se enojó:

*


Me estoy divirtiendo con el asunto de cómo se especifican las constantes en C, ya sea char o int, y cuáles son todas las vicisitudes en torno a la asignación de tipos de datos a esas constantes.

Es algo terriblemente complicado, pero me dí el gusto de hallar toda la información, sacar las conclusiones, y analizar todos los detalles.  >:(

Esto hay que hacerlo alguna vez, porque si no, después vienen las sorpresas, y nadie entiende por qué el programa puso un número donde uno esperaba que ponga otro...

06 Enero, 2013, 01:52 am
Respuesta #44

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,305
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
No sirve de nada que copie un programa de ese video de Youtube, porque el programa que tiene errores es el tuyo.

Por eso tengo que ver tu programa.

Además, aunque el programa del video es corto, no lo pienso copiar a mano, porque encima lo va cambiando durante todo el video, y tengo que comerme toda la explicación hasta ver qué diablos es lo que hace.

No voy a mirar videos...

Bueno, hombre, no te pongas así  :laugh:  :laugh: Decía sólo la primera parte hasta que ejecuta; lo he mirado y remirado, repasado puntos y comas, etc., pero introduzco el número y ahí se queda, el condicional que le sigue no corre. Pero da igual, ya lo repaso más veces, a ver...

06 Enero, 2013, 01:55 am
Respuesta #45

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,282
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
¿Sabían que el número 10 trillones es un desastre de constante?

Según las reglas de asignación automática de tipos enteros, el 10 trillones intenta asignarse a un long long int, pero este tipo le queda chico, así que el estándar no le asigna nada.

Mi compilador me avisa de la situación esta del estándar, pero sin embargo el valor lo toma igual, y parece que lo reconoce como un unsigned long long int.

O sea que la situación es altamente impredecible, si uno no conoce su compilador.

Por un lado, el compilador reconoce que 10 trillones es un número entero positivo (podría no reconocerle como tal).
A la vez, reconoce cuánto vale realmente (podría no hacerlo), porque puede decir que es más grande que lo que acepta el long long int.
Pero dice que no le gusta el número ese, porque no cabe en ningún tipo entero, según el estándar (el estándar podría ser otra cosa).
Aunque igual lo asigna a un tipo entero, el unsigned long long int (podría no asignarlo a nada).
Y también se trata de una constante factible de ser guardada en memoria como un dato de tipo long long int (podría darse el caso de un valor que no pertenezca a ningún tipo válido).

Así que una constante puede considerarse desde varios puntos de vista, que pueden ser todos incompatibles, si no se procede con cuidado.


06 Enero, 2013, 01:56 am
Respuesta #46

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,282
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
No sirve de nada que copie un programa de ese video de Youtube, porque el programa que tiene errores es el tuyo.

Por eso tengo que ver tu programa.

Además, aunque el programa del video es corto, no lo pienso copiar a mano, porque encima lo va cambiando durante todo el video, y tengo que comerme toda la explicación hasta ver qué diablos es lo que hace.

No voy a mirar videos...

Bueno, hombre, no te pongas así  :laugh:  :laugh: Decía sólo la primera parte hasta que ejecuta; lo he mirado y remirado, repasado puntos y comas, etc., pero introduzco el número y ahí se queda, el condicional que le sigue no corre. Pero da igual, ya lo repaso más veces, a ver...

Me puse celoso, me andás engañando con el tipo ese de youtube.  :'(

06 Enero, 2013, 02:04 am
Respuesta #47

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,305
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino

Me puse celoso, me andás engañando con el tipo ese de youtube.  :'(

De eso nada, tiene voz de robot, no es mi tipo :D

 Bueno, te ponga la rutinita, a ver qué hago mal; cuando meto el número no sigue, y si doy a enter desaparece la ventana:

#include <stdio.h>

main()

{
    int a;
       
    printf("Escriba un numero: ");
   
    scanf(" %d", &a);
 
    if(a>0)
 
printf("Es positivo");
   
 
    }

Ya mañana me levanto pronto para ver los Reyes, a ver si lo han arreglado :D

Hasta mañana y buenas noches.

06 Enero, 2013, 02:37 am
Respuesta #48

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,282
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Bueno, a mí el programa me funciona.

Veamos, al poner el número que pide scanf, funciona bien.

Pero desaparece la ventana.
Esto es porque no hay nada que frene el programa antes de que termine.

Lo que tendrías que hacer es abrir una ventana de comandos de Windows:

Menú Inicio, "Ejecutar" y luego CMD.exe, ENTER.

Ahí vas a la carpeta donde tengas guardados tus proyectos, y tratar de ejecutar tu programa desde la línea de comandos directamente.

Ahí vas a ver que no se te cierra la ventana, y que muestra el resultado correcto.

__________

Intenté ponerle un freno, como hacíamos antes, colocando una sentencia getchar(); al final del programa.

Pero no funcionó.

La cuestión es que parece que hay cierta incompatibilidad en los métodos de lectura de datos desde el teclado, al usar scanf, y luego más tarde un getchar().

El tema está en que con scanf("%d", &a); leíste un número, es cierto, pero también tuviste que apretar la tecla ENTER para que terminara el proceso de entrada de datos del teclado.

Sin embargo, esta tecla ENTER no es parte del número que ingresaste, y por lo tanto queda guardado, en cierto modo, en el buffer del archivo estándar (la consola o teclado).
Así, cuando intentás hacer una nueva lectura de datos del teclado, lo primero que aparece en escena es esa "tecla ENTER" que presionaste antes,
lo cual es un caracter, el famoso avance de línea '\n' (o ASCII 10).

Entonces cuando le llega el turno al getchar(), ya lee ese ENTER que habías presionado anteriormente, y sigue con el fin de programa, con lo cual no te da tiempo a presionar ENTER de nuevo.

Una solución horrenda, podría ser poner dos getchar() juntos... pero eso es un asco, no lo hagas.
Otro intento de solución podría ser poner un nuevo scanf(), lo cual te obligará a presionar ENTER, al igual que getchar();

Pero pueden suceder situaciones parecidas a las del getchar(), o bien habrá una forma no clara de salir del embrollo.

Me parece que en este caso lo más adecuado sería hacer una pausa con una llamada al sistema, así:

system("PAUSE");

previamente adosando la librería stdlib.h

______________




#include <stdlib.h>
#include <stdio.h>

void main(void)

{
   int a;

    printf("Escriba un numero: ");
   
    scanf(" %d", &a);

    if(a>0)
        printf("Es positivo\n\n");
   
   system("PAUSE");

 }


06 Enero, 2013, 05:55 am
Respuesta #49

pierrot

  • pabloN
  • Moderador Global
  • Mensajes: 3,395
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Me estoy divirtiendo con el asunto de cómo se especifican las constantes en C, ya sea char o int, y cuáles son todas las vicisitudes en torno a la asignación de tipos de datos a esas constantes.

Es algo terriblemente complicado, pero me dí el gusto de hallar toda la información, sacar las conclusiones, y analizar todos los detalles.  >:(

Me gusta el estilo con el que estás redactando las notas; te está quedando muy bien.

Esto hay que hacerlo alguna vez, porque si no, después vienen las sorpresas, y nadie entiende por qué el programa puso un número donde uno esperaba que ponga otro...

Sí, cuando dije que estaba ansioso por ver como tratarías todo el tema de los punteros y la memoria dinámica no lo dije como si toda esta introducción me aburriera; por el contrario estoy aprendiendo cantidad de cosas. En la facultad se le da muy poca importancia al lenguaje de programación en sí; en seguida se pasa a analizar las distintas estructuras de datos y sus implementaciones; también se estudian una cantidad de algoritmos relacionados a esas estructuras de datos. Pero de C en sí es muy poco lo que se enseña (al igual que sobre Pascal y Modula-2 que fueron los lenguajes que utilizamos anteriormente). Sólo lo básico para empezar a programar. Lo demás se aprende sobre la marcha y a los golpes, como es de suponer. Este año pareciera que vamos a hacer lo mismo con Java en Programación 4 y Taller.

Ya que estás con la representación interna de los distintos tipos de datos, como sugerencia nada más, podrías explicar algo sobre las máscaras de bits en C y en general sobre los operadores bit a bit. Además de esa forma se puede investigar sobre cómo representa C cada tipo de datos. Por ejemplo, para un variable de tipo int se usan 32 bits, pero al menos yo desconocía exactamente cuál era la representación interna que empleaba C para el tipo de datos entero con signo. Para descubrirlo, hice este programa

#include <stdio.h>

int main(){
   int k,n;
   n=-2;
   for(k=31; k>=0; k=k-1)
      printf("%d",(n & (1 << k)) >> k);
return 0;
}


y muestra:

-11111111111111111111111111111110

Es claro que usa complemento a dos  :P. Lo que sí no sé es por qué imprime un signo de menos, pero imagino que debe estar asociado a la implementación de la función printf. Si se cambia la línea n=-2 por n=2, despliega, obviamente:

00000000000000000000000000000010

Investigar este tipo de cosas puede estar interesante  :laugh:.

Saludos
$_="loe  hnachaPkr erttes,urJ";$j=0;for($i=0;s/(.)(.{$j})$//;$i++){$_=$2.$_,$j+=1-$i%2,print$1}print