Wyodrębnienie cyfr danej liczby (Język C)

0

Interesuje mnie funkcja która wyodrębnia cyfry danej liczby tak abym mógł na każdej z poszczególnych cyfr pracować w innych funkcjach.

Chodzi mi dokładnie o program w którym podam liczbę np 12345 a następnie za pomocą funkcji wyodrębnię każdą z tych cyfr.
Następnie stworzę dwie kolejne funkcje w których jedna będzie odpowiadać za określenie czy dana cyfra jest parzysta, a druga funkcja będzie wypisywać kwadrat tej cyfry.

Ostateczny wynik programu ma wyglądać tak:
1 - nieparzysta, kwadrat = 1
2 - parzysta, kwadrat = 4
3 - nieparzysta, kwadrat = 9
itd...

Załączam funkcje w której rozbijam liczbę a następnie sprawdzam parzystość.
Niestety wykładowca uważa to za złą metodę z czym w sumie się zgadzam, ale nie mam pomysłu jak zrobić to inaczej.
Z góry dziękuję za pomoc.

char* czyParzysta(int x)
{
	int cyfra;
	int coZostanie;
	int odwrotna = 0;
	    
	while(x != 0)
    	{
	    coZostanie = x % 10;
	    odwrotna = odwrotna * 10 + coZostanie;
	    x /= 10;
    	}     
    	
	while(odwrotna != 0)
        {    
        cyfra = odwrotna%10;
        odwrotna /= 10;

    	if (cyfra % 2 == 0)
    	{
        	printf("%d - parzysta \n", cyfra);
    	}	
    	else 
        {
		printf("%d - nieparzysta \n", cyfra);
        }
	}
    return 0;
}
3
bilbon napisał(a):

Interesuje mnie funkcja która wyodrębnia cyfry danej liczby tak abym mógł na każdej z poszczególnych cyfr pracować w innych funkcjach.

wykładowca uważa to za złą metodę z czym w sumie się zgadzam

Prawdę mówiąc, jak chcę tu zobaczyć jakiś pozytyw, to widzę jedynie użycie %

Typ zwracany przez funkcję (https://en.wikipedia.org/wiki/Boolean_data_type#C,_C++,_Objective-C,_AWK), nazwy zmiennych (co rzutuje na czytelność zamysłu autora - ale nie jest tak źle, jak u dzisiejszych wspól-kolegów, może mam widzieć "jest względnie dobrze"? ), źle skonstruowana przynajmniej druga pętla (za ChRL nie rozumiem, pachnie srogim stosowaniem algorytmu pp. Copiego i Pejsta), drukowanie zamiast zwracania porządnego wyniku (skąd wy to bierzecie???) ... ciężko na czymś pozytywnie oko zawiesić.

Zmienne lepiej by się czuły jak najbardziej lokalne, a nie ogólne dla całej funkcji.

PS.Prawdziwe brzmienie zadania by się przydało - wielu adeptów męczy się z konceptem cyfry i liczby, jak też jestem trochę nieufny w tym przypadku

0
#include <stdio.h>

int main()
{
    unsigned value=12345;
    const char *msg[]={"","nie"};
    for(unsigned next=0,digit=0;value+(next=value/10)+(digit=value-10*next);value=next) if(digit&1) printf("%u - %sparzysta, kwadrat = %u\n",digit,msg[digit&1],digit*digit);
}
2

Wyodrębnienie - użyłbym sprintf lub %10, co wolisz

Utwórz osobną funkcję dla obsługi pojedynczej liczby i zwracaj uwagę na jej typ zwracany:

bool czyParzysta(int x)

Funkcja ta nie powinna w żaden sposób komunikować się z użytkownikiem.

Idąc dalej, to samo zrób dla kwadratu:

int kwadrat(int x)

Następnie, pseudokod funkcji zewnętrznej:

obsluzLiczbe(x)
    dla_kazdej_cyfry c
        print: "parzysta: ", parzysta(c), "kwadrat: ", kwadrat(c)

Mając to powinieneś być w stanie sobie dalej poradzić

0
bilbon napisał(a):

Interesuje mnie funkcja która wyodrębnia cyfry danej liczby tak abym mógł na każdej z poszczególnych cyfr pracować w innych funkcjach.

unsigned getDigit(unsigned *value,unsigned pos)
{
	for(unsigned mul=10;pos;mul*=mul,pos>>=1) if(pos&1) *value/=mul;
	return (*value)%10;
}

bool isOdd(unsigned value) { return value&1; }
bool isEven(unsigned value) { return !isOdd(value); }
unsigned sqr(unsigned value) { return value*value; }

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