Ir para conteúdo

Arquivado

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

csgoratto

Dúvidas de um iniciante!

Recommended Posts

Olá galera, tudo bem?

Comecei a estudar a linguagem c++ e estou com algumas dúvidas, podem me ajudar?

Lá vai:

1. No momento de criar o main ( http://d.pr/i/17fjU ), qual tipo devo escolher? void main(), int main()? O que preciso "me perguntar" para colocar o tipo correto.

2. Estou fazendo um exercício: "Ler quatro números inteiros, calcular a soma dos números pares e a soma dos números ímpares". Já fiz todo o algoritmo e até usei Struct. Porém, sempre é passado o valor "1" junto do vetor. Veja: http://d.pr/i/hGXf .

Eu digitei 1 2 3 4, então era para aparecer:

PAR: 2 PAR
PAR: 4 PAR
IMPAR: 1 IMPAR
IMPAR: 3 IMPAR

Eu não sei porque, aparece o valor 1 no meio e a soma vem errado. Pois a soma dos pares era para vir 6.
Veja o script: http://d.pr/n/l5nI

Muito obrigado!!

Compartilhar este post


Link para o post
Compartilhar em outros sites
No chat do forum existe a opção "<>" q é onde sao colocados os codigos, evite colocar links, pois se daki alguns meses o seu link sair do ar, a sua pergunta nao podera mais ser usada para sanar duvidas de outras pessoa. Favor editar e arrumar.
Ola csgoratto, meu nome é Joao e eu vou tentar ajudar com as suas duvidas.
1- Na linguagem C a funcao main, assim como outras funcoes, pode ou nao ter um tipo de retorno, porem ao contrario das outras funcoes, o retorno da main é enviado para o processo chamador, que é geralmente o SO. Devolver um valor em main() é como fazer uma chamada a funcao exit(), que quando explicito indica que ocorreu tdo bem, exit(0), ou que ouve algum problema, exit(1). Se o void é utilizado na funcao main, o usuario perde o controle de se o programa foi executado corretamente ou n, usar o int main() sem um valor de retorna devolve um valor tecnicamente indefinido para o SO.
Resumindo, esse contato entre SO e o MAIN é usado por questoes de portabilidade, porem, "...de acordo com o padrao ANSI, a funcao MAIN() devolve um inteiro para o processo chamador...", por isso é melhor pegar o habito de devolver um int na funcao principal ;P
*Informação entre aspas retiradas do livro -C completo e total, Herbert Schildt-
2- O seu codigo nao esta errado, adicione esta parte depois de instanciar as variaveis:
for(int i = 0; i <= MAX; i++)
{
   numero[i] = 0;
   structimpar[i].numeroimpar = 0;
   structpar[i].numeropar = 0;
   somaPar = 0;
   somaImpar = 0;
}

O erro do seu codigo é basicamente sua confiança em seu compilador, e olha q é o devc hehe, se você quiser fazer o teste, copia e coloca o seu codigo em programas diferentes, e você vai ver q os resultados sao diferente, se quiser saber mais sobre oq esta acontecendo, faça uma pesquisa na internet sobre "lixo de memoria".

Sempre evite esperar que o compilador faça o trabalho do programador. =D

DICAS:
1- Voce criou uma constante 'MAX = 4', um vetor q vai de 0-4 e um 'i = 1', e trabalha com 4 digitos. Só como dica, nao faça isso, é horrivel para manutenção, e extremamente sujeito a erros.
ERRADO:
numero[5];

for(int i = 1; i <= MAX; i++){
cout << "Digite o "<< i <<" numero : ";
cin >> numero;
}

CERTO:

numero[4];

for(int i = 0; i < MAX; i++)

{

...

}

2- LINHA 51 E 52

//while (structpar[j].numeropar > 0)

//somaPar = somaPar + structpar[j].numeropar;

Voce deduzir q todo "int" vai ser automaticamente atribuido com o valor 0, é uma pratica extremamente ruim, e pode te levar a comportamentos inesperados, você nem sempre vai trablhar com compiladores e/ou linguagens q fazem isso, entao procure sempre inicializar suas variaveis, e nunca supor o valor q esta nela.

--Seu codigo possui outras pessimas praticas, destaquei apenas as mais importantes--

Espero ter ajudado, GLHF

Compartilhar este post


Link para o post
Compartilhar em outros sites
No chat do forum existe a opção "<>" q é onde sao colocados os codigos, evite colocar links, pois se daki alguns meses o seu link sair do ar, a sua pergunta nao podera mais ser usada para sanar duvidas de outras pessoa. Favor editar e arrumar.
Ola csgoratto, meu nome é Joao e eu vou tentar ajudar com as suas duvidas.
1- Na linguagem C a funcao main, assim como outras funcoes, pode ou nao ter um tipo de retorno, porem ao contrario das outras funcoes, o retorno da main é enviado para o processo chamador, que é geralmente o SO. Devolver um valor em main() é como fazer uma chamada a funcao exit(), que quando explicito indica que ocorreu tdo bem, exit(0), ou que ouve algum problema, exit(1). Se o void é utilizado na funcao main, o usuario perde o controle de se o programa foi executado corretamente ou n, usar o int main() sem um valor de retorna devolve um valor tecnicamente indefinido para o SO.
Resumindo, esse contato entre SO e o MAIN é usado por questoes de portabilidade, porem, "...de acordo com o padrao ANSI, a funcao MAIN() devolve um inteiro para o processo chamador...", por isso é melhor pegar o habito de devolver um int na funcao principal ;P
*Informação entre aspas retiradas do livro -C completo e total, Herbert Schildt-
2- O seu codigo nao esta errado, adicione esta parte depois de instanciar as variaveis:
for(int i = 0; i <= MAX; i++)
{
   numero[i] = 0;
   structimpar[i].numeroimpar = 0;
   structpar[i].numeropar = 0;
   somaPar = 0;
   somaImpar = 0;
}

O erro do seu codigo é basicamente sua confiança em seu compilador, e olha q é o devc hehe, se você quiser fazer o teste, copia e coloca o seu codigo em programas diferentes, e você vai ver q os resultados sao diferente, se quiser saber mais sobre oq esta acontecendo, faça uma pesquisa na internet sobre "lixo de memoria".

Sempre evite esperar que o compilador faça o trabalho do programador. =D

DICAS:
1- Voce criou uma constante 'MAX = 4', um vetor q vai de 0-4 e um 'i = 1', e trabalha com 4 digitos. Só como dica, nao faça isso, é horrivel para manutenção, e extremamente sujeito a erros.
ERRADO:
numero[5];

for(int i = 1; i <= MAX; i++){
cout << "Digite o "<< i <<" numero : ";
cin >> numero;
}

CERTO:

numero[4];

for(int i = 0; i < MAX; i++)

{

...

}

2- LINHA 51 E 52

//while (structpar[j].numeropar > 0)

//somaPar = somaPar + structpar[j].numeropar;

Voce deduzir q todo "int" vai ser automaticamente atribuido com o valor 0, é uma pratica extremamente ruim, e pode te levar a comportamentos inesperados, você nem sempre vai trablhar com compiladores e/ou linguagens q fazem isso, entao procure sempre inicializar suas variaveis, e nunca supor o valor q esta nela.

--Seu codigo possui outras pessimas praticas, destaquei apenas as mais importantes--

Espero ter ajudado, GLHF

Olá Nefisto, só tenho a te agradecer.

Muito obrigado por todo o empenho em me ajudar.

Todo sucesso do mundo pra voce, um abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.