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

Liczby w systemie dwójkowym zapisane w pliku

Ostatnio zmodyfikowano 2015-02-09 16:50
Autor Wiadomość
rikrosfit
Temat założony przez niniejszego użytkownika
Liczby w systemie dwójkowym zapisane w pliku
» 2015-02-09 14:15:04
Hej, staralem sie napisac program ale troche mi cienko to idzie mam nadzieje ze mi pomozecie


W pliku liczby.txt, w oddzielnych wierszach, znajduje się 1000 liczb zapisanych
w systemie dwójkowym o długościach zapisów od 2 do 16 cyfr (0 lub 1).
Napisz program, którego wykonanie da odpowiedzi do poniższych podpunktów.
Odpowiedzi zapisz w pliku zadanie6.txt, a każdą odpowiedź poprzedź literą
oznaczającą ten podpunkt.
a) Ile jest liczb parzystych w całym pliku?
b) Jaka jest największa liczba w tym pliku? Podaj jej wartość w dwóch systemach:
dwójkowym i dziesiętnym.
c) Ile liczb w całym pliku ma dokładnie 9 cyfr? Podaj sumę tych liczb w systemie
dwójkowym.

C/C++
#include<iostream>
#include<cstring>
#include<cstdlib>
#include <fstream>
using namespace std;
long oblicz( int tab[], int n )
{
    long w = tab[ 0 ];
    for( int i = 1; i <= n; i++ )
         w = w * 2 + tab[ i ];
   
    return w;
}
int dziesiec( int t1[], int n1 )
{
    int i;
    cout << "podaj liczbe";
    cin >> i;
    while( i > 0 )
    {
        t1[ n1 ] = i % 2;
        t1[ n1 ] --;
    }
}

int main()
{
    int z, n, parzyste;
    int t[ 1000 ];
   
    ifstream in;
    in.open( "liczby.txt" );
    while( !in.eof() )
    {
        z >> in;
    }
    oblicz( z );
    for( z = 1; z <= n; z++ )
    {
        if( z % 2 == 0 )
             parzyste++;
       
    }
    cout << " ilosc liczb parzystych :" << parzyste;
    int g;
    g = z;
   
    for( g = 1; g <= t[ g - 1 ]; g++ )
    {
        int max = t[ 0 ]
        if( t[ g } > max )
         max = t[ g ];
   
    cout << "max=" << max;
   
}
dziesiec( g );
for( g = 1; g <= t[ g - 1 ]; g++ )
{
    int max = t[ 0 ]
    if( t[ g } > max )
     max = t[ g ];

cout << "max=" << max;
}

???



ofstream of;
of.close( "zadanie6" );
 punkt c jest zaznaczony ?? bo tu to juz w ogole nie wiem co robic
P-126235
michal11
» 2015-02-09 15:12:51
To ci się w ogóle kompiluje ?
Moim zdaniem bez sensu jest wczytywać te liczby do intów. Lepiej będzie jeżeli będziesz wczytywał je do stringa i wtedy:
a) jeżeli najmniej znaczący bit jest równy zero to liczba jest parzysta.
b) Największa liczba będzie miała najwięcej cyfr i najwięcej jedynek (możesz napisać sobie funkcje która zwraca ile jedynek ma liczba zapisana jako string)
c)
Ile liczb w całym pliku ma dokładnie 9 cyfr?
 To jest banalne jeżeli liczby są w stringu.
  
Podaj sumę tych liczb w systemie dwójkowym.
 To może być trochę trudniejsze, ale możesz zrobić to na 2 sposoby
albo napiszesz sobie funkcje która będzie dodawała 2 liczby binarne zapisane w stringu (to nawet nie jest takie trudne), albo (moim zdaniem trochę łatwiejsze) zamienić zamienić stringa na dec int dodawać do jakiejś sumy i na koniec ta sume zamienic na bin.
P-126237
jegor377
» 2015-02-09 15:16:19
po pierwsze to masz parę błędów w programie (literówki), po drugie zrób sobie tablicę i wczytaj każdą linię po kolei a następnie zamień na system decymalny i sprawdź czy modulo wczytanej liczby (jeżeli podzielisz ją przez dwa i czy jej wynik) jest większy od 0, jeżeli tak to jest liczba nieparzysta, w przeciwnym wypadku parzysta, dobrze też jak zrobisz sobie tablicę do których wrzucisz numery parzystych liczb. Następnie zrób sobie jakiś bufor i wrzuć tam wszystkie te liczby już przekonwertowane na system decymalny i poukładaj je najlepiej metodą quick sort (u P. Zelenta na kanale jest to najlepiej pokazane) i zależnie jak to poukładasz to weź albo liczbę z pierwszej komurki w już po układanej tablicy, albo ostatnią (zależnie od tego gdzie masz najmniejszą i jak układałeś). Analogicznie zrób tablicę (najlepiej vector) i sprawdź każdą liczbę (konwertując ją oczywiście) czy jest równa 9, wrzuć do tablicy i odczytaj rozmiar :)

