elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  problemas con comparación de arrays + presentación
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problemas con comparación de arrays + presentación  (Leído 3,011 veces)
doctore17

Desconectado Desconectado

Mensajes: 3


Ver Perfil
problemas con comparación de arrays + presentación
« en: 4 Diciembre 2014, 11:54 am »

Hola muy buenas =) me presento en el foro, soy alumno de primero de informática y bueno estoy empezando con el tema de programación en c++, me esta apasionando la asignatura la verdad y espero que en el futuro pueda ser de gran ayuda en este foro ya que vosotros me habéis ayudado mucho en mis dudas de primerizo.

Después de esta breve introducción me gustaría consultaros una duda, el caso que el ejercicio es el siguiente (copio y pego):

Escribir un programa en C++ que implemente la siguiente funcionalidad:
Programa para hacer quinielas que permita realizar las siguientes acciones a un usuario (las opciones se muestran en un menú):

- Introducir los 14 datos simples de una quiniela (1, X o 2 para cada partido), más el dato del pleno al 15.
- Introducir los resultados de la quiniela ganadora de la semana en curso.
- Comprobar el número de aciertos de una apuesta partiendo de los datos introducidos en los apartados anteriores.

El caso es que consigo introducir el primer array sin problemas ( o eso creo ), pero a la hora de introducir el segundo me pierdo un poco y ya cuando llega el tema de la comparación no se por donde cogerlo, muchas gracias por vuestra ayuda ( a continuación les pego el código que llevo):

#include <iostream>
#define MAX_APUESTAS 15
using namespace std;


int main() {
    char apuestas [MAX_APUESTAS], resultados [16];
    int i;
    
    for (i=1; i < MAX_APUESTAS; i++){
        cout << "\n Introduce 1 X 2 según la apuesta, "<<i <<": ";
        cin >> apuestas ;
    }
    
    if (apuestas [MAX_APUESTAS] == resultados[16]){
        cout << "Resultado correcto partido " << i;
    }
    else {
        cout << "Resultado incorrecto" << i;
    }
    
    resultados [1] = 'x';
    resultados [2] = '2';
    resultados [3] = '1';
    resultados [4] = 'x';
    resultados [5] = '2';
    resultados [6] = 'x';
    resultados [7] = '1';
    resultados [8] = '1';
    resultados [9] = '2';
    resultados [10] = 'x';
    resultados [11] = '2';
    resultados [12] = '2';
    resultados [13] = '2';
    resultados [14] = '1';
    resultados [15] = '1';

}

EDITO: Vale dandole otra  vuelta al ejercicio creo que me acerco mas a la respuesta, este es mi nuevo código:

int main() {
    char apuestas [MAX_APUESTAS], resultados [16];
    int i, r;
   
    for (i=1; i < MAX_APUESTAS; i++){
        cout << "\n Introduce 1 X 2 según la apuesta, "<< i <<": ";
        cin >> apuestas ;
    }
   
    for (r = 1; r<16; r++){
        cout << "\n Introduce ahora los resultados de la semana, partido " << r << ": ";
        cin >> resultados [r];
    }
   
    if (r == i){
        cout << "Resultado correcto \n";
    }
    else {
        cout << "Resultado incorrecto \n";
    }
   
}

Vale ahora consigo comparar los dos array al completo, el problema que tengo es que quiero ir resultado a resultado comparándolo y no lo consigo, por otro lado también me gustara por el pleno al 15 como dato a parte y eso no se como hacerlo.


« Última modificación: 4 Diciembre 2014, 12:03 pm por doctore17 » En línea

Orubatosu


Desconectado Desconectado

Mensajes: 2.515


Ver Perfil WWW
Re: problemas con comparación de arrays + presentación
« Respuesta #1 en: 4 Diciembre 2014, 15:25 pm »

Te pongo un ejemplo:

Código:
int main() {
    char apuestas [15], resultados [15];
    int i;

    for (i=0; i < 15; i++){
        cout << "\n Introduce 1 X 2 según la apuesta, "<< i+1 <<": ";
        cin >> apuestas[i] ;
    }

    for (i = 0; i<15; i++){
        cout << "\n Introduce ahora los resultados de la semana, partido " << i+1 << ": ";
        cin >> resultados [i];
    }

   bool acierto=true;
   bool complementario=true;

    for (i=0; i<14; i++){
        if (apuestas[i] != resultados[i]) acierto = false;
    }
    if (apuestas[14] != resultados[14]) complementario = false;
    cout << acierto << ' ' << complementario;
}


