csgoratto 0 Denunciar post Postado Novembro 14, 2016 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 PARPAR: 4 PARIMPAR: 1 IMPARIMPAR: 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
Nefisto 0 Denunciar post Postado Novembro 14, 2016 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
csgoratto 0 Denunciar post Postado Novembro 16, 2016 Em 14/11/2016 at 17:29, Nefisto disse: 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