Hellsius 0 Denunciar post Postado Julho 5, 2011 Como sou iniciante em programação e logicamente também na linguagem C++ comecei a fazer programas simples como este que fis de "Controle de Gastos", logicamente não esta totalmente terminado, quero melhora-lo e coisa e tale. Bom, o meu programa compila sem apresentar nenhum erro e quando estou entrando com as informações de gastos como por exemplo quando chega na parte em que ele pede os gastos extras de algo que eu tenho que pagar, ao inserir estes dados e depois responder "n" dizendo que não tem mais gastos extras o programa apresenta uma menssagem em baixo dizendo "erro de segmento" e pede para apertar enter para sair. Obs: estou compilando os meus programas no CODE::BLOCKS 8.02. Segue o fonte abaixo: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <ctype.h> // Realiza um controle de gastos referente a sua renda mensal. int main() { float aluguel, luz, agua, telefone, totalprestacao=0, totalextra=0, totalrenda=0, totalgastos, totalgeral; float prestacao[100], extra[100], renda[100]; int i=0, r=0, x, n, xprestacao, xextra, xrendas; /* i, r, x, n (contadores), xprestacao, xextra, xrendas(conta a quantidade de prestação, gasto extra e renda informados pelo usuario) */ char resp1='S', resp2='S'; //Armazena a resposta de "s" para continuar e "n" para sair // Gastos printf("Informe os gastos mensais\n"); printf("Aluguel: "); scanf("%f", &aluguel); printf("Luz: "); scanf("%f", &luz); printf("Agua: "); scanf("%f", &agua); printf("Telefone: "); scanf("%f", &telefone); while(toupper(resp1)=='S') { printf("Informe uma prestacao: "); scanf("%f", &prestacao[i]); //informe uma prestação a ser paga i++; xprestacao++; //i (contador do vetor), xprestacao(conta a quantidade de prestações informadas pelo usuário) printf("Deseja continuar (S-Sim, N-Nao): "); scanf("%s", &resp1); //pergunta se deseja continuar informando mais prestações a serem pagas } while(toupper(resp2)=='S') { printf("Informe um gasto extra: "); scanf("%f", &extra[r]); //Informe outro gasto que não seja os que já foram referidos r++; xextra++; //r(contador do vetor extra), xextra(conta a quantidade de gastos extras informados pelo usuario) printf("Deseja continuar (S-Sim, N-Nao): "); scanf("%s", &resp2); } // Soma dos Gastos for(x=0; x<xprestacao; x++) //xprestacao(quantidade de prestações que já foram informadas pelo usuário) { totalprestacao = totalprestacao+prestacao[x]; // incremento de todas as prestações que já foram informadas com seus elementos para a soma deles mesmo. } for(x=0; x<xextra; x++) //xextra(quantidade de gastos extras que já foram informados pelo usuário) { totalextra = totalextra+extra[x]; // incremento de todos os gastos extras. } totalgastos = totalprestacao+totalextra+aluguel+luz+agua+telefone; /*Total de Gastos */ // Rendas printf("Informe o numero de rendas a ser declarada: "); scanf("%d", &xrendas); for(x=0, n=1; x<xrendas; x++, n++) { printf("Informe a %d renda", n); scanf("%f", &renda[x]); } // Soma das Rendas for(x=0; x<xrendas; x++) { totalrenda = totalrenda+renda[x]; } // Subtração de toda a renda menos todos os gastos. totalgeral = totalrenda-totalgastos; printf("A sua Renda Final eh de: %.2f", totalgeral); } Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Julho 5, 2011 Olá! Só para te tirar uma dúvida: você está programando em C, não C++. Agora, sobre o programa, pode ter a ver você estar usando o operador %s para pegar um caracter, quando na verdade usaria um %c. Isso pode gerar um overflow na memória quando o scanf substitui o próximo local na memória com '\0' para formar uma pseudo-string. Tente substituir e veja se resolve. Outra coisa: tem jeitos melhores de fazer menu do que esse... Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
Hellsius 0 Denunciar post Postado Julho 7, 2011 Coloquei %c em vez de %s, mas não adiantou e ainda piorou o programa pois ele mostra a saida desta forma: Deseja continuar (S-Sim, N-Nao): Informe um gasto extra: "cursor piscando nesta parte" Ele exibiu Estas duas frases juntas. O erro tem que ser muito bobo, por que eu não acho, kkk Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Julho 7, 2011 Olá! Leia esse tópico sobre a sujeira no buffer de entrada: http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/ Agora, você compila esse programa com o gcc (ou MinGW, Cygwin)? Se sim, use a seguinte instrução de compilação para compilar mostrando o máximo de erros: gcc -Wall -Wextra -Werror -o /* OUTPUT */ /* SOURCE FILES */ Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
Hellsius 0 Denunciar post Postado Julho 7, 2011 Obrigado pela dica, eu já tinha lido sobre o fflush. Então já tentei colocar em todos os scanf's %*c nos scanfs. ex: scanf("%s*%c", &resp1); scanf("%f*%c", &prestacao); E assim por diante. Mas o mesmo erros "erro de segmento" continua. Obs: Estou usando o CODE::Block 8.02 para compilar o programa. Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Julho 7, 2011 Você usa o Code::Blocks em que sistema operacional? Normalmente ele funciona com o GCC. Veja se adiciona essas opções ao compilador e compila novamente, vai dar um tanto de erros... Se a opção não existir, pode pular, mas considere todos os warnings e resolva todos. Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
Hellsius 0 Denunciar post Postado Julho 9, 2011 Utilizo o Linux Ubuntu 10.4. Tentei rodar o comando que me passou pelo terminal por que não sei onde posso inseri-lo no Code:blocks. Então a saída mostrada foi esta: root@lap:~# gcc -Wall -Wextra -Werror -o /home/fabricio/Área\ de\ Trabalho/Controle\ de\ Gastos.cpp /home/fabricio/Área\ de\ Trabalho/Controle\ de\ Gastos.cpp /tmp/ccJ2xqki.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status root@lap:~# Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Julho 9, 2011 Tente fazer assim: Entre na pasta em que está o .cpp no terminal (usando o comando cd). Depois, rode: $ gcc -Wall -Wextra -Werror -o controle_de_gastos controle_de_gastos.cpp o $ só simboliza que você não precisa estar como root, só como usuário normal já basta. E corrija os erros. Depois veja se resolve. Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
Hellsius 0 Denunciar post Postado Julho 9, 2011 Não sei o que estou fazendo de errado, fiz diversas tentativas, veja: fabricio@lap:~/Área de Trabalho$ gcc -Wall -Wextra -Werror -o controle_de_gastos controle_de_gastos.cpp gcc: controle_de_gastos.cpp: Arquivo ou diretório não encontrado gcc: no input files fabricio@lap:~/Área de Trabalho$ gcc -Wall -Wextra -Werror -o Controle_de_Gastos Controle_de_Gastos.cpp gcc: Controle_de_Gastos.cpp: Arquivo ou diretório não encontrado gcc: no input files fabricio@lap:~/Área de Trabalho$ gcc -Wall -Wextra -Werror -o "Controle de Gastos" "Controle de Gastos.cpp" /tmp/ccbDbzqJ.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status fabricio@lap:~/Área de Trabalho$ gcc -Wall -Wextra -Werror -o Controle\ de\ Gastos Controle\ de\ Gastos.cpp /tmp/ccLjufAc.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status fabricio@lap:~/Área de Trabalho$ gcc -Wall -Wextra -Werror -o controle_de_ gastos Controle\ de\ Gastos.cpp gcc: gastos: Arquivo ou diretório não encontrado fabricio@lap:~/Área de Trabalho$ gcc -Wall -Wextra -Werror -o controle_de_ gastos "Controle de Gastos.cpp" gcc: gastos: Arquivo ou diretório não encontrado fabricio@lap:~/Área de Trabalho$ Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Julho 10, 2011 Olá! Qual o nome do arquivo? gcc -Wall -Wextra -Werror -o "Controle de Gastos" "Controle de Gastos.cpp" Parece que esse é que é o certo... mas tenta o seguinte: g++ -Wall -Wextra -Werror -o "Controle de Gastos" "Controle de Gastos.cpp" Vou dar uma olhada no teu código pra ver como tá... depois te falo o que mudar... Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
Hellsius 0 Denunciar post Postado Julho 11, 2011 O nome do arquivo é: Controle de Gastos.cpp tentei o seguinte: root@lap:/home/fabricio/Dropbox/CPP's Desenvolvimento# gcc -Wall -Wextra -Werror -o "Controle de Gastos" "Controle de Gastos.cpp" /tmp/ccV76dop.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status e root@lap:/home/fabricio/Dropbox/CPP's Desenvolvimento# g++ -Wall -Wextra -Werror -o "Controle de Gastos" "Controle de Gastos.cpp" root@lap:/home/fabricio/Dropbox/CPP's Desenvolvimento# Ok, quando verificar o código é só postar que vou estar aqui. Obrigado pela ajuda amigo. Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Julho 11, 2011 root@lap:/home/fabricio/Dropbox/CPP's Desenvolvimento# g++ -Wall -Wextra -Werror -o "Controle de Gastos" "Controle de Gastos.cpp"root@lap:/home/fabricio/Dropbox/CPP's Desenvolvimento# O código compilou sem problema '-' Olah pra você ver. Execute: ./"Controle de Gastos.cpp" Ele compilou e rodou legal aqui... Tem algum erro caso fizer alguma coisa? Se sim, me mande exatamente quais passos para reproduzir o erro... porque se não fica complicado... Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
Hellsius 0 Denunciar post Postado Julho 11, 2011 Veja: root@lap:/home/fabricio/Dropbox/CPP's Desenvolvimento/Controle de Gasto# ./"Controle de Gastos" Informe os gastos mensais Aluguel: 678 Luz: 200 Agua: 30 Telefone: 200 Informe uma prestacao: 110 Deseja continuar (S-Sim, N-Nao): n Informe um gasto extra: 20 Deseja continuar (S-Sim, N-Nao): n Falha de segmentação root@lap:/home/fabricio/Dropbox/CPP's Desenvolvimento/Controle de Gasto# Depois que informo os gastos extras e coloco "n" para sair prosseguir com o programa aparece "Falha de segmentação" e executo no Code::Blocks acontece também a mesma coisa. Compartilhar este post Link para o post Compartilhar em outros sites
Hellsius 0 Denunciar post Postado Julho 14, 2011 Conseguiu achar alguma coisa? Compartilhar este post Link para o post Compartilhar em outros sites
Dinho19sp 0 Denunciar post Postado Julho 14, 2011 Conseguiu achar alguma coisa? É amigao todo empenhado em te ajudar...rss eu vou colaborar; compilei seu codigo no Devc++, mudei um pouco uma parte.. mas o seu erro esta na logica da soma faz um teste de mesa pra ver o que acontece... eu ainda não fiz pq to no trampo... mas vou ver isso certim pra você. haaa inclui a biblioteca conio e muda sua opcoes assim: do { printf("\nInforme uma prestacao: "); scanf("%f", &prestacao[i]); //informe uma prestação a ser paga i++; xprestacao++; //i (contador do vetor), xprestacao(conta a quantidade de prestações informadas pelo usuário) printf("Deseja continuar (S-Sim, N-Nao): "); resp1 = getche(); //pergunta se deseja continuar informando mais prestações a serem pagas }while(toupper(resp1)=='S'); do { printf("\nInforme um gasto extra: "); scanf("%f", &extra[r]); //Informe outro gasto que não seja os que já foram referidos r++; xextra++; //r(contador do vetor extra), xextra(conta a quantidade de gastos extras informados pelo usuario) printf("Deseja continuar (S-Sim, N-Nao): "); resp2 = getche(); // Esta funcao ja aloca na memoria assim não da conflito com %c ou %s }while(toupper(resp2)=='S'); Seu erro esta aki: por no windows ele não roda... diz que houve um erro e o programa parou de funcionar: // Soma dos Gastos for(x=0; x <= xprestacao; x++) //xprestacao(quantidade de prestações que já foram informadas pelo usuário) { totalprestacao = totalprestacao+prestacao[x]; // incremento de todas as prestações que já foram informadas com seus elementos para a soma deles mesmo. } for(x=0; x <= xextra; x++) //xextra(quantidade de gastos extras que já foram informados pelo usuário) { totalextra = totalextra+extra[x]; // incremento de todos os gastos extras. } totalgastos = totalprestacao+totalextra+aluguel+luz+agua+telefone; /*Total de Gastos */ Abraços; Compartilhar este post Link para o post Compartilhar em outros sites
Hellsius 0 Denunciar post Postado Julho 15, 2011 Obrigado por ajudar um iniciante feito eu. Vou ler seu post e ja te dou uma resposta. :) Compartilhar este post Link para o post Compartilhar em outros sites
Hellsius 0 Denunciar post Postado Julho 17, 2011 Desculpe a demora por responder amigo, mas vamos ate o final. Fiz as alterações que me passou e compilou certinho sem apresentar nenhum erro. Mas quando rodei o programa, ex: "Informe os gastos mensais Aluguel:5 Luz:5 Agua:5 Telefone:5 Informe uma prestação: 5 Deseja continuar (S-Sim, N-Nao): n Informe um gasto extra:5 Deseja continuar:n " Chegando nesta parte aparece o seguinte erro "Instrução )x0040147c fez referencia a memoria 0x00234000. A memoria não pode ser read.". Obs: Compilei o programa em outro computador desta vez com o DEV-C++. Nussa amigo, não entendo o que pode estar errado.´No seu pc o programa roda certinho sem erros? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 20, 2011 Só uma pergunta: você lembrou de inicializar os contadores em 0 no bloco de declaração de variáveis, lá no início do main? Porque só precisei colocar o %c%*c e inicializar as variáveis que executou normalmente: isis@isis-opensuse:~/src/c> ./a.out Informe os gastos mensais Aluguel: 1.23 Luz: 2.34 Agua: 3.45 Telefone: 4.56 Informe uma prestacao: 5.67 Deseja continuar (S-Sim, N-Nao): n Informe um gasto extra: 9.87 Deseja continuar (S-Sim, N-Nao): n Informe o numero de rendas a ser declarada: 1 Informe a 1 renda1234.56 A sua Renda Final eh de: 1207.44 Compartilhar este post Link para o post Compartilhar em outros sites
Hellsius 0 Denunciar post Postado Julho 22, 2011 Parece que é só comigo que o programa não funciona. Então amigo isis, já olhei revisei e nada. Compartilhar este post Link para o post Compartilhar em outros sites