Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - rir3760

#991
Por partes ...

Cita de: 0x3c en 26 Enero 2013, 22:55 PMcomo ya he dicho en otras ocasiones estoy siguiendo un libro para aprender a programar en C, en el capitulo 13 hay un codigo para un programa que se supone lo que hace es comparar dos caracteres
Te recomendaría buscar otro libro, para sugerencias sobre alguno bueno nada mejor que el motor de búsqueda de los foros.

El programa que publicas tiene deficiencias como: el tipo de retorno de getchar es int, no se vacía explícitamente la salida estándar, vaciar el bufer de la entrada estándar como se indica no es valido, si se va a imprimir una literal es mejor utilizar puts y por ultimo "return(0);" no es una llamada a función y por ende los paréntesis están de mas.

----

Cita de: mr.blood en 27 Enero 2013, 11:34 AM
Te dejo este codigo, compilado con GCC a mi me funciona sin problema alguno.

Puedes usar setbuff o setbuffer para limpiar el buffer de entrada
En C estándar tampoco vale como solución ya que la llamada a setbuf termina como una llamada a setvbuf y esta ultima debe ser llamada antes de cualquier uso del stream (salvo su apertura).

----

Cita de: avesudra en 27 Enero 2013, 12:26 PM
Las demás formas de hacerlo son parches para corregir.Durasno en ese caso deberías comprobar también si es EOF así que quedaría así:
char c;
while(c=getchar() != '\n' && c != EOF){}
Primero la pedantería: el tipo de retorno de la función getchar es int y faltan paréntesis para obtener el resultado esperado:
int ch;

/* ... */

while ((ch = getchar()) != EOF && ch != '\n')
   ;


Cita de: avesudra en 27 Enero 2013, 12:26 PMPero como ya digo son parches. Hacerlo bien no mata a nadie:
#include <stdio.h>

int main()
{
    char a,b;
    char buffer[80];

    printf("Which character is bigger?\n");

    printf("Type a single character:");
    fgets(buffer,sizeof(buffer),stdin);
    sscanf(buffer,"%c",&a);

    printf("Type another character:");
    fgets(buffer,sizeof(buffer),stdin);
    sscanf(buffer,"%c",&b);

    if(a > b)
    {
        printf("'%c' is greater than '%c'!\n",a,b);
    }
    else if(b > a)
    {
        printf("'%c' is greater than '%c'!\n",b,a);
    }
    else
    {
        printf("Next time don't press the same character");
    }
    return(0);
}
No puede decirse que la solución en base a un bucle sea un parche cuando, si se piensa un poco, garantiza el descarte de la linea sin importar su longitud, algo que no sucede al utilizar fgets. Por ejemplo si en tu programa la primera linea tiene mas de 79 caracteres su salida no es la correcta.

Opciones hay varias: fgets + sscanf, el mentado bucle o bien scanf mas algunos especificadores de formato. Cual elegir lo decide el contexto.

Un saludo
#992
Programación C/C++ / Re: duda c
29 Enero 2013, 18:08 PM
Cita de: amchacon en 29 Enero 2013, 15:01 PM
Generalmente sí. Pero puede que haya alguna plataforma que no lo represente como un cero... Por eso se pone NULL
No. La macro NULL resulta en el valor cero (tipo int, long o "void *"). En el contexto de punteros ese valor indica la dirección que nunca sera valida para un objeto (null pointer constant).

Un saludo
#993
Programación C/C++ / Re: No se eliminan nodos
21 Enero 2013, 16:23 PM
Lo primero que debes hacer es cambiar la definición de la función main a "int main(void) ..." o "int main() ..." e indicar su valor de retorno con al menos "return 0;". También debes cambiar el nombre del campo "año" ya que la 'ñ' no es un carácter valido para nombres de variables y campos. Mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

Un error importante se encuentra al tratar de imprimir los datos de la pila:
printf ("\n %s de %s\n", carro.marca, carro.año);
Para imprimir el campo año que es de tipo int debes utilizar el especificador de formato "%d".

Un saludo
#994
Cita de: Puntoinfinito en 20 Enero 2013, 13:39 PMHe dicho lo mismo que has dicho tú.
Honestamente y en buen plan, no.

Lo seria si tu comentario hubiera sido mas o menos así: Supongo la intención es almacenar en el puntero (la variable "punt") la dirección en memoria del objeto (la variable "numero") para así practicar el uso de los operadores "&" y "*" ...

Hay que tener cuidado con el lenguaje, si se utiliza "declarar" uno piensa en una declaración pero en el caso del programa original:
int numero;
int *punt; /* Declaracion */

numero = 43;
punt = &numero; /* Expresion */

El almacenamiento de la dirección en la variable "punt" no ocurre en su declaración, ocurre en una expresión donde se utiliza el operador de asignación "=".

Un saludo
#995
Cita de: lucaslopez0000 en 20 Enero 2013, 15:39 PMPor lo que he leido esos operadores sirven para otros propositos
Supongo es una confusión al pensar en los operadores lógicos AND y OR ("&&" y "||"), estos resultan en el valor 1 o cero dependiendo si se cumple o no la condición.

Los operadores a nivel de bits AND, OR y XOR ("&", "|" y "^") permiten realizar las mentadas operaciones con valores de tipo int.

Para ejemplos nada mejor que utilizar el motor de búsqueda de los foros.

Un saludo
#996
Programación C/C++ / Re: funcion fprintf
19 Enero 2013, 02:29 AM
Si no tienes un curso o libro de calidad es hora de conseguir uno, ello porque (lo digo en buen plan) hay errores en casi todas las lineas.

* Cuando declaras un array e indicas sus valores iniciales mediante una lista esta debe contener por lo menos uno, no es valido utilizar (como es tu caso) una lista vacía.

* Con las funciones printf/fprintf/sprintf el especificador de formato "%s" indica que el argumento correspondiente (en tu caso 052546) es la dirección donde se almacena la cadena. Aquí hay dos errores: el primero que difícilmente la dirección sera valida y el segundo que 052546 != 52546 (el primero se toma como base ocho).

* Al leer del archivo con fscanf y "%s" se debe indicar el nombre de un array de caracteres sin utilizar el operador "&".

El programa con las correcciones:
#include <stdio.h>
#include <stdlib.h>

#define NOM_ARCHIVO  "Entrada.txt"

int main(void)
{
   FILE *archivo;
   long num = 52546;
   
   if ((archivo = fopen(NOM_ARCHIVO, "wb+")) == NULL){
      perror(NOM_ARCHIVO);
      return EXIT_FAILURE;
   }
   
   fprintf(archivo, "%06ld\n", num);
   rewind(archivo);
   fscanf(archivo, "%ld", &num);
   fclose(archivo);
   printf("I have read:%06d\n", num);
   
   return EXIT_SUCCESS;
}


Un saludo
#997
Programación C/C++ / Re: caso raro!
17 Enero 2013, 16:37 PM
Cita de: 0x3c en 17 Enero 2013, 13:44 PMtodo funciona bien el programa compila y se ejecuta a la perfeccion :D...sin embargo deberia fallar cuando en vez de recibir un numero recibe una letra cosa que no pasa, habra algun error?
El problema se debe a que no verificas el valor de retorno de la función "atoi". Cuando esta función no puede obtener un valor entero en base a la cadena pasada como argumento su valor de retorno es cero. Un detalle: también retorna ese valor si la entrada es "0", una de las razones por las cuales se desaconseja su uso en favor de strtol.

Lo que debes hacer es verificar el mentado valor y si es cero indicar que la entrada no es valida, caso contrario realizas la operación:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char altura[2];
   int valor;
   
   printf("Di tu altura en pies:");
   fflush(stdout);
   fgets(altura, 2, stdin);
   
   valor = atoi(altura);
   if (valor == 0)
      puts("La entrada no es valida");
   else if (valor > 5)
      puts("Eres mas alto que yo!.");
   else if (valor < 5)
      puts("Soy mas alto que tu!");
   else
      puts("Somos de la misma altura!!.");
   
   return 0;
}


También se debe evitar el uso de gets, en su lugar puedes utilizar fgets. Y por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
#998
Depende del estándar bajo el cual se compile el programa.

* En C90 deben colocarse primero las sentencias declarativas (declaraciones) y solo después las ejecutivas (sentencias). Y cuando se declara un array debe indicarse su numero de elementos mediante una expresión entera mayor que cero y calculable en tiempo de compilación (constante). Compilando en este modo se genera el mensaje de error mencionado, este se describe en MSDN en la pagina Compiler Error C2143.

* En C99 se puede al igual que C++ intercalar sentencias de ambos tipos y también puede indicarse el numero de elementos de un array mediante una expresión que no sea constante, a estas se les llama "arrays de longitud variable" o en ingles VLAs (variable length arrays).

Por ultimo para conocer a detalle el lenguaje C la referencia mas completa y correcta son sus estándares C90, C99 y C11. Se pueden comprar en la pagina de la ISO o se puede optar por la opción mas cercana y gratuita que son los borradores (buscar en Google N1256 y N1570).

Pero hay que aclarar que no son documentos para principiantes, para estos mejor un buen libro.

Un saludo
#999
Se pueden procesar los eventos de la consola (incluyendo el mouse) mediante las funciones de consola de la Win32 API (por ejemplo ReadConsoleInput) pero es mejor tratarlo después,  cuando ya se tiene un buen manejo del lenguaje.

Un saludo
#1000
Programación C/C++ / Re: Problema cadenas
7 Enero 2013, 16:59 PM
No es posible ayudarte con solo eso. Publica el código fuente del programa completo o, si es muy largo, su versión mas pequeña donde se genere el error.

Un saludo