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

#1341
Programación C/C++ / Re: Comparando cadenas
22 Enero 2012, 15:05 PM
Cita de: DickGumshoe en 22 Enero 2012, 11:45 AMEDITO:

Para reducir el código, trato de hacer esto:

do{
    for (i=0;i<=10;i++){
    printf("Introduce un nombre");
    gets(n1[i][20]);
    }
}
    while(n1!=n1[9][20]);


Pero da errores. Así, solo tendría que meter una variable, tal y como dice rir3760.
Si declaras el array de esta forma:
char n1[10][20];

Primero: no cuesta nada darle un nombre descriptivo al array, por ejemplo "nombre", así cuando utilizas "nombre[7]" ...

La función gets espera la dirección del primer elemento del array, para obtenerla basta con utilizar "nombre[X]" donde "X" es el indice dentro del rango valido.

Se puede decir mas pero serian suposiciones, mejor publica el código fuente completo para revisarlo.

Un saludo
#1342
Programación C/C++ / Re: Problema con strcat
22 Enero 2012, 14:58 PM
Cita de: DickGumshoe en 22 Enero 2012, 11:15 AMEDITO: Con sprintf, lo que acabo de decir, me lo ha hecho bien. Sin embargo, con strcat no...
Si deseas ayuda primero debes publicar el código fuente (si no lo haces no hay forma de solucionar el problema).

Un saludo
#1343
Un error en el programa y, supongo, causa del comportamiento que mencionas es el uso de la función "feof". Salvo contados escenarios se debe evitar el uso de ella en favor del valor de retorno de la función utilizada.

En tu caso fscanf retornara 1 mientras pueda leer una palabra y EOF en caso de error o fin de archivo. Cambia el bucle a:
while (fscanf(fichero, "%s", lineas) == 1){
   ptrToken = strtok(lineas, "," );
   
   i = 0;
   while (ptrToken != NULL){
      strcpy(dato[i],ptrToken);
      i++;
      ptrToken = strtok(NULL, "," );
   }
}


Un saludo
#1344
Pensandolo un poco no es claro si quieres crear una matriz en base a otra consistiendo de:

A) Todas las columnas menos las ultimas cuatro.
B) Solo las ultimas cuatro columnas.

Otro problema es que usualmente se almacena la informacion en filas y columnas (no al reves: columnas y filas).

En el caso usual con filas primero y columnas despues, utilizando la clase vector de C++ puedes:

1) Crear el nuevo vector
2) Utilizas por cada uno de los elementos del vector la funcion miembro "assign" para el reajuste del tamaño y copia de valores.

Un programa de ejemplo relativamente largo, la mayoria solo es "fluf" (creacion y asignacion de valores a la matriz), la parte importante donde se muestra el proceso de copia esta comentado.

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

#include <vector>
using std::vector;

int main()
{
vector<vector<int> > mat(10);
typedef vector<vector<int> >::size_type vvi_size;
typedef vector<int>::size_type vi_size;

for (vvi_size i = 0; i != mat.size(); ++i){
mat[i].resize(10);

for (vi_size j = 0; j != mat[i].size(); ++j)
mat[i][j] = j;
}

for (vvi_size i = 0; i != mat.size(); ++i){
for (vi_size j = 0; j != mat[i].size(); ++j)
cout << ' ' << mat[i][j];
cout << endl;
}
cout << "----" << endl;

// Creamos el nuevo vector
vector<vector<int> > nuevo(10);
// Iteramos por cada elemento (fila)
for (vvi_size i = 0; i != nuevo.size(); ++i)
// Asignamos los elementos requeridos del vector original (mat)
nuevo[i].assign(mat[i].begin(), mat[i].end() - 4);

// Impresion de prueba
for (vvi_size i = 0; i != nuevo.size(); ++i){
for (vi_size j = 0; j != nuevo[i].size(); ++j)
cout << ' ' << nuevo[i][j];
cout << endl;
}

return 0;
}


Un saludo
#1345
Las reglas del juego de la vida las puedes encontrar en cinco minutos cortesía de un buscador decente como Google.

En cuanto al algoritmo, este es:
Imprimir la generación actual (generación inicial)
Incrementar el numero de generaciones

Mientras no se alcance el numero de generaciones requerido
   Calcular la siguiente generación
   Imprimir la generación

Eso te debe sugerir que solo se trata de un bucle llamando a funciones de soporte: una para crear una generación en base a la actual y otra para imprimirla.

Para almacenar la generación actual debes utilizar una matriz, eso se implementa en C mediante un array de arrays de caracteres (por ejemplo "char gen[10][10]") con el valor 1 si hay una célula viva y 0 en caso contrario.

Para la generación siguiente debes recorrer cada una de las celdas de la matriz actual verificando su estado (numero de vecinos): si eso resulta en una célula viva o muerta lo "anotas" en otra matriz (esa es la nueva generación).

Suena engorroso (tedioso) pero no es difícil.

Un saludo
#1346
El error se encuentra en ambas funciones ("main" y "opcion_1", a esta ultima mejor dale un nombre descriptivo como "jugar" o "apostar"). En ambas declaras la variable local "bolsa", eso ya sugiere un error (lógico), el problema es que tratas de utilizar su valor

