Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Soulburner

Algorytm obliczający schemat Hornera

Rekomendowane odpowiedzi

Witam!

 

Znalazłem przeszukując otchłanie internetu taki algorytm konwertujący liczby między systemami (dwójkowy, dziesiętny, szesnastkowy) wykorzystujący schemat Hornera (najważniejszy dla mnie jest ten schemat).

Niby wszystko jest w porządku i mój mały móżdżek jest w stanie go zrozumieć... poza jedną rzeczą.

 

Najpierw kod:

#include <iostream.h> 
#include <string.h> 


//This is the function that makes the convertion 
//It takes 3 parameters- char *array, unsigned short int system 
//and int size. 
//char *array is the array where is stored the number to be 
//converted. Every digit of it must be in one cell 
//unsigned short int system, stores which numeric system is 
//the number in, and int size stores the size of the array 
void horner(char *array,unsigned short int system,int size) 
{ 
int *result; 

result=new int[size]; 
result[0]=array[0]-48;				 //***

//Main loop that makes the convertion itself 
for(int g=0;g<size;g++) 
 result[g+1]=result[g]*system + (array[g+1]-48);  //***

cout << "Result in decimal: "<<result[size-1]<<endl; 
} 

//Main function 
void main() 
{ 
char a[100]; 
unsigned short int sys; 

cout << "Enter number: "; 
cin >> a; 
int size=strlen(a); //Get the size of the array 
cout << "What numeric system is your number in? : "; 
cin >> sys; 

horner(a,sys,size); 
}

 

Chodzi o linijki oznaczone //***.

O co biega z tym -48? Kompletnie się w tym miejscu zapętliłem i za chorobę nie mogę się domyśleć :/

 

Wszelka pomoc mile widziana!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Chodzi o linijki oznaczone //***.

O co biega z tym -48?

te gwiazdki to jakiś punkt odniesienia, normalnie to to komentarz jest, natomiast prawdopodobnie w opisie kodu ktoś pisał, "w linijce z gwiazdkami cośtam cośtam"...

48 to kod LITERY '0' (zero), program odczytuje dane jako litery a potem zamienia dopiero na wartości liczbowe (np w systemie szesnastkowym jest to potrzebne, zeby odczytać ze A to 10 dziesiętnie...) dlatego jest to odejmowane...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

-48 to sposób konwersji z chara (gdzie np. cyfra 1 ma kod ASCII 49) na inta.

 

A ten algo nie działa dla systemów > 10

 

Info by Maciek ;)

 

te gwiazdki to jakiś punkt odniesienia, normalnie to to komentarz jest, natomiast prawdopodobnie w opisie kodu ktoś pisał, "w linijce z gwiazdkami cośtam cośtam"...

48 to kod LITERY '0' (zero), program odczytuje dane jako litery a potem zamienia dopiero na wartości liczbowe (np w systemie szesnastkowym jest to potrzebne, zeby odczytać ze A to 10 dziesiętnie...) dlatego jest to odejmowane...

 

No wlasnie dla szesnastkowego to nie działa :) nie ma takiej cyfry jak "10" :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
A ten algo nie działa dla systemów > 10

 

Info by Maciek ;)

No wlasnie dla szesnastkowego to nie działa :) nie ma takiej cyfry jak "10" :)

w ogole to sorry za ta info o gwiazdkach, zmęczony jestem i nie przycztalem dokładnie...

 

co do systemow... czemu niby mialby nie działać dla tych systemow powyzej 9? ewentualnie dlatego, ze char "A" to nie jest 10+48 gdyby to poprawic, to by działało...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Te gwiazdki dodałem ja, żeby łatwiej było odnaleźć gdzie te -48 siedzi ;)

Dzięki za wyjaśnienie, już wszystko kumam.

 

Moglibyście jeszcze przy okazji rzucić okiem na programik, który ma obliczyć pierwiastek kwadratowy? Niby wszystko jest ok, ale zamiast wyniku program wyświetla "1.#INF" :/

 

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
float a, x, eps, b0;
int i;

cout <<"Podaj liczbe pierwiastkowana: ";
cin >>a;

cout <<"Podaj zadana dokladnosc obliczen: ";  //np. 0.001
cin >>eps;

//obliczam b0
b0=0;
do
{
	 b0 = b0+1.0;
}
while (b0*b0 > a);

b0=b0 - 1.0;

//liczenie pierwiastka z zadana dokladnoscia
x = b0;
i = 0;

do
{
  i=i+1;
  x = ((x+a/x)/2.0);	
}
while ((x*x-a) < 2*b0*eps);

cout <<endl;
cout <<"Pierwiastek z liczby "<<a<<" wynosi: "<<x<<endl;
cout <<"\nWykonano "<<i<<" krokow";	

system("PAUSE");
return EXIT_SUCCESS;
}

Co tutaj zrąbałem? ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Te gwiazdki dodałem ja, żeby łatwiej było odnaleźć gdzie te -48 siedzi ;)

Dzięki za wyjaśnienie, już wszystko kumam.

 

Moglibyście jeszcze przy okazji rzucić okiem na programik, który ma obliczyć pierwiastek kwadratowy? Niby wszystko jest ok, ale zamiast wyniku program wyświetla "1.#INF" :/

 

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
float a, x, eps, b0;
int i;

cout <<"Podaj liczbe pierwiastkowana: ";
cin >>a;

cout <<"Podaj zadana dokladnosc obliczen: ";  //np. 0.001
cin >>eps;

//obliczam b0
b0=0;
do
{
	 b0 = b0+1.0;
}
while (b0*b0 > a);

b0=b0 - 1.0;

//liczenie pierwiastka z zadana dokladnoscia
x = b0;
i = 0;

do
{
  i=i+1;
  x = ((x+a/x)/2.0);	
}
while ((x*x-a) < 2*b0*eps);

cout <<endl;
cout <<"Pierwiastek z liczby "<<a<<" wynosi: "<<x<<endl;
cout <<"\nWykonano "<<i<<" krokow";	

system("PAUSE");
return EXIT_SUCCESS;
}

Co tutaj zrąbałem? ;)

nie wiem co w implementacji.. ale algorytm masz nieoptymalny... po pierwsze sqrt(x), a po drugie, jezeli piszesz ręcznie, to powinno się to odbywać wyszukiwaniem binarnym...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nieprawidlowe znaki mniejszosci i wiekszosci, zamienic miejscami

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...