Ir ao conteúdo
  • Cadastre-se

Programa em C


Silas001

Posts recomendados

24. Fazer um programa que leia uma data (dia e mês) e informe se é primavera, verão, outono ou

inverno. Sabe-se que as estações, no hemisfério sul, começam nas seguintes datas:

» Primavera: 22/Set

» Verão: 21/Dez

» Outono: 20/Mar

» Inverno: 20/Jun

OBS:

Estou com algumas duvidas em relação a esse programa, aparentemente ele é fácil,mas eu não consigo resolver a parte em que uso o "if" para a questão dos dias das estações(tentei mudar alguma coisa no primeiro if,mas não deu certo). Quem puder me ajudar agradeço desde já.

int main()

{

int dia,mes;

printf("Digite o dia no mes ");

scanf("%d",&dia);

printf("\nDigite o mes no ano ");

scanf("%d",&mes);

if((mes>=7 && mes<=12) && (dia>=22 && dia<=21) ){

printf("\nA data faz parte da primavera");

}

else if(mes>=12 && dia>=21){

printf("\nA data faz parte da verao");

}

else if(mes>=3 && dia>=20){

printf("\nA data faz parte da outono");

}

else if(mes>=6 && dia>=20){

printf("\nA data faz parte da inverno");

}

system("PAUSE");

return 0;

}

Link para o comentário
Compartilhar em outros sites

Olha, eu faria assim:

Obs: Tentei organizar o código ao máximo pra você entender.


#include <stdio.h>
#include <stdlib.h>

int dia,mes,hemisferio;

int main()
{

printf("Digite \"1\" para Hemisferio Norte e \"2\" para Hemisferio Sul: "); scanf("%u",&hemisferio); printf("\n");

printf("Digite o dia: "); scanf("%u",&dia); printf("\n");

printf("Digite o mes: "); scanf("%u",&mes); printf("\n");

if(hemisferio==1) /* Aqui ele verifica se é HEMISFÉRIO NORTE, se sim ele entra nos IF's abaixo */
{
if((mes==4 || mes==5) || (mes==3 && dia>=21) || (mes==6 && dia<=20)) /* IF da PRIMAVERA */
{
printf("A estacao atual e PRIMAVERA\n\n"); system("PAUSE"); return 0;
}
if((mes==7 || mes==8) || (mes==6 && dia>=21) || (mes==9 && dia<=22)) /* IF do VERAO */
{
printf("A estacao atual e VERAO\n\n"); system("PAUSE"); return 0;
}
if((mes==10 || mes==11) || (mes==9 && dia>=23) || (mes==12 && dia<=20)) /* IF do OUTONO */
{
printf("A estacao atual e OUTONO\n\n"); system("PAUSE"); return 0;
}
if((mes==1 || mes==2) || (mes==12 && dia>=21) || (mes==3 && dia<=20)) /* IF do INVERNO */
{
printf("A estacao atual e INVERNO\n\n"); system("PAUSE"); return 0;
}
}

if(hemisferio==2) /* Aqui ele verifica se é HEMISFÉRIO SUL, se sim ele entra nos IF's abaixo */
{
if((mes==4 || mes==5) || (mes==3 && dia>=21) || (mes==6 && dia<=20)) /* IF do OUTONO */
{
printf("A estacao atual e OUTONO\n\n"); system("PAUSE"); return 0;
}
if((mes==7 || mes==8) || (mes==6 && dia>=21) || (mes==9 && dia<=22)) /* IF do INVERNO */
{
printf("A estacao atual e INVERNO\n\n"); system("PAUSE"); return 0;
}
if((mes==10 || mes==11) || (mes==9 && dia>=23) || (mes==12 && dia<=20)) /* IF da PRIMAVERA */
{
printf("A estacao atual e PRIMAVERA\n\n"); system("PAUSE"); return 0;
}
if((mes==1 || mes==2) || (mes==12 && dia>=21) || (mes==3 && dia<=20)) /* IF do VERAO */
{
printf("A estacao atual e VERAOO\n\n"); system("PAUSE"); return 0;
}
}
system("PAUSE");
return 0;
}

Só usei os recursos que você usou. O problema tava na lógica dos seus IF's, não consigui entender muita coisa.

