Ir para conteúdo

Arquivado

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

DifusioN

Inverter ordem de inteiros(Exe: 2357>7532), fiz certo?

Recommended Posts

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

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

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

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

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

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

entaum uma simples chamada do strrev(*string); resolveria ;D

Compartilhar este post


Link para o post
Compartilhar em outros sites

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..aUAHUa

Nã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

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

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

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

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

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

×

Informação importante

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