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

#121
Cita de: DanielC# en 14 Febrero 2015, 18:05 PMLa duda es sobre cómo establecer  el valor correcto de la variable bits, si bien practicando un poco tal vez lograría que si por ej. El ingreso es:
2147483648 en binario ? 10000000000000000000000000000000
Obtendría el resultado esperado pero no me quedaría claro por qué establecí dicho valor.-   
Me podrían decir el criterio que debo utilizar para establecer el valor correcto en la variable bits.
Algunos comentarios solo para redondear el tema:

* No es necesario comparar el valor leído contra INT_MAX ya que no hay forma de que sea mayor que este, esa comparación la debes eliminar.

* No es necesario calcular el valor ya que este ya lo tienes y lo pasas como argumento a la función "decimalBinario", otra cosa seria procesar una cadena con la representación del numero en base 2 y en base a esta obtener el numero.

* No es necesario un contador para controlar el bucle de la función, en su lugar terminas este cuando la mascara sea cero:
void decimalBinario(int numero)
{
   unsigned bit = 1U << sizeof(unsigned) * CHAR_BIT - 1;
   
   while (bit){
      putchar(numero & bit ? '1' : '0');
      bit >>= 1;
   }
   
   putchar('\n');
}


Un saludo
#122
Cita de: fary en 13 Febrero 2015, 20:27 PMSimplemente copias en un nuevo buffer todos los caracteres que no coincidan con el que quieres eliminar.
Dos comentarios sobre tu programa: 1) En la llamada a malloc hay que reservar un carácter adicional para prevenir el caso donde el carácter a buscar no se encuentre en la cadena y 2) Falta agregar el '\0' a la nueva cadena.

----

Cita de: mariano96 en 13 Febrero 2015, 20:57 PMGracias por el aporte y tu tiempo pero tengo que hacerlo usando otra cadena (cadena de destino)
El ejemplo de fary muestra la forma mas simple de realizar la operación, no encontraras una mas fácil y por ello no debes tener problemas al aplicarla a tu programa, si los tienes publica el código fuente actualizado.

Un saludo
#123
Programación C/C++ / Re: mayor divisor primo
14 Febrero 2015, 05:14 AM
Lo primero que debes hacer es corregir la función "esPrimo" ya que esta no da el resultado correcto:
/* 1) Supongamos que n es igual a 8 ... */
for (i = 1;  n % i == 0 && !primoEncontrado; i++){
   if (n%i>0){ /* 2) El residuo de la division 8 / 1 es mayor que cero? No ... */
      numPrimo = false;
      primoEncontrado = false;
   }else { /* 3) Se ejecuta esta parte y se termina el bucle indicando que 8 es primo */
      numPrimo = true;
      primoEncontrado = true;
   }
}


La forma mas simple (por supuesto no la mas eficiente) de implementar esa funcion es:
bool esPrimo(int n) /* n >= 2 */
{
   int i;
   
   for (i = 2; n % i != 0; i++)
      ;
   
   return i == n;
}


El siguiente paso es verificar la función "mayorDivisorPrimo" (esta la puedes reducir mediante la factorizacion de primos).

Un saludo
#124
Cita de: DanielC# en 11 Febrero 2015, 19:06 PMMe queda una duda, el array reg cuando está dentro de la función ingreso ¿no es un puntero al primer elemento del arreglo?
Correcto.

Cita de: DanielC# en 11 Febrero 2015, 19:06 PMy si es así ¿porque no puedo utilizar el operador flecha (->)? y si me acepta el operador punto (.).
Primero, no hay relación entre los operadores ya que "->" aplica a un puntero mientras que "." aplica a un objeto.

