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

#1471
La forma mas sencilla es utilizando un array de caracteres para ahí almacenar cada uno de los dígitos, eso mas calcular su numero lo relegas a la función sprintf.

Un ejemplo del uso de esa funcion:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char digito[33]; /* 33 == ALGUN_VALOR */
    int num_digitos;
    int numero = 5694;
    int i;
   
    num_digitos = sprintf(digito, "%d", numero);
   
    printf("Numero de digitos: %d\n", num_digitos);
    for (i = 0; i < num_digitos; i++)
        printf("%c\n", digito[i]);
   
    return EXIT_SUCCESS;
}

Por supuesto debes considerar que los dígitos se almacenan como caracteres. Antes de procesarlos debes restarles '0' para en base al carácter obtener el numero:
'0' - '0' == 0
'1' - '0' == 1
'2' - '0' == 2
...


El resto es verificar si el numero de dígitos es par o impar, eso lo realizas mediante el operador de modulo. Finalmente realizas la división con el operador del mismo nombre.

Un saludo
#1472
Un detalle:
printf("Inserta el simbolo / para que divida su valor en 2.\nInserta la opcion (simbolo) deseada (0 para terminar): ");
getchar();
scanf("%c", &simba);

Cuando se utiliza el especificador "%c" este no descarta el espacio blanco previo (de ahi la llamada a getchar).

Para eliminar el espacio blanco y leer un unico caracter se puede utilizar:
printf("Inserta el simbolo / para que divida su valor en 2.\nInserta la opcion (simbolo) deseada (0 para terminar): ");
scanf(" %c", &simba);

El espacio en " %c" es critico (con el se elimina primero el espacio blanco y solo entonces se lee el caracter).

Un saludo
#1473
Si se trata de compilar tu programa en Dev-C++ con las opciones predeterminadas se genera el mensaje:
#warning This file includes at least one deprecated or antiquated header.
Please consider using one of the 32 headers found in section 17.4.1.2 of the C++
standard. Examples include substituting the <X> header for the <X.h> header for
C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To
disable this warning use -Wno-deprecated.

Ello en relación a la inclusión de <iostream.h>, caso similar con <stdlib.h>. En cuanto a <conio.h> no es necesario utilizarla.

En cuanto a la función principal esta debe retornar cero o bien un valor distinto en caso de error (tu devuelves 9 de forma indiscriminada).

En mi opinión deberías revisar alguna pagina sobre pilas en la red (por ejemplo Wikipedia) y rescribir el programa desde cero ya que tiene varios errores.

Un saludo
#1474
Lo digo sin mala intención: ese programa esta muy mal y si apenas empiezas con el lenguaje C deberías conseguir un buen libro, para ello revisa los temas fijos de este foro.

Casi todo el proceso que haces en la función de comparación como pedir las cadenas e indicar el resultado lo debes pasar a la función principal con ciertas correcciones como evitar el uso de "gets" y "fflush(stdin)".

En cuanto a la implementación de la función para comparar, a esta se le pasa la dirección base de dos cadenas y debe retornar el resultado indicado. Un solución utilizando punteros:
int fn_cmp(char const *s, char const *t)
{
   while (*s == *t && *s != '\0'){
      s++;
      t++;
   }
   
   return (*s > *t) - (*s < *t);
}


El resto te toca a ti.

Un saludo
#1475
¿Leiste la descripcion y opiniones sobre el? Es un libro sobre Visual C++ 6.0 enfocado en la programacion en MS Windows.

Primero define que es lo que realmente quieres.

Un saludo
#1476
Para alguien que apenas empieza con el lenguaje C++ dos libros muy buenos pero en ingles:

Accelerated C++: Practical Programming by Example
Andrew Koenig and Barbara E. Moo
Addison-Wesley, 2000
ISBN 0-201-70353-X


C++ Primer, 4th Edition
Stanley B. Lippman, Josée LaJoie, Barbara E. Moo
Addison-Wesley Professional
ISBN-10: 0-201-72148-1
ISBN-13: 978-0-201-72148-5


Otras dos opciones (si ya se tiene un buen manejo del lenguaje) por desgracia tambien en ingles:

The C++ Programming Language
Bjarne Stroustrup
Addison-Wesley Professional
ISBN-10: 0201327554
ISBN-13: 978-0201889543

The C++ Standard Library: A Tutorial and Reference
Nicolai M. Josuttis
Addison-Wesley Professional
ISBN-10: 0201379260
ISBN-13: 978-0201379266

