solicitar día de la semana e imprimir número correspondiente

Iniciado por cargs, 2 Agosto 2019, 05:02 AM

0 Miembros y 1 Visitante están viendo este tema.

cargs

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;
}

K-YreX

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:

    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):

    if(strncmp(cadenaUsuario, "Lunes", 5) == 0)
        // lo que quieras hacer si es lunes
    else if(strncmp(cadenaUsuario, "Martes", 6) == 0)
        // lo que quieras hacer si es martes
    //...

    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
Código (cpp) [Seleccionar]

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

cargs


cargs

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:
#include <stdio.h>
#include <string.h>

char mes[100];

int main() {
    printf("Cual es el mes? (en minusculas)\n");
    fgets (mes, 100, stdin);
    mes[strlen(mes)-1] = '\0';
    if (strcmp(mes, "enero") == 0) {
        printf("1 invierno!\n");
    }
    if (strcmp(mes, "febrero") == 0) {
        printf("2 invierno!\n");
    }
    if (strcmp(mes, "marzo") == 0) {
        printf("3 primavera!\n");
    }
    if (strcmp(mes, "abril") == 0) {
        printf("4 primavera!\n");
    }
    if (strcmp(mes, "mayo") == 0) {
        printf("5 primavera!\n");
    }
    if (strcmp(mes, "junio") == 0) {
        printf("6 verano!\n");
    }
    if (strcmp(mes, "julio") == 0) {
        printf("7 verano!\n");
    }
    if (strcmp(mes, "agosto") == 0) {
        printf("8 verano!\n");
    }
    if (strcmp(mes, "septiembre") == 0) {
        printf("9 otonio!\n");
    }
    if (strcmp(mes, "octubre") == 0) {
        printf("10 otonio!\n");
    }
    if (strcmp(mes, "noviembre") == 0) {
        printf("11 otonio!\n");
    }
    if (strcmp(mes, "diciembre") == 0) {
        printf("12 invierno!\n");
    }
    else {
        printf("prueba de nuevo.\n");
    }
    return 0;
}

K-YreX

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)

int numero = 1;

if(numero == 1)
    printf("El numero vale 1");
if(numero == 2)
    printf("El numero vale 2");
if(numero != 1 && numero != 2)
    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í:

int numero = 2;

if(numero == 1) // si vale 1...
    printf("El numero vale 1");
else if(numero == 2) // si no vale 1, si vale 2...
    printf("El numero vale 2");
else // si no vale 1 ni 2... ya se da por hecho que es distinto de 1 y de 2
    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:

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".
Código (cpp) [Seleccionar]

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

cargs

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