PS ta metoda wyżej jest bardziej wydajna :)
P-126238
Monika90
» 2015-02-09 15:49:57
@jegor377
Nie ma potrzeby zapisywania tych liczb do tablicy, ani tym bardziej ich sortowania.
P-126241
rikrosfit
Temat założony przez niniejszego użytkownika
» 2015-02-09 15:54:24
co to znaczy najmniej znaczący bit? rozumiem ze jak mamy 1110 to zero bedzie najmniej znaczącym bitem tak? jak mam to zapisac?, nie kompiluje mi sie bląd wyskakuje
C/C++
while( !in.eof() )
{
    z >> in;
}
b) Największa liczba będzie miała najwięcej cyfr i najwięcej jedynek (możesz napisać sobie funkcje która zwraca ile jedynek ma liczba zapisana jako string)
a nie moglbym zrobic tego forem ?
C/C++
max = t[ 0 ]
for( int i = 1; i <= tab[ i - 1 ]; i++ )
     if( tab[ i ] > max ) max = tab[ i ]
 bo przeciez tutaj jest nieistonee chyba jaki system bo np 11 w systemie binarnym i dziesietynm bedzie wieksze od 10 to samo np 110 i 10
Podaj sumę tych liczb w systemie dwójkowym.
 To może być trochę trudniejsze, ale możesz zrobić to na 2 sposoby
albo napiszesz sobie funkcje która będzie dodawała 2 liczby binarne zapisane w stringu (to nawet nie jest takie trudne), albo (moim zdaniem trochę łatwiejsze) zamienić zamienić stringa na dec int dodawać do jakiejś sumy i na koniec ta sume zamienic na bin.

Szczerze mowiąc to ja staram sie praktycznie w ogole nie operowac stringiem bosie na tym calkowicie nie znam, w szkole o tym mowy praktycznie nie bylo wiec tyle ile sie obejrzlao na jakims tutorialu rozumiem ze ten drugi sposob zamiana stringa na inta to bedzie rzutowanie ?  a potem uzyje tej fukcji
C/C++
int dziesiec( int t1[], int n1 )
{
    int i;
    cout << "podaj liczbe";
    cin >> i;
    while( i > 0 )
    {
        t1[ n1 ] = i % 2;
        t1[ n1 ] --;
    }
}
 w ogole to mi sie wydaje ze w niej bedzie jakis bląd ale nie wiem jaki mozecie rzucic okiem na tą fukcje ona powinna zamieniac z bin na dec


a co to tego ile liczb ma 9 cyfr to jak są w stringu to po prostu
C/C++
int ile
int tablica[]
int suma = 0;
if( z == 9 ) ile++;

for( z = i; z <= tablica[ z - 1 ]; z++ )
{
    z = tablica[ 0 ];
    tablica[] ++;
}
oblicz( z );
suma += z;
dziesiec( suma );
cout << "suma wynosi" << suma << endl;
cout << liczb o 9 cyfrach jest << ile;
P-126242
michal11
» 2015-02-09 16:34:06
Tak powinieneś wczytywać.
C/C++
while( in >> str )
{
}

a) Tak pierwsza cyfra z prawej to najmniej znaczący bit.
przyda ci się funkcja length() z string. http://www.cplusplus.com​/string::length

b)
Ogólnie ja wszystko pisałem po wczytywanie liczb do stringa. Jeżeli liczba jest w stringu zapisana binarnie to żeby wiedzieć która jest największa to musisz sprawdzić to co napisałem wcześniej. To proste, lengthem sprawdzasz długoś, a form ilość jedynek. Musisz tylko gdzieś trzymać info o liczbie która jest najwieksza, ile ma cyfr i ile jedynek, żeby można było to porównywać.

c)
Tu masz gotowy algorytm na zamianę bin stringa na dec int.
C/C++
#include <string>
#include <cmath>
#include <algorithm>

string bin = "1000";
reverse( bin.begin(), bin.end() );
int tmp = 0;
for( int i = 0; i < bin.length(); ++i )
{
    tmp +=( bin[ i ] - '0' ) * static_cast < int >( pow( 2, i ) );
}

Wtedy wystarczy dodawać tmp do jakiejś sumy i na koniec zmienić ją na bin. Tu może być przydatny bitset.
C/C++
#include <bitset>

cout << bitset < 26 >( sum );



Do sprawdzania ile jest liczb w stringu podałem wcześniej funkcje length().

P-126249
jegor377
» 2015-02-09 16:50:24
@Monika

ahhh mimo iż znam podstawy itp... c++ na poziomie, że mogę praktycznie napisać wszystko co się da, jedyne co mnie ogranicza to matematyka na poziomie 1 gim, to muszę się jeszcze DUUUUUUUŻO nauczyć, bo ja bym to na serio tak zrobił, nawet nie szukając prostszego rozwiązania :) Zanim przeszedłem z konsoli na tryb 13h (o ile się nie mylę tak się nazywa tryb graficzny w assemblerze) to strasznie dbałem o to, by program był jak najprostszy i jak najmniej skomplikowany, a tym samym zajebisty, zaś dziś dbam tylko i wyłącznie o to by apka zjadała jak najmniej pamięci i zapierdzielała jak dzika, a kodu może być nie skończoność, pewnie wieki miną, aż opanuje go do perfekcji, ale będę się starał :)
P-126252
« 1 »
  Strona 1 z 1