Ir ao conteúdo

Programa em C


Silas001

Posts recomendados

Postado

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;

}

Postado

To arrumando pra você, mas já tem coisa errada, tipo:

dia>=22 && dia<=21

Dia maior ou igual a 22 E dia menor ou igual a 21, nunca vai entrar no "THEN" deste if.

Postado

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]

Postado

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.

Postado
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.

Postado

Como é que ficaria essa função return??

Olha, se eu tiver criando um programa que possui um menu principal e varios submenus, como é que eu faço para retornar do submenu para o menu principal sem repetir todo o codigo???

Postado

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

Postado

"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

Postado

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.

Postado
"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

Postado

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)

Postado

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?

Postado

Cara, acho que não existe nenhuma situação em Linguagem de Programação que só exista uma solução viável, além disso, o goto é tão não-usado que eu acho que programadores ja se acostumaram a encontrar outras saídas.

Postado
Acho que não tem uma situação que a unica solução seja o "goto". Com uma gambiarrinha da pra fazer qualquer coisa :P

Até por que o "goto" serve para ir a uma parte pré-definida do programa,ou seja, é só transoformar essa parte em outra função e a chamá-la pela main :cool:

Postado

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...

Postado

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

Eu falei de while.. :huh:

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

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??

Postado
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.

Postado

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!!

Postado
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á.

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

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!