En la función principal:
bolsa = bolsa - apuesta;

En la función "opcion_1":
bolsa = bolsa + 2 * apuesta;

Sin darle un valor inicial, si eso sucede la variable inicia almacenando un valor no definido o "basura", de ahí el resultado que obtienes.

Un saludo
#1347
Programación C/C++ / Re: Comparando cadenas
22 Enero 2012, 03:05 AM
El programa tiene errores básicos, se mantiene el mismo consejo que en tu otro tema: consigue material de referencia de calidad.

Como ya se comento deberías utilizar un bucle para verificar si existe una coincidencia y también evitar el uso de la función "gets", utilizar un array de arrays de caracteres para evitar tantas variables, etc.

Por ultimo no hay consistencia en las comparaciones, primero utilizas strcmp, después strstr y por ultimo:
char n10[20], n11[20];

/* ... */

do {

/* ... */

}while (n11! = n12);

Si bien es valido (en el sentido de respetar la sintaxis del lenguaje) no hace lo esperado ya que esta comparando las direcciones en memoria de los objetos (los arrays "n11" y "n12") y siendo objetos distintos tienen distintas direcciones. Para compararlas hay que utilizar strcmp.

Para darte una idea, para obtener diez nombres eliminando el '\n' que almacena fgets puedes utilizar:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NUM_NOMBRES   10
#define CHARS_NOMBRE  20

int main(void)
{
   char nombre[NUM_NOMBRES][CHARS_NOMBRE];
   int i;
   char *p;
   int ch;
   
   for (i = 0; i < NUM_NOMBRES; i++){
      printf("Nombre %2d:", i + 1);
      fflush(stdout);
      fgets(nombre[i], CHARS_NOMBRE, stdin);
     
      /* Buscamos el '\n' y lo eliminamos */
      if ((p = strchr(nombre[i], '\n')) != NULL)
         *p = '\0';
      else
         /* Linea demasiado larga, eliminamos el resto */
         while ((ch = getchar()) != EOF && ch != '\n')
            ;
   }
   
   for (i = 0; i < NUM_NOMBRES; i++)
      printf("Nombre %d: %s\n", i + 1, nombre[i]);
   
   return EXIT_SUCCESS;
}


Un saludo
#1348
Programación C/C++ / Re: Problema con strcat
22 Enero 2012, 02:47 AM
El programa tiene errores básicos, si no tienes un curso o libro de calidad te aconsejo que consigas uno. Puedes revisar las recomendaciones utilizando el motor de búsqueda de los foros.

En C las cadenas son secuencias de caracteres seguidas de un '\0' para indicar el final de esta. Si declaras un array de dos elementos tipo char:
char dia[2],mes[2];
Tanto "dia" como "mes" solo pueden almacenar cadenas de un solo carácter ya que el restante se debe reservar para el '\0'. Eso se pasa por el arco del triunfo debido a que utilizas la función "gets". Por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico|

Para solucionarlo debes cambiar el numero de elementos de esos dos arrays a tres y utilizar la función "fgets" (o una propia) para leer cada linea de la entrada estándar.

Un saludo
#1349
Programación C/C++ / Re: Problema con strcat
22 Enero 2012, 00:23 AM
Habra que revisar el fragmento donde pides los datos, ya que strcat requiere dos cadenas. Supongo el tipo de "nombre", "dia" y "mes" es "array de caracteres", ¿Correcto?

Una forma mas corta es mediante sprintf o, si solo se imprime en la salida estándar, printf.

Un saludo
#1350
Programación C/C++ / Re: Acerca de switch
21 Enero 2012, 16:45 PM
Cita de: eleon en 21 Enero 2012, 14:56 PMTengo una duda en C++, según he leído el análisis de casos (switch) solo puede llevar un entero o caracter, ¿entonces cómo se haría para un número real o un booleano?.
No es posible ya que, como bien indicas, solo puedes utilizar valores enteros. En el caso de un valor booleano utilizado como expresión este resulta en 1 si es verdadero y 0 si es falso.

Cita de: eleon en 21 Enero 2012, 14:56 PMY también me gustaría saber cómo se ponen los rangos o periodos en C++, por ejemplo, en pascal para poner que se ejecute una instrucción en el caso de que la variable o contante tenga el valor del 1 al 5 se hace lo siguiente:

case variable of begin
1..5: //Instrucción a ejecutar
5..10: //Instrucción a ejecutar
end;


Como veis los dos puntos (..) le dicen al compilador que en caso de que "variable" tenga el valor del 1 al 5 se ejecute la instrucción, ¿cómo se marcan los periodos en C++?.
De nuevo no es posible. Si se trata de un numero pequeño de valores puedes colocar los casos uno después del otro de esta forma:
Código (cpp) [Seleccionar]
switch (opcion){
case 1:
case 2:
case 3:
case 4:
case 5:
   // Procesamos aqui el rango 1 .. 5
   break;
}

Pero si el rango es mayor no hay alternativa: debes utilizar una sentencia de selección "if" en su lugar.

Un saludo