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

#1271
Cita de: gonpiar en  4 Marzo 2012, 20:02 PM
Buenas  :D , me gustaria preguntar a cualquiera que pueda resolverme esta dudilla:

Tengo la función: void funcion (char** cadena1, int pos, char *caracter)

Se indica que se debe extraer el caracter que hay en la posicion pos de la cadena char** cadena1 e insertarlo en la cadena char* caracter.
Bien el enunciado esta mal o tal vez ocurrió un error al copiarlo.

Tal como esta "cadena1" no es una cadena en el sentido de ser la dirección en memoria donde se almacena una cadena.

En su lugar es la dirección en memoria de un objeto de tipo "char *". Para explicarlo mejor siguiendo el enunciado ese fragmento seria valido extendiéndolo mas o menos así:
char *cad;
char *tmp;

cad = malloc(123); /* Solo por decir algo */
tmp = malloc(123); /* Solo por decir algo */

strcpy(cad, "hola");

/* ... */

funcion(&cad, 3, tmp);

Con ello la intención sera copiar (de alguna forma) el carácter 'a' en la cadena indicada por el puntero "tmp".

Pero de nuevo no tiene sentido pasar un "char **" para esa operación a menos (como ya comente) que falte algo.

Un saludo
#1272
El problema se debe a que defines la semilla para los números aleatorios dentro del bucle. Lo que debes hacer es colocar la llamada a "srand" justo al principio de la función "main".

Y para obtener un valor en el rango 1 .. 20 debes utilizar:
printf("random: %i\n", 1 + rand() % 20);

Un saludo
#1273
Hay dos errores en tu fragmento de código.

* Si se utiliza una variable como bandera para controlar (y eventualmente terminar) un bucle "while" esta debe iniciar con un valor distinto de cero (si no es así nunca entraría en el bucle).

* No es necesario utilizar un puntero a carácter y este inicia con un valor "no definido".

Y para la comparación basta con utilizar el operador de comparación (el "==").

Un saludo
#1274
Programación C/C++ / Re: Problemas vectores
2 Marzo 2012, 23:03 PM
Si solo dices "Eso ya lo probé, eso no es" no hay forma de comprobar lo dicho.

Supongo habrás cometido algún error ya que si la función se corrige solucionando la falta de consistencia que te mencione:
int maximapos (int V[], int n)
{
   int i, mejor_valor;
   
   mejor_valor = 0;
   for (i = 1; i < n; i++)
      if (V[i] > V[mejor_valor])
         mejor_valor = i;
   
   return mejor_valor;
}

El programa produce la salida esperada.

Un saludo
#1275
Programación C/C++ / Re: Problemas vectores
2 Marzo 2012, 22:26 PM
El problema se debe a la funcion que encuentra el maximo, falta consistencia:
int maximapos(int V[], int n)
{
   int i,mejor_valor;
   
   mejor_valor = V[0]; /* <== valor */
   
   for (i = 0; i < n; i++)
      if (V[i] > mejor_valor) /* <== valor */
         mejor_valor = i; /* <== indice */

   
   return(mejor_valor);
}

Eso lo solucionas en un par de minutos.

Por cierto la sentencia de retorno "return(mejor_valor);" es solo eso: una sentencia. Los parentesis en ella estan de mas.

Un saludo
#1276
Si buscas cursos sobre listas vinculadas un par muy bueno pero en ingles se puede descargar de la pagina de la universidad de Stanford.

Un saludo
#1277
Tiene la misma función que el array de caracteres utilizado en el programa original (tu programa): obtener una linea de texto y de ahí extraer el retiro.

Un saludo
#1278
Espero lo tomes como una critica constructiva: si estas aprendiendo C++ te deberian enseñar eso y no la base de C. El programa tiene varios errores algunos de ellos basicos y que no deberian existir en un programa cuya unica finalidad (de nuevo en el caso de C++) es la practica del uso de punteros.

Para empezar los nombres de todos los encabezados estan mal, deberian ser:
Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>

// Por el momento basta, despues habra que incluir solo lo necesario ...
using namespace::std;

// ...


Hay que evitar el uso de extensiones como la biblioteca conio de Borland. Por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Tambien debes separar la operacion para agregar un retiro en partes: reserva de memoria (creacion del nodo), peticion de los datos (lectura de un registro) y agregar el registro a la lista

El error principal en el programa se debe a la funcion "mostrar":
Código (cpp) [Seleccionar]
void mostrar()
{
   ultimo = primero;
   
   while (ultimo != NULL){
      cout << endl << "nombre:" << primero->nombre;
      cout << endl << "retiro:" << primero->retirar;
     
      ultimo = ultimo->siguiente;
   }
}

Si la lista contiene al menos un nodo al terminar esa funcion "ultimo" no apunta a ese nodo, su valor es NULL y cuando se trate de agregar un nodo a la lista el programa va a reventar (comportamiento no definido).

