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 - K-YreX

#821
Cita de: gdzc1 en 10 Diciembre 2018, 00:09 AM
Ya hice lo que me dijiste de sacar la estructura pero me sigue apareciendo el error que dice ´a´ que en este caso es la señal dentro de <struct> no está definido como hago?
Sin ver cómo te ha quedado el código no sé por qué te saldrá ese error...
#822
Vale, creo que ya te entiendo. Un arreglo de 5 elementos y que cada elemento sea un conjunto de 5 señales.
Para eso la idea más simple es un arreglo de arreglos, comúnmente conocido como matriz.

Si lo quieres hacer sin matrices y usando <struct> entonces tienes que usar la tercera opción que te he dado antes. Crear una <struct> que almacene 5 enteros y luego hacer un arreglo de 5 structs. Ya te he dejado antes también como acceder a cada uno de los elementos. Suerte. :-X
#823
No termino de entender tu planteamiento. Si lo que quieres es un arreglo donde almacenar 5 enteros, te sirve la primera opción que te he dado. En cambio si vas a ampliar el programa. igual te viene mejor usar <struct>.

Citar
el arreglo sería de diez partes y que dentro de dicho arreglo tenga un registro de cinco señales
No entiendo esto que has comentado. :rolleyes:
#824
Primero, el código ponlo entre etiquetas GeSHi, seleccionando el lenguaje que usas.
Segundo, ese código tiene problemas lo cojas por donde lo cojas.

Ahora la pregunta es, quieres usar un arreglo o una <struct>?? Si quieres usar un arreglo para 5 datos de tipo <int> tienes que crear un arreglo de tamaño 5, como es lógico y acceder a cada posición del arreglo con los índices {0,1,2,3,4}.

const int MAX_SIGNALS = 5;
int signals[MAX_SIGNALS];
for(int i = 0; i < MAX_SIGNALS; i++){
    printf("Introduce numero para guardar en la posicion %d del arreglo", i);
    scanf("%d", &signals[i]);
}


Si lo que quieres es usar una <struct> primero declara la <struct> antes del <main> para después usarla dentro de este.

struct Signal{
    int a, b, c, d, e;
};

int main(){
    Signal mySignal;
    printf("Introduce primer numero: ");
    scanf("%d", mySignal.a);
    // asi con todos los numeros
}


Dejar claro que esto no es un arreglo, es una estructura, esto está más orientado a la programación orientada a objetos POO. Por lo que estás creando un objeto <mySignals> de tipo <Signal> y un objeto de tipo <Signal> está compuesto internamente de 5 enteros.

Si quieres mezclar ambas cosas, que es lo que parece que estabas intentando con ese código, lo que hay que hacer es crear un arreglo de Signals. Entonces creamos por ejemplo un arreglo de tamaño 2 y cada uno de sus elementos {0,1} serán un objeto de tipo <Signal>.

struct Signal{
    int a, b, c, d, e;
};

int main(){
    Signal mySignals[2];
    // para acceder por ejemplo al segundo entero del primer objeto sería mySignals[0].b
}


Ahora ya es decisión tuya usar lo que creas más conveniente para tu programa. Suerte. :-X
#825
Programación C/C++ / Re: Ayuda con programa
9 Diciembre 2018, 16:11 PM
No es que la puntuación de la máquina salga al final, simplemente al ser un bucle en el que el usuario no tiene que hacer nada el programa se ejecuta muy rápido y por eso se muestra la puntuación y de seguido el ganador. Si quieres ver la puntuación en cada iteración lo que puedes hacer es meter una pausa por ejemplo con <cin.get()>. Así se va a parar en cada vuelta hasta que pulses enter.
Código (cpp) [Seleccionar]

double modoBmaquina(ifstream & archivo, int numeroAleatorio, double puntosHumano){
int final = 0, aux;
double puntos = 0;

while (final < numeroAleatorio && puntosHumano < puntos && puntos < PUNTUACION_LIMITE){
archivo >> aux;
if (aux > 7)
puntos += 0.5;
else
puntos += aux;
cout << "La maquina ha robado : " << aux << endl;
cout << "La puntuacion de la maquina es : " << puntos << endl;
                cin.get();
        }
return puntos;
}


