Ir ao conteúdo
  • Cadastre-se

Ajuda para aprender "C"


Emerson111

Posts recomendados

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!

Link para o comentário
Compartilhar em outros sites

Olá! Vim aqui pra te ajudar! Então vamos lá:

1° Seu código está LOTADO de erros relacionados eu mau uso das chaves.

Você não precisa colocar o do...while dentro das chaves, pois as chaves vão dentro dessa estrutura! VOcê fez assim: {do{ .... } while()}; Mas o correto é sem as chaves de fora assim: do{ ... } while(); Só assim cara ^^

2° No seu último código, você iniciou com do{ mas no final, esqueceu de colocar os }while() kkk ^^

3° Toda função deve retornar um valor, você esqueceu de retornar um valor de função main;

Aqui está seu código arrumado:

#include <stdio.h>
#include <iostream> // Isso é opcional, só pra dar system("pause"); Exclua depois se quiser
int main()

{
int dia; // É recomendável inicializar as varizaveis, só por precaução
int mes; // Mas como fazer isso?? Fácil assim: int dia = 0;
int ano; // Mas faça com todas as variasveis, pois isso pode evitar futuros erros,
// principalmente com laços de repetição que utilizam while!

// Aqui tinha umas chaves erradas e foram retiradas

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); // Nem tinha essa linha, você esqueceu kkk

// Aqui tinha umas chaves erradas e foram retiradas

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); // Nem tinha essa linha, você esqueceu kkk

// Aqui tinha umas chaves erradas e foram retiradas

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");
} // Essa chave não existia, você esqueceu
while (ano>2100||ano<1900);

// Aqui tinha umas chaves erradas e foram retiradas

printf ("Dia: %d, Mes: %d, Ano: %d \n\n", dia, mes, ano); // Isso é pra você ver se o seu programa funcionou! Exclua depois se quiser

system("pause"); // Isso é só pra pausar o programa e você ver o resultado xD Exclua depois se quiser

return 0; // Retorna o valor 0, pois TODA FUNÇÃO DEVE RETORNAR UM VALOR, MESMO QUE SEJA NULO!

}

EDIT1: Você disse que quer APRENDER, então comentei o código todo pra você entender BEM MESMO ele TODO!

Abração!

Posta sua Dúvidas!

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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

}

Link para o comentário
Compartilhar em outros sites

Li sobre isso do goto, mas foi só assim que consegui fazer o código.

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

}

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...