Segundo, en tu caso:
void ingreso(registro *reg, size_t num_regs)
{
   /* ... */
   
   reg[i].orden = i;

Tienes el puntero reg y para acceder al objeto apuntado debes aplicar indireccion con "[]" y solo entonces se accede al campo indicado con ".".

Puedes utilizar el operador "->" sin ningún problema:
void ingreso(registro *reg, size_t num_regs)
{
   /* ... */
   
   (reg + i)->orden = i;

Pero me temo estoy repitiendo la explicación (en la primera pagina de este tema) de Blaster, por favor relee el tema con atención.

Un saludo
#125
Ademas de lo indicado por _Enko (retornar en base a la variable local "cadena" debe ser el error principal) deberías evitar el uso de llamadas a system, gets y el uso de la biblioteca conio de Borland, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

Y si envías un texto a la salida estándar con:
printf("Frase: ");
La cadena debe terminar con el carácter de avance de linea (para ello lo mas sencillo es utilizar puts en lugar de printf) o bien vacías explícitamente el bufer de la salida estándar con fflush(stdout).

Un saludo
#126
Cita de: DanielC# en 10 Febrero 2015, 22:34 PMEste programa es para que me digan con teoría que le estoy pasando a la función.
Demasiado complicado para lo que intentas.

Basta con declarar la funcion con dos parámetros: el primero es la dirección en memoria del array y el segundo su numero de elementos. De esta forma:
#include <stdio.h>

struct registro {
   int ordenint;
   int celular;
   char nombre[30];
   char apellido[30];
   char calle[30];
   char ciudad[30];
   char correo[50];
};

void ingreso(struct registro *reg, size_t num_regs);

int main(void)
{
   struct registro reg[10];
   ingreso(reg, sizeof reg / sizeof reg[0]);
   
   return 0;
}

void ingreso(struct registro *reg, size_t num_regs)
{
   size_t i;
   
   for (i = 0; i < num_regs; i++){
      /* Aqui procesas el elemento reg[i] */
   }
}


Un saludo
#127
Programación C/C++ / Re: verdadero hola mundo C
11 Febrero 2015, 02:25 AM
Cita de: sabeeee en 10 Febrero 2015, 18:51 PMReturn no sirve en este caso porque el programa no hace nada.
Independientemente de lo que haga el programa se debe indicar el valor de retorno de la función ya que de omitirse este es indefinido (salvo la excepción comentada mas adelante).

Si se trata del programa mas pequeño posible en el caso de C90 este es:
main(){return 0;}
Al omitirse el tipo de la función main este se toma de forma predeterminada como int.

En el caso de C99 y C11 este es:
int main(){}
Aquí no es posible omitir el tipo de la función, en cambio se puede eliminar la sentencia de retorno ya que en linea con C++ si no se especifica este se asume como cero (salida normal).

Un saludo
#128
Cita de: thxly en 31 Enero 2015, 06:18 AMPero al momento de leer uno de los archivos que cree antes y poner los datos en un vector, solo ingresa la primera linea del archivo al vector. Si mando a imprimir lo que devuelve de la función getline me muestra los demás registros.No se porque solo se ingresa la primera linea del archivo.

Este es el código que estoy utilizando, tal vez algún consejo?
Si agregamos esa función (ligeramente modificada) a un programa de prueba funciona correctamente así que el error que mencionas se debe generar en alguna otra parte del programa, por favor publica su código fuente completo (por supuesto en la forma mas pequeña posible).

Dos sugerencias en relación a esa función son 1) Los objetos de tipo string se inicializan con una cadena vacía, no es necesaria la asignación y 2) getline retorna el objeto de tipo istream utilizado como su primer argumento, no hay porque compararlo contra NUll, quita esa comparación.

----

Cita de: Orubatosu en 31 Enero 2015, 13:18 PM¿Porque no usar algo con menos problemas potenciales como?
Código (cpp) [Seleccionar]
while(!fichero.eof()){
Simplemente: "Mientras el objeto "fichero" no llegue al final..."
No porque en realidad mete mas problemas.

Las funciones feof/eof de C/C++ retornan verdadero en base a la ultima operación de lectura, por ello un bucle controlado por esas funciones tendrá una iteración de mas (a eso hay que agregar que la gran mayoría de las funciones retornan el resultado de la operación de E/S) por lo que no se recomienda su uso mas que en contados escenarios.

Un saludo
#129
Cita de: marck quinto en 30 Enero 2015, 01:38 AMNo encuentro la solucion de este ejercicios... Escriba un programa que cuente espacios en blanco, tabuladores y nuevas líneas.
El programa que publicas cumple con el enunciado. ¿Cual es tu duda?

Un saludo
#130
Cita de: flony en 29 Enero 2015, 04:22 AM
Código (cpp) [Seleccionar]
# include <iostream>
struct T_alumno
{
string nombre;
float nota[2];
} alumno[29];
En C y C++ los indices inician en 0 y terminan en N-1 donde N es el numero de elementos. Si quieres un array de treinta estudiantes con tres calificaciones cada uno debes cambiar esa declaración a:
Código (cpp) [Seleccionar]
# include <iostream>
struct T_alumno
{
   string nombre;
   float nota[3];
} alumno[30];


Cita de: flony en 30 Enero 2015, 15:53 PM
Código (cpp) [Seleccionar]
condicion == 1 ? /* ==> */ cuentaAlumno = cuentaAlumno++ /* <== */ : cuentaAlumno;
No deberías hacer eso primero porque el lenguaje no define cuando se aplicara el efecto lateral y segundo porque estas modificando dos veces el objeto. Para el caso utiliza:
Código (cpp) [Seleccionar]
if (condicion == 1)
   cuentaAlumno++;


Un saludo