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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


  Mostrar Mensajes
Páginas: 1 ... 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [46] 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 ... 102
451  Programación / Programación C/C++ / Re: cadenas y uso de MAYUSCULA en: 25 Noviembre 2019, 02:03 am
No sé si tienes alguna restricción en cuanto a que tengas que implementarlo todo sin utilizar funciones que ya existen...
Si no es tu caso y puedes usar funciones tienes:
  • strrchr() de la librería <string.h> que te devuelve un puntero a la última coincidencia de un caracter dado.
  • toupper() de la librería <ctype.h> que convierte un caracter en mayúscula.

Si no puedes usar dichas funciones y tienes que implementarlo tú, te recomendaría hacer una función que dado un <char[]>, te devuelva la posición (índice) en el que empieza la última palabra; y luego con un bucle vas convirtiendo cada letra en mayúscula.
En ASCII una letra minúscula vale 28 más que en mayúscula si no me equivoco por lo que si haces:
Código
  1. char minuscula = 'a';
  2. char mayuscula = minuscula - 28; // esto deberia guardar 'A'
  3.  
  4. // Sino siempre puedes hacer:
  5. char minuscula = 's';
  6. char mayuscula = minuscula - ('a' - 'A'); // esto deberia dar 'S'

Es posible que si acabas de empezar, esto que te acabo de soltar te suene a chino y no entiendas nada. Si tienes alguna duda o no consigues avanzar en tu tarea, puedes poner el código en un mensaje entre etiquetas de Código GeSHi para que podamos ayudarte mejor.
 
452  Programación / Programación C/C++ / Re: programa que lee solo la primera parte en c++ en: 24 Noviembre 2019, 23:58 pm
Como te habia dicho, lo intente hacer así pero me daba errores, asi como lo pones sigue dando errores, empieza en el cout de la linea 8, probe borrandolo y sigue dando errores en la linea siguiente y así, ahí no se como arreglarlo realmente, me estuve fijando y no se que es lo que esta mal.
Como te ha dicho @?0!,5^34, el error parece que es que hay un punto por ahí suelto en la línea del switch() (línea 17).
Si te da algún error más en las líneas del <cout> asegúrate de haber incluido la cabecera <iostream> y la línea "using namespace std;" porque son las encargadas de hacer que <cout>, <cin> y <endl> funcionen.

Esta sentencia no sé si es válida.
salir = (opcion == 1);
Entiendo que (opcion == 1) es lo mismo que true, pero nunca ví utilizar expresiones así.

Si te da error ahí haz un if (opcion == 1) { salir = true; } else {salir = false;}
El else sobra pero por si lo modificas te lo dejo.
Y sobre esta sentencia, sí es válida. Como tú dices la comparación (opcion == 1) es una operación booleana por lo que el resultado sólo puede ser {true, false}. Dicho resultado se puede almacenar directamente en una variable como aparece ahí para ahorrarse los <if()>.
Es algo similar al operador ternario:
Código
  1. salir = (opcion == 1)?true:false;
pero que permite hacer la expresión todavía más sencilla.

Al final es lo mismo que cuando quieres hacer una función que devuelva un bool:
Código
  1. // La primera opcion seria:
  2. bool esPar(int numero){
  3.    bool par;
  4.    if(numero % 2 == 0)
  5.        par = true; // o bien hacer un return true
  6.    else
  7.        par = false; // y aqui un return false
  8.    return par;
  9. }
  10.  
  11. // La otra opcion un poco mas simple seria:
  12. bool esPar(int numero){
  13.    bool par = false;
  14.    if(numero % 2 == 0)
  15.        par = true;
  16.    return par;
  17. }
  18.  
  19. // Y la opcion aprovechando dicha propiedad quedaria:
  20. bool esPar(int numero){
  21.    return (numero % 2 == 0);
  22. }
Al menos para mí parece más sencilla la última y más rápida de leer.
453  Programación / Programación C/C++ / Re: programa que lee solo la primera parte en c++ en: 24 Noviembre 2019, 22:03 pm
Bueno a ver, hasta la línea 42 está bien. Pero el bucle... :xD :xD
Si te he puesto lo de:
Código
  1. bool salir = false;
  2. int respuesta;
  3.  
  4. while(!salir){
  5.    cout << "Hola" << endl;
  6.  
  7.    cout << "Desea salir (1 = Si / 0 = No): ";
  8.    cin >> respuesta;
  9.  
  10.    salir = (respuesta == 1);
  11. }
Era para que vieses un ejemplo sencillo de un programa que muestra "hola" cada vez que lo repites. Pero lo que tú quieres hacer no es que te muestre "hola" sino que te haga una operación con dos números.
A eso se refería tu profesor al decir que el programa debe ir dentro del <while()>.

En tu caso tendrías que coger TU PROGRAMA que es el que va de la línea 1 a la 43 y ponerlo donde está el "cout << "Hola" << endl;" de mi ejemplo.
El resultado sería el siguiente:
Código
  1. int main(){
  2.    // Declaramos las variables antes del bucle porque si lo hacemos dentro las estaremos declarando cada vez que se repita el programa
  3.    int numero1, numero2, resultado;
  4.    int opcion;
  5.    bool salir = false;
  6.  
  7.    while(!salir){
  8.        cout<<"Que operacion desea realizar?"<<endl;
  9.        cin>>opcion;
  10.  
  11.        cout<<"Introduzca un valor"<<endl;
  12.        cin>>numero1;
  13.  
  14.        cout<<"Introduzca otro valor"<<endl;
  15.        cin>>numero2;
  16.  
  17.        switch(opcion){ .
  18.            case 1:
  19.                resultado = numero1 + numero2;
  20.                break;
  21.            case 2:
  22.                resultado = numero1 - numero2;
  23.                break;
  24.            case 3:
  25.                resultado = numero1 * numero2;
  26.                break;
  27.            case 4:
  28.                resultado = numero1 / numero2;
  29.                break;
  30.            default:
  31.                cout << "La opcion no es valida" << endl;
  32.        }
  33.        cout << "El resultado es: " << resultado << endl;
  34.        // AQUI TERMINA LO QUE SERIA TU PROGRAMA SIN REPETICIONES
  35.        // Ahora ponemos la pregunta para repetir el programa
  36.        cout << "Terminar programa (1 = Si / 0 = No): ";
  37.        cin >> opcion; // podemos reutilizar la variable opcion para no tener que crear otra al principio. Si se crea otra tambien funciona bien
  38.        salir = (opcion == 1);
  39.    }
  40. }
454  Programación / Programación C/C++ / Re: Archivos usando fseek en: 24 Noviembre 2019, 19:25 pm
Coloca el código entre etiquetas de Código GeSHi...

Por lo que veo, la función <fseek()> para poder recibir un valor de offset (segundo parámetro), el fichero debe estar abierto en formato binario.
Modifica la apertura del archivo por:
Código
  1. // ruta_archivo que siga siendo la ruta de tu archivo
  2. // r abre el archivo en modo lectura
  3. // b abre el archivo en modo binario
  4. archivo = fopen("ruta_archivo", "rb");

No sé si en C++ se podrá hacer de otra manera ya que parece que estás usando un método nativo de C.

PD: La condición del <while()> es una asignación, no una comparación, por lo que no te funcionará.
PD 2: Tienes un <switch()> con un único <case>... Para un único valor, acabas antes haciendo un condicional <if()>.
455  Programación / Programación C/C++ / Re: programa que lee solo la primera parte en c++ en: 24 Noviembre 2019, 18:27 pm
Obviamente yo también tuve unos inicios y no me ofende que no sepas programar o que tengas errores básicos porque para eso es el foro, para ayudar. Lo que me molesta es que haya muchas personas que comentan ocasionalmente y no se molesten en poner los códigos entre etiquetas y más cuando siempre aconsejo usar dichas etiquetas (puedes comprobar en el otro post que hiciste AQUÍ que también te avisé de poner los códigos entre etiquetas y creo que lo hice con toda la educación que tengo).
Dicho esto, que no quiero que sea el comienzo de una pelea, sólo mostrar porque a veces no tengo tanta paciencia para repetir lo de las etiquetas, vamos al problema.
Ahora tu código ya tiene mejor pinta, lo que te falta es pedir al usuario una opción:
Cuando en la línea 9 preguntas qué operación realizar, lo que responda el usuario debe ir a la variable <opcion> y dicha variable no tiene que ser un array/vector. El array sería para almacenar a la vez todas las opciones (que eso es lo que tienes tú hecho en la línea 7). En tu caso debe ser una variable normal porque sólo contendrá 1 de esos 5 valores.
Y después de haber guardado la opción, es cuando hay que pedir los dos operandos. Los condicionales están bien, te faltaría hacer más para el resto de opciones, pero vas bien.

