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 - MAFUS

#441
Estas mezclando C y C++ en un compilador de C++.

Cuando en C++ pasas un argumento a una función cuyo argumento esté prototipo con un & pasas una referencia y por tanto ese dato será modificado.
En contdigitos has variado el valor de n, cuando se lo entregas a maiordig ya no tienes el valor n original sino el que te dejó contdigitos.
#442
Cuando capturas una frase que contenga espacios el %s de scanf adquiere datos hasta llegar al primer espacio en blanco.
Los datos restantes quedarán en el buffer y al volver a usar scanf adquirirá desde la última posición en que quedó.
Nosotros, al concluir un escrito con la tecla RETURN, añadimos al final de todo un carácter de nueva línea '\n' y eso lo podemos usar como marcador de final de buffer stdin.
while(getchar()!='\n'); hacemos que getchar vaya adquiriendo (y quitando) caracteres de uno en uno del buffer hasta que encuentre el de nueva línea, momento en que el bucle while se detendrá y el bucle quedará vacío.
#443
Ahí va mi versión, desde 0. Se deben tener algunas consideraciones, tal y como muestra el código
#include <stdio.h>
#include <math.h>

int main() {
    int n;
    int copia;
    unsigned i;
    unsigned num_digitos;
    unsigned pos;
    unsigned resultado;

    // Adquiero el numero
    printf("Numero: ");
    scanf("%d", &n);

    // Hago copia pues el proceso es destructivo
    copia = n;

    // Por razon de que log10 no puede usar numeros negativos lo hago positivo
    if(copia<0)
        copia = -copia;

    // Según documentación log10 no debería usarse con 0
    if(copia == 0)
        num_digitos=1;
    else
        num_digitos = log10(copia)+1;

    // Adquiero la posición deseada
    printf("Posicion: ");
    scanf("%u", &pos);

    // Si está fuera del número: avisar y salir
    if(pos==0 || pos>num_digitos) {
        puts("Indice fuera de rango");
        return -1;
    }

    // Consigo el número en la posición deseada
    for(i=0; i<num_digitos-pos+1; ++i) {
        resultado = copia%10;
        copia /= 10;
    }

    // Lo muestro
    printf("En la posicion %d del numero %d esta el %d", pos, n, resultado);
}
#444
Cambia lo de setbuf(stdin, NULL); por while(getchar()!='\n'); tal que así:
void getRangedSimStr(char* vec,char message[],char eMessage[],int minChars, int maxChars)
{
    char palabra[1000];
    printf("%s", message);
    scanf("%s",palabra);
    while(getchar()!='\n');
    while(strlen(palabra) > maxChars || strlen(palabra) < minChars)
    {
        printf("%s",eMessage);
        scanf("%s",palabra);
        while(getchar()!='\n');
    }
    strcpy(vec,  palabra);
}

stdin, stdout y stderr todo y que son tratados como archivos no lo son, y por esa razón tienen sus manías.
#445
Programación C/C++ / Re: ayuda para keylogger
15 Abril 2018, 11:28 AM
Todo código debe estar dentro de una función.
#446
Hazte tu propia strcpy
char* strcpy(char *destino, const char* origen) {
    register unsigned long long i = 0;
    register char c;
   
    for(i=0; (c=origen[i]) != '\0'; ++i)
        destino[i] = c;
       
    destino[i] = '\0';
   
    return destino;
}


Como la original, ésta no tiene protección contra desbordamiento de buffer.
#447
Es 'muy imporante' tabular bien un código, lenguajes como Python lo han hecho norma, así se puede ver bien la estructura del programa. En cambio cuando se hace mal es fácil perder qué cosa va con qué cosa y así es imposible mantener la estructura.

Como podrás ver en el código arreglado cuándo entras en un periodo y preguntas por un pintor, el código debe seguir en ese if, no hay que cerrarlo, pues todo lo referente a esos pintores pertenece a ese periodo. Una vez terminado el periodo se sigue el else if para los periodos posteriores.

De todas formas esto es una práctica un poco mala, llamada spaghetti code, porque se extiende de seguido de principio a fin, haciéndolo difícil de seguir y mantener.

#include<stdio.h>
#include<string.h>


int main() {
    char periodo[50];
    char pintor[50];
    char nacion[50];
   
    printf("Ingrese periodo: ");
    scanf("%s", periodo); while(getchar()!='\n');
   
    if ((strcmp (periodo, "Prehistorico")==0) || (strcmp(periodo, "egipcio")==0)) {
        printf("Galeria 1 \n");
    }
    else if (strcmp(periodo, "renacimiento")==0) {
        printf("Ingrese nombre del pintor: ");
        scanf("%s", pintor); while(getchar()!='\n');
       
        if ((strcmp (pintor, "Leonardo")==0) || (strcmp(pintor, "Michelangelo")==0)) {
            printf ("Galeria 2 \n");
        }
        else if (strcmp(pintor, "Rafael")==0) {
            printf ("Galeria 3");
        }   
        else if ((strcmp (pintor, "Tiziano")==0) || (strcmp(pintor, "Boticelli")==0)) {
            printf("Galeria 4");
        }   
        else if ((strcmp (pintor, "Greco")==0) || (strcmp(pintor, "Tintoretto")==0)) {
            printf("Galeria 5a");
        }
        else if (strcmp(pintor, "Bellini")==0) {
            printf("Galeria 5b");
        }
        else {
            printf("No hay obras de este pintor \n");
        }
    }
    else if (strcmp(periodo, "barroco")==0) {
        printf("Ingrese nacion: ");
        scanf("%s", nacion); while(getchar()!='\n');
       
        if (strcmp (nacion, "Espana")==0) {
            printf("Galeria 6, Velzaquez y Murillo");
        }
        else if (strcmp(nacion, "Italia")==0) {
            printf("Galeria 7, Caravaggio");
        }
        else {
            printf("No hay obras de esta nacionalidad");
        }
    }
    else if (strcmp(periodo, "expresionismo")==0) {
        printf("Galeria 8, Kandiski");
    }     
    else if (strcmp(periodo, "impresionismo")==0) {
        printf("Galeria 8, Van Gogh");
    }
    else if (strcmp(periodo, "fauvismo")==0) {
        printf("Galeria 8, Manguin");
    }
    else if (strcmp(periodo, "cubismo")==0) {
        printf("Galeria 9, Picasso");
    }
    else if (strcmp(periodo, "surrealismo")==0) {
        printf("Ingrese pintor: ");
        scanf("%s", pintor); while(getchar()!='\n');
       
        if (strcmp(pintor, "Dali")==0) {
            printf("Galeria 10");
        }
        else if (strcmp(pintor, "Miro")==0){
            printf("Galeria 11");
        }
        else{
            printf("No hay obras de este pintor");
        }
    }
    else if ((strcmp(periodo, "informalismo")==0) || (strcmp(periodo, "hiperralismo")==0)) {
        printf("Galeria 12");
    }
    else {
        printf("No hay obras en este periodo");
    }
   
    return 0;
}
#448
 Correcto. El else que hay justo después hace que continúe la cadena de ifs en vez de iniciar una nueva toma de decisiones.
#449
Programación C/C++ / Re: Estructura
13 Abril 2018, 07:09 AM
Unas cuantas cosas mal pero la más importante
Si arreglo es una estructura después no la trates como un simple entero. Cómo arreglar eso: elimina la estructura y haz un array de ints ya que el programa está diseñado para ello, así ahorrarás tiempo.
#450
Haz un pantallazo de cuando te falla.