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

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  solicitar día de la semana e imprimir número correspondiente
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: solicitar día de la semana e imprimir número correspondiente  (Leído 1,878 veces)
cargs

Desconectado Desconectado

Mensajes: 4


Ver Perfil
solicitar día de la semana e imprimir número correspondiente
« en: 2 Agosto 2019, 05:02 am »

Soy muy nuevo, lo que quiero hacer es hacer funcionar un programa parecido al que pongo, pero a la inversa, es decir, leer el día de la semana (lunes) y que se imprima el número correspondiente (1) para martes 2, etc, ¿cómo se hace?

/**
 * C program to print day of week using switch case
 */

#include <stdio.h>

int main()
{
    int week;
   
    /* Input week number from user */
    printf("Enter week number(1-7): ");
    scanf("%d", &week);
   
    switch(week)
    {
        case 1:
            printf("Monday");
            break;
        case 2:
            printf("Tuesday");
            break;
        case 3:
            printf("Wednesday");
            break;
        case 4:
            printf("Thursday");
            break;
        case 5:
            printf("Friday");
            break;
        case 6:
            printf("Saturday");
            break;
        case 7:
            printf("Sunday");
            break;
        default:
            printf("Invalid input! Please enter week number between 1-7.");
    }

    return 0;
}


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: solicitar día de la semana e imprimir número correspondiente
« Respuesta #1 en: 2 Agosto 2019, 06:53 am »

Si estás empezando, hacerlo a la inversa es un poco más complicado pero te comento lo que deberías mirar:
  • Uso de cadenas de C (arrays de <char>) estáticas (también puedes usar memoria dinámica pero mejor dejar esa parte para más adelante)
  • Algunas funciones para trabajar con cadenas de C. La más útil es para comparar dos cadenas <strcmp()> y <strncmp()> (recomendable usar la segunda porque puedes indicar cuántos caracteres comparar de ambas cadenas). Además para pedir una cadena C al usuario deberás usar <fgets()> en lugar de <scanf()>. Te dejo cómo se usan:
Código:
strcmp(const char *cadena1, const char *cadena2); -> Retorna: -1 (cadena1 < cadena2) / 0 (cadena1 == cadena2) / 1 (cadena1 > cadena2) usando el orden lexicográfico.
strncmp(const char *cadena1, const char *cadena2, size_t longitud); -> Igual que la anterior pero compara tantos caracteres como se indica en <longitud> o hasta que una cadena termina.
fgets(char *cadena, int longitud, FILE *stream); -> Almacena en <cadena> lo introducido por la entrada. Usar como <stream> <stdin> para la entrada estándar (teclado). <longitud> determina el número máximo de caracteres que se van a almacenar (normalmente el tamaño de <cadena>).

Yo te recomendaría una forma poco eficiente pero más simple que sería: de forma manual hacer un bloque de <if-else-if> y en cada uno comparar la entrada con cada uno de los días de la semana (colocar de forma manual el número de caracteres a comparar según el día):
Código
  1. if(strncmp(cadenaUsuario, "Lunes", 5) == 0)
  2.    // lo que quieras hacer si es lunes
  3. else if(strncmp(cadenaUsuario, "Martes", 6) == 0)
  4.    // lo que quieras hacer si es martes
  5. //...
PD 1: Cuidado con las mayúsculas/minúsculas ya que hacen que una cadena con el mismo contenido se interprete como cadenas distintas.

Echa un vistazo a lo comentado antes y anímate a intentarlo. Si tienes algún problema, envía tu código para que podamos ver el problema y ayudarte.
PD 2: No olvides colocar los códigos entre etiquetas de Código GeSHi... :rolleyes: :-X


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
cargs

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: solicitar día de la semana e imprimir número correspondiente
« Respuesta #2 en: 2 Agosto 2019, 07:31 am »

Wow!  ;-) ;-) ok, muchas gracias, voy a revisar!! Saludos!
En línea

cargs

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: solicitar día de la semana e imprimir número correspondiente
« Respuesta #3 en: 2 Agosto 2019, 23:18 pm »

Hola, pude avanzar, el programa debe solicitar el mes y como resultado mostrar el número de mes (1 para enero, 2 para febrero, 3 para marzo) y la estación del año correspondientes.El usuario debe introducir el mes en minúsculas. Si el usuario ingresa mal u otra cosa, debe aparecer "prueba de nuevo"