El tema de la <PUNTUACION_LIMITE> si lo único que has hecho ha sido declarar la variable y sustituir en cada <7.5> por <PUNTUACION_LIMITE> el programa no tiene que cambiar. Puede que sea que si usas números aleatorios para la cantidad de cartas que se roban y has aplicado alguno de los métodos que te comenté para robar cartas desordenadas haya coincidido que el humano haya tenido 7 puntos con las cartas que ha robado y la máquina se haya pasado en la última iteración a 8.
Prueba a quitar los trozos de código aleatorios para que las cartas que se cogen siempre sean las mismas y así poder controlar los resultados.

Un par de consejos más:
Código (cpp) [Seleccionar]

if (determinaGanador(puntosHumano, puntosMaquina) == HUMANO) {
cout << "Ha ganado el HUMANO" << endl;
cin.get();
}
else{
cout<<"El ganador es la maquina"<<endl;
cin.get();
}

Si tienes un <if> que ejecuta una instrucción y un <else> que ejecuta la misma instrucción, esa instrucción se ejecutará siempre. Entonces se pone después del <else> y así sólo se pone una vez.
Código (cpp) [Seleccionar]

if (determinaGanador(puntosHumano, puntosMaquina) == HUMANO)
cout << "Ha ganado el HUMANO" << endl;
else
cout<<"El ganador es la maquina"<<endl;
cin.get();


Y esto:
Código (cpp) [Seleccionar]

while (responder < 1 || responder > 2)

Sería más correcto usar el operador "distinto" <!=>.
Código (cpp) [Seleccionar]

while(responder != 1 && responder != 2)
#826
Programación C/C++ / Re: Compilar C/C++ en Windows
9 Diciembre 2018, 02:59 AM
Retomo este tema para ver si alguien puede ayudarme con algo relacionado a lo que ya pregunté aquí. Bueno la cosa es que cuando compilo programas pequeños puedo hacerlo en Windows sin problemas desde la línea de comandos como me habéis comentado en las respuestas de este post; sin embargo, cuando trabajo en programas más grandes, procuro modularizar todo el código con la siguiente estructura en Linux:
/programa
|_ /bin
|_ /obj
|_ /src
|_ /include
|_ /lib
|_ Makefile

Y entonces simplemente poniéndome al nivel del Makefile en la terminal y mediante la orden <make> se compilan todos los archivos necesarios en sus correspondientes directorios.

Quería saber si puedo hacer algo equivalente a esto en Windows. Mi idea es poder compilar los códigos en ambos sistemas operativos, pero creo que para empezar tendría problemas por el sistema de archivos ya que en el Makefile los directorios se representan para un sistema Linux y no para uno Windows. Si alguien puede ayudarme... :-X :-X
#827
GominaTilted, respecto a tu código:
- Las funciones que no reciben parámetros, no hace falta que pongas <void>. Eso creo que es más de C, en C++ se suele dejar vacío.
Código (cpp) [Seleccionar]

void Cabecera()

- Y la función <Cabecera()> no tiene mucho sentido, sólo para hacer un <cout>. Si fuese un conjunto de instrucciones más grande o fuese un titulo muy trabajado... Pero para hacer un <cout> lo puedes hacerlo directamente en el <main>.
- Además si no devuelven ningún valor puedes omitir el <return> del final. No es muy habitual ver un <return> en una función de tipo <void>.

Respecto a tu problema de omitir palabras que estén repetidas, la idea siempre es la misma, tener un contenedor de palabras (seguramente usarás arrays pero también puedes usar un contenedor de la STL), coger una palabra, recorrer el contenedor y si no existe ya, la metes en el contenedor.

He estado probando un código que hice hace poco para separar palabras y he intentado adaptarlo para este problema. Sin embargo, sólo me coge la primera palabra. He mirado el código original del que he sacado la estructura de la función y en el original funciona perfecto pero no consigo dar con el problema. El código que he intentado adaptar es este:
Código (cpp) [Seleccionar]

#include <iostream>
#include <string>

using namespace std;

const int MAX_PALABRAS = 20;

size_t SepararPorPalabras(string, string*);

int main(){
string frase;
string palabras[MAX_PALABRAS];
size_t numPalabras;

cout << "Ingresa una frase: ";
getline(cin, frase);

numPalabras = SepararPorPalabras(frase, palabras);

cout << "La frase tiene " << numPalabras << " palabras: " << endl;
for(size_t i = 0; i < numPalabras; i++)
cout << "Palabra " << i+1 << ": " << palabras[i] << endl;

}

