Przykładowe zadania na poprawę kolokwium: Do I kolokwium: 1

Transkrypt

Przykładowe zadania na poprawę kolokwium: Do I kolokwium: 1
Przykładowe zadania na poprawę kolokwium:
Do I kolokwium:
1. Tworzymy ciąg, którego pierwszym wyrazem jest liczba naturalna n, a każdym kolejnym iloczyn
cyfr poprzedzającego go wyrazu. Jeśli w ciągu pojawi się liczba jednocyfrowa, to jest ona ostatnim
wyrazem tego ciągu. Na przykład dla n = 663 i dla n = 999 mamy następujące ciągi:
663 → 108 → 0
999 → 729 → 126 → 12 → 2
Wiadomo, że dla każdej liczby naturalnej n, tak określony ciąg zakończy się liczbą jednocyfrową.
Napisz program pobierający liczbę naturalną n, który kolejno wypisuje wszystkie wyrazy ciągu i
zlicza ich ilość.
Wejście: n = 999
Wyjście: 999, 729, 126, 12, 2
Ilość wyrazów ciągu: 5
2. Napisz program, który zlicza ilość tych wierszy w pliku o nazwie podanej przez użytkownika, w
których występuje zadane przez użytkownika słowo S. Jeśli słowo S występuję w pliku, program
podaj numery wierszy i pozycję w wierszu, w których to słowo występuje. Wiersze w pliku i
pozycje w wierszu numerujemy od 1. Np.
Wejście: S = ''dobry''
dane.txt
Piotr jest dobry i już
Ania jest uczciwa i tak
a ….......
to.....
dobry
jest człowiek
Wyjście: Ilość wierszy ze słowem „dobry”: 2
Wiersz nr: 1 Pozycja nr: 3
Wiersz nr: 5 Pozycja nr: 1
3. Utwórz plik o nazwie dane.txt i zapisz w nim 5 wierszy danych. Napisz program, który losowo
zmienia kolejność tych wierszy w pliku i zapisuje je w tej nowej kolejności do pliku losowo.txt. Na
koniec program zlicza wiersze, które nie zmieniły swojej pierwotnej kolejności i je wyświetla.
4. Utwórz plik, w którym każda linia składa się z imienia (imion) i nazwiska pojedyńczego
studenta. Następnie napisz program, który:
a) sortuje tę listę studentów względem nazwiska i drukuje posortowaną listę
b) sprawdza, czy student o podanym przez użytkownika nazwisku znajduje się na tej liście, jeśli tak
drukuje jego numer na posortowanej liście i jego pierwsze imię. Jeśli jest więcej niż jeden student o
podanym nazwisku, drukuje wszystkie pierwsze imiona znalezionych studentów i ich numery na
posortowanej liście.
Do II kolokwium:
1. a) Napisz moduł Date zawierający definicję funkcji wczesniej, której parametrami są dwa
łańcuchy oznaczające datę zapisaną w formacie dd.mm.rrrr . Funkcja zwraca wartość True jeśli
pierwsza data jest wcześniejsza od drugiej i wartość False w przeciwnym wypadku. Jeśli jeden z
łańcuchów jest pusty, funkcja podnosi wyjątek ValueError. Np.
>> wczesniej(''12.03.2015'',''16.05.2015'')
True
>> wczesniej('''',''16.05.2015'')
Błąd: ValueError
b) Napisz program, który odczytuje plik daty.txt (zakładamy, że w każdej linii jest zapisana jedna
data w w/w formacie) i zapisuje do pliku wyjściowego daty_sort.txt posortowane daty od
najwcześniejszej do najpóźniejszej (każdą w oddzielnej linii). Użyj do tego celu funkcji wczesniej z
modułu Date.
Rozwiązanie:
#moduł Date
def wczesniej(datap,datak):
datap = datap.split(".")
datak = datak.split(".")
datap = [int(datap[0]),int(datap[1]),int(datap[2])]
datak = [int(datak[0]),int(datak[1]),int(datak[2])]
if datap[2] < datak[2]: #lata
return True
elif datap[2] == datak[2]:
if datap[1] < datak[1]:#miesiące
return True
elif datap[1] == datak[1]:
if datap[0] < datak[0]:#dni
return True
else:
return False
else:
return False
else:
return False
#moduł główny
from Date import wczesniej
def najwczes(lista_dat):
najwczes = lista_dat[0]
for data in lista_dat:
if wczesniej(data,najwczes):
najwczes = data
return najwczes
wej = open("daty.txt","r")
lista_dat = []
for line in wej:
line = line.split()
lista_dat.append(line[0])
wej.close()
wyj = open("daty_sort.txt", "w")
while len(lista_dat) > 0:
wyj.write(najwczes(lista_dat) + "\n")
lista_dat.remove(najwczes(lista_dat))
wyj.close()
2. a) Utwórz moduł Palindrom zawierający definicję funkcji czy_palindrom, pobierającą jako
parametr łańcuch znaków i zwracającą informację czy podany łańcuch jest palindromem, tzn.
ciągiem znaków, który czytany od lewej i od prawej strony jest taki sam np. ''atomotomota ''.
Funkcja ma zwracać True, jeśli parametr jest palindromem i False, gdy nim nie jest.
np.
>>czy_palindrom(''ikarraki'')
True
>>czy_palindrom(''ikarraKi'')
False
b) Napisz program sprawdzający, czy w pliku tekstowym o nazwie podanej przez użytkownika są
linie będące palindromami. Program wypisuje listę składającą się z numerów linii (numerujemy od
1), które są palindromami. Użyj funkcji czy_palindrom z modułu Palindrom.
3. a) Utwórz moduł Sygnalizacja zawierający definicję funkcji zwieksz_zielone pobierającą jako
parametr listę liczb całkowitych nieujemnych (składającą się z co najmniej 3 liczb) oraz liczbę
całkowitą N > 0. Jeśli na liście pojawią się trzy kolejne liczby w porządku ściśle rosnącym (zwane
trójką) i każda z nich będzie przekraczać N, to funkcja zwraca wartość trzeciej liczby(w trójce) oraz
jej numer indeksu na liście. Listę numerujemy od 1. Jeśli taka trójka nie pojawi się na liście funkcja
zwraca 0. Jeśli wejściowa lista jest pusta lub składa się z mniej niż 3 liczb, funkcja podnosi wyjątek
ValueError
>>zielone([3, 4, 5, 4, 4, 5, 6, 4], 3)
Trzecia liczba w trójce: 6
Nr indeksu: 7
b) Napisz program obsługujący sygnalizację na jednym wlocie skrzyżowania. Pracownik
organizacji ruchu podaje liczbę całkowitą N≥0 oraz listę ilości aut pozostających na wlocie po
kolejnych cyklach świateł (co najmniej 3 cyklach). W każdym cyklu świateł sterownik zlicza
pozostającą na wlocie ilość aut. Jeżeli ilość ta wzrasta w trzech kolejnych cyklach, a jej wartość w
każdym z tych trzech kolejnych cykli wynosi więcej niż N samochodów, to światło zielone zielone
wydłuża swoją długość o 1s na każde pozostające auto w ostatnim z tych trzech kolejnych cykli.
Program ma obliczać po którym cyklu zwiększać długość zielonego światła na tym wlocie i o ile.
Użyj funkcji zwieksz_zielone z modułu Sygnalizacja. Np. gdy N = 9 i ilości aut pozostających po
kolejnych cyklach tworzą następującą listę:
[7, 8, 9, 5, 10, 12, 14, 11, 10]
to wynik programu jest następujący.
Zwiększyć długość zielonego światła po cyklu nr: 7 o sekund: 14