No sé si habrás visto el <switch>. Es otra estructura como el <if()> muy común para realizar menús y temas de opciones:
Código
  1. switch(opcion){ // Segun lo que vale opcion...
  2.    case 1: // ...si vale 1...
  3.        resultado = numero1 + numero2; // ...hace esto
  4.        break; //...y Sale. Si no se pone el break haria tambien las instrucciones del case 2, del 3... hasta el default o hasta encontrar un break
  5.    case 2:
  6.        resultado = numero1 - numero2;
  7.        break;
  8.    // todos los case que quieras con su numero de opcion correspondiente
  9.    default: // ...si opcion no vale ninguna de las cosas anteriores...
  10.        cout << "La opcion no es valida" << endl; // ...muestra esto
  11.    // Como despues del default ya no hay mas opciones, el break es opcional.
  12. }


Como veo que eso ya lo llevas bastante bien, aprovecho para explicarte lo del bucle.
Lo normal es hacerlo con una estructura <do{} while()> pero si te mandan hacerlo con un <while()> también se puede adaptar.
Para ello hay que tener una condición que será la que determine si el programa se repite o no. En tu caso es 1=sale 0=repite. Esto se puede hacer con otra variable <int> por ejemplo llamada <salir> o con una variable de tipo <bool salir> que valdrá true/false (1/0).

Te hago un pequeño programa muy sencillo para que veas su uso y después aplicarlo tú a tu problema:
Código
  1. // ALTERNATIVA 1: Usando un int
  2. int main(){
  3.    int salir = 0; // le damos el valor 0 para que la primera vez que se ejecuta, funcione.
  4.  
  5.    // La condicion para finalizar el programa es que salir valga 1. Entonces el programa se repetira mientras salir sea distinto de 1:
  6.    while(salir != 1){
  7.        cout << "Hola" << endl;
  8.  
  9.        cout << "Desea salir: (1 = Si / 0 = No): ";
  10.        cin >> salir;
  11.    }
  12. }
  13.  
  14. // ALTERNATIVA 2: Usando un bool de forma un poco rara
  15. int main(){
  16.    bool salir = false;
  17.  
  18.    while(!salir){ // esto es equivalente a decir: salir == false
  19.        cout << "Hola" << endl;
  20.  
  21.        cout << "Desea salir: (1 = Si / 0 = No): ";
  22.        cin >> salir; // Si no recuerdo mal, el 0 lo guardara como false y cualquier otro numero lo guardara como true
  23.    }
  24. }
  25.  
  26. //ALTERNATIVA 3: Usando un bool de forma mas facil de entender
  27. int main(){
  28.    bool salir = false;
  29.    int respuesta; // para guardar la respuesta del usuario y no hacerlo directamente en bool
  30.  
  31.    while(!salir){
  32.        cout << "Hola" << endl;
  33.  
  34.        cout << "Desea salir (1 = Si / 0 = No): ";
  35.        cin >> respuesta;
  36.        // Ahora si la respuesta vale 1, salir debe valer true y si vale 0, salir debe valer false
  37.        salir = (respuesta == 1); // Asi valdra true cuando respuesta sea 1 y false en cualquier otro caso
  38.    }
  39. }

Como ves hay muchas formas de hacerlo y esto sólo usando el while(), si usas el <do while()> tendrás el doble de alternativas. Lo que todas tienen en común es que si el usuario no introduce ni 1 ni 0, el programa tomará una decisión según la alternativa.
456  Programación / Programación C/C++ / Re: Necesito ayuda con un juego de SNAKE EN ALLEGRO C++ en: 24 Noviembre 2019, 05:09 am
Al final lo que tienes que hacer es un bucle para poder repetir el juego.
Código
  1. int contadorPartidas = 0;
  2.  
  3. do{
  4.    reiniciarPuntuaciones(); // poner las puntuaciones y todo a 0 para cada vuelta
  5.    jugar(); // el proceso del juego
  6.    guardarPuntuacion(); // al acabar guardas la puntuacion segun el sistema que estes utilizando
  7.    ++contadorPartidas; // incrementas el contador de partidas jugadas
  8. }   while(contadorPartidas < LIMITE_PARTIDAS); // Todo esto se repite mientras el numero de partidas jugadas sea menor al minimo que desees
