Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda para aprender "C"


Emerson111

Pergunta

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!

Editado por Emerson111
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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"))
    }

Editado por Emerson111
Link para o comentário
Compartilhar em outros 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)

Editado por Emerson111
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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);

}

Editado por Emerson111
Link para o comentário
Compartilhar em outros 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);

}

Editado por Emerson111
Link para o comentário
Compartilhar em outros 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.

Editado por mJi
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...