• 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

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

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

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

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