Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kod U1

Ostatnio zmodyfikowano 2014-01-24 19:29
Autor Wiadomość
masa...
Temat założony przez niniejszego użytkownika
Kod U1
» 2014-01-24 11:27:12
Witam ma problem z jednym zadaniem. O to treść.

Dla podanej poniżej specyfikacji zapisz (w postaci listy kroków, schematu blokowego lub
w wybranym języku programowania) algorytm, który oblicza wartość liczby zapisanej
w kodzie U1.
Specyfikacja algorytmu
Dane:
d – długość zapisu U1, d 1
bin [1..d] – tablica, której elementami są pojedyncze bity zapisu U1, z czego bin[1]
to bit znaku
Wynik:
x – wartość liczby zapisanej w tablicy bin d 1.. 
 
Przykład: Dla d = 5 i bin[1..5]= 10110  wynikiem jest x = -9.


mój kod:
C/C++
#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

int main( int argc, char ** argv ) {
    double znak = 1;
    static int d;
    cin >> d;
    char bin[ d ];
    cin >> bin;
   
    if( bin[ 0 ] == 1 )
    {
        for( int i = 1; i < d; i++ )
        if( bin[ i ] == 1 )
             bin[ i ] = 0;
        else
             bin[ i ] = 1;
       
        znak =- 1;
    }
    //Do tego miejsca dobrze zamienia U1 na system binarny
   
    //Od tego miejsca zaczynają sie schody
    for( int i = 0; i < d - 1; i++ ) bin[ i ] = bin[ i + 1 ];
   
    bin[ d - 1 ] = NULL;
    string a[ d - 1 ];
    for( int i = 0; i < d - 1; i++ )
         a[ i ] = bin[ i ];
   
    int dec = strtol( a.c_str(), NULL, 2 );
   
    int x = dex * znal;
   
    cout << x;
   
    return 0;
}


Nie wiem jak tą tablice zamienic na string żeby ją potem wrzucić do funkcji strtol.
P-103029
pekfos
» 2014-01-24 11:32:06
Przypisz. A najlepiej od razu używaj stringów, bo i tak źle tworzysz tablice.
P-103030
Wiesiek
» 2014-01-24 12:13:34
Faktycznie schody. Zaczynają się już wcześniej: liczba ma mieć zapis długości d, więc deklarujesz tablicę o d+1 elementach. Nie sądzę abyś z cin wpisywał znaki o kodach 0 i 1 (raczej znaki o kodach '0' i '1'), więc powinieneś pisać:
bin[ 0 ] == '1'
bin[ i ] = '0'
a gdy zechcesz odczytać, czy w bin jest liczba 1, czy 0, to piszesz
bin-'0'
wynik tego wyrażenia wynosi 0, gdy jest znak '0', zaś w przypadku znaku '1' wynik jest 1.

Tam, gdzie sam zobaczyłeś schody brakuje mnożenia przez odpowiednie potęgi dwójki i pomnożenia wyniku przez -1, gdy masz do czynienia z liczbą ujemną (sprawdź w wikipedii zapis U1).
P-103032
masa...
Temat założony przez niniejszego użytkownika
» 2014-01-24 19:29:24
Dziekuję bardzo za pomoc :) Moje ostateczne rozwiązanie :
C/C++
/*
Zad 1 C) Matura maj 2013 PR
*/
#include <iostream>
#include <string>
#include <cstdlib>
#include <math.h>

using namespace std;

int main( int argc, char ** argv ) {
    double znak = 1;
    static int d;
    cin >> d;
    string bin;
    cin >> bin;
   
    if( bin[ 0 ] == '1' )
    {
        for( int i = 1; i < d; i++ )
        if( bin[ i ] == '1' )
             bin[ i ] = '0';
        else
             bin[ i ] = '1';
       
        znak =- 1;
    }
   
    for( int i = 0; i < d; i++ ) bin[ i ] = bin[ i + 1 ];
   
    int x = strtol( bin.c_str(), NULL, 2 );
    x = x * znak;
   
    cout << x;
   
    return 0;
}
P-103101
« 1 »
  Strona 1 z 1