• Nie Znaleziono Wyników

Laboratorium telekomunikacji Zadanie 2

N/A
N/A
Protected

Academic year: 2021

Share "Laboratorium telekomunikacji Zadanie 2"

Copied!
11
0
0

Pełen tekst

(1)

150875

numer indeksu

Grzegorz Graczyk

imi i nazwisko

151021

numer indeksu

Paweł Tarasiuk

imi i nazwisko

Data 2010-03-03

Kierunek Informatyka Rok akademicki 2009/10

Semestr 4

Grupa dziekańska 2

Laboratorium telekomunikacji

Zadanie 2

(2)

Opis programu i naszego rozumowania

Przygotowane zostały dwa programy, których używaliśmy do rozwiązania problemu. Pierw- szy z nich - napisany w języku Python - został wykorzystany do dogłębnej analizy problemu i wykonuje założenia instrukcji do ćwiczenia bardzo dokładnie, trzymając się semantyki postawio- nego problemu. Wyróżnione zostały np. funkcje przekształcające dane z pliku do postaci wekto- rów macierzy wartości logicznych, oraz funkcje przeznaczone do mnożenia macierzy. Program ten zawiera także funkcje badające zgodność wykorzystywanych macierzy z założeniami, oraz moż- liwość brutalnego szukania spełniającej wymagania macierzy o podanych wymiarach. Brutalne poszukiwania (sprawdzenie ponad pięciu milionów przypadków) utwierdziły nas w przekonaniu, że najmniejsza macierz H, która może pozwolić na korektę dwóch błędów w ośmiobitowej ma- cierzy musi mieć dziewięć wierszy (a zatem minimalna liczba bitów kontrolnych to właśnie 9).

Dużo prościej jest dla korekty jednego błędu - potrafimy oszacować od dołu, że liczba bitów kontrolnych musi wynosić co najmniej 4, i faktycznie dla 4 bitów udało nam się skonstruować poprawną macierz. Oszacowanie wynika z tego, że macierz H dla korekty jednego błędu musi posiadać n + 8 różnych, niezerowych kolumn, podczas gdy możliwych wariacji które mogą być kolumnami jest tylko 2

n

− 1. Uzyskany warunek n + 8 ¬ 2

n

− 1 jest natomiast spełniony dla n > 3.

Zatem przykładowe macierze, których można używać do tworzenia bitów kontrolnych oraz do korekty błędów, mają postać:

H

1

=

1 1 1 0 0 0 1 1 1 0 0 0

1 0 0 1 1 0 1 1 0 1 0 0

0 1 0 1 0 1 1 0 0 0 1 0

0 0 1 0 1 1 0 1 0 0 0 1

Dla korekty jednego błędu, oraz:

H

2

=

0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0

1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0

1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0

0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0

1 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0

0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0

1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0

0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0

0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1

Dla korekty dwóch błędów.

Druga z przygotowanych implementacji cechuje się wysoką wydajnością, jednakże jest pisana w specyficznym dialekcie języka C, specyficznym dla kompilatora GNU. Jednakże kompilator gcc pozwala na korzystanie z niego na wielu platformach sprzętowych z systemami uniksopo- bobnymi. Implementacja ta jest szybka i oszczędna pamięciowo, lecz jej wadami są: mniejsza przenośność, gorsza czytelność i pewne zmiany w rozumowaniu w stosunku do instrukcji. Jednak- że wynik działania drugiego programu jest w pełni zgodny z oczekiwaniami i obie implementacje są wzajemnie kompatybilne.

Implementacja przenośna, ściśle zgodna z opisem, wykonana w języku Python

#! / u s r / b i n / env python i m p o r t s y s

(3)

i m p o r t random

#

# Agumenty programu :

# 1 l u b 2 − t r y b p r a c y ( p r z y g o t o w a n i e do k o r e k c j i 1 b i t u na 12 l u b 2 b i t o w na 1 7 )

# e n c l u b d e c − p r z y g o t o w a n i e l u b o d c z y t

# p l i k w e j s c i o w y

# p l i k w y j s c i o w y

#