Está incompleto al final, pero seguro que te las apañas.

Unas cosillas. Usar un "define" en la cabecera es matar moscas a cañonazos. Podemos hacerlo claro, pero es un poco... exagerado, aunque supongo que eso va por gustos.

Recuerda que ambos arreglos (o arrays, o como quieras llamarlos) deben de tener el mismo número de elementos. No tiene sentido que "apuestas" tenga 15 casillas, y resultados 16.

No necesitas diferentes variables para bucles, a menos que estén anidados. Puedes usar la misma variable de tipo entero "i" para todos, e incluso declararla en el mismo bucle

En plan:

Código:
for (int i=0; i<15; i++)

Recuerda que las tablas empiezan en el 0, no en el 1. El ejemplo anterior te haría un bucle entre la casilla 0 y la 14, lo que nos da un total de 15 casillas, de las cuales las primeras 14 son para los resultados normales, y la 15 (que ojo, es la casilla 14) sería para el pleno al 15.

Esto al principio suele liar, es solo cuestión de acostumbrarse. Acuerdate siempre de que todos los contenedores, ya sean arrays de enteros, caracteres o cualquier otra cosa (incluso strings, vectores, etc...) empiezan siempre en el '0'.

Es decir: (insisto), que un array "apuestas[15]" empieza en el 0 y llega al 14. Si intentas leer o escribir fuera de esos límites de arriesgas como poco a resultados imprevistos, o a que el programa explote.

Luego, la comparación la has hecho entre dos "indices", no entre los valores que contienen los arrays. Para eso verás que he definido dos variables de tipo bool, y hago un bucle de 0 a 13 (0<14) para comprobar cada uno, y si alguno es diferente cambio la condición a falso.

Y lo mismo hago, pero sin bucle con la última casilla de los dos arreglos, comparando así la casilla del "pleno al 15"

Esto:

Código:
 if (r == i)

Literalmente  está comparando dos variables de tipo entero, que son las que has usado para los dos bucles, pero no el contenido de los arrays.

El resultado son dos "1", pero si la condición de cualquiera de los dos no se cumple, te saldría un "0"

Claro, hay otras maneras, pero esta es una sencilla, a partir de ahí puedes montar un "if" que saque un resultado u otro dependiendo de esta variable.

Mas refinamientos sería poner (por ejemplo) un contador de aciertos, o sacar por pantalla por un lado la apuesta y al lado el resultado y cosas así, pero eso ya te lo dejo para que practiques.

Esto debería de funcionarte, a menos que haya metido gloriosamente la pata de forma inadvertida por algún lado.



En línea

"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: problemas con comparación de arrays + presentación
« Respuesta #2 en: 4 Diciembre 2014, 15:41 pm »

Citar
Usar un "define" en la cabecera es matar moscas a cañonazos. Podemos hacerlo claro, pero es un poco... exagerado, aunque supongo que eso va por gustos.

Y qué pasa si quisieras cambiar a 10 partidos en lugar de 15? Deberías cambiar todos esos '15' que tienes en el código a mano... Con pocas lineas no pasa nada, pero los 'define' son una buena práctica de programación para evitar tener números literales en el código que muchas veces ni sabes de donde vienen (qué se entiende más, un '15' o un 'MAX_APUESTAS'?) y, en el caso de que tengas que cambiarlo, conlleva un trabajo innecesario.

Saludos.
En línea

Orubatosu


Desconectado Desconectado

Mensajes: 2.515


Ver Perfil WWW
Re: problemas con comparación de arrays + presentación
« Respuesta #3 en: 4 Diciembre 2014, 16:15 pm »

Desde luego, en un caso general no tiene mayor problema, ahí estoy de acuerdo, pero las quinielas... bueno, son 14+1, no hablamos de una rutina de uso general.

Claro, es cuestión de gustos y opiniones, aquí podemos terminar hablando del sexo de los ángeles. Claro que es correcto, solo que para un programa tan simple es innecesario.

Pero vamos, esto es como los culos, todos tenemos uno y creemos que el de los demás no es tan bonito  :laugh:
En línea

"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998
doctore17

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: problemas con comparación de arrays + presentación
« Respuesta #4 en: 4 Diciembre 2014, 18:23 pm »

Te pongo un ejemplo:

Código:
int main() {
    char apuestas [15], resultados [15];
    int i;

    for (i=0; i < 15; i++){
        cout << "\n Introduce 1 X 2 según la apuesta, "<< i+1 <<": ";
        cin >> apuestas[i] ;
    }

    for (i = 0; i<15; i++){
        cout << "\n Introduce ahora los resultados de la semana, partido " << i+1 << ": ";
        cin >> resultados [i];
    }

   bool acierto=true;
   bool complementario=true;

    for (i=0; i<14; i++){
        if (apuestas[i] != resultados[i]) acierto = false;
    }
    if (apuestas[14] != resultados[14]) complementario = false;
    cout << acierto << ' ' << complementario;
}


Está incompleto al final, pero seguro que te las apañas.

Unas cosillas. Usar un "define" en la cabecera es matar moscas a cañonazos. Podemos hacerlo claro, pero es un poco... exagerado, aunque supongo que eso va por gustos.

Recuerda que ambos arreglos (o arrays, o como quieras llamarlos) deben de tener el mismo número de elementos. No tiene sentido que "apuestas" tenga 15 casillas, y resultados 16.

No necesitas diferentes variables para bucles, a menos que estén anidados. Puedes usar la misma variable de tipo entero "i" para todos, e incluso declararla en el mismo bucle

En plan:

Código:
for (int i=0; i<15; i++)

Recuerda que las tablas empiezan en el 0, no en el 1. El ejemplo anterior te haría un bucle entre la casilla 0 y la 14, lo que nos da un total de 15 casillas, de las cuales las primeras 14 son para los resultados normales, y la 15 (que ojo, es la casilla 14) sería para el pleno al 15.

Esto al principio suele liar, es solo cuestión de acostumbrarse. Acuerdate siempre de que todos los contenedores, ya sean arrays de enteros, caracteres o cualquier otra cosa (incluso strings, vectores, etc...) empiezan siempre en el '0'.

Es decir: (insisto), que un array "apuestas[15]" empieza en el 0 y llega al 14. Si intentas leer o escribir fuera de esos límites de arriesgas como poco a resultados imprevistos, o a que el programa explote.

Luego, la comparación la has hecho entre dos "indices", no entre los valores que contienen los arrays. Para eso verás que he definido dos variables de tipo bool, y hago un bucle de 0 a 13 (0<14) para comprobar cada uno, y si alguno es diferente cambio la condición a falso.

Y lo mismo hago, pero sin bucle con la última casilla de los dos arreglos, comparando así la casilla del "pleno al 15"

Esto:

Código:
 if (r == i)

Literalmente  está comparando dos variables de tipo entero, que son las que has usado para los dos bucles, pero no el contenido de los arrays.

El resultado son dos "1", pero si la condición de cualquiera de los dos no se cumple, te saldría un "0"

Claro, hay otras maneras, pero esta es una sencilla, a partir de ahí puedes montar un "if" que saque un resultado u otro dependiendo de esta variable.

Mas refinamientos sería poner (por ejemplo) un contador de aciertos, o sacar por pantalla por un lado la apuesta y al lado el resultado y cosas así, pero eso ya te lo dejo para que practiques.

Esto debería de funcionarte, a menos que haya metido gloriosamente la pata de forma inadvertida por algún lado.



Muchas gracias Orubatosu, creo que he podido solucionar las coas y ya tengo algo mucho mejor que con lo que empecé esta mañana. En el siguiente post pongo lo que tengo así no resulta muy tedioso.



Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main() {
  6.    char apuestas [15], resultados [15];
  7.    int i;
  8.  
  9.    for (i=0; i < 15; i++){
  10.        cout << "\n Introduce 1 X 2 según la apuesta, partido "<< i+1 <<": ";
  11.        cin >> apuestas[i] ;
  12.    }
  13.  
  14.    for (i = 0; i<15; i++){
  15.        cout << "\n Introduce ahora los resultados de la semana, partido " << i+1 << ": ";
  16.        cin >> resultados [i];
  17.    }
  18.  
  19.  
  20.    for (i=0; i<14; i++){
  21.        if (apuestas[i] != resultados[i]){
  22.        cout << "Partido " << i+1 << ": " << apuestas [i] << " " <<resultados [i] <<" resultado incorrecto\n";
  23.        }
  24.        else {
  25.            cout << "Partido " << i+1 << ": " << apuestas [i] << " " <<resultados [i] <<" resultado correcto\n";
  26.        }
  27.    }
  28.    if (apuestas[14] != resultados[14]){
  29.    cout <<"Partido del pleno al 15: "<< apuestas [i] <<" " << resultados [i] << " resultado incorrecto\n";
  30.    }
  31.    else {
  32.        cout <<"Partido del pleno al 15: "<< apuestas [i] <<" " << resultados [i] << " resultado correcto\n";
  33.    }
  34. }

