Przydatne funkcje do łańcuchów

0

Zamieszczam tu przydatne funkcje do operacji na stringach. Proszę o ocenę ich funkcjonalności.
I mam pytanie co do kodu nr 3. Funkcja przyjmuje 2 liczby zawarte w stringu, znak działania i przekazuje do *wynik wynik działania.
dodawanie, odejmowanie i mnożenie działa idealnie, jednak dzielenie daje przy niektórych liczbach daje zły wynik. Głowiłem długo nad tym i potrzebuję jakiegoś sposobu na 'wykonanie dzielenia'. Nie chodzi mi o kod źródłowy tylko o sposób. Mój sposób odejmuje od liczby l1 liczbę l2 aż wynik nie będzie równy 0 lub nie będzie ujemny (Po każdym wykonaniu pętli do ogólnego wyniku dodawana jest wartość 1). Jeżeli wynik jest ujemny wstawiamy kropkę do ogólnego wyniku, dzielimy l2 na 10 i wykonujemy te same zdarzenia aż do 3 liczb po przecinku. Jednak przy liczbach typu "0.000..." pojawia się problem. Mój sposób jest zły czy coś pomieszałem w kodzie?

0

ad 3.txt:

void STR_DZIALANIE(char* l1, char* l2, char* wynik, char znak)

WTF! Nie wiadomo co to robi, a na dodatek ta funkcja ma ponad 800 linii kodu, więc nikomu ni będzie się chciało rozszyfrowywać co to za cudo!
Życzę powodzenia przy szukaniu potencjalnych błędów lub przy testowaniu.

edit patrzę w losową cześć tego cuda:
Jest:

if(l1[n] == '0' ||l1[n] == '1' ||l1[n] == '2' ||l1[n] == '3' ||l1[n] == '4' ||l1[n] == '5' ||l1[n] == '6' ||l1[n] == '7' ||l1[n] == '8' ||l1[n] == '9')

Powinno być:

if(l1[n] >= '0' && l1[n] <= '9')

A jeszcze lepiej:

if(isdigit(l1[n]))

Jeśli funkcja jest dłuższa niż 10 linii to jest już trudniejsza w analizie. Jeśli ma więcej niż 100 to już jest nie do przyjęcia.
Inną miarą długości funkcji jest liczba pętli i instrukcji warunkowych.
Radzę ci to podziel to na jakieś rozsądne kawałki, łatwiej znajdziesz ten swój błąd.

0

Ja kurczę pytam tylko o sposób podzielenia pisemnie 2 liczb przez siebie. A w początkowym komentarzu pisze co dana funkcja robi :) pozdrowienia
l1 = liczba1 [wskaznik na tablicę]
l2 = liczba2 [wskaznik na tablicę]
znak = [znak arytmetyczny */+-]
wynik = wynik[wskaznik na tablicę]
Funkcja zapisuje do 'wynik' wynik dzialania l1 znak l2

0

A ja ci zwracam uwagę, że nazwałeś źle nazwałeś funkcję i napakowałeś do niej za dużo. Sorry, ale nikt nie ma się ochoty katożyć analizą funkcji, która ma 800 linii.
Na dodatek, przy takim bezmyślnym pisaniu warunków, jest to szczególnie trudne.

0

Dobra rozumiem już :D A teraz nie czytając żadnego kodu. Jaki jest sposób na dzielenie ?? Mam zasymulować dzielenie pisemne (mając do czynienia z wielkimi licbami) czy jest jakiś łatwiejszy sposób podzielenia dwóch długich liczb?

dodawanie, odejmowanie i mnzoenie zrobiłem metodą pisemną ale za dzielenie nie wiem jak się zabrać

0

Po pierwsze zrób każdą operację (+, -, *, /) osobno. Dodatkowo na pewno pewne fragmenty kodu będą się powtarzać wiele razy, takie fragmenty dobrze jest umieścić w osobnych funkcjach (które zostaną odpowiednio nazwane).
Zalet takiego podejścia jest wiele:
#łatwiej ogarnąć całą funkcję, gdy jest krótka i nie przyprawia o ból głowy
#unikasz kodowania kopiuj wklej. Każde kopiuj wklej powoduje, że ten sam błąd pojawia się w kolejnym miejscu (co po naprawieniu łatwo przegapić).
#łatwiej jest debugować, nie musisz analizować całego kodu funkcji jeśli widzisz, że wynik jej działania jest zgodny z oczekiwaniem
#możliwe jest testowanie. kawałek kodu, który jest w swoje własnej funkcji zawsze można przetestować osobno (testy jednostkowe i funkcjonalne). Kod który nie jest umieszczony w osobnej funkcji jest bardzo trudny do przetestowania.

0

Dziękuję za radę :) Biorę się do poprawek. Potem podeślę sformatowane funkcje ;p

0

Mam pytanie. Jak mam zaalokowane od wskaznika char* zalozmy 10 bajtow pamieci, to da rade nie usuwajac tekstu "doalokowac" jeszcze pare bajtow? (Potrzebuje tego bo rozmiar lancucha ulega zmianie)

0

A klasa string działa jak lista czy tablica? Bo jak tablica to można wyciągnąć znak mając wskaźnik pierwszego elementu :P Dobrze mówię? Nie wiem czemu ale zawsze unikałem klasy string. Bałem się jej :P Zawsze operowałem na char*. Chyba zmienię poglądy ^^

Czyli:

 
string tekst = "abcd";
char tekst2[] = "efgh";
strcat(tekst, &tekst2[0]);

Po dodaniu tekstu2 do tekstu1 ilość zarezerwowanej pamięci w tablicy "tekst" ulegnie zmianie?

0

Totalnie źle! string to klasa! Do jej osługi masz odpowiednie metody. Zapomnij o strcat jeśli używasz string! Dla ułatwienia ma przeciążone operatory, więc możesz napisać:

string tekst = "abcd";
char tekst2[] = "efgh";
tekst += tekst2;
0

Kurde. To string odpada. O Vectorach czytałem też odpada.
Co myslicie o takim sposobie zwiekszania rozmiaru tablicy:

 
char* dodawanie_bajtow(char* tablica, int ilosc_bajtow)
{
     
     if(tablica != 0)
     if(ilosc_bajtow > 0)
     {
            char* polaczone;
            polaczone = (LPSTR)GlobalAlloc(GPTR, strlen(tablica)+ilosc_bajtow+1);
            strcpy(polaczone, tablica);
            GlobalFree(tablica);
            return polaczone;
     }
     return tablica;
}

Funkcja przyjmuje wskaźnik na tablicę i ilość bajtów jaką dodać do zarezerwowanej pamięci i Jeżeli operacja się powiodła zwraca wskaznik na nową tablicę lub przy niepowodzeniu zwraca wskaznik wejsciowy.

To co napisałem bardzo by mi się przydało. Macie jakieś zastrzeżenia co do tego sposobu?
Edit:

od razu się spytam. GlobalFree(); zamienia wszystkie znaki w tablicy na '\0' a wskaznik dalej na nie wskazuje czy dane w pamięci zostają tylko adres jest zmieniany na 0?

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