# m a c i e r z do k o r e k t y j e d n e g o b l e d u p r z y 8 b i t a c h danych − 4 b i t y k o n t r o l n e

H1 = [

[ 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 0 , 0 ] , [ 1 , 0 , 0 , 1 , 1 , 0 , 1 , 1 , 0 , 1 , 0 , 0 ] , [ 0 , 1 , 0 , 1 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 0 ] , [ 0 , 0 , 1 , 0 , 1 , 1 , 0 , 1 , 0 , 0 , 0 , 1 ] ]

# m a c i e r z do k o r e k t y dwoch bledow p r z y 8 b i t a c h danych − 9 b i t o w k o n t r o l n y c h

H2 = [

[ 0 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] , [ 1 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] , [ 1 , 1 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 ] , [ 0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 ] , [ 1 , 0 , 1 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 ] , [ 0 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 ] , [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 ] , [ 0 , 0 , 1 , 0 , 1 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 ] , [ 0 , 1 , 0 , 1 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ]

# sprawdza poprawnosc m a c i e r z y H s l u z a c e j do naprawy j e d n e g o b l e d u

# i i n f o r m u j e o e w e n t u a l n y c h b l e d a c h w m a c i e r z y d e f m a t r i x t e s t 1 (H, q u i e t = F a l s e ) :

HT = t r a n s p o n a t e (H) HT. append ( [ ] )

f o r i i n x r a n g e ( l e n (HT [ 0 ] ) ) : HT[ − 1 ] . append ( 0 )

h = l e n (HT)

f o r i i n x r a n g e ( h ) : f o r j i n x r a n g e ( i ) :

i f HT[ i ] == HT[ j ] : i f n o t q u i e t :

p r i n t ” Columns %d and %d a r e e q u a l . ” % ( i , j ) r e t u r n F a l s e

r e t u r n True

# sprawdza poprawnosc m a c i e r z y H s l u z a c e j do naprawy dwoch bledow

# i i n f o r m u j e o e w e n t u a l n y c h b l e d a c h w m a c i e r z y d e f m a t r i x t e s t 2 (H, q u i e t = F a l s e ) :

HT = t r a n s p o n a t e (H) HT. append ( [ ] )

f o r i i n x r a n g e ( l e n (HT [ 0 ] ) ) : HT[ − 1 ] . append ( 0 )

h = l e n (HT) P = [ ]

f o r i i n x r a n g e ( h ) : f o r j i n x r a n g e ( i ) :

i f HT[ i ] == HT[ j ] : i f n o t q u i e t :

p r i n t ” Columns %d and %d a r e e q u a l . ” % ( i , j ) r e t u r n F a l s e

P . append ( [ b o o l v e c t o r x o r (HT[ i ] , HT[ j ] ) , i , j ] ) h = l e n (P)

f o r i i n x r a n g e ( h ) : f o r j i n x r a n g e ( h ) :

i f i != j :

i f P [ i ] [ 0 ] == P [ j ] [ 0 ] : i f n o t q u i e t :

p r i n t(” Columns (%d , %d ) and (%d , %d ) have e q u a l sums . ”

(4)

% (P [ i ] [ 1 ] , P [ i ] [ 2 ] , P [ j ] [ 1 ] , P [ j ] [ 2 ] ) ) r e t u r n F a l s e

r e t u r n True

# g e n e r u j e m a c i e r z , np .

# m a t r i x g e n ( 4 , m a t r i x t e s t 1 ) − l o s u j e m a c i e r z do k o r e k c j i j e d n e g o b l e d u

# m a t r i x g e n ( 9 , m a t r i x t e s t 2 ) − l o s u j e m a c i e r z do k o r e k c j i dwoch bledow

# m a t r i x g e n ( 8 , m a t r i x t e s t 2 ) − w i e c z n i e p r a c u j e i i n f o r m u j e o l i c z b i e zbadanych przypadkow d e f m a t r i x g e n ( t , t e s t ) :

U = [ ] P = [ ] s = 0

f o r i i n x r a n g e ( t + 1 ) : U . append ( [ ] )

f o r j i n x r a n g e ( t ) : U [ i ] . append ( 0 ) f o r i i n x r a n g e ( 1 , t + 1 ) :

U [ i ] [ i − 1 ] = 1 f o r i i n x r a n g e ( 1 << t ) :

P . append ( [ ] )

f o r j i n x r a n g e ( t ) :

P [ i ] . append ( i n t ( b o o l ( i & ( 1 << j ) ) ) ) f o r e i n U :

P . remove ( e ) w h i l e True :

R = [ ]

f o r e i n random . s a m p l e (P , 8 ) : R . append ( e )

f o r e i n U [ 1 : ] : R . append ( e )

i f t e s t ( t r a n s p o n a t e (R) , True ) :

p r i n t ” Analyzed s a m p l e s : %d” % ( s + 1 ) p r i n t ” R e s u l t : [ ”

f o r e i n t r a n s p o n a t e (R ) : p r i n t e

p r i n t ” ] ” r e t u r n True s += 1

i f s % 2 50 00 == 0 :

p r i n t ” Analyzed s a m p l e s : %d” % s

# d o d a j e b i t y k o n t r o l n e do t a b l i c y b i t o w d e f a d d c o n t r o l (T, H ) :

S = T n = l e n (H)

m = l e n (H [ 0 ] ) − n f o r i i n x r a n g e ( n ) :

c = 0

f o r j i n x r a n g e (m) :

c ˆ= H [ i ] [ j ] & T [ j ] [ 0 ] S . append ( [ c ] )

r e t u r n S

# mnozy m a c i e r z e

d e f b o o l m a t r i x m u l (A, B ) : i f l e n (A [ 0 ] ) != l e n (B ) :

r e t u r n F a l s e R = [ ]

h = l e n (A) w = l e n (B [ 0 ] ) n = l e n (B)

f o r i i n x r a n g e ( h ) : R . append ( [ ] )

f o r j i n x r a n g e (w ) : R [ i ] . append ( 0 )

f o r k i n x r a n g e ( n ) :

R [ i ] [ j ] ˆ= A [ i ] [ k ] & B [ k ] [ j ] r e t u r n R

# d o d a j e w e k t o r y jednowymiarowe

(5)

d e f b o o l v e c t o r x o r (A, B ) : i f l e n (A) != l e n (B ) :

r e t u r n F a l s e R = [ ]

l = l e n (A)

f o r i i n x r a n g e ( l ) : R . append (A [ i ] ˆ B [ i ] ) r e t u r n R

# t r a n s p o n u j e m a c i e r z dwuwymiarowa d e f t r a n s p o n a t e (A ) :

R = [ ] h = l e n (A) w = l e n (A [ 0 ] )

f o r i i n x r a n g e (w ) : R . append ( [ ] )

f o r j i n x r a n g e ( h ) : R [ i ] . append (A [ j ] [ i ] ) r e t u r n R

# wprowadza b l e d y do t a b l i c y b i t o w d e f a d d e r r o r s (V, n ) :

R = V

f o r r i n random . s a m p l e ( r a n g e ( l e n (V) ) , n ) : R [ r ] [ 0 ] ˆ= 1

r e t u r n R

# sprawdza , c z y czasem m a c i e r z n i e z a w i e r a j a k i e g o s n i e z e r o w e g o p o l a d e f i s z e r o (A ) :

t r y:

f o r i i n x r a n g e ( l e n (A ) ) : i f n o t i s z e r o (A [ i ] ) :

r e t u r n F a l s e r e t u r n True

e x c e p t:

r e t u r n n o t b o o l ( i n t (A) )

# w y s z u k u j e e l e m e n t w t a b l i c y ( n i e c h c e nam s i e potem o b s l u g i w a c bledow −

# j a k e l e m e n t u n i e ma , chcemy w a r t o s c −1) d e f a r r a y f i n d (A, e ) :

t r y:

r e t u r n A . i n d e x ( e ) e x c e p t:

r e t u r n −1

d e f m a k e f l a t (A ) : t r y:

i f l e n (A) == 1 :

r e t u r n m a k e f l a t (A [ 0 ] ) e l i f l e n (A) > 1 :

f o r i i n x r a n g e ( l e n (A ) ) : A [ i ] = m a k e f l a t (A [ i ] ) r e t u r n A

e x c e p t: r e t u r n A

# u s t a l a , na j a k i c h p o z y c j a c h s a b l e d y d e f f i n d e r r o r s (H, E ) :

M = m a k e f l a t ( b o o l m a t r i x m u l (H, E ) ) HT = t r a n s p o n a t e (H)

i f i s z e r o (M) : r e t u r n [ ]

f = a r r a y f i n d (HT, M) i f f != −1:

r e t u r n [ f ]

f o r i i n x r a n g e ( l e n (HT ) ) :

f = a r r a y f i n d (HT, b o o l v e c t o r x o r (M, HT[ i ] ) ) i f f != −1:

r e t u r n [ f , i ] r e t u r n [ − 1 ]

(6)

# z a m i e n i a c i a g b a j t o w na t a b l i c e b i t o w o z a d a n e j d l u g o s c i d e f b y t e s 2 a r r ( b , n ) :

R = [ ] p = 0

i f b == ’ ’: b = ’ \0 ’

w h i l e n − l e n (R) > 8 : t = o r d ( b [ 0 ] ) f o r i i n x r a n g e ( 8 ) :

R . i n s e r t ( p , t & 1 ) t >>= 1

p += 8 b = b [ 1 : ]

i f b == ’ ’: b = ’ \0 ’ t = o r d ( b [ 0 ] ) w h i l e l e n (R) < n :

R . i n s e r t ( p , t & 1 ) t >>= 1

r e t u r n R

# z a m i e n i a t a b l i c e b i t o w na c i a g b a j t o w d e f a r r 2 b y t e s (A ) :

B = A [ : 8 ] C = A [ 8 : ] n = 0 r = ’ ’

w h i l e l e n (B) < 8 : B . i n s e r t ( 0 , 0 ) w h i l e B :

n = ( n << 1 ) + B [ 0 ] B = B [ 1 : ]

r += c h r ( n ) i f C :

r += a r r 2 b y t e s (C) r e t u r n r

# p r z y g o t o w u j e p l i k do t r a n s m i s j i , o p c j o n a l n i e z a s z u m i a j a c go d e f e n c o d e f i l e ( inn , outn , H, e = 0 ) :

f i n = open ( inn , ’ r b ’) f o u t = open ( outn , ’wb ’) w h i l e True :

c = f i n . r e a d ( 1 ) i f c == ’ ’:

b r e a k

f o u t . w r i t e ( a r r 2 b y t e s ( m a k e f l a t ( a d d e r r o r s ( a d d c o n t r o l ( t r a n s p o n a t e ( [ b y t e s 2 a r r ( c , 8 ) ] ) , H) , random . r a n d i n t ( 0 , e ) ) ) ) )

f i n . c l o s e ( ) f o u t . c l o s e ( )

# o d c z y t u j e o d e b r a n y p l i k

d e f d e c o d e f i l e ( inn , outn , H, e = −1):

f i n = open ( inn , ’ r b ’) f o u t = open ( outn , ’wb ’) n = l e n (H [ 0 ] )

b = ( n + 7 ) >> 3 w h i l e True :

c = f i n . r e a d ( b ) i f c == ’ ’:

b r e a k

R = t r a n s p o n a t e ( [ b y t e s 2 a r r ( c , n ) ] ) E = f i n d e r r o r s (H, R)

i f l e n (E) == 1 and E [ 0 ] == −1:

p r i n t ” E r r o r : d a t a n o t r e c o g n i z e d a t a l l ( and , e s p e c i a l l y , n o t f i x e d ) ! ” e l i f e != −1 and l e n (E) > e :

p r i n t (” Warning : more e r r o r s than e x p e c t e d . P r o b a b l y m i s t a k e n due t o t o o buggy ” +

” d a t a . ”) f o r x i n E :

R [ x ] [ 0 ] ˆ= 1

(7)

f o u t . w r i t e ( a r r 2 b y t e s ( m a k e f l a t ( t r a n s p o n a t e (R ) ) [ : 8 ] ) ) f i n . c l o s e ( )

f o u t . c l o s e ( )

c o n f i g s = [ [ H1 , m a t r i x t e s t 1 , 1 ] , [ H2 , m a t r i x t e s t 2 , 2 ] ]

i f l e n ( s y s . a r g v ) != 5 :

p r i n t ”Too l i t t l e a r g u m e n t s . ” p r i n t

p r i n t ”USAGE: ”

p r i n t ”%s 1 | 2 e n c | d e c INFILE OUTFILE”

s y s . e x i t ( )

i f s y s . a r g v [ 1 ] == ’ 1 ’: c o n f i g = c o n f i g s [ 0 ] e l i f s y s . a r g v [ 1 ] == ’ 2 ’:

c o n f i g = c o n f i g s [ 1 ]

i f n o t c o n f i g [ 1 ] ( c o n f i g [ 0 ] ) :

p r i n t ” E r r o r s i n b u i l t −i n m a t r i x . . . ” e x i t ( )

i f s y s . a r g v [ 2 ] == ’ e n c ’:

e n c o d e f i l e ( s y s . a r g v [ 3 ] , s y s . a r g v [ 4 ] , c o n f i g [ 0 ] , c o n f i g [ 2 ] ) e l i f s y s . a r g v [ 2 ] == ’ d e c ’:

d e c o d e f i l e ( s y s . a r g v [ 3 ] , s y s . a r g v [ 4 ] , c o n f i g [ 0 ] )

Implementacja wydajna - w dialekcie języka C wykorzystującym specyficzne właściwości kompilatora GNU

#i n c l u d e < s t d i o . h>

#i n c l u d e < s t r i n g . h>

#i n c l u d e < s t d l i b . h>

c o n s t c h a r u s a g e [ ] = ” Usage \n” ” . / main [ s s e c i n g s ] mode\n” ”Modes : \ n”

// ” term − t e r m i n a l c o n n e c t i o n \n”

// ” r e c v − r e c i v e f i l e u s i n g xmodem\n”

// ” s e n d − s e n d f i l e u s i n g xmodem\n”

” c a t − w r i t e i n p u t t o o u t p u t \n”

// ” P o r t : \ n”

// ” e n t e r p o r t a s d e v i c e f i l e path \n”

” S s e c i n g s : \ n”

− i f i l e u s e FILE a s i n p u t \n”

−o f i l e u s e FILE a s o u t p u t \n”

−c c o d e e n c o d e f i l e u s i n g CODE\n”

” c o d e s : \n”

” s e c S i n g l e E r r o r C o r r e c t i o n \n”

” s e c r S i n g l e E r r o r C o r r e c t i o n R e v e r t \n”

” d e c Double E r r o r C o r r e c t i o n \n”

” d e c r Double E r r o r C o r r e c t i o n R e v e r t \n”

” e r r 1 C r e a t e e r r o r s f o r SEC\n”

” e r r 2 C r e a t e e r r o r s f o r DEC\n” ” −v v e r b o s e mode\n”;

/∗ s s e c i n g s : ∗/

#d e f i n e b o o l c h a r

#d e f i n e t r u e ( ( b o o l ) 1 )

#d e f i n e f a l s e ( ( b o o l ) 0 )

t y p e d e f i n t ( ∗ c o d e r ) (c h a r ∗ , i n t , c h a r ∗ ) ;

FILE ∗ i n p u t ; FILE ∗ o u t p u t ; c o d e r c o d e = NULL ; b o o l v e r b o s e = f a l s e ; /∗ kodowanie ( zad2 ) ∗/

(8)

/∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− E i g h t t o Twelve −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗/

c o n s t c h a r s e c m a s k [ 4 ] = { 0 x 0 f , 0 x71 , 0 xb6 , 0 xda } ;

i n t s e c r (c h a r ∗ i n , i n t l e n , c h a r ∗ ou t ) { i n t i , j , k ;

u n s i g n e d c h a r e r , m;

i f( i n == NULL) r e t u r n l e n / 2 ;

f o r( i = j = 0 ; i < l e n ; i += 2 , j ++) { o u t [ j ] = i n [ i ] ;

e r = 0 x f f ; m = i n [ i + 1 ] ;

f o r( k = 0 ; e r && k < 4 ; k++, m >>= 1 ) {

// f p r i n t f ( s t d e r r , ”%d ) %x %x \n ” , k , e r , m ) ;

i f( ( b u i l t i n p o p c o u n t ( i n [ i ] & s e c m a s k [ k ] ) & 1 ) == (m & 1 ) ) e r &= ˜ s e c m a s k [ k ] ;

e l s e

e r &= s e c m a s k [ k ] ; }

i f( v e r b o s e )

f p r i n t f ( s t d e r r , ” F i x i n g e r r o r ! \ n”, k ) ; o u t [ j ] ˆ= e r ;

}

r e t u r n j ; }

i n t s e c (c h a r ∗ i n , i n t l e n , c h a r ∗ ou t ) { i n t i , j , k ;

i f( i n == NULL) r e t u r n l e n ∗ 2 ;

f o r( i = j = 0 ; i < l e n ; i ++, j += 2 ) { o u t [ j ] = i n [ i ] ;

o u t [ j + 1 ] = 0 ;

f o r( k = 0 ; k < 4 ; k++)

o u t [ j + 1 ] |= ( b u i l t i n p o p c o u n t ( i n [ i ] & s e c m a s k [ k ] ) & 1 ) << k ; }

r e t u r n j ; }

/∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− E i g h t t o S e v e n t e e n −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗/

c o n s t c h a r dec mask [ 9 ] = { 0 x31 , 0 x f 4 , 0 xc9 , 0 x2a , 0xbd , 0 x 5 f , 0 x f e , 0 x2d , 0 x5a } ; s h o r t d e c e r r o r s [ 1 7 ] = { −1 } ;

v o i d d e c i n i t ( ) { i n t i , k ;

f o r( i = 0 ; i < 8 ; i ++) { d e c e r r o r s [ i ] = 0 ; f o r( k = 0 ; k < 9 ; k++)

i f( dec mask [ k ] & ( 1 << i ) ) d e c e r r o r s [ i ] |= 1 << k ; }

f o r( ; i < 1 7 ; i ++)

d e c e r r o r s [ i ] = 1 << ( i − 8 ) ; }

i n t d e c r (c h a r ∗ i n , i n t l e n , c h a r ∗ ou t ) { i n t i , j , k , l ;

u n s i g n e d s h o r t e r , m;

i f( i n == NULL) r e t u r n l e n / 3 ; i f( d e c e r r o r s [ 0 ] == −1)

d e c i n i t ( ) ;

f o r( i = j = 0 ; i < l e n ; i += 3 , j ++) {

(9)

o u t [ j ] = i n [ i ] ; e r = 0 ;

m = ( i n [ i + 2 ] << 8 ) | (u n s i g n e d c h a r) i n [ i + 1 ] ; f o r( k = 0 ; k < 9 ; k++, m >>= 1 ) {

i f( ( b u i l t i n p o p c o u n t ( i n [ i ] & dec mask [ k ] ) & 1 ) != (m & 1 ) ) e r |= 1 << k ;

}

// f p r i n t f ( s t d e r r , ”%x \n ” , e r ) ; f o r( k = 0 ; e r && k < 1 7 ; k++)

i f( d e c e r r o r s [ k ] == e r ) { e r = 0 ;

i f( k < 8 )

o u t [ j ] ˆ= 1 << k ; i f( v e r b o s e )

f p r i n t f ( s t d e r r , ” E r r o r a t %d b i t ! \ n”, k ) ; }

f o r( k = 0 ; e r && k < 1 7 ; k++)

f o r( l = k + 1 ; e r && l < 1 7 ; l ++)

i f( ( d e c e r r o r s [ k ] ˆ d e c e r r o r s [ l ] ) == e r ) {

// f p r i n t f ( s t d e r r , ” w t f : %x ˆ %x = %x \n ” , d e c e r r o r s [ k ] , d e c e r r o r s [ l ] , e r ) ; e r = 0 ;

i f( k < 8 )

o u t [ j ] ˆ= 1 << k ; i f( l < 8 )

o u t [ j ] ˆ= 1 << l ; i f( v e r b o s e )

f p r i n t f ( s t d e r r , ” E r r o r s a t %d and %d b i t ! \ n”, k , l ) ; }

i f( e r )

f p r i n t f ( s t d e r r , ” U n r e p a i r e d e r r o r ! \ n”) ; }

r e t u r n j ; }

i n t d e c (c h a r ∗ i n , i n t l e n , c h a r ∗ ou t ) { i n t i , j , k ;

i f( i n == NULL) r e t u r n l e n ∗ 3 ;

f o r( i = j = 0 ; i < l e n ; i ++, j += 3 ) { o u t [ j ] = i n [ i ] ;

o u t [ j + 1 ] = 0 ;

f o r( k = 0 ; k < 8 ; k++)

o u t [ j + 1 ] |= ( b u i l t i n p o p c o u n t ( i n [ i ] & dec mask [ k ] ) & 1 ) << k ; o u t [ j + 2 ] = ( b u i l t i n p o p c o u n t ( i n [ i ] & dec mask [ 8 ] ) & 1 ) ;

}

r e t u r n j ; }

/∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗/

i n t e r r 1 (c h a r ∗ i n , i n t l e n , c h a r ∗ ou t ) { i n t i , r ;

i f( i n == NULL) r e t u r n l e n ;

f o r( i = 0 ; i < l e n ; i += 2 ) { o u t [ i ] = i n [ i ] ;

o u t [ i + 1 ] = i n [ i + 1 ] ; r = rand ( ) % 1 2 ;

i f( r < 8 )

o u t [ i ] ˆ= 1 << r ; e l s e

o u t [ i + 1 ] ˆ= 1 << ( r − 8 ) ; }

r e t u r n i ; }

i n t e r r 2 (c h a r ∗ i n , i n t l e n , c h a r ∗ ou t ) { i n t i , r ;

i f( i n == NULL)

(10)

r e t u r n l e n ;

f o r( i = 0 ; i < l e n ; i += 3 ) { o u t [ i ] = i n [ i ] ;

o u t [ i + 1 ] = i n [ i + 1 ] ; o u t [ i + 2 ] = i n [ i + 1 2 ] ; r = rand ( ) % 1 7 ;

i f( r < 8 )

o u t [ i ] ˆ= 1 << r ; e l s e i f( r < 1 6 )

o u t [ i + 1 ] ˆ= 1 << ( r − 8 ) ; e l s e

o u t [ i + 2 ] ˆ= 1 << ( r − 1 6 ) ; }

r e t u r n i ; }

/∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗/

i n t c a t ( ) {

i n t s i z e = 1 0 2 4 , l e n = 0 , num ;

c h a r ∗ i n = m a l l o c ( s i z e ) , ∗ ou t = NULL ;

do {

num = f r e a d ( i n + l e n , 1 , s i z e − l e n , i n p u t ) ; i f(num == −1)

r e t u r n −1;

l e n += num ; i f( l e n == s i z e ) {

s i z e <<= 1 ;

i n = r e a l l o c ( i n , s i z e ) ; }

} w h i l e(num > 0 ) ;

i f( c o d e ) {

o u t = m a l l o c ( c o d e ( 0 , l e n , 0 ) ) ; l e n = c o d e ( i n , l e n , o u t ) ; f w r i t e ( out , 1 , l e n , o u t p u t ) ; } e l s e

f w r i t e ( i n , 1 , l e n , o u t p u t ) ;

f r e e ( i n ) ; i f( o u t )

f r e e ( o u t ) ; }

i n t term (c o n s t c h a r ∗ path ) { FILE ∗ f i l e = f o p e n ( path , ” r ”) ;

i n t v a l ; c h a r b u f [ 1 2 3 ] ;

do {

v a l = f g e t c ( f i l e ) ; i f( v a l == EOF)

b r e a k; p u t c h a r ( v a l ) ; } w h i l e( 1 ) ;

f c l o s e ( f i l e ) ; r e t u r n 0 ; }

v o i d d e s t r u c t o r ( ) { i f( i n p u t != s t d i n )

f c l o s e ( i n p u t ) ; i f( o u t p u t != s t d o u t )

f c l o s e ( o u t p u t ) ; }

#d e f i n e CODE( name ) i f( s t r c m p ( a r g v [ i ] , #name ) == 0 ) c o d e = &name ; i n t main (i n t a r g c , c o n s t c h a r ∗c o n s t a r g v [ ] ) {

(11)

i n t i , j ;

c o n s t c h a r ∗mode , ∗ p o r t ; FILE ∗ f ;

i n p u t = s t d i n ; o u t p u t = s t d o u t ;

f o r( i = 1 , j = 0 ; i < a r g c ; i ++) { i f( a r g v [ i ] [ 0 ] == ’− ’)

s w i t c h ( a r g v [ i ] [ 1 ] ) { c a s e ’ i ’:

f = f o p e n ( a r g v [++ i ] , ” r b ”) ; i f( f == NULL)

i = a r g c ; e l s e

i n p u t = f ; b r e a k;

c a s e ’ o ’:

f = f o p e n ( a r g v [++ i ] , ”wb”) ; i f( f == NULL)

i = a r g c ; e l s e

o u t p u t = f ; b r e a k;

c a s e ’ c ’: ++i ; CODE( s e c )

e l s e CODE( s e c r ) e l s e CODE( d e c ) e l s e CODE( d e c r ) e l s e CODE( e r r 1 ) e l s e CODE( e r r 2 ) e l s e i = a r g c ; b r e a k;

c a s e ’ v ’:

v e r b o s e = t r u e ; b r e a k;

d e f a u l t: i = a r g c ; } e l s e

s w i t c h ( j ++) { c a s e 0 :

mode = a r g v [ i ] ; b r e a k;

c a s e 1 :

p o r t = a r g v [ i ] ; b r e a k;

d e f a u l t: i = a r g c ; }

}

i f( i > a r g c | | j != 1 ) { p u t s ( u s a g e ) ;

r e t u r n −1;

}

i f( s t r c m p ( mode , ” c a t ”) == 0 ) r e t u r n c a t ( ) ;

// i f ( s t r c m p ( a r g v [ 1 ] , ” term ” ) == 0 ) // r e t u r n term ( a r g v [ 2 ] ) ;

// p u t s ( u s a g e ) ; r e t u r n −1;

}

