Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[C++] Czemu to nie działa?


Rekomendowane odpowiedzi

Opublikowano

Napisałem funkcję która mi zrobi z liczby zapisanej w takim formacie:

12122112 (w binarnym to jest 01011001. Zwiększone żeby mi zer nie ucinało, a w tym programie jest to bardzo ważne.)

tablicę.

 

Jednak wyjście zamiast wyglądać tak:

01011001

wygląda tak:

01011000

czyli na końcu zawsze daje 0. Dlaczego tak jest?

 

void to_tab(long double input, bool tab[], int cg)
{
   //input = 12122112


   cout << "in:  " << input << "\n";// << "out: ";
   for(int d = dlugosc(input); d >= 0; d--, cg++)
   {
   //d = 7, czyli dlugosc inputa -1

   input /= moc(10, d); // dzieli input na 10^d
   tab[cg] = (int)input-1; // odejmuje 1, zeby zamienic np 212 na 101.
   cout << tab[cg];
   input -= int(input);
   input *= moc(10, d);

   }
}

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Weteran
Opublikowano

Napisałem funkcję która mi zrobi z liczby zapisanej w takim formacie:

12122112 (w binarnym to jest 01011001. Zwiększone żeby mi zer nie ucinało, a w tym programie jest to bardzo ważne.)

Trochę nie rozumiem tego stwierdzania. Dlaczego ma ucinać zera? Przecież to nie jest liczba po przecinku.

 

Niestety po twoim kodzie nic nie wywnioskuję, ponieważ nie pokazałeś reszty funkcji.

 

Użyłeś funkcji, którą ci podałem w poprzednim temacie?

Możliwe, że faktycznie trochę ucina.

Tutaj masz lepszą:

 

float GetNum(int i, int pos)
{
int x = 10;
for(int j = 0; j < pos; j++)
{
x*=10;
}
i = i / (x/10);

return ((float)i/10 - (int)(i/10))*10;
}

Opublikowano

Tutaj kod całego programu:

 

 

#include <iostream>
#include <iomanip>
#include <math.h>

using namespace std;

long double moc(int liczba, int potega)
{
long double wynik = 1;
while(potega--)
 wynik *= liczba;
return wynik;
}
int dlugosc(long double in)
{
int dlg = 0;
for (; in > 3; dlg++)
 in /= 10;
return dlg;
}
void to_bin(int input, long double & output)
{
if (input > 1)
 to_bin(input/2, output);
output*= 10;
output+= (int)(input % 2)+1;
}
void to_tab(long double input, bool tab[], int cg)
{
cout << input << "\n";
while (input >= 1)
{
 int d = dlugosc(input);
 tab[cg] = (floor( input / moc(10, d) - 1 ));

 input/= moc(10, d);
 input-= floor(input);
 input*= moc(10, d);
 cout << tab[cg];
 cg++;
}
}
int main()
{
cout << fixed << setprecision(0);
long double m = 0; // glowna
long double c = 0; // potega
long double p = 0; // przecinek
int d;
int cg = 1;
float in;
bool minus = false;
bool tablica[32] = {0};

cin >> in;
if (in < 0) minus = true, in *= -1;
to_bin(in, m);
d = dlugosc(m);
to_bin(d+127, c);

m /= moc(10, d);
m -= int(m);
m *= moc(10, d);
to_tab(m, tablica, cg);
}

 

 

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Opublikowano

Korzystaj z ideone...

http://ideone.com/AU14s

 

Najlepiej zupload'uj raz jeszcze (MPC ma duży problem z tabulatorami) i wprowadź swój żądany input...

 

Ogólne wskazówki:

- używaj istniejących funkcji; do pobrania długości stringa służy strlen, albo std::string.length();

- korzystaj z STL'a

- przekonwertoranie int'a ( a raczej int'ów, l. mn. ) podałem w ostatnim temacie [ dlaczego, swoją drogą, zakładasz dwa tematy do tego samego...? ]

 

Co dokładnie ma robić cały ten Twój kod...?

Ta sygnatura jest pusta.

Opublikowano

Już naprawiłem, ale to nie jest chyba zbyt dobre wyjście.

 

Kod ma robić to:

http://pl.spoj.pl/problems/PP0504D/

 

Program:

http://ideone.com/dPhAQ

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Opublikowano

ehh... to odrazu mow co chcesz osiagnac. Wystarczy wiedziec na jakiej zasadzie sa przechowywane liczby zmiennoprzecinkowe i jak wyglada ich reprezentacja.

 

void printhex(float number)
{
// rozbijamy sobie ladnie na bajty
unsigned char address[4];
unsigned char * wtab = address ;
// wyciagamy wartosci poszczegolnych bajtow do tablicy charow
*(reinterpret_cast<float*>(wtab)) = number;
for(int i=3;i>=0;i--) cout << hex << static_cast<int>(wtab[i]) << " ";
}

int main()
{
printhex(123.125);
return 0;
}

 

http://ideone.com/3wG4U

  • 2 tygodnie później...

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...