El resultado final es este, pues bien al final quite los booleanos (ya que no se como manejarlos del todo) y preferí utilizar unas sentencias if quizás mas tediosas pero para mi es mas sencillo en este aspecto. En lo que es el resultado consigo destacar el pleno al 15 pero en la introducción de datos no consigo diferenciarlo.

Se asignar a un elemento del array un dato concreto, pero no se como ponerlo para que ese dato lo introduzca el usuario. Creo que seria bastante sencillo destacar el pleno al 15 de la siguiente manera

apuestas [15] = i;
cout << "Introduzca el plano al 15 ";
cin >> apuestas ;

Pero creo q no es la manera correcta ya que no me deja. Muchas gracias por vuestra ayuda y bueno sobre todo espero q el código que he puesto le sirva a alguien

EDITO: Pues muy bien ya lo conseguí con algo tan simple como una estructura, no se como funciona exactamente pero funcionó! Muchas gracias a todos y espero que el código le sirve a alguien en un futuro!.


Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct resultados{
  6.    char apuestas [14];
  7.    char resultados [14];
  8.    char i;
  9.    char pdato;
  10.    char presultado;
  11. };
  12.  
  13. int main() {
  14.    char apuestas [14], resultados [14];
  15.    char i, pdato, presultado;
  16.  
  17.    for (i=0; i < 14; i++){
  18.        cout << "\n Introduce 1 X 2 según la apuesta, partido "<< i+1 <<": ";
  19.        cin >> apuestas[i] ;
  20.    }
  21.  
  22.    cout << "\n Introduce el pleno al 15: ";
  23.    cin >> pdato;
  24.  
  25.    for (i = 0; i<14; i++){
  26.        cout << "\n Introduce ahora los resultados de la semana, partido " << i+1 << ": ";
  27.        cin >> resultados [i];
  28.    }
  29.  
  30.    cout << "\n Introduce el resultado del pleno al 15: ";
  31.    cin >> presultado;
  32.  
  33.  
  34.    for (i=0; i<14; i++){
  35.        if (apuestas[i] != resultados[i]){
  36.        cout << "\n Partido " << i+1 << ": " << apuestas [i] << " " <<resultados [i] <<" resultado incorrecto\n";
  37.        }
  38.        else {
  39.            cout << "\n Partido " << i+1 << ": " << apuestas [i] << " " <<resultados [i] <<" resultado correcto\n";
  40.        }
  41.    }
  42.    if (pdato != presultado){
  43.    cout <<"\n Partido del pleno al 15: "<< pdato <<" " << presultado << " resultado incorrecto \n\n";
  44.    }
  45.    else {
  46.        cout <<"\n Partido del pleno al 15: "<< pdato <<" " << presultado << " resultado correcto \n\n";
  47.    }
  48. }
« Última modificación: 4 Diciembre 2014, 19:09 pm por doctore17 » En línea

Orubatosu


Desconectado Desconectado

Mensajes: 2.515


Ver Perfil WWW
Re: problemas con comparación de arrays + presentación
« Respuesta #5 en: 4 Diciembre 2014, 20:01 pm »

A ver... esto es bastante sencillo.

Sea el array (o arreglo) char A[15];

Esto es un array de 15 casillas, cada una con un carácter, en casillas que van desde la 0 a la 14

Tal que... si queremos escribir algo en ellas:

Código:
A[0] = 'x';
A[1] = '1';

Donde van números puede ir una variable de tipo entero, tan simple como eso.

¿quieres sacar lo que hay dentro? Mismo sistema

Código:
char B = A[0];
// o a otro array:
char B[5] = A[1]
cout << B[5]
// etc...

No tiene mas misterio, solo dos cosas. Una es acordarte de que van de 0 a la longitud -1. Eso ya te lo comenté antes.

La otra es que como todas las variables, cuando se inicializan contienen valores aleatorios, pueden tener dentro cualquier cosa a menos que las inicialices con algún valor.

Es posible (por ejemplo)