En el código que hice, funciona para diciembre, pero para los demás meses como resultado manda el número de mes y la estación, pero además el mensaje de "prueba de nuevo" ¿Qué debo hacer para que solo mande el número de mes y la estación?

este es el código:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. char mes[100];
  5.  
  6. int main() {
  7.    printf("Cual es el mes? (en minusculas)\n");
  8.    fgets (mes, 100, stdin);
  9.    mes[strlen(mes)-1] = '\0';
  10.    if (strcmp(mes, "enero") == 0) {
  11.        printf("1 invierno!\n");
  12.    }
  13.    if (strcmp(mes, "febrero") == 0) {
  14.        printf("2 invierno!\n");
  15.    }
  16.    if (strcmp(mes, "marzo") == 0) {
  17.        printf("3 primavera!\n");
  18.    }
  19.    if (strcmp(mes, "abril") == 0) {
  20.        printf("4 primavera!\n");
  21.    }
  22.    if (strcmp(mes, "mayo") == 0) {
  23.        printf("5 primavera!\n");
  24.    }
  25.    if (strcmp(mes, "junio") == 0) {
  26.        printf("6 verano!\n");
  27.    }
  28.    if (strcmp(mes, "julio") == 0) {
  29.        printf("7 verano!\n");
  30.    }
  31.    if (strcmp(mes, "agosto") == 0) {
  32.        printf("8 verano!\n");
  33.    }
  34.    if (strcmp(mes, "septiembre") == 0) {
  35.        printf("9 otonio!\n");
  36.    }
  37.    if (strcmp(mes, "octubre") == 0) {
  38.        printf("10 otonio!\n");
  39.    }
  40.    if (strcmp(mes, "noviembre") == 0) {
  41.        printf("11 otonio!\n");
  42.    }
  43.    if (strcmp(mes, "diciembre") == 0) {
  44.        printf("12 invierno!\n");
  45.    }
  46.    else {
  47.        printf("prueba de nuevo.\n");
  48.    }
  49.    return 0;
  50. }
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: solicitar día de la semana e imprimir número correspondiente
« Respuesta #4 en: 2 Agosto 2019, 23:48 pm »

Eso es porque usas condicionales aislados. Es decir, que has utilizado un conjunto de condiciones que son independientes por lo que tu programa las comprueba todas. En estos casos en los que una coincidencia en un <if> excluye que pueda ser verdadera otra coincidencia se usa <if - else if - else if - ... - else>.

Aquí tienes un código sencillo que funciona correctamente pero que no es muy eficiente ya que se compara el valor de <numero> con 1 y coincida o no, se compara con 2 y coincida o no se comprueba que el número sea distinto de 1 y de 2:
(Sé que el código es un poco absurdo pero me parecía un buen ejemplo para mostrarte el problema)
Código
  1. int numero = 1;
  2.  
  3. if(numero == 1)
  4.    printf("El numero vale 1");
  5. if(numero == 2)
  6.    printf("El numero vale 2");
  7. if(numero != 1 && numero != 2)
  8.    printf("El numero es distinto de 1 y de 2");


Se ve claramente que si el número vale 1 ya no va a valer 2 ni ningún otro valor. Por lo que se puede hacer más eficiente así:
Código
  1. int numero = 2;
  2.  
  3. if(numero == 1) // si vale 1...
  4.    printf("El numero vale 1");
  5. else if(numero == 2) // si no vale 1, si vale 2...
  6.    printf("El numero vale 2");
  7. else // si no vale 1 ni 2... ya se da por hecho que es distinto de 1 y de 2
  8.    printf("El numero es distinto de 1 y de 2");
En este caso se comprueba cada <if> hasta que uno sea cierto y en el momento que uno es cierto no sigue comprobando el resto de condiciones.

En tu caso compruebas de forma aislada cada mes excepto el último y en el último haces:
Código:
si mes == "diciembre" entonces
    12  invierno
sino entonces
    prueba de nuevo
fin si
Entonces ese <sino> se ejecutará siempre que el mes no sea igual a "diciembre".
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
cargs

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: solicitar día de la semana e imprimir número correspondiente
« Respuesta #5 en: 3 Agosto 2019, 00:45 am »

perfecto,  ya quedó!
muchas gracias por tus explicaciones, me ayudaron enormemente!!! ;-) ;-)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines