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

#1491
Los problemas son varios. Lo primero que debes hacer es conseguir un buen libro, revisa los temas fijos de este foro.

Errores comunes son la definicion de la funcion main, el uso de conio, etc. Todo eso se discute, de nuevo, en los temas fijos. Por favor revisalos.

El error mas importante en el programa es el uso de la coma como separador de decimales, en C debes utilizar el punto. El programa con las correcciones es:
#include <stdio.h>

int main(void)
{
   int dias;
   int horas_extra;
   double sueldo;
   
   puts("Dias trabajados:");
   scanf("%d", &dias);
   
   puts("Horas extra:");
   scanf ("%d", &horas_extra);
   
   sueldo = dias * 23.5 + horas_extra * 11.3;
   printf("Sueldo: %.2f", sueldo);
   
   return 0;
}


Un saludo
#1492
En una sentencia de retorno como esta:
return N;
"N" debe ser del tipo indicado en la declaración de la funcion (siguiendo tu ejemplo debe ser "signed int") y puede ser cualquier expresión.

Esto es una expresión:
numero >= '0' && numero <= '9'

La prioridad de los operadores es, utilizando paréntesis:
(numero >= '0') && (numero <= '9')
1) Primero se aplican los operadores ">=" y "<=", el resultado de estos es 1 o 0 (Verdadero o Falso).

2) Despues se aplica el operador "&&" en el caso de '5' tenemos:
(1) && (1)
El operador "&&" resulta en 1 o 0 si se cumple con el operador lógico AND (Verdadero si ambos operandos son distintos de cero, Falso en caso contrario).

Para el tema de expresiones no hay nada mejor que un libro de calidad, si no tienes uno consiguelo (empieza revisando los temas fijos de este foro para recomendaciones).

Un saludo
#1493
Programación C/C++ / Re: Dimensión de Arreglos en C
27 Septiembre 2011, 22:52 PM
Por lo visto tenemos una confusión, a ver si ahora me explico mejor.

Cuando indique que el proceso no es acumulativo me refería a la llamada a "malloc", no al incremento del contador "i".

Cuando se reserva memoria la variable "arreglo" sirve como bandera para saber si la reserva fue exitosa o no. Después de ello se libera pero eso no importa porque basta con revisar el valor de esa variable para conocer si funciono (diferente de NULL) o no (NULL).

Si por curiosidad se desea conocer si es posible realizar la máxima (en teoría) reserva de memoria basta con:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   size_t max = -1;
   char *p;
   
   p = malloc(max);
   free(p);
   
   if (p)
      puts("OK");
   else
      puts("Error");
   
   return EXIT_SUCCESS;
}

El programa anterior de naderST realiza (poco mas o poco menos) lo mismo: acercarse al punto donde la reserva de memoria falle.

Un saludo
#1494
Programación C/C++ / Re: Dimensión de Arreglos en C
27 Septiembre 2011, 17:52 PM
Cita de: Lambda en 27 Septiembre 2011, 14:46 PM
Si que afecta, fijate mejor xD

El bucle acabara cuando el sistema se quede sin memoria y retorne NULL, eso nunca pasara por que hace free a la memoria que reserva.
No. Las llamadas anteriores no importan porque la intención no es realizar un proceso acumulativo.

Si se llama a "malloc" y esta falla su valor (NULL) se almacenara en la variable "arreglo" y eso causara la salida del bucle.

Un saludo
#1495
Programación C/C++ / Re: Dimensión de Arreglos en C
27 Septiembre 2011, 03:52 AM
Cita de: Lambda en 26 Septiembre 2011, 10:31 AMNunca sale del ciclo por que siempre liberas la memoria.
No. La variable "arreglo" contiene la ultima direccion retornada por malloc, la liberacion de memoria en la siguiente sentencia no afecta la condicion del bucle.

Si piensan ejecutar un bucle asi seria mejor cambiar el incremento a 1 KB o 1 MB.

Un saludo
#1496
Programación C/C++ / Re: Dimensión de Arreglos en C
26 Septiembre 2011, 01:44 AM
Cita de: LearningSpanishProgrammer en 26 Septiembre 2011, 00:10 AM
No me gusta de números mágicos.
Muchas personas consideran usar "sizeof" una buena práctica.
Leo Gutiérrez se refiere al uso de sizeof en esta linea:
char * arreglo = malloc(sizeof(char) * i);
Todo compilador que cumpla con el estándar de C debe evaluar "sizeof(char)" resultando en 1 y la multiplicación por este no tiene sentido ya que no afecta el resultado. Por ello se puede abreviar a:
char * arreglo = malloc(i);

En cuanto al tamaño máximo que puede tener un array este depende del compilador utilizado. Ello porque el estándar del lenguaje permite indicar el numero de elementos en un array mediante una expresión constante de tipo entero (cualquier tipo, por ejemplo "int" o "unsigned long") mayor que cero.

Lo que debe hacer el OP (el usuario Principios en C) es revisar la documentación de su compilador.

Un saludo
#1497
Cita de: LearningSpanishProgrammer en 25 Septiembre 2011, 20:39 PMEl_Java, no entiendo por qué tu usa números mágicos en su codigo
Supongo querias decir: "El_Java, no entiendo por qué el (Leon8086x) usa números mágicos en su codigo".

Cita de: LearningSpanishProgrammer en 25 Septiembre 2011, 20:39 PMtambien no entiendo por qué el OP no usa cero en lugar de menos uno.

...

Así, puede usar en el 'if' directamente.
Si se retorna uno en caso de coincidencia y cero en caso contrario no hay porque utilizar un "if", en su lugar se utiliza directamente el resultado del operador "&&":
int esnum(char numero)
{
   return numero >= '0' && numero <= '9';
}


Un saludo
#1498
Solo tienes que tomar el numero y dividirlo por la base una y otra vez hasta que termine en cero. En cada iteracion el residuo de la división (el modulo) te dará el dígito menos significativo (hasta ese momento).

Inténtalo primero con papel y lápiz usando las bases mas utilizadas (8, 10 y 16).

Un saludo
#1499
Para algo relativamente complejo es mejor desarrollar una función. Ello porque en la macro seria muy difícil (tal vez mediante la macro "assert") validar los argumentos.

En todo caso si solo quieres agregar un sufijo a la cadena puedes utilizar algo mas o menos así:
#include <stdio.h>
#include <stdlib.h>

#define FOPEN(var, sufix) ((var) = fopen("asd" TO_STR(sufix) ".dat", "ab"))
#define TO_STR(str)  #str

int main(void)
{
   FILE *a;
   FILE *b;
   
   FOPEN(a, 1);
   FOPEN(b, 2);
   
   fclose(a);
   fclose(b);
   
   return EXIT_SUCCESS;
}

Como puedes observar el problema es que se deben utilizar literales como 1 o 2, no puedes utilizar una variable. De nuevo en un caso como ese lo mejor es una funcion.

Un saludo
#1500
Programación C/C++ / Re: Punteros en C
19 Septiembre 2011, 15:17 PM
Me parece el mensaje de error es bastante claro: el especificador "%d" espera un (correspondiente) argumento de tipo "int" mientras que tu le pasas "&mientero" que es de tipo "int *".

Si quieres imprimir una dirección de memoria debes utilizar "%p" y convertir explícitamente el puntero al tipo "void *":
printf("%p\n", (void *) &mientero);

Un saludo