Como no veo tu código, sólo te queda adaptar esta versión simplificada a tu programa.
Suerte :-X
457  Programación / Programación C/C++ / Re: programa que lee solo la primera parte en c++ en: 24 Noviembre 2019, 05:00 am
Ya llevas varios mensajes en el foro por lo que deberías empezar a aplicar las normas básicas como poner tu código entre etiquetas de Código GeSHi y aplicar unos mínimos de orden como no poner un código con más líneas en blanco entre medias que las que tienen algo de código. Si sigues sin hacer caso, llegará un día que nadie te ayude...

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main (){
  5.   int Suma;
  6.   int Resta;
  7.   int Multiplicacion;
  8.   int Division;
  9.  
  10.   //valores de la suma
  11.   int a;
  12.   int b;
  13.  
  14.   int valoressum = a + b;
  15.  
  16.   //valores de la resta
  17.  
  18.   int c;
  19.   int d;
  20.  
  21.   int valoresresta = c - d;
  22.  
  23.   cout<<"Menu"<<endl<<"Que operacion desea realizar?"<<endl<<"1. Suma"<<endl<<"2. Resta"<<endl<<"3. Multiplicacion"<<endl<<"4. Division"<<endl;
  24.  
  25.  
  26.   //suma
  27.  
  28.   cin>>Suma;
  29.  
  30.   if (Suma = 1){  
  31.      cout<<"Digite 2 valores"<<endl;
  32.         cin>>a;
  33.         cin>>b;
  34.   }
  35.  
  36.   if (valoressum = a + b)
  37.   {
  38.      cout<<"El resultado es"<<endl<<valoressum<<endl;
  39.   }
  40.  
  41.   //resta
  42.  
  43.   cin>>Resta;
  44.  
  45.   if (Resta = 2){
  46.      cout<<"Digite 2 valores"<<endl;
  47.         cin>>a;
  48.         cin>>b;
  49.   }
  50.  
  51.   if (valoressum = c - d)
  52.   {
  53.      cout<<"El resultado es"<<endl<<valoresresta<<endl;
  54.   }
  55.  
  56.   return 0;
  57. }
Ese código es un auténtico caos... Sobran variables por todos los lados, hay operaciones que no tienen sentido, se utilizan variables que no poseen ningún valor (poseen basura), las condiciones de los <if> están mal implementadas y además no tienen ningún sentido.
Mi humilde opinión es que debes buscar un rato para dedicarle a la programación y empezar desde el principio ya que veo muchos errores de un nivel muy básico.

No sirve de nada que intentes hacer un <while()> cuando estoy viendo que el propio planteamiento del programa está mal pensado y por ende, mal implementado.

Lo que tienes que hacer en ese programa, olvidándonos del bucle, es:
  • Crear dos variables: numero1 y numero2 que serán los que almacenen los valores del usuario para los operandos.
  • Crear una variable: resultado que será la que almacene el resultado de la operación que elija el usuario.
  • Crear una variable: opcion que será la que guarde la operación a realizar (ej: 1 = suma, 2 = resta, 3 = multiplicación, etc).

Ahora el proceso es sencillo:
  • Mostrar en un mensaje las posibles operaciones y pedir al usuario que elija una de ellas (y guardarla en la variable <opcion>).
  • Pedir al usuario que introduzca dos operandos (y guardarlos en <numero1> y <numero2>).
  • Implementar unos condicionales <if()> para comprobar la opción elegida y según la opción asignar a la variable <resultado> el resultado de realizar la operación correspondiente.
  • Mostrar el resultado.

En pseudocódigo sería algo como esto:
Código:
INICIO
    PEDIR "Elige una operacion: " opcion
    PEDIR "Introduce el primer operando: " numero1
    PEDIR "Introduce el segundo operando: " numero2

    SI opcion == 1 ENTONCES // suponiendo que 1 es la suma
        resultado = numero1 + numero2
    SINO SI opcion == 2 ENTONCES // suponiendo que 2 es la resta
        resultado = numero1 - numero2
    // asi con cada una de las posibles operaciones
    FIN SI

    MOSTRAR "El resultado de la operacion es: " + resultado
