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. #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 |
|
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. |
|
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 :) |
|
Monika90 |
» 2015-02-09 15:49:57 @jegor377 Nie ma potrzeby zapisywania tych liczb do tablicy, ani tym bardziej ich sortowania. |
|
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 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 ? 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 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 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;
|
|
michal11 |
» 2015-02-09 16:34:06 Tak powinieneś wczytywać. a) Tak pierwsza cyfra z prawej to najmniej znaczący bit. przyda ci się funkcja length() z string. http://www.cplusplus.com/string::lengthb) 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. #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. #include <bitset>
cout << bitset < 26 >( sum );
Do sprawdzania ile jest liczb w stringu podałem wcześniej funkcje length(). |
|
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ł :) |
|
« 1 » |