size_t SepararPorPalabras(string frase, string *palabras){
size_t numPalabras = 0, letrasPorPalabra;
string palabra;

while((letrasPorPalabra = frase.find(' ')) != string::npos && numPalabras < MAX_PALABRAS){
palabra = frase.substr(0, letrasPorPalabra);
frase.erase(0, letrasPorPalabra+1);
palabras[numPalabras++] = palabra;
}
if(numPalabras < MAX_PALABRAS){
palabra = frase.substr(0, letrasPorPalabra);
palabras[numPalabras++] = palabra;
}
return numPalabras;
}


La salida del programa es la siguiente:

Ingresa una frase: frase de prueba
La frase tiene 1 palabras:
Palabra 1: frase


Si alguien puede echarme una mano para encontrar el error.  :-X :-X
#828
Cita de: MAFUS en  8 Diciembre 2018, 17:40 PM
Supongo que con este te irá bien.
Va comprobando desde la primera hasta la penúltima columna si las siguientes son iguales a ellas. En cuánto detecta que dos elementos no son iguales va no pierde más tiempo y va a buscar la siguiente columna. Si detecta que dos columnas son iguales se detiene e informa de ello.
Hay que usar stdbool, pero se puede cambiar el bool por int y true y false por 1 y 0 respectivamente.

bool columnas_iguales(int matriz[][COLUMNAS]) {
   bool retval = false;

   for(int i=0; !retval && i<COLUMNAS-1; ++i) {
       for(int j=i+1; !retval && j<COLUMNAS; ++j) {
           int m;
           for(m=0; m<FILAS; ++m) {
               if(matriz[m][i]!=matriz[m][j])
                   break;
           }
           if(m==FILAS)
               retval = true;
       }
   }

   return retval;
}


Por lo que yo tengo entendido no es muy recomendable usar instrucciones como <break> (excepto en un <switch>), <goto>, etc. Entonces se puede conseguir lo mismo usando la propia variable <retval>. Supones que son iguales y cuando dos valores no coincidan, dejan de ser iguales. Quedaría así:

bool columnas_iguales(int matriz[][COLUMNAS]) {
   bool retval = false;
   for(int i=0; !retval && i<COLUMNAS-1; ++i) {
       for(int j=i+1; !retval && j<COLUMNAS; ++j) {
           retval = true;
           for(int m=0; retval && m<FILAS; ++m)
               if(matriz[m][i]!=matriz[m][j])
                   retval = false;
   }
   return retval;
}

A esto me refería cuando al principio le comenté a Hackersanfe que intentará hacerlo sin el array auxiliar.

PD: No sabía que para usar el tipo de dato <bool> en C se podía hacer con <stdbool>. Yo creaba una enumeración para poder usarlo. Algo así:

typedef enum {false, true} bool;
#829
Programación C/C++ / Re: Ayuda con programa
8 Diciembre 2018, 18:20 PM
Es cierto, pero si no recuerdo mal, él había declarado lo siguiente:
Código (cpp) [Seleccionar]

const int HUMANO = 1;
const int MAQUINA = 2;

Por eso lo he hecho así, sin embargo, tu idea es mejor por el tema que dices de que el valor no se diferencie en 1.
#830
Programación C/C++ / Re: Error en compilación!
8 Diciembre 2018, 15:32 PM
Como te han comentado:
Cita de: CalgaryCorpus en  8 Diciembre 2018, 15:13 PM
Fíjate en el nombre que le pusiste a la función y como la invocaste. Hay una diferencia allí.

Estás cambiando el nombre de la función. En el prototipo de la función se llama <SumaCifrasNumero()> y en la implementación (abajo) se llama <SumarCifrasNumero()>. El fallo es esa "R" de "Sumar".

Cuando un compilador te muestra este error "undefined reference to `SumaCifrasNumero(int, int)". Se debe a que no encuentra la función que le estás diciendo. En esos casos tienes que ver que el nombre sea el mismo (cosa que en tu caso no es y por eso falla) o que le estés pasando diferentes parámetros en un sitio que en otro (no es tu caso). Suerte. :-X