FIN

Intenta hacer eso. Si tienes algún problema en alguna parte concreta siempre puedes poner un mensaje con el código (repito: entre etiquetas de Código GeSHi) y explicando tu problema o duda para que te ayudemos. Cuando tengas eso conseguido, será más fácil ayudarte con lo del bucle. De momento, vamos con lo fácil y después vamos agregando cosas nuevas.

PD: En C/C++ las comparaciones se realizan con ==, el operador = es el de asignación:
  • a == b -> Comprueba si a es igual a b
  • a = b -> Asigna el valor de b a la variable a
458  Programación / Programación C/C++ / Re: Duda sobre scanf en: 16 Noviembre 2019, 03:27 am
Si no estás seguro del tipo de dato que va a introducir el usuario por teclado deberías usar la función <fgets()> y almacenar la entrada en un <char[]> para después validarlo tú internamente.
459  Programación / Programación C/C++ / Re: Ayuda con este trozo de código en: 16 Noviembre 2019, 01:49 am
Para próximas consultas, coloca el código entre etiquetas de Código GeSHi.

La parte del filtro está todo bien. La única mejora que se me ocurre es guardar las condiciones en una variable de tipo <bool> para no tener que realizar las comprobaciones dos veces (una en el <if> y otra en el <while>).
Código
  1. int lado;
  2. bool ladoValido;
  3. do{
  4.    cout << "Dame valor del numero (par entre 4 y 300): ";
  5.    cin >> lado;
  6.  
  7.    ladoValido = (lado < 4 || lado > 300 || lado % 2 != 0);
  8.    if(!ladoValido)
  9.        //...
  10. }  while(!ladoValido);

Ahora imagina que <lado> vale 4. El resultado se vería algo así:
Código:
+ + + -
+ + - *
+ - * *
- * * *
Ahora tienes que encontrar una relación entre ese dibujo y el valor de <lado>. Por ejemplo:
Código:
Fila 0: (lado - 1) veces el símbolo '+' y un '-'
Fila 1: (lado - 2) veces el símbolo '+', un '-' y un '*'
Fila 2: (lado - 3) veces el símbolo '+', un '-' y dos veces el '*'
Fila 3: (lado - 4) veces el símbolo '+', un '-' y tres veces el '*'
Ahora hay que intentar generalizarlo para poder hacer un programa que se adapte.
La parte del '+' ya la tenemos: para la fila i, (lado - i - 1) veces el símbolo '+'.
La parte del '-' también porque siempre es, un símbolo '-' cuando se completan los '+'. Es decir, para cada fila i, un '-' en la posición (lado - i).
La parte del '*' podemos verlo como desde (lado - i) hasta (lado - 1).

Entonces quedaría algo así:
Código:
INICIO
    PARA i := 0 HASTA lado - 1 HACER // para cada fila
        PARA j := 0 HASTA lado - i - 2 HACER
            MOSTRAR '+'
        FIN PARA
        MOSTRAR '-'
        PARA k := j HASTA lado - 1 HACER // al terminar el PARA anterior, j vale (lado-i)
            MOSTRAR '*'
        FIN PARA
    FIN PARA
FIN

Intenta codificar ese pseudocódigo en C++ y si tienes problemas puedes poner tu código para que te ayudemos pero recuerda, entre etiquetas de Código GeSHi.
460  Programación / Programación C/C++ / Re: Por favor ayuda URGENTE invalid type float[const int] for arrays subscript en: 13 Noviembre 2019, 14:32 pm
Pretendes que te den la solución en un plazo de unas horas por no haber intentado solucionarlo antes y encima... te has parado a ver tu propio mensaje?? Un código donde faltan índices que no se ven, con la mitad del texto en cursiva, la otra mitad tachado, sin etiquetas de Código GeSHi y donde es casi imposible leer nada...

Yo diría que el fallo que se puede ver a priori es que están usando dos funciones que reciben un array y una matriz de <float> y en el <main> has creado dos variables de tipo <float> sin más que son las que estás pasando a la función.

Páginas: 1 ... 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [46] 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines