Siemanko. Ostatnio próbuje zrobić projekt na zaliczenie mojego przedmiotu na studyjkach i natknąłem się na mały, choć jak dla mnie w ogóle nie zrozumiały błąd konwersji opisanej w tytule. Oczywiście całego kodu wrzucać tu nie będę więc tylko mały prosty programik który odzwierciedla to czego tak naprawdę do szczęścia mi potrzeba. Mianowicie:
#include
using namespace std;
int main()
{
char tab[5];
int i(2);
char a;
a = (char)i;
tab[0] = ((char)i);
cout<
system("pause");
}
[/code]
Przyznam że jak dla mnie linijka a = (char)i; bądź tab[0] = ((char)i); jest dla mnie jak najbardziej poprawna gdyż dokonuje jawnej konwersji typu (w duł). Natomiast przy wypisaniu elementu tablicy bądź zwykłego obiektu dostaje jakieś głupoty a nie jak bym tego chciał pożądany przeze mnie znak. Jeśli można was prosić o pomoc panowie programiści będę wam naprawdę ogromnie wdzięczny … Ja jakoś nie mogę się tego nigdzie doczytać. Wszędzie znajduję regułę jaką wymieniłem powyżej.
A jakiego spodziewasz się wyniku programu? tab[0] zawiera znak o kodzie ASCII 2 ( http://pl.wikipedia.org/wiki/ASCII ). Być może chciałeś wypisać znak o kodzie ASCII 50, czyli cyfrę 2.
Generalnie program ma dodawać do siebie dwie tablice znaków np: char n1[] = “1946574832182”; oraz char n2[] = “132432311”;. Tworzę więc tworze funkcję która przyjmuje i przetwarza obydwie tablice (czyli wysyłam jej adresy pierwszych ich elementów oraz ich rozmiary nie zbędnych do przetwarzania tablic w funkcji) oraz dodatkowo kolejna tablicę która zwrócę jako wynik funkcji . W pętli for odwołuję się do podanych wyżej dwóch tablic. Do zmiennej s zapisuje wynik sumy danych wartości tab przez indeks. Mniej więcej wygląda to tak s = ((tab_-‘0’) + (n1__-‘0’) + (n2__-‘0’)) - oczywiście przed dodaniem do siebie dwóch wartości uwzględniam możliwości przekroczenia wyniku poza zakres jedności, możliwości ze jedna z tablic jest krótsza od drugiej i takie tam. Wszystko działa bez zarzutu pozostaje mi tylko przypisać danemu elementowi wynikowej tablicy wartość obiektu s (który zawiera się w zbiorze liczb {1, … ,9} ) no i właśnie tu pojawia się mój problem … Niby proste ale zatrzymałem się właśnie w tym momencie i dalej ani rusz._
char *a=n1+strlen(n1)-1,*b=n2+strlen(n2)-1;int p=0; // przenoszeniewhile((a=n1)(b=n2)) { p+=(*(a--)-'0')+(*(b--)-'0'); char c=p%10+'0'; p/=10; coutc; }a=n1) { p+=(*(a--)-'0'); char c=p%10+'0'; p/=10; coutc; }b=n2) { p+=(*(b--)-'0'); char c=p%10+'0'; p/=10; coutc; }p) { char c=p%10+'0'; p/=10; coutc; }[/code]Wynik będzie w odwrotnej kolejności ale oczywiście możesz przerobić do zapisywania wyniku do tablicy.
Długość wyniku będzie od max(strlen(n1),strlen(n2)) do max(strlen(n1),strlen(n2))+1.
Po obliczeniu wyniku można pominąć zera z przodu.
Jednym ze sposobów jest odejmowanie 48 od wartości kodu znaku. Czyli pobierasz kolejne znaki zaczynając od ostatniego. Rzutujesz char na int’a dodajesz do siebie i odejmujesz 96 (2*48). Czyli coś w stylu
Taka mała uwaga, że wartość którą należy odjąć może być inna niż 48 (choć zazwyczaj jest to właśnie 48). Bezpieczniej jest sprawdzić jaka jest różnica i dopiero później odejmować.