Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TP7 E2 #66

Open
Agustin-Pomares opened this issue Sep 25, 2024 · 2 comments
Open

TP7 E2 #66

Agustin-Pomares opened this issue Sep 25, 2024 · 2 comments

Comments

@Agustin-Pomares
Copy link

Agustin-Pomares commented Sep 25, 2024

Buenas. Haciendo este ejercicio, me surgieron un par de preguntas.

Primero, claramente no estoy entendiendo bien el uso de scan, así que me gustaría que me pudieran decir cómo modificarlo para que encaje mejor en este ejercicio.

Segundo, no sé si hice el ejercicio de una manera un poco vueltera. Siento que tenía que trabajar con strings y tomarles la longitud, pero al final terminé haciendo las cosas con cuentas y no sabría cómo hacerlo de otra manera.

Sin más, acá está mi código:
`#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "getnum.h"

int
main(void){

int baseOG;
int baseFin;

//Primero tiene que ingresar la base original y la base final

do{
    puts("Ingrese la base inicial y la deseada del numero en el siguiente formato: <original>deseada");
    printf("(Note que sólo puede ingresar bases de un solo dígito; excepto '10', que debe expresarse como '0')\n: ");
}while(scanf("<%i[0-9]>%i[0-9]", &baseOG, &baseFin)!=5);

//* Nota: no sé si debe ser 5 (cuenta todo) o 2 (solo cuenta variables)
//* Nota2: en tiempo de ejecución, luego de que ingreses los datos, repite el print incesantemente.
//* Nota3: todavía no hice el caso especial de base10


//* Leo el número, tomo su longitud (para hacer la conversión polinómica a b10)
//* Voy a necesitar operar con el número, así que lo necesito como int; pero para tomar longitud, me conviene string
//* Voy a necesitar usar matemática para suplantar el dato de longitud.

int num;

num = getint("Ingrese el numero en su base original: ");

//* Hago la conversión de OG a base10

int numb10=0;
int aux=0;
int countDigits=0;

for(int i=0; num/(pow(10, i))<0 ; i++){
    numb10 += (((num % (int)pow(10, i+1))-aux) / pow(10, i)) * pow(baseOG, i);
    aux = num % (int)pow(10, i+1);
    countDigits++;
}

//* Por si aclara algo en cuanto a las cuentas, el acumulador recibe el dígito correspondiente 
//* por la base "a la i".
//* Para sacar, por ejemplo, el dígito menos significativo, basta con hacer %10.
//* Para el anteúltimo, %100 nos dejará también incluido el dígito anterior, así que lo borro (resto aux)
//* Pero ahora el dígito está acompañado de un cero a la derecha. Lo borro (divido por 10 a la i) y ahora sí
//* lo multiplico por la base elevada a la i; y modifico mi aux acordemente.

//* En fin. Luego paso de b10 a la base final

int numFin=0;
aux=numb10;

for(int i=0; i<countDigits; i++){
    numFin+= (aux % baseFin) * pow(10, i);
    aux = aux/baseFin;
}

//* Algoritmo para conversión de b10 a cualquier otra base. Armo el número "de atrás para adelante".
//* Finalmente, imprimo.

printf("%i (base%i) es %i en base%i", num, baseOG, numFin, baseFin);

}`

En resumen, me gustaría que me dijeran cómo usar el scan correctamente en este ejercicio, y si me convendría rehacerlo usando strings en lugar de cuentas

@ImNotGone
Copy link
Contributor

scanf te devuelve la cantidad de datos que leyo bien, por lo tanto lo que deberias pedir es que sea 2 el resultado. si queres saber mas de scanf podes usar el siguiente comando en la terminal

man scanf

ahi indica lo siguiente

RETURN VALUE
On success, these functions return the number of input items success‐
fully matched and assigned; this can be fewer than provided for, or
even zero, in the event of an early matching failure.
The value EOF is returned if the end of input is reached before either
the first successful conversion or a matching failure occurs. EOF is
also returned if a read error occurs, in which case the error indicator
for the stream (see ferror(3)) is set, and errno is set to indicate the
error.

En cuanto al algoritmo, no es necesario usar pow, podrias ir manteniendo una variable y multiplicarla por la base cada iteracion para evitar el costo de la funcion pow en este caso. Es mejor hacerlo sobre los numeros antes que operar con strings, esta bien asi, solo fijate que podes remplazar el pow que deberia hacerlo una pisca mas eficiente

@Agustin-Pomares
Copy link
Author

Muchas gracias por la respuesta!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants