Kodowanie liczb w innych systemach niż dziesiętny

0

Cześć, prosiłbym o pomoc z kodem do zamiany systemu dziesiętnego na inne. Mam mały problem z włożeniem warunku zerowego do funkcji i udało mi się go zrobić jedynie poza nią.

Gdy przy takim kodzie uwzględniam w funkcji f
else if(n==0) printf("0");
pojawiają się zera na początku, a nie tylko w przypadku n=0. Domyślam się, że może chodzić o przekazywanie dwóch zmiennych f(n / i, i) przy rekurencji niestety nie wiem w jaki inny sposób to wykonać.

#include <stdio.h>

void f(int n, int system)
{
    if (n > 0 )
    {
        f(n / system, system);
        if(n%system==10)
        {
            printf("A");
        }
        if(n%system==11)
        {
            printf("B");
        }
        if(n%system==12)
        {
            printf("C");
        }
        if(n%system==13)
        {
            printf("D");
        }
        if(n%system==14)
        {
            printf("E");
        }
        if(n%system==15)
        {
            printf("F");
        }
        if(n%system<=9)
        {
            printf("%d",n%system);
        }
    }
}

int main()
{
    int n; //liczba do zamienienia na inny system
    printf("N: ");
    scanf("%d",&n);
    if(n==0)
    {
        printf("Binarnie: 0\nPiątkowo: 0\nSiódemkowo: 0\nÓsemkowo: 0\nSzesnastkowo: 0");
    }
    else
    {
        printf("Binarnie: ");
        f(n, 2);
        printf("\nPiątkowo: ");
        f(n, 5);
        printf("\nSiódemkowo: ");
        f(n, 7);
        printf("\nÓsemkowo: ");
        f(n, 8);
        printf("\nSzesnastkowo: ");
        f(n, 16);
    }
    return 0;
}

Z góry dziękuję za pomoc:)

0

Masz specjalny warunek poczatkowy. W takim wypadku robi się po prostu dwie funkcje:

  • pierwszą - zawiera tego dodatkowego ifa dla zera i wywołuje drugą funkcję
  • druga funkcja jest ekurencyjna i wywouje siebie tak długo jak trzeba

Co do reszty kodu to to że mieszasz konwersję z jednoczesnym wypisywaniem może być problemem jakbyś chciał reużyć taką funkcję i ogólnie tak się nie robi

1
KamilAdam napisał(a):

Masz specjalny warunek poczatkowy. W takim wypadku robi się po prostu dwie funkcje:

  • pierwszą - zawiera tego dodatkowego ifa dla zera i wywołuje drugą funkcję
  • druga funkcja jest ekurencyjna i wywouje siebie tak długo jak trzeba

Co do reszty kodu to to że mieszasz konwersję z jednoczesnym wypisywaniem może być problemem jakbyś chciał reużyć taką funkcję i ogólnie tak się nie robi

Super, dziękuję za pomoc. Udało mi się poprawić kod Twoim sposobem:). Dzięki za wskazówkę.

3
  1. Masz 9 operacji dzielenia na każdy znak liczby, doprawdy uważasz że to ma sens?
  2. A co jeżeli system będzie 36-kowy?
  3. http://forum.4programmers.net/1005274 - konwersja systemu z dowolnego na dowolny oraz dowolna ilość znaków.
  4. Coś w stylu:
void prnsys_(unsigned n,unsigned system,int first)
{
	static const char digits[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	//if(system>36) { ... } else 
    if(n||first)
	{
		unsigned next=n/system;
		prnsys_(next,system,0);
		putchar(digits[n-next*system]);
	}
}

void prnsys(int n,int system) { prnsys_(n,system,1); }
0

Rozlazło CI się to.

ja bym kombinował z tolower
a potem znając wartość a ... ;-)

Będziesz też potrzebował użyć %

1 użytkowników online, w tym zalogowanych: 0, gości: 1