Ir ao conteúdo
  • Cadastre-se

C Exercicio de odenação - menos significativio


Posts recomendados

Estou tentando desenvolver um código que separe o numero de uma variavel em um vetor, em seguida coloquei o numero menos significativo(o ultimo numero a direita diferente de 0), na primeira posição do vetor, e exiba esse vetor ordenado, como mostra a imagem abaixo:
Ex: Entrada - 1250
      Saida - 5120image.png.10d9589e2d3a3246f35f83a443301e1b.png
Além disso como mostrado acima, tem de manter os zeros no final.

 

Eu desenvolvi um código porém ele elimina o 0 no final.
Se alguem puder ajudar, agradeço desde já!
 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Há muitas formas de fazer isso. Minha preferida é aplicar a função sprintf do cabeçalho #include <stdio.h> para converter o inteiro em string. Depois é só percorrer a string e transformar os elementos em ASCII para resultar em um vetor de algarismos correspondente.

 

 

 

Seguindo isso o restante do programa fica trivial F5Rua4D.gif.

 

 

 

Espero ter ajudado GbhmuXl.gif.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Citação

    int v1, v2, ia=0, ib=0;
    float tam1 = 0, tam2 = 0;
    bool saber = false, saber2 = true;

    int cont10a = 0, cont10b = 0;
    int aux1 =0, aux2=0, aux1ini = 0, aux2ini=0;
while(v1 > 10000 || v2 > 10000){
    printf("Entre com um numero: \n");
    scanf("%d", &v1);
    printf("Entre com um numero: \n");
    scanf("%d", &v2);
}
    aux1ini = v1;
    aux2ini = v2;
   while(aux1ini % 10 == 0){
        aux1ini = aux1ini / 10;
        cont10a++;
        saber = true;

    }
    while(aux2ini % 10 == 0){
        aux2ini = aux2ini / 10;
        cont10b++;
        saber2 = true;
    }

v1 = aux1ini;
v2 = aux2ini;

    if (aux1ini == 0) tam1 = 1;
    else
        while (v1 != 0)
           {
              tam1 = tam1 + 1;
               v1 = v1 / 10;
           }
    //----------------------------------------------
    if (aux1ini == 0) tam2 = 1;
    else
        while (v2 != 0)
           {
              tam2 = tam2 + 1;
               v2 = v2 / 10;
           }

   char va[(int)tam1], vb[(int)tam2];
    int i;

int contador = 0;
//atirbui e ordena A
while (aux1ini > 0){

    va[contador] = aux1ini%10;
    aux1ini = aux1ini/10;
    contador++;
}
if(tam1 == 4){
        aux1 = va[1];
        va[1] = va[2];
        va[2] = aux1;
}
//atirbui e ordena B
contador =0;
while (aux2ini > 0){

    vb[contador] = aux2ini%10;
    aux2ini = aux2ini/10;
    contador++;
}
if(tam2 == 4){
        aux2 = vb[1];
        vb[1] = vb[2];
        vb[2] = aux2;
}
printf("\n");
//-----------------------

char vacerto[(int)tam1+cont10a], vbcerto[(int)tam2+cont10b];

if(saber == true){
for(i=0;i<((int)tam1+cont10a);i++){
    if(va[i] != 0){
        vacerto[i] = va[i];
    }
    else{
        vacerto[i] = 0;
    }
}
for(i = 0; i<((int)tam1+cont10a); i++){
    printf("Va[%d]: %d  ",i, vacerto[i]);
}
}
else{
    for(i = 0; i<tam1; i++){
    printf("Va[%d]: %d  ",i, va[i]);
}
}
//---------------------
printf("\n");
if(saber2 == true){
for(i=0;i<((int)tam1+cont10b);i++){
    if(va[i] !=0){
        vbcerto[i] = vb[i];
    }
    else{
        vbcerto[i] = 0;
    }
}
for(i = 0; i<((int)tam2+cont10b); i++){
    printf("Vb[%d]: %d  ",i, vbcerto[i]);
}
}
else{
    for(i = 0; i<tam2; i++){
    printf("Vb[%d]: %d  ",i, vb[i]);
}
}

por enquanto o código está assim, porém ainda ta dando errado kkkk

 

adicionado 3 minutos depois

a separação eu fiz, de boa, problema foi na hora de colocar o algarismo menos significativo na primeira posição do vetor

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Luis Felipe Aparecido

 

 

Montado o vetor de algarismos, percorra-o de trás para frente através de um loop. O primeiro dígito diferente de zero você armazena em uma variável, além de sua posição no vetor. Por fim, é só imprimir o número salvo e posteriormente o vetor de algarismos, excetuando o número daquela posição salva.

 

 

 

Espero ter ajudado GbhmuXl.gif.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 minuto atrás, rjjj disse:

@Luis Felipe Aparecido

 

 

Montado o vetor de algarismos, percorra-o de trás para frente através de um loop. O primeiro dígito diferente de zero você armazena em uma variável, além de sua posição no vetor. Por fim, é só imprimir o número salvo e posteriormente o vetor de algarismos, excetuando o número daquela posição salva.

 

 

 

Espero ter ajudado GbhmuXl.gif.

entendi, muito obr :)

adicionado 11 minutos depois
28 minutos atrás, rjjj disse:

Há muitas formas de fazer isso. Minha preferida é aplicar a função sprintf do cabeçalho #include <stdio.h> para converter o inteiro em string. Depois é só percorrer a string e transformar os elementos em ASCII para resultar em um vetor de algarismos correspondente.

 

 

 

Seguindo isso o restante do programa fica trivial F5Rua4D.gif.

 

 

 

Espero ter ajudado GbhmuXl.gif.

@rjjj como ficaria o código caso eu usasse sprintf? eu nunca use ele par separar numeros e colocar numa char kkkk

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Luis Felipe Aparecido

 

 

Segue um exemplo dessa jogada. Um bom programador otimiza seu código F5Rua4D.gif.

 

 

int n = 12345;
char v[8];
sprintf(v, "%d", n);
int i = 0;
while(v[i] != '\0') {
    v[i] -= '0';
    i++;
}
printf("Vetor: ");
int j = 0;
while(j < i) {
    printf("%d", v[j]);
    j++;
}

 

 

 

Espero ter ajudado GbhmuXl.gif.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Luis Felipe Aparecido  Olá,

Mostrarei de uma forma mais simples, o seu código estava muito complicado para uma questão simples (Acontece todos já foram iniciantes em algo, alguma vez).

 

Para fazer isto basta salvar o input utilizando fgets() e depois analisar o input e fazer o que @rjjj já sugeriu (exceto o sprintf() que neste caso não seria necessário), segue exemplo em código (Apenas um vetor):

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int msize = 10000; // Tamanho máximo
	int xpos = 0; // Marca a posição do algarismo
	int vsize = 0; // Quantidade de digitos
	int va[msize]; // Vetor, OK...

	char a[msize]; // Guarda os valores de stdin

	// INPUT HERE:
	fgets(a, msize, stdin);
	
	// E se o input não for de numeros inteiros positivos?
	if (atoi(a) == 0 || atoi(a) < 0)
		return 1; // retorne 1

	// Quantos digitos foram passados? Vamos ver:
	for (size_t i = 0; a[i]; i++)
		vsize++;
	vsize--;

	// Qual a posição do algarismo menos significativo?
	for (int i = vsize; i > -1; i--)
	{
		if((a[i] - '0') > 0)
		{
			// Adiciona o algarismo ao vetor na posição 0
			va[0] = a[i] - '0'; 
			xpos = i; // Marca a posição
			break; // Quebra o loop já achemos o algarismo
		}
	}

	// Vetor contem apenas o algarismo menos significativo?
	// Bora adicionar os outros digitos:
	for (int i = 1, j = 0; j < vsize; j++)
	{
		// Sem contar o algarismo é claro:
		if(a[j] != a[xpos])
		{
			// Adicionar digito ao vetor:
			va[i] = ((int)a[j]) - ((int)'0');
			i++; // Próxima posição do vetor
		}
	}

	// Imprimir digitos do vetor:
	for (int i = 0; i < vsize; i++)
		printf("%d", va[i]);

	// Execução completada com sucesso?
	return 0; // retorne 0
}

 

Espero ter lhe ajudado, até mais!

 

Link para o comentário
Compartilhar em outros sites

9 horas atrás, Luis Felipe Aparecido disse:

Ex: Entrada - 1250
      Saida - 5120image.png.10d9589e2d3a3246f35f83a443301e1b.png
Além disso como mostrado acima, tem de manter os zeros no final.

 

Comentarei porque vai que alguém tenha a mesma opinião então já encontra outro aqui.

 

Uma coisa é manter o zero no final, outra coisa é a troca de posição que acontece entre o polo significativo. Por último, esse enunciado que não se relaciona com a entrada e saída em sua totalidade.

"

 

Na minha opinião faça na forma do enunciado: O algarismo menos significativo é também o menos preciso, ou, o último. 

 

Lei os números, coloque-os um em cada vetor invertidamente persistindo os 0s finais. Lembre-se que terá uma tarefa para duas vezes (dois números) então é melhor que as ações fossem programadas para função/método.

 

[<]ENTRADA .: 1234 6700
[>]SAIDA ...: 4321 7600

[<]ENTRADA .: 1234 6070
[>]SAIDA ...: 4321 7600

 "

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...