Un saludo
#1477
Si apenas empiezas con C++ deberías conseguir un buen libro sobre este, por favor revisa los temas fijos de los foros.

Te daría una solución pero honestamente el programa tiene errores y la aproximación es, para decirlo de forma amable, incorrecta.

En el caso de C++ para utilizar cadenas utilizas la clase "string" y para almacenar un numero indeterminado de estas puedes crear un vector de strings (con vector me refiero a la clase, no a un array).

Puedes empezar utilizando el motor de búsqueda (o alguno de los libros recomendados) para revisar temas sobre esas dos clases (string y vector).

Un saludo
#1478
Cita de: do-while en 16 Octubre 2011, 20:13 PMLlevo mas de diez años programando en C, y nunca me ha dejado asignar directamente el puntero devuelto al asignar memoria dinamicamente. Siempre he utilizado MinGW (gcc, vamos)
Es extraño, habría que revisar la linea de comando que utilizas. En el caso de gcc/cygwin para compilar en el modo mas estricto posible se llama a este con:
gcc -c -ansi -pedantic -Wall -O main.c
Y al utilizarlo asi una llamada a malloc como esta:
num = malloc(10 * sizeof *num);
Debe compilar sin problemas (para el caso según el estándar de C debe pasar correctamente con cualquier compilador).

Cita de: do-while en 16 Octubre 2011, 20:13 PMAl reves de lo que dices, en C++ no hace falta realizar el cast, ya que el propio new devuelve un puntero correcto (o deberia hacerlo), del tipo de la clase (o vector de clases) que estes creando.
Me refería a las llamadas a malloc y compañía. En ese lenguaje la misma llamada:
num = malloc(10 * sizeof *num);
Debe generar un mensaje indicando que falta la conversión, la forma correcta es (si "num" es de tipo "int *"):
num = (int *) malloc(10 * sizeof *num);
Pero como bien comentas es mejor utilizar el par new/delete para reservas de memoria en C++ ya que así se garantiza (si aplica) la ejecución de los constructores/destructores.

Un saludo
#1479
Aclaro que lo siguiente es en relación a C, la mayoría también aplica a C++ pero tienen sus diferencias así que, cuidado.

Una de las razones, como ya te comento El_Java, es para evitar la copia del argumento. Siguiendo su ejemplo otra ventaja es la posibilidad (mediante indireccion) de modificarlo. Sin embargo C++ agrego las referencias que solucionan ambos problemas.

Otra razón es la capacidad de indicar el uso de una función en particular (en C++ son los famosos predicados). Ya que los objetos y las funciones son entidades distintas la única forma de indicar una función es mediante un puntero a esta.

El mejor ejemplo en la biblioteca estándar de C son las funciones bsearch y qsort, como sus nombres lo indican la primera busca y la segunda ordena cualquier tipo de array. El problema es el método de comparación, ya que dependiendo del tipo se debe realizar una comparación distinta. Ello se soluciona con el paso de un puntero a función.

Un ejemplo de qsort para ordenar un array de enteros:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define NUM_ELEM 16

int fn_cmp(const void *p, const void *q);

int main(void)
{
   int i, num[NUM_ELEM];
   
   srand((unsigned) time(NULL));
   
   printf("Array sin ordenar:");
   for (i = 0; i < NUM_ELEM; i++){
      num[i] = rand() % NUM_ELEM;
      printf("%3d", num[i]);
   }
   puts("");
   
   /* Ordenar el array de forma ascendente (menor a mayor) */
   qsort(num, (size_t) NUM_ELEM, sizeof(num[0]), fn_cmp);
   
   printf("Array ordenado:   ");
   for (i = NUM_ELEM; i > 0; i--)
      printf("%3d", num[i - 1]);
   puts("");
   
   return EXIT_SUCCESS;
}

int fn_cmp(const void *p, const void *q)
{
   int a = *(int *) p;
   int b = *(int *) q;
   
   if (a < b)
      return -1;
   else if (a == b)
      return 0;
   else
      return 1;
}


Un saludo
#1480
Solo dos aclaraciones.

Los prototipos de las funciones malloc, calloc, realloc y free se encuentran en el encabezado <stdlib.h>.

Sobre la conversión explicita del "void *" que retornan esas funciones es obligatoria en C++ pero no se recomienda en C (ya que ella es automática).

Un saludo