DifusioN Postado Setembro 5, 2009 Denunciar Share Postado Setembro 5, 2009 (editado) Fala povo, seguinte, to com um programa que está perfeito, rodando redondinho xD....Mas fui colocar algumas mensagens de erro na digitação de algumas opções e dai que apareceu o problema.Não sei como em algum momento ainda estão sobrando lixos na digitação...Analisem ai o trecho e se alguém poder me ajudar eu agradeceria muito!char sex; do { printf("\nDigite seu sexo(M-Masculino/F-Feminino: "); getchar(); //limpa a sujeira sex=getchar(); if (sex!='F' && sex!='f' && sex!='M' && sex!='m') printf("Sexo invalido, digite novamente!"); }while(sex!='S' && sex!='s' && sex!='M' && sex!='m');Depois do primeiro teste dar verdadeiro e ele voltar a perguntar o sexo, o programa não está mais identificando as respostas certas, como F e M...Abraçoss e aguardo respostas... Editado Setembro 5, 2009 por DifusioN Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Arrk Postado Setembro 6, 2009 Denunciar Share Postado Setembro 6, 2009 Cara, é o seguinte, presumo que você seja usuário de alguma distro linux, hehehe, justamente pelo fflush() não ter funcionado. No linux a função que realmente limpa o buffer é a __fpurge():#include <stdio.h> #include <stdio_ext.h> #include <ctype.h> #include <stdlib.h> int main(void){ char sex; do { printf("Digite seu sexo(M-Masculino/F-Feminino): "); __fpurge(stdin); sex = getchar(); sex = toupper(sex); if(sex != 'F' && sex != 'M') printf("Sexo invalido, digite novamente!\n"); } while(sex != 'F' && sex != 'M'); printf("sexo: %s\n", sex == 'F' ? "feminino" : "masculino"); return 0; }A condição do seu laço do-while também estava errada, porque em vez de 'F', você colocou 'S'. Pra não precisar escrever uma condição muito grande, use a função toupper() da ctype.h pra transformar a letra em maiúscula.Espero ter ajudado,[]'s Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 DifusioN Postado Setembro 6, 2009 Autor Denunciar Share Postado Setembro 6, 2009 (editado) Não véio, sou usuário Windows....Como você pode ver mesmo utilizando o getchar da errado...e a idéia é limpar o que recebe antes, que tem um scanf no meu programa mas não aparece aii....Sobre transformar em maiúscula eu já sabia, era um passo depois desse programa ai.....xD.....mas irei colokar antes....Mas mesmo trocando o s/S por f/F ainda está dando errado......Tem algo errado...vou postar o programa todo...da uma zoiada://Cadastro de candidatos - 31/08/09 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int masc=0, fem=0, candh=0,candf=0, tcandid=0, insc, idade, opcao; float idademed=0, porch=0, porcf=0; char sex, exp; printf("\t* * * Menu de Opcoes * * *\n"); printf("Escolha a Opcao desejada: \n"); printf("1 - Adicionar um candidato\n"); printf("2 - Sair\n"); scanf("%d", &opcao); do { if (tcandid >= 1) system("CLS"); //Limpa a tela do Pront de Comando switch (opcao) { case 1: printf("Digite o numero de inscricao: "); scanf("%d", &insc); fflush(stdin); printf("\nDigite a idade: "); scanf("%d", &idade); fflush(stdin); do { printf("\nDigite seu sexo(M-Masculino/F-Feminino): "); getchar(); //limpa a sujeira de teclas do teclado(do buffer do teclado) sex=getchar(); // Le o caracter e salva na variável sex if (sex!='F' && sex!='f' && sex!='M' && sex!='m') // Testa, se for verdade, da a mensagem de erro printf("Sexo invalido, digite novamente!"); }while(sex!='F' && sex!='f' && sex!='M' && sex!='m'); //enquanto for verdade vai fikar requisitando o sexo if (sex>='a' && sex<='z') //testa se é minúscula e transforma em Maiúscula sex-=32; if(sex=='M') //Soma quantidade de sexos dos candidatos masc=masc+1; else if (sex=='F') fem=fem+1; getchar(); //limpa a sujeira de teclas do teclado printf("\nPossui experiencia?(S/N): "); exp=getchar(); if (exp>='a' && exp<='z') //testa se é minúscula e transforma em Maiúscula exp-=32; if (idade > 18 && sex=='M' && exp=='S') // Testar a quantidade de candidatos (homens/mulheres), maiores de 18 anos e que tenham experiência profissional. candh=candh+1; else if (idade > 18 && sex=='F' && exp=='S') candf=candf+1; tcandid=tcandid+1; //soma o total de candidatos a cada laço idademed=(idademed+idade)/tcandid; //Media das idades porch=(masc*100)/tcandid; porcf=(fem*100)/tcandid; break; case 2: exit (0); //Sai do Programa default: printf("Opcao Invalida!"); } printf("Adicionar outro Candidato?(1 - Sim/2 - não)"); scanf("%d", &opcao); }while(opcao==1); printf("-----------------------//-----------------------"); printf("\n\nIdade Media: %.0f", idademed); printf("\n\nTotal de Homens: %d, Mulheres: %d", masc, fem); printf("\n\nCandidatos Homens, maiores de 18 anos com experiencia: %d",candh); printf("\n\nCandidatas Mulheres, maiores de 18 anos com experiencia: %d",candf); printf("\n\nTotal de Candidatos: %d",tcandid); printf("\n%.0f %% Homens e %.0f %% Mulheres\n\n", porch, porcf); system("PAUSE"); return 0; }E o que quer dizer essa sua linha aki do seu programa:" printf("sexo: %s\n", sex == 'F' ? "feminino" : "masculino"); " ?Me explica ela aiAbraçoss e espero respostas! =D Editado Setembro 6, 2009 por DifusioN Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Arrk Postado Setembro 7, 2009 Denunciar Share Postado Setembro 7, 2009 (editado) DifusioN, beleza então. Dando uma olhada no seu código, só pra fazer algumas observações:Nesse treço do seu código:printf("Digite o numero de inscricao: "); scanf("%d", &insc); fflush(stdin); printf("\nDigite a idade: "); scanf("%d", &idade); fflush(stdin); você não precisa limpar o buffer antes de ler um inteiro, basta que você o faça depois de ler um char, pois esse pequeno transtorno de dados sobrando pra próxima leitura estão relacionados a algumas funções que lêem char (como gets(), getchar(), etc). Com a função getchar() você não consegue limpar o buffer porque pra limpar o buffer com, ou seja, ler todos os caracteres que estão na fila esperando por uma leitura, você teria que saber quantos caracteres estão esperando, então o correto seria usar uma função específica pra limpar o buffer, como o fflush() ou __fpurge(), nenhuma das duas está funcionando ? E com relação a linha é simples: printf("sexo: %s\n", sex == 'F' ? "feminino" : "masculino"); Não sei se você conhece, mas no C há esse operador condicional ternário que funciona como um if e else numa linha só, a linha em cima funciona da mesma maneira que isso aqui: if(sex == 'F') printf("sexo feminino\n"); else printf("sexo masculino");Espero que tenha ajudado,[]'s Editado Setembro 7, 2009 por Arrk Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 DifusioN Postado Setembro 8, 2009 Autor Denunciar Share Postado Setembro 8, 2009 (editado) Po cara, valeu por estar me ajudando ai....funcionou aki de boaa......valeu mesmo em!!!Mas tipo, me explica melhor essa parte aki ó:Com a função getchar() você não consegue limpar o buffer porque pra limpar o buffer com, ou seja, ler todos os caracteres que estão na fila esperando por uma leitura, você teria que saber quantos caracteres estão esperando,E sobre esse operador condicional eu não conhecia não, valeu por me dar a dica ai!Abraçosssss Editado Setembro 8, 2009 por DifusioN Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Arrk Postado Setembro 11, 2009 Denunciar Share Postado Setembro 11, 2009 (editado) As leituras de chars em geral são bufferizadas, ou seja, ficam em um buffer a espera de uma função de leitura para apanhá-los. Na frase que você citou eu só quis dizer que, como você tava tetando limpar o buffer com a função getchar(), você obrigatoriamente precisava saber quantos caracteres estavam esperando leitura, pra que assim, você possa colocar getchar()'s na mesma quantidade, mas isso seria um tanto absurdo, você teria que lotar o código com inúmeros getchar()'s. Então use uma das duas funções aqui descritas pra limpar o buffer: fflush() ou __fpurge(). E outro detalhe, na frase houve um erro de digitação.Com a função getchar() você não consegue limpar o buffer porque pra limpar o buffer com, ou seja, ler todos os caracteres que estão na fila esperando por uma leitura, você teria que saber quantos caracteres estão esperandoPerceba que quando eu falo "buffer com" eu queria dizer na verdade "buffer com ela, (...)", desculpe por isso, hehehe. E por último, a questão do operador ternário, ele é só uma sentença if-else em uma só linha, a sintaxe é aquela do código, não tem nenhum complicação ;DEspero que tenha clareado mais as coisas. Se tiver mais alguma dúvida, pode perguntar.Abraços. Editado Setembro 11, 2009 por Arrk Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
DifusioN
Fala povo, seguinte, to com um programa que está perfeito, rodando redondinho xD....
Mas fui colocar algumas mensagens de erro na digitação de algumas opções e dai que apareceu o problema.
Não sei como em algum momento ainda estão sobrando lixos na digitação...
Analisem ai o trecho e se alguém poder me ajudar eu agradeceria muito!
Depois do primeiro teste dar verdadeiro e ele voltar a perguntar o sexo, o programa não está mais identificando as respostas certas, como F e M...
Abraçoss e aguardo respostas...
Editado por DifusioNLink para o comentário
Compartilhar em outros sites
5 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.