kolokwium2 2013

Transkrypt

kolokwium2 2013
Kolokwium II z Wst¦pu do Informatyki, 2013/2014
1. Telemarketer dzwoni pod numery, które ma na li±cie. Do ka»dej osoby z listy dzwoni si¦ tylko raz (aby unikn¡¢
skarg), przy czym licz¡ si¦ tylko rzeczywi±cie odbyte rozmowy. Aby skoordynowa¢ dziaªania, rma zatrudniaj¡ca
telemarketerów prowadzi rejestr odbytych rozmów.
Plik z numerami zawiera w kolejnych linijkach numery telefonów, przykªadowo:
numery.txt:
501123234
504142142
Pliki z danymi rozmów zawieraj¡: numer telemarketera, numer telefonu, dªugo±¢ rozmowy (0 w przypadku, gdy
rozmowa si¦ nie odbyªa, tzn. telemarketerowi nie udaªo si¦ dodzwoni¢ do rozmówcy). Przyjmujemy, »e próby s¡
rejestrowane w kolejno±ci chronologicznej. Przykªadowy plik:
rozmowy.txt:
14 501123234 0
14 501123234 0
12 501123234 3
14 601990880 2
15 601990880 1
8 504142142 0
11 501123234 2
(a) (2 pkt.) Napisz funkcj¦ zadzwonic(f_numery, f_rozmowy), dla podanych plików z numerami oraz z rozmowami zwróci list¦ wszystkich numerów, do których nale»y jeszcze w danym miesi¡cu zadzwoni¢, tzn.
tych, pod które nie dodzwoniª si¦ skutecznie (tzn. nie porozmawiaª przynajmniej minuty) »aden telemarketer. Przykªadowo, wynikiem wykonania funkcji zadzwonic("numery.txt","rozmowy.txt") powinno by¢
['504142142'].
(b) (4 pkt.) Napisz funkcj¦ bledy(f_numery, f_rozmowy), która pozwoli wyªapa¢ tych telemarketerów, którzy
popeªnili bª¦dy podczas pracy. Bª¦dem jest w szczególno±ci: próba dzwonienia do osoby, której nie ma na
li±cie oraz próba dzwonienia do osoby, do której ju» udaªo si¦ dodzwoni¢ wcze±niej jakiemu± telemarketerowi. W przypadku rozpatrywania, czy kto± popeªniª bª¡d, to, czy telemarketerowi udaªo si¦ dodzwoni¢ do
rozmówcy nie jest brane pod uwag¦. Funkcja powinna zwróci¢ list¦ numerów telemarketerów, którzy popeªnili bª¦dy. Przykªadowo, dla bledy("numery.txt","rozmowy.txt") wynikiem powinno by¢ [11, 14,
15].
Rozwi¡zanie:
d e f baza_numerow ( f_numery ) :
f = open ( f_numery )
baza = s e t ( [ ] )
for x in f :
r = x . s p l i t ()
b a z a . add ( r [ 0 ] )
f . close ()
r e t u r n baza
def
z a d z w o n i c ( f_numery , f_rozmowy ) :
baza_n = baza_numerow ( f_numery )
z = set ( [ ] )
f o r k i n baza_n
z . add ( k )
f = open ( f_rozmowy )
for x in f :
r = x . s p l i t ()
i f i n t ( r [ 2 ] ) > 0 and r [ 1 ] i n
z:
1
z . remove ( r [ 1 ] )
f . close ()
return l i s t ( z )
def
b l e d y ( f_numery , f_rozmowy ) :
baza_n = baza_numerow ( f_numery )
juz_obsluzone = s e t ( [ ] )
bladzacy = set ( [ ] )
f = open ( f_rozmowy )
for x in f :
r = x . s p l i t ()
marketer = i n t ( r [ 0 ] )
numer = r [ 1 ]
minuty = i n t ( r [ 2 ] )
i f r [ 1 ] n o t i n baza_n o r numer i n
b l a d z a c y . add ( m a r k e t e r )
e l i f minuty > 0 :
j u z _ o b s l u z o n e . add ( numer )
return l i s t ( bladzacy )
juz_obsluzone :
2. Rozwa»my list¦ list zawieraj¡cych imiona uczestników kolejnych zebra« koªa naukowego (zakªadamy, »e ka»de
imi¦ jednoznacznie wyznacza jedn¡ osob¦). Przykªadowa taka lista to np. [['Jan', 'Maria', 'Krzysztof'],
['Maria', 'Katarzyna'], ['Jan', 'Grzegorz', 'Maria']]).
(a) (2 pkt.) Napisz funkcje kazde(l), która zwróci list¦ osób, które byªy na ka»dym z zebra«. Dla naszej
przykªadowej listy powy»ej wynikiem funkcji kazde powinno by¢ ['Maria'].
(b) (3 pkt.) Napisz funkcj¦ najczesciej(l, u), która dla listy l uczestników zebra« oraz dla listy u wybranych
osób zwróci osob¦, która na zebraniach byªa najcz¦±ciej. W przypadku remisu zwracamy dowoln¡ z tych
osób, przy czym remis jest tak»e wtedy, kiedy »adna z osób nie byªa na ani jednym zebraniu.
Rozwi¡zanie:
import
collections
def
spotkania_uczestnik ( l ) :
uczestnictwa = c o l l e c t i o n s . defaultdict ( int )
for spotkanie in l :
for uczestnik in spotkanie :
u c z e s t n i c t w a [ u c z e s t n i k ] += 1
return uczestnictwa
def
kazde ( l ) :
ilosc_spotkan = len ( l )
byli = [ ]
uczestnictwa = spotkania_uczestnik ( l )
for k , v in uczestnictwa . iteritems () :
i f v == i l o s c _ s p o t k a n :
b y l i . append ( k )
return byli
def
n a j c z e s c i e j ( l , u) :
uczestnictwa = spotkania_uczestnik ( l )
przodownik = [ ]
ile = 0
for k , v in uczestnictwa . iteritems () :
i f k in u :
if v > ile :
przodownik = k
ile = v
r e t u r n przodownik
3. Co wypisz¡ nast¦puj¡ce programy?
(a) (2 pkt.)
def g(x , z ) :
y = x + z [0]
z [0] = y ∗ 2
2
if
x > 3:
return z
else :
return g(x + 1 ,
print
g (1 ,
z)
[1])
(b) (2 pkt.)
v = 2
def h( l ) :
global v
i f len ( l ) > 3:
return v
else :
l . append ( v + l [ 0 ] )
v += l [ 0 ]
l [0] = v
return l
print h ( [ 2 ] )
3

Podobne dokumenty