Jump to content
Fórum Script Brasil
  • 0

Ajuda para aprender "C"


Emerson111

Question

Olá,

Estou começando a aprender a linguagem C. Tenho que fazer um um exercício que pede:

"Escreva um programa que peça três inteiros, correspondentes a dia , mês e ano. Peça os números até conseguir valores que estejam na faixa correta (dias entre 1 e 31, mês entre 1 e 12 e ano entre 1900 e 2100). Verifique se o mês e o número de dias batem (incluindo verificação de anos bissextos). Se estiver tudo certo imprima o número que aquele dia corresponde no ano. Comente seu programa.

PS: Um ano é bissexto se for divisível por 4 e não for divisível por 100, exceto para os anos divisíveis por 400, que também são bissextos."

Pesquisando até encontrei em alguns fóruns a solução para o exercício, mas eu não gostaria de simplesmente copiar e colar para tirar a nota, por isso estou tentando fazer o exercício sem cola. Mas como esse e o primeiro programa que faço, estou tento muitas dificuldades. Por isso conta a ajuda do pessoal do fórum.

Ainda estou no começo, até agora eu só fiz esse pedaço:

#include <stdio.h>
int main()

{
int dia;
int mes;
int ano;


{
    do
    {
    printf ("Digite um dia do mes no formato dd: \n");
    scanf ("%d", &dia);
    if (dia>31||dia<1)
    printf ("Dia invalido, digite novamente!\n\n");
    }while (dia>31||dia<1);

        printf ("Digite um mes do ano no formato mm: \n");
        scanf ("%d", &mes);
            if((mes>12)||(mes<1))
            printf ("Mes invalido!");

    printf ("Digite um ano entre 1900 e 2100; \n");
            scanf ("%d", &ano);
}

return(0);
}


No primeiro trecho funcionou belezinha:
do
    {
    printf ("Digite um dia do mes no formato dd: \n");
    scanf ("%d", &dia);
    if (dia>31||dia<1)
    printf ("Dia invalido, digite novamente!\n\n");
    }while (dia>31||dia<1);
Mas agora eu quero fazer o mesmo com o mês e ano, mas não estou conseguindo. Pensei que se repetisse a mesma estrutura do "dia", funcionaria com "mes" e "ano", mas não deu certo:
#include <stdio.h>
int main()

{
int dia;
int mes;
int ano;



{
    do
    {
    printf ("Digite um dia do mes no formato dd: \n");
    scanf ("%d", &dia);
    if (dia>31||dia<1)
    printf ("Dia invalido!\n Digite novamente!\n");
    (dia>31||dia<1);
    }
}
{
    do
    {
    printf ("Digite um mes do ano no formato mm: \n");
    scanf ("%d", &mes);
    if (mes>12||mes<1)
    printf ("Mes invalido!\n Digite novamente!\n");
    (mes>12||mes<1);
    }
}
{
    do
    {
     printf ("Digite um ano entre 1900 e 2100; \n");
     scanf ("%d", &ano);
     if (ano>2100||ano<1900)
    printf ("Ano invalido!\n Digite novamente!\n");
    while (ano>2100||ano<1900);
    }
}



}

Coloquei só a primeira parte, por que foi o que eu "consegui" fazer até agora. E por que quero aprender, não apenas copiar e colar o trabalho de outros. Espero que o pessoal possa me ajudar. E desde já agradeço!

Edited by Emerson111
Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0

Legal querer aprender, isso é raro hoje em dia.

Sobre a verificação de dia, você não pode comparar o dia entrado com 31 porque cada mês possui um número variável de dias.

O que eu faria: Criaria um vetor de dias limite de cada mes. Exemplo:

int diasLimite[] = {31,28,31,30,31,30,31,31,30,31,30,31};
Depois verificaria se o ano entrado é bissexto. Se for,
vet[1] += 1;

Isso facilita muito para verificar. Basta pegar o mês entrado, verificar se 1 <= mês entrado <= 12. Se for, acessa o índice 'mês - 1' do vetor diasLimite e confere o dia entrado.

