Schemat Hornera

0

Witam , potrzebuje pomocy w zadaniu. W miejsca gdzie są wstawione "//?" mam napisać co dany wiersz robi w całym programie. Jestem zielony w C++ i może znalazł by się ktoś , kto by mi pomógł. Z góry dziękuje za pomoc.

#include <iostream>
#include <string>

using namespace std;

main()
{
  string s;				//?
  unsigned i,p,L,c;
 
  
  cout << "Obliczanie wartosci liczby zapisanej\n"
          "w systemie pozycyjnym  o podstawie p\n"
          "    przy pomocy schematu Hornera\n"
          "------------------------------------\n";
         
  cout <<      "Podaj p (2..10) = ";
  cin >> p;			//?
  cout << "\nPodaj liczbe    = ";
  cin >> s;			//?
  
  L = s[0] < 57 ? s[0] - 48 : s[0] -55;	//?
  for(i = 1; i < s.length(); i++)		//?
  {
    c = s[i] < 57 ? s[i] - 48 : s[i] -55;	//?
    L = L * p + c;			//?
  }
  cout << "\nLiczba " << s << "(" << p << ") = " << L << "(10)"
          "\n\nNacisnij ENTER...\n";
 
  return 0;
}
2

W sensie, że skopiowałeś fragment kodu z internetu (https://eduinf.waw.pl/inf/alg/006_bin/0002.php) i teraz chcesz, abyśmy Ci go wytłumaczyli?

0

Nie , po prostu nauczyciel zadał nam takie zadanie , żeby uzupełnić braki w programie. Uzupełniłem je , i potrzebuje pomocy co oznaczają dane wiersze. Zdalne nauczanie jednak troszkę boli i nie ma kto tego wytłumaczyć , więc zwracam się o pomoc tutaj.

1

Pomocna może być tabela ascii.
57 to nr znaku '9', a 48 to nr znaku '0', czyli s[i] - 48 zamienia znak cyfry na liczbę.
s[i] -55 zamienia literę na liczbę, przy czym 'A' ma wartość 11, 'B' - 12 itd
Ogólnie jest to próba odczytu liczby złożonej z cyfr i liter używana gdy podstawa liczby jest większa niż 10

1

Uzupełniłem je , i potrzebuje pomocy co oznaczają dane wiersze.

Ach, jasne :-) w takim razie:

string s;
// deklaracja zmiennej o nazwie `s` oraz typie `string`;
// zmienne typu `string` przechowują ciągi znaków (np. "ala ma kota" albo "1234567890")
cin >> p;
// pobranie od użytkownika dodatniej liczby (jako że `p` jest typu `unsigned`) i zapisanie jej do zmiennej `p`
cin >> s;
// pobranie od użytkownika ciągu znaków (jako że `s` jest typu `string`) i zapisanie go do zmiennej `s`
L = s[0] < 57 ? s[0] - 48 : s[0] -55;

// `?` nazywa się operatorem trójargumentowym i jest to skrócona wersja:

if s[0] < 57 {
  L = s[0] - 48;
} else {
  L = s[0] - 55;
}

// praktycznie: ten fragment zamienia wczytany od użytkownika znak w formie ASCII na liczbę, tak jak wytłumaczył wyżej @KamilAdam
L = L * p + c;
// jest to najzwyklejsze mnożenie oraz dodawanie - którą część chciałbyś, aby Ci wytłumaczono?

Większa część złożoności przytoczonego przez Ciebie kodu wynika z faktu, że jedna z liczb wczytywana jest do zmiennej s typu string, przez co musi ona później zostać ręcznie skonwertowana z powrotem na liczbę (z ciągu znaków ASCII) - gdybyś zmienił s na unsigned int, kod można by uprościć (lecz przypuszczam, że nauczyciel nie bez powodu go podał w takiej formie).

2

Dla wpisanej cyfry 9 wynik nie będzie prawidłowy - zmień na s[0] <= 57

2

Jak jesteś zielony to warto to zmienić.
Do C++ polecają dla początkujących to: https://helion.pl/ksiazki/c-przewodnik-dla-poczatkujacych-alex-allain,cppppo.htm#format/d
A do C niezmiennie od lat to: https://helion.pl/ksiazki/jezyk-ansi-c-programowanie-wydanie-ii-brian-w-kernighan-dennis-m-ritchie,jansiv.htm#format/d

Jak chcesz się "prześlizgnąć" to można spróbować jeszcze jakiś kurs po angielsku, np. te:
https://www.programiz.com/cpp-programming
https://www.cplusplus.com/doc/tutorial/introduction/
https://www.learncpp.com/

0

Ten kod to syf, którego nie powinno się używać do nauczania.
https://godbolt.org/z/TGocPG
Pomijając testy w catch2, chyba widać lepiej co się dzieje i łatwiej zrozumieć kod.

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