Não vi você usando, mas você conhece a diferença de "=" e "==" ?

"=" é uma atribuição, e "==" é uma checagem;

Exemplo 1: "mes = 6", aqui você atribui o valor 6 a variável mes.

Exemplo 2: "mes==6", aqui você confere se a variavel mes tem o valor 6 >>>> if(mes==6) /* Se mes for igual a 6 */

Se tiver mais dúvidas só postar ai (sou iniciante em C, comecei o curso no meio de março, até agora não sei muita coisa, só o básicão mesmo... [printf, scanf, if, switch, break, for]

Link para o comentário
Compartilhar em outros sites

valeu RHBH.

Olha existe alguma forma de colocar um return no final da função que retorne para a primeira etapa, aquela que você escolhe o hemisfério? Eu estou apanhando um pouco com essa função return, não sei direito para que ela serve.

a função return nao serve pra retornar a um ponto do programa e sim para retornar um valor, se você quer repetir o programa chame a função main novamente.

Link para o comentário
Compartilhar em outros sites

Silas! Então, me disseram que tem vários modos.

Que eu aprendi, somente o "goto" (que o professor disse que não aceita, e blablabla... q pode entrar em loop e tudo mais).

Bom mas, funciona assim:

Eu crio um ponto daonde quero voltar ( sintaxe= nome: ) e depois invoco esse ponto com o comando goto ( sintaxe= goto nome; )

Exemplo:


#include <stdlib.h>
#include <stdio.h>

int main()
{
restart:
printf("Hello World");
goto restart;

system("PAUSE");
return 0;
}

No exemplo, o nome do ponto que criei foi "restart", e o como pode ver, neste caso o programa está em loop, porém eu ja usei esse comando goto, com um system("cls"); para "reiniciar" o programa em caso do usuario digitar uma variavel inválida, segue o exemplo do código:

Esse aqui é dum programinha pra calcular raízes..


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double x,raiz;
int opcao,restart;

int main(int argc, char *argv[])
{
printf("Calculadora de RAIZES | Por: Rafael Hipolito.\n");

restart1: /* goto restart1 | Caso a pessoa insira um número inválido */

printf("________________________________________________________________________________"); /* Número a ser calculada a raíz */
printf("\nInsira o numero (nao utilize virgulas, SOMENTE pontos; ate SEIS casa decimais): "); scanf("%lf",&x);

restart2: /* goto restart2 | Caso a pessoa insira uma opcao de raiz inválida */

printf("________________________________________________________________________________");

if(x<0)
{
printf("\nATENCAO!! Numeros negativos nao possuem raiz real.\n\n");

printf("Deseja corrigir o numero? Digite \"1\" para corrigir, qualquer outra coisa para sair\n");
scanf("%d",&restart);
if(restart==1)
{
system("cls");
goto restart1; /* Erro 1 (Número inválido) */
}
else
{
return 0;
}

}

printf("\nQual raiz deseja calcular? [2]=Quadrada [3]=Cubica [4]=Quarta [5]=Quinta\n"); /* Opção de Raíz */
scanf("%u",&opcao);
printf("________________________________________________________________________________\n");

if(opcao<2 || opcao>5)
{
printf("ATENCAO!! voce digitou uma OPCAO INVALIDA.\n\n");

printf("Deseja corrigir o opcao? Digite \"1\" para corrigir, qualquer outra coisa para sair\n");
scanf("%d",&restart);
if(restart==1)
{
system("cls");
goto restart2; /* Erro 2 (Raíz inválida) */
}
else
{
return 0;
}

}
if(opcao==2)
{
raiz = pow(x,1.0/2.0); /* Raíz Quadrada */
printf("Raiz quadrada de %.6lf = %.16lf",x,raiz);
}
if(opcao==3)
{
raiz = pow(x,1.0/3.0); /* Raíz Cúbica */
printf("Raiz cubica de %.6lf = %.16lf",x,raiz);
}
if(opcao==4)
{
raiz = pow(x,1.0/4.0); /* Raíz Quarta */
printf("Raiz quarta de %.6lf = %.16lf",x,raiz);
}
if(opcao==5)
{
raiz = pow(x,1.0/5.0); /* Raíz Quinta */
printf("Raiz quinta de %.6lf = %.16lf",x,raiz);
}

printf("\n________________________________________________________________________________\n");
system("PAUSE");
return 0;
}

Link para o comentário
Compartilhar em outros sites

"goto" se não me engano, ele é bem antigo, e é muito não recomendado o uso, pois ele deixa o código bastante confuso, dai pode ocasionar erro...Há vários jeitos para fazer esse "retorno" que você quer...Da pra fazer algo assim, bem simples com um "switch" por exemplo xD

Link para o comentário
Compartilhar em outros sites

Quanto a função "return", ela é pra finalizar o programa, pelo que sei, o número depois do return é usado para indicar algum erro; por exemplo, eu poderia criar um IF onde se no meu programa de raíz fosse inserido um numero negativo (nao tem raiz real), ele daria o comando return 1; este numero 1 indicaria um erro, que no caso, o programador do programa teria de lembrar o que era o "erro 1" no programa dele, por padrão o return vale 0 se não me engano (o programa foi executado sem nenhum erro)

Eu acredito que seja assim, se tiver algo errado me corrijam por favor! também estou aprendendo.

Link para o comentário
Compartilhar em outros sites

"goto" se não me engano, ele é bem antigo, e é muito não recomendado o uso, pois ele deixa o código bastante confuso, dai pode ocasionar erro...Há vários jeitos para fazer esse "retorno" que você quer...Da pra fazer algo assim, bem simples com um "switch" por exemplo xD

foi o q me disseram ^^, mas nao tenho perfeicao ainda no uso de switch... to treinando ainda, me disseram que ele é otimo pra odernar os IF's

Link para o comentário
Compartilhar em outros sites

1. goto costuma causar erros nos programas.

2.return não é só pra indicar erros, você pode retornar o valor de uma conta feita em uma função para a main.

3.você pode pedir pro usuario se quer ou n reiniciar o programa e fazer um if (letra == 's') main();

4. Pode ser feito também com switch ou com while(a função inteira dentro de um while)

Link para o comentário
Compartilhar em outros sites

Obrigado Task, ajudou bastante.

Ainda nao cheguei nessa parte e criar outros "não sei o nome" além do main (tipo os sub-main).

Todos falaram mal do goto até agora rsrs, há alguma situação específica em que o goto é a unica solução viável?

Link para o comentário
Compartilhar em outros sites

Nunca tive problemas com goto...

Chamar main(); de novo só faz crescer a pilha de chamada de função...

Sem falar no gasto de memória totalmente desnecessário...

Não se ofenda, mas eu acho isso uma tremenda burrice...

Porque ninguém indicou o uso do while?? É o mais simples para fazer isso...

Link para o comentário
Compartilhar em outros sites

Eu tenho outra duvida, se eu retornar para a função main usando um if ou um while vou perde os dados já incluidos no programa???

ex: criei um programa que cadastra produtos e clientes, depois usando um comando retornei a função main, os dados que já foram inseridos irão ficar salvos ou não??

Link para o comentário
Compartilhar em outros sites

Eu tenho outra duvida, se eu retornar para a função main usando um if ou um while vou perde os dados já incluidos no programa???

ex: criei um programa que cadastra produtos e clientes, depois usando um comando retornei a função main, os dados que já foram inseridos irão ficar salvos ou não??

return main();

main();

Se você fez um desses dois no seu programa, não.

Link para o comentário
Compartilhar em outros sites

Uma duvida sobre esse programa: Porque ele fechou o programa com o "system("PAUSE");" ?

Há um nececidade disso? O que isso faz?

Ao meu ver o programa rodava sem isso... Obrigado aee quem me ajudar!!

No Linux não tem a necessidade realmente, mas programando em Windows, se você não colocar um system("pause") ou um getchar(), a tela do console roda tão rapidamente que nem dá pra ver nada. Adicionando essas intruções, ele para o programa e espera por uma entrada, assim funcionando normalmente.

Tente fazer na prática em Windows e você entenderá.

Link para o comentário
Compartilhar em outros sites

Como é que faço para retornar e não perder os dados??

int main()
{
int x=1;
/* Declare aqui todas as outras variáveis também*/

while(x==1)
{

/* TUDO que você quiser repetir aqui dentro.
Para encerrar o programa, atribua qualquer valor diferente de 1 a x */

}

getchar();
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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!