Pra conferir ano, um if() já serve.

Link to comment
Share on other sites

  • 0

Eu não estava querendo usar vetores, por que ainda não iniciei o estudo deste tópico.

Estava pensando em usar algo mais ou menos assim (caso seja possível é claro):

if (dia>31 || dia <1)
data_valida= mes==1 || mes==3|| mes==5 mes==7 || mes==8|| mes==10|| mes==12;
else
(scanf ("Data invalida"));

if (dia>30 || dia <1)
data_valida= mes==4 || mes==6|| mes==9 || mes==10;
else
(scanf ("Data invalida"));

if fevereiro29= (ano % 4 == 0) && (ano % 400 == 0)
    else
    {
     fevereiro28=(dia>28 || dia <1)
    }
    else
    {
    (scanf ("Data invalida"))
    }

Edited by Emerson111
Link to comment
Share on other sites

  • 0

A segunda parte para mim está mais difícil, e nem tenho certeza se esse caminho funciona.

estou pensando e tentando fazer mais ou menos assim:

#include <stdio.h>
int main()

{

int ano_bissexto=0;
int fevereiro29=0;
int fevereiro28=0;
int dia=0;  
int mes=0; 
int ano=0;  

do
{
printf ("Digite um dia do mes no formato dd: \n");
scanf ("%d", &dia);
if (dia>31||dia<1)
printf ("Dia invalido!\n Digite novamente!\n");
(dia>31||dia<1);
}while(dia>31||dia<1); 

do
{
printf ("Digite um mes do ano no formato mm: \n");
scanf ("%d", &mes);
if (mes>12||mes<1)
printf ("Mes invalido!\n Digite novamente!\n");
(mes>12||mes<1);
}while(mes>12||mes<1); 

do
{
printf ("Digite um ano entre 1900 e 2100; \n");
scanf ("%d", &ano);
if (ano>2100||ano<1900)
printf ("Ano invalido!\n Digite novamente!\n");
} 
while (ano>2100||ano<1900);

{
if (dia>31 || dia <1)
data_valida= mes==1 || mes==3|| mes==5 mes==7 || mes==8|| mes==10|| mes==12;
else
(scanf ("Data invalida"));

if (dia>30 || dia <1)
data_valida= mes==4 || mes==6|| mes==9 || mes==10;
else
(scanf ("Data invalida"));

if fevereiro29= (((ano % 4 == 0) && (ano % 100 > 0)) || (ano % 400 == 0));
    else
    {
     fevereiro28=(dia>28 || dia <1)
    }
    else
    {
    (scanf ("Data invalida"))
    }


printf ("Dia: %d,  Mes: %d,  Ano: %d \n\n", dia, mes, ano); 


return(0);
}
Mas não sei se vai funcionar, a primeira parte está beleza, mas a segunda até agora nada e nem tenho certeza se assim dá certo, pois alem de verificar o ano, mês e o dia, ainda tenho que fazer pedir os dados novamente para fazer com que a pessoa digite corretamente:
do
{
printf ("Digite um ano entre 1900 e 2100; \n");
scanf ("%d", &ano)

Edited by Emerson111
Link to comment
Share on other sites

  • 0

Sem usar vetores, acho que o melhor é ir de switch(). É bem ruim, tem de se fazer varias verificações...

Fiz um aqui, tu pode dar uma olhada para se basear no seu:

#include <stdio.h>

int main(){
    unsigned short int dia, mes, ano;

    do{
        printf("Digite o dia: ");
        scanf("%hu", &dia);
        printf("Digite o mes: ");
        scanf("%hu", &mes);
        printf("Digite o ano: ");
        scanf("%hu", &ano);

        if(dia > 31){
            printf("Dia invalido. Tente novamente.\n");
            continue;
        } else if(mes > 12){
            printf("Mes invalido. Tente novamente.\n");
            continue;
        } else if(ano < 1900 || ano > 2100){
            printf("Ano invalido. Tente novamente.\n");
            continue;
        }

        switch(mes){
            case 1:
                if(dia > 31){
                    printf("Janeiro vai ate dia 31. Tente novamente.\n");
                    continue;
                }
            break;

            case 2:
                if(!(ano%4) && (ano%100) || !(ano%400)){
                    if(dia > 29)
                        printf("Em anos bissextos, fevereiro vai ate dia 29. Tente novamente.\n");
                        continue;
                } else {
                    if(dia > 28)
                        printf("Fevereiro vai ate dia 28. Tente novamente.\n");
                        continue;
                }
            break;

            case 3:
                if(dia > 31){
                    printf("Marco vai ate dia 31. Tente novamente.\n");
                    continue;
                }
            break;

            case 4:
                if(dia > 31){
                    printf("Abril vai ate dia 30. Tente novamente.\n");
                    continue;
                }
            break;

            case 5:
                if(dia > 31){
                    printf("Maio vai ate dia 31. Tente novamente.\n");
                    continue;
                }
            break;

            case 6:
                if(dia > 30){
                    printf("Junho vai ate dia 30. Tente novamente.\n");
                    continue;
                }
            break;

            case 7:
                if(dia > 31){
                    printf("Julho vai ate dia 31. Tente novamente.\n");
                    continue;
                }
            break;

            case 8:
                if(dia > 31){
                    printf("Agosto vai ate dia 31. Tente novamente.\n");
                    continue;
                }
            break;

            case 9:
                if(dia > 30){
                    printf("Setembro vai ate dia 30. Tente novamente.\n");
                    continue;
                }
            break;

            case 10:
                if(dia > 31){
                    printf("Outubro vai ate dia 31. Tente novamente.\n");
                    continue;
                }
            break;

            case 11:
                if(dia > 30){
                    printf("Novembro vai ate dia 30. Tente novamente.\n");
                    continue;
                }
            break;

            case 12:
                if(dia > 31){
                    printf("Dezembro vai ate dia 31. Tente novamente.\n");
                    continue;
                }
            break;
        }

        break;
    } while(1);

    printf("Data valida: %hu/%hu/%hu.\n", dia, mes, ano);
    return(0);
}

Link to comment
Share on other sites

  • 0

Graças a ajuda recebida, consegui entender e organizar o código praticamente todo. Espero que o pessoal possa me ajudar numa última duvida.

Estou com um probleminha na saída do resultado, pois preciso que ele me informe a data digitada (isso consegui) e o dia que representa a data (se o 1º, 23º, 55º etc dia do ano) se o ano for não bissexto eu já consegui, mas para os anos bissexto não consegui. E por causa desse detalhe do dia que representa não estou conseguindo fazer com ele leia o mês de fevereiro, assim ele fica sempre voltando e pedindo para digitar os dados iniciais novamente, com os outros meses não há problema nenhum. Em um outro site para fazer o somatório para representar os dia do ano, quem fez utilizou o código abaixo, mas eu não entendi como ele fez

case 4: total_dias += 31; // do mes de marco 
case 3: total_dias += ano_bissexto?29:28; // do mes de fevereiro 
case 2: total_dias += 31; // do mes de janeiro.
E li também na apostila que estou utilizando e em muitos outros site que o "goto" é algo a ser evitado, mas não entendi qual código devo utilizar no lugar do "goto", para esse exercício creio que isso não seja o mais importante, mas gostaria de saber como utilizar outro código d=no lugar do "goto".
#include <stdio.h>

int main()

{
int dia=0;
int mes=0;
int ano=0;
int total_dias=0;
int dias=0;


data:
do
{
printf ("Digite um dia do mes no formato dd: \n");
scanf ("%d", &dia);
if (dia>31||dia<1)
printf ("Dia invalido, digite novamente!\n");
(dia>31||dia<1);
}while(dia>31||dia<1);

do
{
printf ("Escolha um mes do ano pelo numero: \n");
        printf ("\t (1)...janeiro\n");
        printf ("\t (2)...fevereiro\n");
        printf ("\t (3)...março\n");
        printf ("\t (4)...abril\n");
        printf ("\t (5)...maio\n");
        printf ("\t (6)...junho\n");
        printf ("\t (7)...julho\n");
        printf ("\t (8)...agosto\n");
        printf ("\t (9)...setembro\n");
        printf ("\t (10)...outubro\n");
        printf ("\t (11)...novembro\n");
        printf ("\t (12)...dezembro\n");
scanf ("%d", &mes);
if (mes>12||mes<1)
printf ("Mes invalido, digite novamente!\n");
(mes>12||mes<1);
}while(mes>12||mes<1);

do
{
printf ("Digite um ano entre 1900 e 2100; \n");
scanf ("%d", &ano);
if (ano>2100||ano<1900)
printf ("Ano invalido, digite novamente!\n");
}while (ano>2100||ano<1900);

{

            switch(mes){
            case 1:
                if(dia > 31){
                    printf("Janeiro tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }


            case 2:
                if(!(ano%4) && (ano%100) || !(ano%400)){
                    if(dia > 29)
                        printf("Em anos bissextos, fevereiro tem ate dia 29. Tente novamente.\n\n");
            goto data;
                } else {
                    if(dia > 28)
                        printf("Fevereiro tem ate dia 28. Tente novamente.\n\n");
            goto data;
                }


            case 3:
                if(dia > 31){
                    printf("Marco tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }


            case 4:
                if(dia > 30){
                    printf("Abril tem ate dia 30. Tente novamente.\n\n");
            goto data;
                }


            case 5:
                if(dia > 31){
                    printf("Maio tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }


            case 6:
                if(dia > 30){
                    printf("Junho tem ate dia 30. Tente novamente.\n\n");
            goto data;
                }


            case 7:
                if(dia > 31){
                    printf("Julho tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }


            case 8:
                if(dia > 31){
                    printf("Agosto tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }


            case 9:
                if(dia > 30){
                    printf("Setembro tem ate dia 30. Tente novamente.\n\n");
            goto data;
                }


            case 10:
                if(dia > 31){
                    printf("Outubro tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }


            case 11:
                if(dia > 30){
                    printf("Novembro tem ate dia 30. Tente novamente.\n\n");
            goto data;
                }


            case 12:
                if(dia > 31){
                    printf("Dezembro tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }

        }

{
    switch (mes) {
case 12: total_dias += 30;
case 11: total_dias += 31;
case 10: total_dias += 30;
case 9: total_dias += 31;
case 8: total_dias += 31;
case 7: total_dias += 30;
case 6: total_dias += 31;
case 5: total_dias += 30;
case 4: total_dias += 31;
case 3: total_dias += 28;
case 2: total_dias += 31;
}

total_dias += dia;
dias = total_dias;
}

}


 printf("\n\nData valida: %hu/%hu/%hu.\n", dia, mes, ano);

 printf ("\n\nEsta data representa o %do. dia de %d.\n", dias, ano);

return(0);

}

Edited by Emerson111
Link to comment
Share on other sites

  • 0

Consegui resolver a questão dos anos bissextos.

Só não consegui fazer o mes de fevereiro fechar o ciclo e concluir o calculo quando executo o programa.

#include <stdio.h>

int main()

{
int dia=0;
int mes=0;
int ano=0;
int total_dias=0;
int dias=0;
int ano_bissexto=0;


data:
do
{
printf ("Digite um dia do mes no formato dd: \n");
scanf ("%d", &dia);
if (dia>31||dia<1)
printf ("Dia invalido, digite novamente!\n");
(dia>31||dia<1);
}while(dia>31||dia<1);

do{
        printf("Digite o dia: ");
        scanf("%hu", &dia);
        printf("Digite o mes: ");
        scanf("%hu", &mes);
        printf("Digite o ano: ");
        scanf("%hu", &ano);

        if(dia > 31){
            printf("Dia invalido. Tente novamente.\n");
            continue;
        } else if(mes > 12){
            printf("Mes invalido. Tente novamente.\n");
            continue;
        } else if(ano < 1900 || ano > 2100){
            printf("Ano invalido. Tente novamente.\n");
            continue;
        }

            switch(mes){
            case 1:
                if(dia > 31){
                        printf("Janeiro tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }


            case 2:
                if(!(ano%4) && (ano%100) || !(ano%400)){
                    if(dia > 29)
                        printf("Em anos bissextos, fevereiro tem ate dia 29. Tente novamente.\n\n");
            goto data;
                } else {
                    if(dia > 28)
                        printf("Fevereiro tem ate dia 28. Tente novamente.\n\n");
            goto data;
                }


            case 3:
                if(dia > 31){
                    printf("Marco tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }


            case 4:
                if(dia > 30){
                    printf("Abril tem ate dia 30. Tente novamente.\n\n");
            goto data;
                }


            case 5:
                if(dia > 31){
                    printf("Maio tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }


            case 6:
                if(dia > 30){
                    printf("Junho tem ate dia 30. Tente novamente.\n\n");
            goto data;
                }


            case 7:
                if(dia > 31){
                    printf("Julho tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }


            case 8:
                if(dia > 31){
                    printf("Agosto tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }


            case 9:
                if(dia > 30){
                    printf("Setembro tem ate dia 30. Tente novamente.\n\n");
            goto data;
                }


            case 10:
                if(dia > 31){
                    printf("Outubro tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }


            case 11:
                if(dia > 30){
                    printf("Novembro tem ate dia 30. Tente novamente.\n\n");
            goto data;
                }


            case 12:
                if(dia > 31){
                    printf("Dezembro tem ate dia 31. Tente novamente.\n\n");
            goto data;
                }

        }

{
ano_bissexto = ( ((ano % 4 == 0) && (ano % 100 > 0)) || (ano % 400 == 0) );
    switch (mes) {
case 12: total_dias += 30;
case 11: total_dias += 31;
case 10: total_dias += 30;
case 9: total_dias += 31;
case 8: total_dias += 31;
case 7: total_dias += 30;
case 6: total_dias += 31;
case 5: total_dias += 30;
case 4: total_dias += 31;
case 3: total_dias += ano_bissexto?29:28;
case 2: total_dias += 31;
}

total_dias += dia;
dias = total_dias;
}

}


 printf("\n\nData valida: %d/%d/%d.\n", dia, mes, ano);

 printf ("\n\nEsta data representa o %do. dia de %d.\n", dias, ano);

return(0);

}

Edited by Emerson111
Link to comment
Share on other sites

  • 0

Amigo, o GOTO torna o código muito ruim de se interpretar. Procure evitar ao máximo.

Sobre exibir qual o dia do ano, você precisa de um laço para ir somando. Usar vetores facilitaria muito, mas como você não pode, terá de ser da maneira difícil.

Seria algo assim:

totalDia = 0;
    if(mes == 1)
        totalDias += dia;
    else {
        for(i = 1; i < mes; i++){
            switch(mes){
                case 1: totalDia += 31; break;
                case 2: totalDia += (!(ano%4) && (ano%100) || !(ano%400)) ? 29 : 28; break;
                case 3: totalDia += 31; break;
                case 4: totalDia += 30; break;
                case 5: totalDia += 31; break;
                case 6: totalDia += 30; break;
                case 7: totalDia += 31; break;
                case 8: totalDia += 31; break;
                case 9: totalDia += 30; break;
                case 10: totalDia += 31; break;
                case 11: totalDia += 30; break;
                case 12: totalDia += 31; break;
            }
        }
        totalDias += dia;
    }

Ou seja, se for janeiro, apenas soma ao total o número de dias. Se não for, passa pro laço e vai adicionando até chegar no mês anterior ao que foi entrado. Sai do laço e adiciona a quantidade de dias do mÊs que foi entrado, e é isso.

Edited by mJi
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...