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

#1411
Cita de: RHL en 22 Noviembre 2011, 17:09 PMquien dice que mi codigo no funciona  :¬¬
El creador del tema (hervasiop12345 ), el comentario de BlackZeroX (Astaroth) fue en la linea por supuesto no funcionara si se copia tal cual ya que se deben hacer los cambios pertinentes ....

Cita de: RHL en 22 Noviembre 2011, 17:09 PM@rir3760
En mi codigo escribi solo la funcion main, daba por hecho que hibas a hacer tu las declaraciones!
Honestamente no entiendo a que te refieres.

Cita de: RHL en 22 Noviembre 2011, 17:09 PMy pongo el codigo completo para que vean que SI FUNCIONA
Si funciona (tal cual) pero se debe recordar que al utilizar el objeto cin en su forma predeterminada para leer un caracter:
Código (cpp) [Seleccionar]
char ch;

cin >> ch;

Se descarta el espacio blanco (espacio, tabulador, avance de linea, etc.). Primero hay que cambiar el comportamiento del objeto para que no lo ignore (en este momento no recuerdo pero me parece es con un manipulador).

Un saludo
#1412
Para leer caracteres hasta alcanzar uno en particular puedes utilizar la funcion "getline" con dos argumentos (el tercero se toma como '\n') o tres (si quieres leer hasta algun otro caracter).

Por ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::getline;

#include <string>
using std::string;

int main()
{
string linea;
char delim = '\n';

getline(cin, linea, delim);
cout << "La linea es " << '\"' << linea << '\"' << endl;

return 0;
}


Un saludo
#1413
Los problemas en ese programa son tres: el primero que declarar una variable en un bucle "for" depende del compilador (para ser exactos de su soporte de C99), el segundo es el punto y coma de mas justo después del bucle "for" y el tercero que el condicional "if" esta mal. Tampoco imprimes mensaje alguno para indicar el resultado.

Las correcciones son:
int i;

/* ... */
   
for (i = 0; i < (largo / 2); i++ )
   if (palabra[i] != palabra[largo - 1 - i])
      resultado = 0;

/* Impresion del resultado */


Tambien puedes utilizar el motor de busqueda para revisar los ejemplos sobre como realizar ese programa.

Un saludo
#1414
Si no tienes un libro de calidad ya es hora de conseguir uno, empieza revisando el tema [Libros/Papers] C/C++. El programa tiene varios errores que se describen en detalle en |Lo que no hay que hacer en C/C++. Nivel basico|.

Aparte de eso hay que evitar el uso de macros:
#define p printf
#define s scanf

Ello porque si cualquiera ve "printf/scanf" ya sabe de que se trata el asunto, no hay que revisar las definiciones.


Para trabajar con memoria reservada de forma dinámica lo primero que debes hacer es llamar a malloc/calloc/realloc, accedes al objeto utilizando operadores como "->" o "[]" y finalmente liberas la memoria mediante la función "free".

Un empujón:
#include <stdio.h>
#include <stdlib.h>

#define NUM_CHARS  128

struct agenda {
   char nombre[NUM_CHARS];
   char apellido[NUM_CHARS];
   int edad;
   
};

int main(void)
{
    struct agenda *p;
    struct agenda *q;
    int num_regs = 3;
    int i;
    int ch;
   
    /* 1) Reservamos el bloque de memoria */
    if ((p = malloc(num_regs * sizeof *p)) == NULL)
        return EXIT_FAILURE;
   
    /* 2) Leemos los registros */
    q = p;
    for (i = 0; i < num_regs; i++){
        printf("Registro %d\n", i + 1);
       
        printf("Nombre: ");
        fflush(stdout);
        fgets(q->nombre, NUM_CHARS, stdin);
       
        printf("Apellidos: ");
        fflush(stdout);
        fgets(q->apellido, NUM_CHARS, stdin);
       
        printf("Edad: ");
        fflush(stdout);
        scanf("%d", &q->edad);
       
        while ((ch = getchar()) != EOF && ch != '\n')
            ;
       
        q++;
    }
   
    /* 3) Impresion de los registros */
    for (i = 0; i < num_regs; i++){
        printf("Registro %d\n", i + 1);
       
        printf("Nombre: %s\n", p[i].nombre);
        printf("Apellidos:  %s\n", p[i].apellido);
        printf("Edad: %d\n\n", p[i].edad);
    }
   
    /* 4) Liberamos la memoria */
    free(p);
   
    return EXIT_SUCCESS;   
}


Un saludo
#1415
Programación C/C++ / Re: Ayuda con algoritmo C++
15 Noviembre 2011, 00:36 AM
El problema es, no se puede reducir mucho y utilizando formas mas simples lo único que se consigue es incrementar el tamaño de la función.