Código:
int a[5] = {1, 2, 3, 4, 5};

Y otra cosa, un array contiene lo que tu quieras, si haces un array de 15 casillas, puedes usar las que están de la 0 a la 13 para 14 resultados, y la 14 (la última) para el final (pleno al 15)

Los booleanos no tienen misterio, son un tipo de variable que solo acepta dos valores: cero "u otro". Ese otro, si no es 0 se asume como "true"

Es un poco "tonto" porque si haces algo como:

Código:
bool a = 0;
bool b = 6;

En realidad "b" es "true", porque no es cero. Es un poco "tonto", pero es asi

Y se usan precisamente en los if. Cuando evaluas una condición dentro de un if, lo que haces es evaluar si la condición es falsa o verdadera. Tan simple como eso.

Es decir, que si tienes un bool tal que:

Código:
bool a = true;  // También pueden inicializarse así
bool b = false;
if (a) cout << "A es verdadera" << endl;
if(!b) cout << "B es falsa";

Vale... un momento. ¿Como es que en el "if" no hay una expresión?. Porque el resultado de una expresión es verdadero, o falso. Si ponemos directamente en el if algo que es verdadero, se da como "buena" la respuesta. En el segundo caso he puesto !b, y como ese operador niega lo que le sigue, como "b" es falso, si lo negamos es verdadero, y el if lo da "como bueno".

Ten en cuenta que este tipo de expresiones se usa mucho, pero mucho en C++, es normal poner como condición en un if, o en un while un comando que si se ejecuta, devuelve "true" (o false).

Por ejemplo:

Código:
int A;
while (cin >> A) { cout << A << ' ';}

Raro ¿no?... pero no tanto, ya que cin puede tener o no éxito. Si introduces un dato, el while se cumple.

Intenta ejemplos y programas sencillos para ir pillando "mano" con estas cosas, sobre todo con los diferentes tipos, arreglos y demás, que luego las cosas se ponen divertidas.

También es importante usar un IDE que te facilite el trabajo, y ojo, si estás usando Codeblocks ten en cuenta que el compilador por defecto que trae, a menos que lo hayan cambiado te dará mas adelante algún problema y conviene usar otro (minGW64 por ejemplo)
En línea

"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998
doctore17

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: problemas con comparación de arrays + presentación
« Respuesta #6 en: 5 Diciembre 2014, 00:38 am »

Muchas gracias Orubatosu, voy haciendome a ello poco a poco.

Ahora mismo estoy programando con mac concretamente el Xcode. Que es un IDE?

Tambien que compilador me recomeindas para windos ya que tengo uno pero no me funciona correctamente entonces estaria bien si me puedes recomendar un par por lo menos

Gracias por adelantado!
En línea

Orubatosu


Desconectado Desconectado

Mensajes: 2.515


Ver Perfil WWW
Re: problemas con comparación de arrays + presentación
« Respuesta #7 en: 5 Diciembre 2014, 11:12 am »

Xcode es un IDE, de manera que ya estás usando uno

"Integrated - Development - Enviroment"

Entorno de desarrollo integrado, ya estás usando uno, no hay mas.

En Mac no se como anda el tema de compiladores, en Windows te recomiento el minGW-w64

http://mingw-w64.sourceforge.net/

Funciona en 32 y 64 bits. Como IDE para windows, el mismo codebloks te vale, a menos que quieras hacer proyectos mas grandes sobre entorno windows, donde ya sería recomentable empezar a pensar en un Visual Studio de Microsoft (que ahora creo que es gratis en alguna de sus versiones)
En línea

"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
otro tipo de problemas con fechas (Comparacion)
Programación Visual Basic
Zeroql 6 2,210 Último mensaje 1 Diciembre 2007, 16:54 pm
por Zeroql
problemas con Arrays PHP
PHP
Dreamcacher 7 4,362 Último mensaje 9 Diciembre 2010, 10:16 am
por Dreamcacher
Problemas con arrays C++
Programación C/C++
#Aitor 4 2,564 Último mensaje 26 Marzo 2014, 15:35 pm
por Yoel Alejandro
Problemas con toString en Arrays Bidimensionales
Java
n-utz 3 2,608 Último mensaje 6 Abril 2017, 00:16 am
por n-utz
Comparacion de arrays y eliminacion de elementos iguales
Programación C/C++
PeinSoR 5 6,755 Último mensaje 13 Junio 2022, 15:31 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines