DifusioN 0 Denunciar post Postado Março 11, 2009 Fala Gente, Seguinte!! Estou começando agora a postar nesse forum que conheço a um bocado de tempo... Massss eu gostaria mtu de começar minha participação com um conteúdo que preste para a comunidade...mas vou começar com uma pergunta....xD Então... "O prof da facul passou o seuginte problema: Dado um número de 4 digitos, escreva um programa para apresentar o número invertido. Exemplo: 2357 ->7532" beleza, dai na sala ele deu uma dica que ajudou e mtu, que o resto da divisão de um número por 10 é o ultimo número dele, certo? beleza, dai ele falou algo de pegar o resto e salvar(o resto não lembro do ke ele falou, tava ajudando um brother). Ele também falou que não tem nada a ver com Vetor, só poderia utilizar o que ele ja passou d matéria(if else; laços "for", "while", "do...while", e %(mod)) Masssssss a questão é a seguinte: Da meneira que eu fiz está certa?Existem outras maneiras de se fazer a mesma coisa?Tem como fazer o mesmo problema para "n" números de digitos? Aqui segue o código que eu fiz: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) int NUM, NUM1, NUM2, NUM3, NUM4; printf("Digite um nu'mero natural de 4 digitos: "); scanf("%d", &NUM); if(NUM>10) { NUM1=NUM%10; NUM=NUM/10; NUM2=NUM%10; NUM=NUM/10; NUM3=NUM%10; NUM=NUM/10; NUM4=NUM%10; } printf("%d%d%d%d\n\n", NUM1,NUM2,NUM3,NUM4); system("PAUSE"); return 0; } Aqui funfou normal, mas axei simples d+ pelo que ele ja passou como laços e tal, gostaria de uma ajuda sobre como poderia resolver com laços ou se esta foi a melhor forma de ter resolvido isso....se teria como fazer algo mais automático sem declarar as variáveis NUM1,2,3,4....sei lá....me dem uma luz ai!! Estou gostando mtu de aprender C e gostaria de aprender mais ainda com vcs.. Grande abraço e falowss......!!! Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Março 11, 2009 Quer fazer com laço? Defina numeros como array: int numeros[4]; Faça o loop: int x; for(x = 0; x < 4; x++) { numeros[x] = num % 10; num /= 10; } Pra falar a verdade, sugiro que faça as divisões em uma variável secundária, assim você tem o valor inicial digitado pronto para ser usado caso queira escrever no final 2345 -> 5432. Compartilhar este post Link para o post Compartilhar em outros sites
DifusioN 0 Denunciar post Postado Março 11, 2009 Quer fazer com laço? Defina numeros como array: int numeros[4]; Faça o loop: int x; for(x = 0; x < 4; x++) { numeros[x] = num % 10; num /= 10; } Pra falar a verdade, sugiro que faça as divisões em uma variável secundária, assim você tem o valor inicial digitado pronto para ser usado caso queira escrever no final 2345 -> 5432. Da uma olhada véio: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int numeros[4], x, NUM; printf("Digite um nu'mero natural de 4 digitos: "); scanf("%d\n", &NUM); for (x = 0; x < 4; x++) { numeros[x] = NUM % 10; NUM /= 10; } printf("%d\n", numeros); system("PAUSE"); return 0; }Não estádando mtu certo não!....Eu fiz tudo certo ai? É ke não entendi mtu o que você quiz fazer e tal. Tipo, estou bem basicão em C ainda, me fala o que quer dizer declarar como "array"....seria fazer ke nem vetor de string?...ke coloka o tamanho(no caso seria as "sequencias")? E me da uma luz na questão do que você disse em fazer as divisões em uma variavel secundária......me explica melhor ai pliss... Kero entender a fundo.....sei ke pareço meio folgado e tal.....mas acredito ke para um cara aprender alguma coisa, primeiro ele tem ke entender e ver tal coisa em ação!Como é sua estrutura e sua teoria!..xD Grande abraço...valew pela ajuda e falowss Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Março 11, 2009 Sim, é um vetor, mas de ints dessa vez. Você precisa imprimir com loop também: for(x = 0; x < 4; x++) { printf("%d", numeros[x]); } Com variável secundária quis dizer copiar o valor para uma outra variável de nome diferente (atribuir com varnova = var), e realizar as operações nessa variável, deixando o valor original intacto na variável original, caso seja necessário usá-lo mais tarde. Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Março 11, 2009 Ele deu alguma restrição de como tem q ser feito o programa? pq tem como você usar uma função q inverta + com strings, + isso é o de menos. []s Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Março 11, 2009 Pois é quit, bem lembrado! Eu acho que também iria de strings... ^^ imagina só inverter: 1293819231897459827349 como int... Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Março 11, 2009 entaum uma simples chamada do strrev(*string); resolveria ;D Compartilhar este post Link para o post Compartilhar em outros sites
DifusioN 0 Denunciar post Postado Março 11, 2009 Sim, é um vetor, mas de ints dessa vez. Você precisa imprimir com loop também: for(x = 0; x < 4; x++) { printf("%d", numeros[x]); } Com variável secundária quis dizer copiar o valor para uma outra variável de nome diferente (atribuir com varnova = var), e realizar as operações nessa variável, deixando o valor original intacto na variável original, caso seja necessário usá-lo mais tarde. Putzz fundiu meu motorzinhu..xD..aUAHUaNão entendi.... Vamo com calma...xD Primeiro eu declaro as variáveis lá, que seriam o numeros[4], num e x. num seria para o numero que a pessoa digita, numeros é um vetor de inteiros com ja pré determinados 4 indices, e x é a variavel que irá mudar o valor dentro do campo [] do numeros, estou certo? Mas então pra que já determinar o valor [4] na variavel se ela mudara no "for"?.... beleza, otra coisa, na questão que você falou de imprimir também como loop...tipo, eu tentei aki e deu caca..xD Da uma olhada no meu código ai: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) int numeros[4], x, NUM; printf("Digite um nu'mero natural de 4 digitos: "); scanf("%d\n", &NUM); for (x = 0; x < 4; x++) { numeros[x] = NUM % 10; NUM /= 10; printf("%d\n", numeros[x]); } system("PAUSE"); return 0; }Simplesmente não acontece nada....xD...o DOS fika lá pensando e nada...deve ter algo errado.. Sem contar no detalhe que falo aki embaixo: Ele deu alguma restrição de como tem q ser feito o programa? pq tem como você usar uma função q inverta + com strings, + isso é o de menos. []s Então, no caso ele não deu limite, mas eu sou o mais avançado da turma e perguntei se poderia fazer com vetor e tal, dai ele falou que não, que era para utilizar o que ele ainda tinha passado nas aulas, que é If-Else, while e do...while....tendeu?Por isso o que amigo acima falou não pode ser utilizado...pq é vetor! xD...fodz.. No caso então axo ke não tem como utilizar o while né? Então como eu fiz pelo IF-ELSE está certo? Obrigado, valew, abraços e aguardo respostas!! Falowss Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Março 11, 2009 Teu código está certinho! o erro está no scanf... o console fica lá parado, pq ele estava esperando uma quebra de linha depois do primeiro enter... Da pra utilizar o while sim, na verdade, ele é uma variação do for, da uma olhada: int i; i=0; while (i<10) { printf(%d\n", i); i++ } Agora vamo ao seu código... eu fiz apenas duas alterações (ps.: não compilei) #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) int numeros[4], x, NUM; printf("Digite um nu'mero natural de 4 digitos: "); //primeira alteração, de scanf("%d\n", &NUM); para: scanf("%d%*c", &NUM); //o '%*c' diz para o scanf ler e DESCARTAR um char, que será um enter, para saber mais, google --> supressão scanf for (x = 0; x < 4; x++) { numeros[x] = NUM % 10; NUM /= 10; printf("%d\n", numeros[x]); } //segunda alteração, de system("PAUSE"); para: scanf("%*c"); //não use o comando system, apenas em casos ultra-mega-super-hiper-extremos! //system não é portável, e é um vício que devemos evitar. return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
DifusioN 0 Denunciar post Postado Março 11, 2009 Blzzz Blzzz!!! Seguinte... Mas, a quebra de linha ja não estava onde você trocou por "%*c"? Eu pesquisei sobre o supressão scanf, olha o ke achei: * indicador de supressão (Opcional) <presente> Se o indicador de supressão estiver presente o campo não é lido. Este supressor é útil quando não queremos ler um campo de dado armazenado em arquivo. <ausente> O campo é lido normalmente. Blzz...mas então como tava antes, eu iria digitar 1234 e enter(que seria \n)....dai ele iria ler e salvar na variavel....depois ele iria descer mais uma linha...certo?.....e o pq da errado nisso?Não é a coisa certa ke deveria acontecer? Pq qdo utilizo o scanf em outros casos não acontece o erro? Pelo ke você falou...ele vai ler os digitos, apertei enter e vai enviar um \n, dai ele vai escluir o \n?.......mas então não irá descer a linha....apenas enviar os digitos..... Da uma força ai...xD Segundo: porque não utilizar o system("PAUSE");?...pq não é portável? E o que significa utilizar o scanf("%*c");? Quer dizer ke ao terminar o programa, qdo eu apertar o ultimo enter ele irá ler e excluirrr??... Faz umaa narração ai do ke acontece plissss????? xD...kero entender a fundo! Valew pela força véi....grande abraço e falowss Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Março 11, 2009 aueheahuhaeuhaeuhuae é simples, olha: vamos "compilar" o comando scanf("%d\n" &num); o que acontece? você digita um número, ele joga na variável "num", ai você aperta enter, e ele manda um '\n' para o scanf mas você ja deixou o scanf esperando que venha um '\n', entendeu? Ai o scanf ficará esperano ouuutro enter para continuar a execução. No caso, não é o scanf que desce a linha, é o console... o scanf não faz nada com as linhas, ao apertar enter, independende do comando que esteja em execução, o console descerá uma linha. com um comando como: scanf("%d%*c", &num); O scanf fica esperando um número inteiro, e um caractere que pode ser qualquer coisa... Ai você me pergunta, qual a diferença entre esse comando, e o primeiro? A tecla enter "ativa" o scanf, para ele jogar os valores nas variáveis, e continuar a execução do programa. No primeiro caso, o scanf ja estava preparado para um enter, então não seria "ativado" na primeira ocorrência de um '\n', no segundo caso ele não estava. ---------------------------------------------------------------------------------------------------------------- system, e o porquê de não utilizar... Quando você usa o comando system, o teu programa redireciona a chamada para o sistema operacional. não são todos os sistemas operacionais que possuem o comando "pause". Com uma ferramenta tão poderosa, como a linguagem C, não é preciso fazer gambiarras do tipo: system("qualquer coisa"); void main() {} fflush(stdin); etc...etc... sempre existe uma solução melhor! :) -------------------------------------------------------------------------------------------------------------------- Equivalencia do system("pause") e scanf("%*c"): Os dois comandos esperam alguma reação do usuário para continuar a execução. a diferença é que o scanf("%*c") só aceita enter (aqui nós dizemos, precisamente, espere por um char e em seguida jogue-o fora), porém é portável e muuuito mais elegante do que system("pause"); :D Compartilhar este post Link para o post Compartilhar em outros sites
DifusioN 0 Denunciar post Postado Março 15, 2009 Beleza, 1º: Eu xo ke poderia deixar o scanf sem nada depois do %d né?(to em um pc agora sem o compilador, depois eu testo xD) Tipo, pelo ke entendi é: o Scanf ao apertar o enter envia o que foi digitado para a variavel...dai c eu utilizar o \n sera "digitado" para o scanf o <enter>, só ke ele ainda espera um <enter> após o comando, só ke como após o comando não existe algo que leia o que foi digitado pelo usuário então ele fika la esperando..esperando...xD....e assim vai. Estou certo? Utilizando o %*c mesmo ao apertar o <enter> ele será deletado e não mandara o \n para a variavel e o scanf não irá "ler" 2º: Certo, então seria uma alternativa melhor utilizar apenas a linguagem em C em si para fazer o que quero, sem requisitar coisas do sistema e tal né....(não escrevi mtu claro mas entendi a questão..xD) C eu entendi....o scanf espera digitar algo, o %*c deleta e como não tem mais nada para fazer o programa termina!.... Certo? Blzz... Agora me fala, existe outra solução a não ser o void main() ? Meu prof da facul insiste em ensinar com void main().....e eu ja consegui programar apenas como main() C puder dar uma forcinha ai tbm eu agradeço! Grande abraço a todos ai...Foi d mta ajuda as respostas que recebi aki...me ajudaram mtu mesmo! Valew! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Falowss...... Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Março 15, 2009 1º: Sim, como é um número que você está lendo, você pode deixar o final do scanf sem nada, mas aquele '\n' ficará no buffer do teclado. Olha só que coisa engraçada: int main(){ char choice='s'; while (choice == 's') { printf("Quer continuar? (s/n)\n"); scanf("%c", &choice); } return 0; }Compile esse código, e experimente....depois troque o scanf de "%c" para "%c%*c" e veja a diferença. Esse é o tipico caso de sujeira no buffer. Funciona assim: você digitou a letra s, e apertou enter, então a string enviada foi: "s\n" O scanf só leu a letra s, e deixou no buffer o '\n'. O próximo scanf lerá esse \n que ficou no buffer de entrada automaticamente, e encerrará o loop, afinal, choice será diferente de 's'... 2º: Exatamente isso! Cara, sinceramente, se o teu prof incentiva a utilização de void main(), ele não sabe nada de nada... A função main, como o nome ja sugere, é a função principal do seu programa, tanto em C como em C++. ok, e então porque ela retorna alguma coisa, se não tem nada que pega esse resultado?? É ai que você se engana, pois o sistema operacional pega esse resultado, e então ele sabe se correu tudo bem, ou não! ok, e porque é precisamente um inteiro, e não podemos declarar como outro tipo?? Essa é mais simples, imagine o seguinte código: double metade(double x) { return x/2; } int main() { int valor=13; valor = metade(valor); return 0; }Esse código não vai nem compilar...pois a variavel "valor" estava esperando um tipo diferente. É precisamente isso que ocorre, quando você executa um programa, o SO ja está esperando que esse programa retorne um inteiro. Para saber mais: http://www.eskimo.com/~scs/readings/voidmain.960823.html Compartilhar este post Link para o post Compartilhar em outros sites