Cytaty

Powiązane dokumenty

Wymień klasy adresów IP, gdzie się je stosuje, jaka jest minimalna

W wierszu Józefa Ratajczaka zostały przedstawione przemiany zachodzące w .... spowodowane upływem ..., a więc następującymi po

Kwestionowanie pragnienia dokonywane przez wolę nie jest, rzecz jasna, jego zakwestionowaniem, ale raczej postawieniem kwestii (czy chcę dalej pragnąć i dzia ­ łać pod

Program przyjmuje prosty, jednoznakowy argument pozwalający decydować, czy pliki będą wysyłane, czy odbierane, oraz argumenty po- zwalające wybrać port COM oraz plik do

Jego działanie jest bardzo proste - tworzone są dwa wątki, z których jeden odczytuje dane wpisywane za pomocą klawiatury na standardowe wejście i przekazuje je w niezmienionej

Środowisko uru- chomieniowe języka Java jest bardzo dobrze rozpowszechnione na telefonach komórkowych oraz urządzeniach mobilnych, dzięki czemu stworzone przy pomocy J2ME aplikacje

2) Wprowadzić dane: lab4.zad2 (cholesterol, wiek).. 2) Tworzymy dwa zbiory: lab4.zad8 (wartość, powierzchnia, odległość), lab4.zad8p (powierzchnia, odległość) 3) Analizuj

przecinają się w jednym punkcie, to równoległościan opisany na tym czworościanie jest rombościanem (wszystkie jego ściany są rombami).. Skonstruuj trójkąt mając dane jego