El programa con la mayoria de las correcciones:
Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdio>

using namespace::std;

struct contacto {
   char nombre[33];
   int retirar;
   struct contacto *siguiente;
};
contacto *primero, *ultimo;

contacto *crear();
void agregar (contacto *nuevo);
void agregar_retiro();
void mostrar();
void liberar();

int main()
{
   char temp[1024]; // O algun valor apropiado ...
   int opcion;
   
   do {
      cout  << "Bienvenido" << endl
            << "1. Agregar retiro" << endl
            << "2. Mostrar datos" << endl
            << "3. Salir" << endl;
      cin.getline (temp, 1024);
      sscanf (temp, "%d", &opcion);
     
      switch (opcion) {
      case 1:
         agregar_retiro();
         break;
      case 2:
         mostrar();
         break;
      case 3:
         break;
      default:
         cout << "Opcion no valida!" << endl;
         break;
      }
   } while (opcion != 3);
   
   liberar();
   
   return 0;
}

contacto *crear()
{
   contacto *nuevo;
   
   nuevo = (contacto *) malloc (sizeof * nuevo);
   if (!nuevo) {
      cerr << "No hay espacio suficiente" << endl;
      exit (1);
   }
   
   nuevo->siguiente = 0;
   return nuevo;
}

void agregar (contacto *nuevo)
{
   if (!primero)
      primero = nuevo;
   else
      ultimo->siguiente = nuevo;
   ultimo = nuevo;
}

void agregar_retiro()
{
   char temp[1024]; // O algun valor apropiado ...
   
   contacto *nuevo = crear();
   
   cout << "Ingrese su nombre: ";
   cin.getline (nuevo->nombre, 33);
   
   cout << "Ingrese el retiro: ";
   cin.getline (temp, 1024);
   sscanf (temp, "%d", &nuevo->retirar);
   
   agregar (nuevo);
}

void mostrar()
{
   contacto *p;
   
   for (p = primero; p; p = p->siguiente) {
      cout << "Nombre: " << p->nombre << endl;
      cout << "Retiro: " << p->retirar << endl;
   }
}

void liberar()
{
   contacto *siguiente;
   
   while (primero) {
      siguiente = primero->siguiente;
      free (primero);
      primero = siguiente;
   }
}


Falta agregar los detalles que mencionas, eso te toca a ti.

Por cierto: el uso de getline y sscanf es solo un "parche mal puesto", lo politicamente correcto es utilizar las clases que la biblioteca estandar de C++ provee para esas operaciones como "string" y "stringstream".

Un saludo
#1279
Siendo pesados ya estas utilizando punteros, ello debido a que el operador "[]" requiere que uno de sus operandos sea un puntero y el otro un entero.

Supongo lo que deseas es utilizar una variable de tipo "char *" para realizar el proceso. Eso es fácil pero antes hay que indicar dos errores en el programa:
printf ("Introduce una frase: ");
scanf ("%s",frase);

El primero es lógico: al utilizar "%s" la función "scanf" no lee una frase como "anita lava la tina", solo lee una palabra. El otro es un error en potencia a la misma altura que el uso de "gets": no se limita la lectura de caracteres y ello puede causar una escritura mas allá de la capacidad del array.

Regresando al programa y modificando este para utilizar una variable del tipo mencionado (por supuesto solo es una de varias posibles soluciones):
#include <stdlib.h>
#include <stdio.h>

#define NUM_CHARS  100

int main(void)
{
   char frase[NUM_CHARS];
   int i;
   char *p;
   
   printf("Introduce una frase: ");
   fflush(stdout);
   fgets(frase, NUM_CHARS, stdin);
   
   for (i = 0; frase[i] != '\0'; i++)
      ;
   if (i > 0 && frase[i - 1] == '\n')
      frase[--i] = '\0';
   p = frase + i;
   
   while (p-- > frase)
      putchar(*p);
   putchar('\n');
   
   return EXIT_SUCCESS;
}


Un saludo
#1280
Cuando tengas un problema con alguno de tus programas no solo debes publicar el código fuente de este sino también explicar en que consiste.

* Cuando se utiliza un bucle se debe indicar la sentencia o, (si son varias) el bloque delimitado por llaves que sera ejecutado.

* Debes almacenar el resultado de llamar a la función "rand".

* También faltan las directivas de inclusión.

* Tampoco declaras las variables utilizadas.


Si al programa se le realizan todas esas correcciones su bucle principal sera mas o menos así:
Código (cpp) [Seleccionar]
for (int i = 0; i < lanzamientos; i++){
   int rv = rand() % 2;
   cout << rv << endl;
   
   if (rv == 1)
      cara++;
   else
      cruz++;
}


Un saludo