Para empezar se puede manejar al numero cero como un caso especial. Eso deja el bucle principal de una forma mas "natural" y por ultimo se puede eliminar el uso del operador condicional "? :" quedando en:

int Digit(int N, int num)
{
   int rv;
   
   if (num < 0)
      num = -num;
   
   if (num != 0){
      int i;
      int r = 0;
     
      for (N++, i = 0; i != N && num != 0; i++){
         r = num % 10;
         num /= 10;
      }
     
      if (i == N)
         rv = r;
      else
         rv = -1;
   }else if (N == 0)
      rv = 0;
   else
      rv = -1;
   
   return rv;
}


El codigo es mas facil de seguir pero, honestamente, no me gusta nada (prefiero la primera forma).

Un saludo
#1416
Hay que tener cuidado al utilizar el valor de retorno de scanf:
while(!scanf("%d", &numero))
   while(getchar() != '\n');

En caso de error o fin de archivo la funcion retorna EOF, eso causaria la salida del bucle con el valor de la variable "numero" como (todavia) "no definido" o "basura".

Un saludo
#1417
Programación C/C++ / Re: ayuda. matriz binaria
14 Noviembre 2011, 06:44 AM
Puedes utilizar un array de arrays de caracteres y utilizar cada uno de los bits del carácter para almacenar el estado (1/0 Verdadero/Falso). Así no habría desperdicio pero a cambio debes utilizar los operadores a nivel de bits para acceder y modificar el bit en cuestión.

¿Que lenguaje estas utilizando?

Un saludo
#1418
Programación C/C++ / Re: Ayuda con algoritmo C++
14 Noviembre 2011, 03:53 AM
Aparte del error que ya te indicaron hay otros, por ejemplo la condición de escape del bucle es:
r = num % 10;
num = num / 10;

if (N > r)
   return -1;

Esta mal (revisa a lápiz y papel que pasa si quieres obtener el dígito de indice 3 del numero 3210).

Tampoco consideras, como indica el enunciado, si el numero es negativo. Aquí lo mejor seria revisar que dice el estándar sobre "quien se queda con el signo" (hasta donde recuerdo es "implementation defined").

También faltan las directivas de inclusión (supongo solo fue un olvido).

Una forma de implementar la función con un bucle "feo" (para así evitar el caso especial del numero cero) es:
int Digit(int N, int num)
{
   int i;
   int r;
   
   if (num < 0)
      num = -num;
   
   i = 0;
   while (true){
      r = num % 10;
      num /= 10;
     
      if (i == N || num == 0)
         break;
     
      i++;
   }
   
   return (i == N) ? r : -1;
}


Un saludo
#1419
Cita de: DickGumshoe en 13 Noviembre 2011, 19:54 PM2. ¿Es posible intercambiar dos valores sin utilizar una variable auxiliar?
Tal vez si o tal vez no (depende del tipo de valor y de los objetos en cuestión). Ese es el problema: ya que no hay una forma realmente genérica para realizar el intercambio (al menos no en C estándar) lo mejor es utilizar una variable temporal y dejarle el resto al compilador.


Cita de: DickGumshoe en 13 Noviembre 2011, 19:54 PMTambién he probado con

((a=b) & (b=a)), pero tampoco...
Te recomendaría que no hicieras eso: "tasajear" código para "ver que pasa" y en base al resultado sacar conclusiones. Ello porque si cometes un error en C eso resulta en "comportamiento no definido", en buen cristiano cualquier cosa puede pasar, por ejemplo:

A) El programa revienta
B) Se quema la PC
C) Te deja la novia/amiga con privilegios/etc.
D) Lo peor: todo funciona de maravilla.

Es usualmente el ultimo caso el que da problemas: le das el programa a tu profesor/tutor/etc. y resulta que el bendito programa no funciona en su PC.

Mejor consigue un buen libro y aprende en base a el (y foros como este).

Un saludo
#1420
No porque si revisas el bucle te daras cuenta que solo estas dividiendo entre los numeros pares mientras que el enunciado te pide revisar la serie 2, 3, 5, 7, ... N.

Un problema con el (debido a esa serie) es que debes manejar el caso especial donde el numero es par, si es dos es primo, cualquier otro no lo es.

Con los cambios:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int numero;
    int i;
    int es_primo;
   
    printf("Introduce el numero: ");
    fflush(stdout);
    if (scanf("%d", &numero) != 1 || numero < 2)
        return EXIT_FAILURE;
   
    es_primo = numero == 2 || numero % 2 == 1;
    for (i = 3; i < numero && es_primo; i += 2)
        if (numero % i == 0)
            es_primo = 0;
   
    if (es_primo)
        printf("%d es primo\n", numero);
    else
        printf("%d no es primo\n", numero);
       
   return EXIT_SUCCESS;
}


Un saludo