Temi d'esame di Informatica svolti
Primo anno · Politecnico di Torino 1
Indice
Auto noleggio 3
Biblioteche 4
Bowling 5
Concorso letterario 6
Concorso prodotti 7
Controllo compiti copiati 8
Costi stampa 9
Diario alimentare 10
Discografia 11
Esame 12
Fantacalcio 13
Gestione conto ristorante 14
Gioco dell'oca 15
Glucometer 16
Hacking 17
Intelligenza demenziale 18
Leggi di murphy 20
Meteo 21
Parametri vitali 23
Partita a dadi 25
Piramidi 26
Polizia 28
Prestito pc 29
Prova 30
Ricerca comuni 32
Sensori temperatura 33
Sequenza dna 34
Statistiche torneo 35
Storpiatore nomi 36
Strategia militare 38
Tempesta 39
Traiettorie droni 40
Voti 41
2
Auto noleggio
Consegna
Leggere il parco auto con la disponibilità giorno per giorno (L = libera, A = affittata). Data una categoria e
un intervallo di giorni, elencare le auto libere e prenotarne una scelta dall'utente.
File di input
auto.csv
Categoria,Marca,Modello,Colore,Lunedì,Martedì,Mercoledì,Giovedì,Venerdì,Sabato,Domenica
utilitaria,FIAT,Panda,rosso,L,L,L,A,A,A,A
utilitaria,KIA,Pikanto,bronzo,A,A,L,L,L,A,A
lusso,Mercedes,Classe S,nero,L,L,L,L,L,A,A
sportiva,Lamborghini,Huracan,giallo,L,L,L,L,L,L,L
furgone,Ford,Transit,bianco,A,A,A,A,A,L,L
Soluzione (main.py)
import csv
FILE = "auto.csv"
def file_reader(file_path):
cars = []
with open(file_path, 'r', encoding = 'UTF-8') as file_name:
csv_reader = csv.reader(file_name)
for line in csv_reader:
cars += [line]
return cars
def search(table, category, day_start, day_end):
book = []
wait = 1
for line in table:
if wait == 0:
if line[0] == category:
if line[3 + day_start] == 'L' and line[3 + day_end] == 'L':
book.append(line)
else: wait -= 1
print_book(book)
return book
def edit_table(table, car, day_start, day_end):
for line in table:
if line[1] == car[1] and line[2] == car[2]:
for i in range(day_end - day_start + 1):
line[3 + day_start + i] = 'A'
print_table(table)
def print_book(table):
for i, line in enumerate(table):
print(" ", i+1, ")", line[1], line[2], "colore", line[3])
def print_table(table):
for line in table:
for element in line:
print(element, end = " ")
print()
if __name__ == "__main__":
cars = file_reader(FILE)
print_table(cars)
data_input = input("\nScegli categoria e giorni: ")
category, day_start, day_end = data_input.split()
book = search(cars, category, int(day_start), int(day_end))
if len(book) == 0:
print(" Non ci sono auto disponibili! :(")
else:
car = int(input("Quale vuoi prenotare?: "))
edit_table(cars, book[car - 1], int(day_start), int(day_end)) 3
Biblioteche
Consegna
Leggere l'inventario di una biblioteca (copie per ISBN). Per ogni titolo con più di 3 copie, mettere le copie in
eccesso nel file delle scuole e preparare il nuovo inventario.
File di input
inventarioNew.csv
978-81-7525-766-5;Omero;Odissea978-81-7525-766-5; Mary Shelley;Frankenstein o il moderno
Prometeo;AB001;BA013;FZ111;FZ112;FZ113;FZ114;FZ115;FZ116;MN214;XY100;XY123;XY124;XY125;XY126;XY128;Y
Y128
978-88-7775-766-7;Omero;Odissea978-88-7775-766-7; Mary Shelley;Frankenstein o il moderno
Prometeo;AB001;BA013;FZ111;FZ112;FZ113;FZ114;FZ115;FZ116;MN214;XY100;XY123;XY124;XY125;XY126;XY128;Y
Y128
inventarioOld.csv
XY128;978-81-7525-766-5;Odissea;Omero
FZ114;978-88-7775-766-7;Frankenstein o il moderno Prometeo; Mary Shelley
XY123;978-81-7525-766-5;Odissea;Omero
AB001;978-23-7525-7546-2;Iliade;Omero
FZ111;978-88-7775-766-7;Frankenstein o il moderno Prometeo; Mary Shelley
YY128;978-81-7525-766-5;Odissea;Omero
inventarioScuola.csv
978-81-7525-766-5;Omero;Odissea;XY100;XY124;XY125;XY126
978-88-7775-766-7; Mary Shelley;Frankenstein o il moderno Prometeo;FZ113;FZ115;FZ116
Soluzione (main.py)
import csv
import os
def book_counter(file_path):
isbn_count = {}
with open(file_path, newline = '') as csv_file:
csv_reader = csv.reader(csv_file, delimiter = ';')
for row in csv_reader:
isbn = row[1]
if isbn in isbn_count:
isbn_count[isbn] += 1
else:
isbn_count[isbn] = 1
book_out = 0
book_isbn = 0
isbn_count_sorted = {key: value for key, value in sorted(isbn_count.items())}
for isbn, count in isbn_count_sorted.items():
if count > 3:
book_out += count - 3
book_isbn += 1
school_writer('inventarioOld.csv', isbn, count)
new_list_writer('inventarioOld.csv', isbn, count)
if book_isbn != 0 and book_out != 0:
print(f"Numero di libri da regalare: {book_isbn}, copie totali: {book_out}")
else:
print("Non ci sono copie di libri che possano essere regalate :(")
def school_writer(file_path, book, book_count):
head = True
copy = 3
copy_code = []
with open(file_path, 'r') as csv_file:
csv_reader = csv.reader(csv_file, delimiter = ';')
with open('inventarioScuola.csv', 'a') as new_file:
for row in csv_reader: 4
if row[1] == book:
if head:
new_file.write(book + ";" + row[3] + ";"+ row[2])
head = False
if copy == 0:
copy_code.append(";" + row[0])
else:
copy -= 1
copy_code.sort()
copy_code_str = ''.join(copy_code)
new_file.write(copy_code_str + "\n")
def new_list_writer(file_path, book, book_count):
head = True
head_others = True
copy_code = []
copy = 3
with open(file_path, 'r') as csv_file:
csv_reader = csv.reader(csv_file, delimiter = ';')
with open('inventarioNew.csv', 'a') as new_file:
for row in csv_reader:
if row[1] == book:
if book_count > 3:
if head:
new_file.write(book + ";" + row[3] + ";"+ row[2])
head = False
copy_code.append(";" + row[0])
else:
if head_others:
new_file.write(book + ";" + row[3] + ";"+ row[2])
head_others = False
copy_code.append(";" + row[0])
copy_code.sort()
copy_code_str = ''.join(copy_code)
new_file.write(copy_code_str + "\n")
def delete_file(file_path):
if os.path.exists(file_path):
os.remove(file_path)
def main():
delete_file('inventarioScuola.csv')
delete_file('inventarioNew.csv')
book_counter('inventarioOld.csv')
main()
Bowling
Consegna
Leggere i punteggi dei giocatori di bowling (cognome, nome e lanci di ogni partita). Stampare la classifica
per punteggio totale e indicare chi ha abbattuto più volte tutti i birilli (strike) e chi ha fatto più volte zero.
File di input
bowling.txt
Rossi;Massimo;7;10;6;5;10;4;9;9;5;10;10
Verdi;Giuseppe;10;10;6;6;7;9;9;8;9;9;10;10;10
De Piscopo;Tullio;9;9;8;8;7;7;6;6;0;5
Montalbano;Salvo;10;10;9;10;10;10;9;10;10;10
Soluzione (main.py)
def file_reader(file_path):
leaderboard = []
with open(file_path, 'r', encoding = "UTF-8") as file_name:
max_skittles = 0
min_skittles = 0 5
for line in file_name:
line = line.rstrip('\n').rsplit(';')
points = line[2:]
max_skittles = points.count('10')
min_skittles = points.count('0')
leaderboard.append([line[0], line[1], int(sum(map(int, points))), int(max_skittles),
int(min_skittles)])
leaderboard.sort(key = lambda x: x[2], reverse = True)
print_table(leaderboard)
def print_table(table):
for line in table:
print(f"{line[0]:12}{line[1]:12}{line[2]}")
top_players = [player for player in table if player[3] == max([x[3] for x in table])]
worst_players = [player for player in table if player[4] == max([x[4] for x in table])]
for player in top_players:
print(f"\n{player[0]} {player[1]} ha abbattuto tutti i birilli {player[3]} volta/e")
for player in worst_players:
print(f"{player[0]} {player[1]} ha abbattuto tutti i birilli {player[4]} volta/e")
if __name__ == "__main__":
file_reader("bowling.txt")
Concorso letterario
Consegna
Leggere i libri di un concorso con prezzo, categoria, nazione e voti (il punteggio finale è la media tra il voto
e la media dei tre giurati). Stampare il libro in base al prezzo, la top 3 per punteggio, le categorie e il
numero di libri per nazione.
File di input
concorso.txt
ISBN_1 Horror 7.50 ITA 9.3 7.5 8.8 8.7
ISBN_2 Poesia 10.00 ITA 9.0 9.0 9.0 9.2
ISBN_3 Narrativa 8.30 USA 8.4 7.2 8.5 8.6
ISBN_4 Narrativa 7.30 RUS 9.3 3.7 9.5 9.6
ISBN_5 Horror 5.10 GRB 8.2 8.9 8.9 6.6
ISBN_6 Narrativa 5.00 USA 8.2 5.9 7.9 8.6
ISBN_7 Poesia 7.20 GRB 8.0 7.0 8.0 6.0
Soluzione (main.py)
FILE = "concorso.txt"
def file_reader(file_path):
library = []
with open(file_path, 'r', encoding = 'UTF-8') as file_name:
for line in file_name:
line = line.rstrip('\n').rsplit(' ')
points, avg_jury = 0.00, 0.00
points += float(line[4])
for i in range(5, 8): avg_jury += float(line[i])
avg_jury /= 3
points = round((points + avg_jury) / 2, 2)
library.append([line[0], line[1], line[2], line[3], float(points)])
print_table(library)
def print_table(table):
table.sort(key = lambda x: x[2])
isbn_prize = table[0]
print(f"\nIl libro più costoso è: {isbn_prize[0]}\n")
print("TOP 3 per punteggio")
table.sort(key = lambda x: x[4], reverse = True)
for i in range(0, 3): 6
print(f" {i+1} classificato: {table[i][0]} punteggio: {table[i][4]}")
print("\nCATEGORIE")
categories = []
for line in table:
if line[1] not in categories:
categories.append(line[1])
for line in categories: print(line)
print("\nLIBRI PER NAZIONE")
number_per_nation = []
found = False
for line in table:
for i, row in enumerate(number_per_nation):
if line[3] in row:
found = True
index = i
if found:
number_per_nation[index][1] += int(1)
else:
number_per_nation.append([line[3], int(1)])
found = False
for line in number_per_nation: print(f" {line[0]} libri: {line[1]}")
if __name__ == "__main__":
file_reader(FILE)
Concorso prodotti
Consegna
Leggere i prodotti con i voti di una giuria di cinque membri. Il punteggio di ogni prodotto è la somma dei
voti senza il più alto e senza il più basso. Stampare il miglior prodotto e la classifica delle nazioni.
File di input
prodotti.txt
SKU012345 Coltello 7.50 ITA 9.3 8.9 9.7 9.7 9.8
SKU012346 Piatto 10.00 ITA 9.0 9.0 9.0 9.2 9.5
SKU012347 Bicchiere 8.30 USA 8.4 8.7 8.5 8.6 9.0
SKU012348 Piatto 7.30 RUS 8.3 8.7 9.5 9.6 9.0
SKU012349 Bicchiere 5.10 GRB 8.2 8.9 8.9 8.6 9.3
SKU012350 Forchetta 5.00 USA 8.2 8.9 8.9 8.6 9.3
SKU012351 Coltello 7.20 GRB 8.0 8.0 8.0 8.0 8.0
Soluzione (main.py)
# Concorso prodotti - versione riscritta e commentata
# Ogni riga del file ha il formato:
# CODICE NOME PREZZO NAZIONE voto1 voto2 voto3 voto4 voto5
def leggi_prodotti(nome_file):
"""Legge il file e restituisce una lista di dizionari, uno per prodotto."""
prodotti = []
with open(nome_file, 'r', encoding='UTF-8') as file:
for riga in file:
campi = riga.split() # split() senza argomenti ignora gli spazi extra
if not campi: # salta le righe vuote
continue
codice = campi[0]
nome = campi[1]
nazione = campi[3]
voti = [float(v) for v in campi[4:9]] # i 5 voti della giuria
# punteggio: somma dei 5 voti, senza il più alto e senza il più basso
punteggio = sum(voti) - min(voti) - max(voti)
prodotti.append({
'codice': codice,
'nome': nome,
'nazione': nazione, 7
'punteggio': round(punteggio, 2),
})
return prodotti
def miglior_prodotto(prodotti):
"""Restituisce il prodotto con il punteggio più alto.
In caso di parità vince il primo nel file."""
return max(prodotti, key=lambda p: p['punteggio'])
def classifica_nazioni(prodotti):
"""Somma i punteggi dei prodotti di ogni nazione e ordina dal più alto al più basso."""
totali = {} # dizionario: nazione -> punteggio totale
for p in prodotti:
totali[p['nazione']] = totali.get(p['nazione'], 0) + p['punteggio']
return sorted(totali.items(), key=lambda coppia: coppia[1], reverse=True)
if __name__ == "__main__":
prodotti = leggi_prodotti("prodotti.txt")
migliore = miglior_prodotto(prodotti)
print(f"Il miglior prodotto è: {migliore['codice']} {migliore['nome']} "
f"con un punteggio di {migliore['punteggio']}")
print("\nClassifica nazioni:")
for nazione, punti in classifica_nazioni(prodotti):
print(f"{nazione}: {round(punti, 2)}")
Controllo compiti copiati
Consegna
Leggere le risposte degli studenti (il trattino indica una risposta mancante) e le posizioni degli studenti in
aula. Segnalare i vicini di banco le cui risposte fanno pensare a una copiatura.
File di input
posizioni.txt
Sofia Leonardo Alessandro Mattia
Edoardo Gabriele Aurora
Vittoria Tommaso Giulia Ginevra Andrea
Giorgia Francesco Riccardo Lorenzo
Beatrice Emma Greta
risposte.txt
Emma C C C - C D B - - D
Gabriele - B A C A A B D D -
Tommaso A - D A A B - - D -
Riccardo - A B D A D C C - A
Edoardo - B A - A A B - D -
Sofia - D B B A B C D A A
Ginevra C A A B B D A - B C
Vittoria C C D - A C C D B D
Beatrice C C C B C D B - C D
Leonardo B C B A B A D - A B
Giorgia - A - C - D - D D A
Greta C C C B C D B - C D
Francesco A A - D C A A D D B
Lorenzo - A B D - D C C - -
Aurora D C B A C A A B - D
Alessandro C B B - A A C C C D
Andrea A B C A D D - - A B
Giulia A B D D A B A - D A
Mattia C B B - A A C C C D
Soluzione (main.py)
def file_reader(file_path):
matrix = []
with open(file_path, 'r', encoding = 'UTF-8') as file_name:
for line in file_name:
matrix.append(line.rstrip().rsplit())
return matrix
def snitch_mode(students, answers, number):
for line in students: 8
for i in range(0, (len(line) - 1)):
student_1, student_2 = [], []
for row in answers:
if line[i] == row[0]:
student_1 = row[1:]
break
for row in answers:
if line[i + 1] == row[0]:
student_2 = row[1:]
sum_answers_1, sum_answers_2 = 0, 0
for j in range(len(student_1)):
if student_1[j] == student_2[j]:
sum_answers_1 += 1
sum_answers_2 += 1
elif student_1[j] != '-' and student_2[j] == '-':
sum_answers_1 += 1
elif student_1[j] == '-' and student_2[j] != '-':
sum_answers_2 += 1
if sum_answers_1 == sum_answers_2 and sum_answers_1 == number: print(f"Le risposte di
{line[i]} e {line[i+1]} sono le stesse")
elif sum_answers_1 == number - 2 and sum_answers_2 == number: print(f"{line[i]} può aver
copiato da {line[i+1]}")
elif sum_answers_1 == number and sum_answers_2 == number - 2: print(f"{line[i+1]} può aver
copiato da {line[i]}")
if __name__ == "__main__":
answers = file_reader('risposte.txt')
students = file_reader('posizioni.txt')
snitch_mode(students, answers, (len(answers[0]) - 1))
Costi stampa
Consegna
Leggere i libri (titolo e numero di pagine) e il listino di stampa per fasce di pagine. Calcolare il costo di
stampa di ogni libro e il totale da pagare.
File di input
costipagine.txt
301;400;1.6€
401;500;1.4€
1;100;2.5€
101;200;2€
701;1000;1€
201;300;1.8€
1001;2000;0.8€
501;700;1.2€
libri.txt
Luci e Ombre in Python;232
Liste nascoste;125
Brevi poemi in Python;15
Dizionario di Python;666
Python Wars;1342
Soluzione (main.py)
def file_reader(file_path):
matrix = []
with open(file_path, 'r', encoding = 'UTF-8') as file_name:
for line in file_name:
l1 = line.rstrip('\n€').rsplit(';')
matrix.append(l1)
return matrix
def calc(libri, costipagine):
costipagine.sort(key = lambda x: int(x[0]))
print("Listino prezzi:")
for line in costipagine:
print(f"Fino a {line[1]} pagine: {line[2]}€/pagina")
print("\nCOSTI DI STAMPA") 9
somma = 0.00
for line in libri:
costo = 0
for row in costipagine:
if int(row[0]) <= int(line[1]) <= int(row[1]):
costo = round(int(line[1]) * float(row[2]), 2)
print(f"{line[0]} - Pagine: {line[1]} - Costo: {costo}€")
somma += costo
print(f"Totale: {somma}€")
if __name__ == "__main__":
libri = file_reader('libri.txt')
costipagine = file_reader('costipagine.txt')
calc(libri, costipagine)
Diario alimentare
Consegna
Leggere il diario alimentare giornaliero (peso e pasti di ogni giorno) e i valori nutrizionali degli alimenti.
Calcolare le calorie di ogni giorno, confrontarle con il fabbisogno (30 kcal per kg di peso) e dire se la dieta è
accettabile.
File di input
diary.txt
***
1 85
yogurt_greco 100
carbonara 250
petto_di_pollo 300
pasta_in_bianco 250
***
2 87
petto_di_pollo 400
pasta_in_bianco 400
***
3 86
yogurt_greco 250
carbonara 250
petto_di_pollo 400
nutrients.txt
pasta_in_bianco 75 15 5
carbonara 41 15 35
petto_di_pollo 0 20 1
yogurt_greco 3 10 0
riso_basmati 60 20 3
tacchino 0 22 3
Soluzione (main.py)
def diary_reader(file_path):
with open(file_path, 'r', encoding = 'UTF-8') as file_name:
matrix, row = [], []
first = True
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.