Posición de un dígito

Iniciado por lohayne, 15 Abril 2018, 20:00 PM

0 Miembros y 1 Visitante están viendo este tema.

lohayne

hola
¿alguien podría ayudarme con una función en la que pongo un número y cualquier posición y el programa me devuelve el dígito del número que está en esa posición. De izquierda a derecha.

Por ejemplo
(358, 1) = 3
El dígito de 358 en la posición 1 es 3

Hice un código, pero la función relacionada con la posición sigue yendo mal

Kenji-chan


lohayne

#include<stdio.h>
#include<math.h>

int contdigitos(int &n);
int posicao (int &num,int &n);
int maiordig (int n);

//main

int main () {
    int n=0,pos,num;
    scanf("%i",&n);
    int numdigitos= contdigitos(n);
    int npos=posicao(num,n);
    printf("\n numero de digitos:%i",numdigitos);
    printf("\n entre com um numero: ");
    scanf("%d", &n);

    printf("coloque a posicao: ");
    scanf("%d", &pos);

    printf("%dth digit of %d is %d.\n", pos, n,npos);

   int largedig= maiordig(n);
    printf("maior digito:%i",largedig);


    return 0;}



// numero de digitos

    int contdigitos(int &n) {
    if (n < 10) {
    return 1;
    }
    int contador = 0;
    while (n > 0) {
        n /= 10;
        contador++;
    }
    return contador;
}
//num = posição
int posicao(int &num,int &n){
    int r, t1, t2;

    t1 = pow(10, num +1);
    r = n % t1;

    if (num > 0)
    {
        t2 = pow(10, num);
        r = r / t2;
    }

    return r;
}
int maiordig (int n)
{
int digit, maior=0;
while (n>0){
digit=n%10;
if(digit>maior)
maior=digit;
n=n/10;}
return maior ;}

El ejercicio original se compone de 3 funciones, pero sólo la función que pide la posición va mal

Kenji-chan

#3
por que no tratas el numero como un string (char*) de esa forma podras recorrer sus posición  para saber que dígito ocupa que posición
de este modo


#include<stdio.h>

int main () {
char numero[15];
int pos = 0;

fprintf(stdout, "introduzca un digito: ");
scanf("%s", numero);
fprintf(stdout, "ntrodusca una posicion: ");
scanf("%d", &pos);

fprintf(stdout, "%dth digito de %s es %c.\n", pos, numero, numero[pos-1]);

return 0;
}



MAFUS

Ahí va mi versión, desde 0. Se deben tener algunas consideraciones, tal y como muestra el código
#include <stdio.h>
#include <math.h>

int main() {
    int n;
    int copia;
    unsigned i;
    unsigned num_digitos;
    unsigned pos;
    unsigned resultado;

    // Adquiero el numero
    printf("Numero: ");
    scanf("%d", &n);

    // Hago copia pues el proceso es destructivo
    copia = n;

    // Por razon de que log10 no puede usar numeros negativos lo hago positivo
    if(copia<0)
        copia = -copia;

    // Según documentación log10 no debería usarse con 0
    if(copia == 0)
        num_digitos=1;
    else
        num_digitos = log10(copia)+1;

    // Adquiero la posición deseada
    printf("Posicion: ");
    scanf("%u", &pos);

    // Si está fuera del número: avisar y salir
    if(pos==0 || pos>num_digitos) {
        puts("Indice fuera de rango");
        return -1;
    }

    // Consigo el número en la posición deseada
    for(i=0; i<num_digitos-pos+1; ++i) {
        resultado = copia%10;
        copia /= 10;
    }

    // Lo muestro
    printf("En la posicion %d del numero %d esta el %d", pos, n, resultado);
}

lohayne

#include<stdio.h>
#include<math.h>

int contdigitos(int &n);
int maiordig (int &n);
//main

int main () {
    char numero [15];
    int n,pos=0,num;
    scanf("%i",&n);

    int numdigitos= contdigitos(n);
    printf("\n numero de digitos:%i",numdigitos);

    int largedig= maiordig(n);
    printf("maior digito:%i",largedig);

   fprintf(stdout, "introduzca un digito: ");
   scanf("%s", numero);
   fprintf(stdout, "ntrodusca una posicion: ");
   scanf("%d", &pos);

   fprintf(stdout, "%dth digito de %s es %c.\n", pos, numero, numero[pos-1]);



    return 0;}



// numero de digitos

    int contdigitos(int &n) {
    if (n < 10) {
    return 1;
    }
    int contador = 0;
    while (n > 0) {
        n /= 10;
        contador++;
    }
    return contador;
}


int maiordig (int &n)
{
int digit, maior=0;
while (n>0){
digit=n%10;
if(digit>maior)
maior=digit;
n=n/10;}
return maior ;}

jajaja
Ahora la posición es correcta, pero mi función para mayor dígito esta volviendo 0 y no tengo ni idea de por qué

lohayne

El código funcionó
No sé cómo Agradecêlos, ayudaron mucho

MAFUS

Estas mezclando C y C++ en un compilador de C++.

Cuando en C++ pasas un argumento a una función cuyo argumento esté prototipo con un & pasas una referencia y por tanto ese dato será modificado.
En contdigitos has variado el valor de n, cuando se lo entregas a maiordig ya no tienes el valor n original sino el que te dejó contdigitos.