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

#541
Me parece que estas confundiendo la dirección de un elemento con la dirección almacenada en el elemento. Las cadenas "abeja" y "Abeja" no pueden almacenarse en las direcciones 4c69c y 4c6a0 porque cada una consta (incluyendo el '\0') de seis caracteres.

Si modificamos el programa un poco:
#include <stdio.h>
#include <string.h>

int main(void)
{
   char *frase[] = {
      "abeja",
      "Abeja"
   };
   int i;
   
   for (i = 0; i < 2; i++)
      printf("frase[%d]: %p --> %s\n", i, (void *) frase[i], frase[i]);
   
   if(strcmp(*frase, *(frase + 1)) > 0){
      char *temp = frase[0];
      frase[0] = frase[1];
      frase[1] = temp;
   }
   puts("----");
   
   for (i = 0; i < 2; i++)
      printf("frase[%d]: %p --> %s\n", i, (void *) frase[i], frase[i]);

   return 0;
}


Su salida (en mi caso) es:
frase[0]: 0x004090bd --> abeja
frase[1]: 0x004090b7 --> Abeja
----
frase[0]: 0x004090b7 --> Abeja
frase[1]: 0x004090bd --> abeja


Un saludo
#542
Cita de: Tezcat en 21 Diciembre 2013, 01:00 AMEsto ha de hacerse con un vector el vector ya lo tengo implementado, pero no se como realizar lo de los guiones. Si pudieran ayudarme o darme alguna idea
C no tiene vectores supongo te refieres a un array, ¿Correcto?

Debes utilizar un array para almacenar cada uno de los números (mas bien dígitos) y para visualizarlos debes utilizar otro array para almacenar el estado de cada dígito (visible u oculto). Este puede ser un array de caracteres donde el valor uno indica que debe imprimirse el dígito y el valor cero que debe imprimirse un guion.

Un saludo
#543
Cita de: DanielC# en 20 Diciembre 2013, 03:19 AMDiscúlpame por la ignorancia, tú código cumple con el enunciado del libro?
Si. Un ejemplo similar se encuentra en el tema Consulta argumentos.

Un saludo
#544
Programación C/C++ / Re: Consulta argumentos
21 Diciembre 2013, 00:44 AM
Cita de: elProfeta1979 en 20 Diciembre 2013, 21:12 PMhay ventajas en hacer este tipo de declaraciones?
Primero tienes que indicar en relación a que.

Para dar mas contexto una función de ese tipo se utiliza junto con qsort (parte de la biblioteca estándar de C) para ordenar un array de punteros a carácter:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int cmp(void const *p, void const *q);

int main(void)
{
   char *pal[] = {
      "xyz",
      "paco",
      "luis",
      "hugo",
      "abc",
   };
   size_t num_pals = sizeof pal / sizeof pal[0];
   size_t i;
   
   qsort(pal, num_pals, sizeof pal[0], cmp);
   for (i = 0; i < num_pals; i++)
      printf("%lu: %s\n", (unsigned long) i, pal[i]);
   
   return EXIT_SUCCESS;
}

static int cmp(void const *p, void const *q)
{
   return strcmp(*(char **) p, *(char **) q);
}


Un saludo
#545
Programación C/C++ / Re: Duda ejercicio C
20 Diciembre 2013, 03:34 AM
Cita de: dennis094 en 19 Diciembre 2013, 14:49 PMresulta que en clase me han pasado el siguiente ejercicio, y la verdad es que no tengo ni idea de por donde cogerlo... si me pudierais echar una mano os lo agradeceria
En buen plan: Ya que se trata de un trabajo de clase deberías publicar tus respuestas y porque piensas que son correctas. A partir de ahí ya podríamos ayudarte.

Eso porque 1) Hacer tareas va contra las reglas de los foros y 2) la idea es que tu aprendas en el proceso (si no te esfuerzas no es posible).

Un saludo
#546
Cita de: ThronerAXE en 20 Diciembre 2013, 00:39 AMeste programita sencillito, por ejemplo en si yo le ingresara una sifra mayor a 7 digitos(ej: 1234567) el programa da como salida 1.23457e+06 y si lo cambio a tipo double sucede lo mismo. ¿ que puedo hacer en esos casos ?
No veo el problema ya que el numero almacenado es el correcto. Tema aparte es el formato de impresión, en C++ utilizas los manipuladores fixed y scientific para ese propósito.

Un saludo
#547
Deberias eliminar esto:
Cita de: DanielC# en 19 Diciembre 2013, 23:53 PMHago esta aclaración porque en muchos casos suponen que tengo 15 o 20 años(es lo lógico) y en realidad tengo 61, como comprenderán no voy a la facultad y la gente que conozco no tiene la más mínima idea lo que es la computadora y menos programar.-
Ya que mientras no infrinjas las reglas de los foros no hay problema.

----

Cita de: DanielC# en 19 Diciembre 2013, 23:53 PMel gran problema que tengo es como declarar temp para que contenga la dirección de memoria de uno de los punteros
La variable temporal debe ser del mismo tipo que los elementos del array "frase": "char *".

Ademas en el intercambio debes aplicar indirección con el operador "*" o "[]". El programa con los cambios:
#include <stdio.h>
#include <string.h>

int main(void)
{
   char *frase[] = {
      "abeja",
      "Abeja"
   };
   int i;
   
   if(strcmp(*frase, *(frase + 1)) > 0){
      char *temp = frase[0];
      frase[0] = frase[1];
      frase[1] = temp;
   }
   
   for (i = 0; i < 2; i++)
      printf(" %s", frase[i]);
   putchar('\n');
   
   return 0;
}


Un saludo
#548
Cita de: d00ze13 en 19 Diciembre 2013, 15:00 PMNo entiendo una cosa de esta función, en la última vuelta del bucle cuando el nodo p->sig ya apunte a NULL y p al último nodo, si quieres volver a llamar a la función mostrarNodos, no mostraría solo el último dato? (ya que p apunta al último nodo, y debería de apuntar al primer nodo para recorrerlos de principio a fin, no?).
No porque el parámetro "p" es una variable local.

Cuando se llama a la función:
Código (cpp) [Seleccionar]
mostrarNodos(cab);
Esta recibe como argumento el valor almacenado en la variable "cab" (la dirección en memoria del primer elemento de la lista), este se utiliza como valor inicial del parámetro "p" de la mentada función y como es una variable local puedes modificar su valor sin afectar otras partes del programa (si aplicas indirección con "*" o "[]" ya no trabajas con el puntero sino con el objeto apuntado).

Un saludo
#549
* En la función "mostrarNodos" no necesitas de una variable local, en su lugar puedes utilizar el parámetro de la función:
Código (cpp) [Seleccionar]
void mostrarNodos(nodo* p)
{
   while (p){
      cout << p->dato << endl;
      p = p->sig;
   }
}


* La función "borrarNodos" esta mal implementada (debe reventar el programa) y solo necesitas de una variable local:
Código (cpp) [Seleccionar]
void borrarNodos(nodo* p)
{
   nodo* sig;
   
   while (p){
      sig = p->sig;
      delete p;
      p = sig;
   }
}


Un saludo
#550
Cuando tengas una duda o problema con alguno de tus programas por favor indica el lenguaje de programación.

En cuanto a la causa del error es la que comentas:
Cita de: erest0r en 18 Diciembre 2013, 18:19 PMImagino que se deben crear variables temporales solamente dentro de la funcion y por eso no se muestran en el main

Como resolverlo depende del lenguaje, en el caso de C++ lo mas fácil es utilizando una referencia, un ejemplo de ello:
Código (cpp) [Seleccionar]
void generar(int**& arreglo, int fil, int col )
{
   arreglo = (int**) malloc(fil * sizeof(int *));
   for (int i = 0; i != fil; ++i)
      arreglo[i] = (int*) malloc(col * sizeof(int));
}

También se debe remplazar el uso de malloc por el operador new (y free por delete).

----

En el caso de C bien pasas un puntero a la variable (tipo "int ***") o, la mas sencilla, modificas la función para que retorne la dirección del bloque principal:
#include <stdio.h>
#include <stdlib.h>

int **generar(int fil, int col);

int main(void)
{
   int **mat;
   
   /* ... */
   
   mat = generar(10, 20);
   
   /* ... */
   
   return EXIT_SUCCESS;
}

int **generar(int fil, int col)
{
   int **mat;
   int i;
   
   mat = malloc(fil * sizeof *mat);
   for (i = 0; i < fil; i++)
      mat[i] = malloc(col * sizeof *mat[i]);
   
   return mat;
}


Un saludo