diff --git a/cs171/lect08/LoopsAndFiles.py b/cs171/lect08/LoopsAndFiles.py
new file mode 100644
index 0000000000000000000000000000000000000000..5aed53fd316694604e85f4c04571ba29efea67d3
--- /dev/null
+++ b/cs171/lect08/LoopsAndFiles.py
@@ -0,0 +1,92 @@
+#Program:  LoopsAndFiles.py
+#Purpose:  Test different ways to process data from files
+#Author:   Adelaida Medlock
+#Date:     March 9, 2024
+
+#count how many times a word appear in each line of a file
+def countWordPerLine():
+    filename = input('Enter the name of the file to open: ')
+    word = input('Enter the word you want to count: ')
+    
+    try :
+        inFile = open(filename)
+        lines = inFile.readlines()
+        inFile.close()
+
+        for index in range(len(lines)) :
+            count = lines[index].count(word)
+            print(word, 'appears', count, 'time(s) in line #', index)
+    
+    except FileNotFoundError :
+        print('Could not find', filename)
+
+# Read a bunch of floating-point values from a file,
+# calculate some basic stats, and print results to screen
+# and save the results in an output file as well
+def computeStats():
+    # loop until we get a value filename
+    validFile = False
+    while not validFile :
+        try :
+            filename = input('Enter the name of the data file: ')
+            inFile = open(filename)
+            validFile = True
+        except FileNotFoundError :
+            print('Could not find', filename, 'Try again')
+    
+    # read data from file and process it
+    lines = inFile.readlines()
+    inFile.close()
+    count = 0
+    total = 0.0
+    for item in lines :
+        count += 1
+        total = total + float(item)
+    average = total / count
+    
+    # display results
+    print('\nStats for data in file')
+    print('Number of values:', count)
+    print('Sum of values: {:.2f}'.format(total))
+    print('Average of values: {:.2f}'.format(average))
+    
+    # saving results to output file
+    outFile = open('stats.txt', 'w')
+    outFile.write('Stats for data in file\n')
+    outFile.write('Number of values: {:d}\n'.format(count))
+    outFile.write('Sum of values: {:.2f}\n'.format(total))
+    outFile.write('Average of values: {:.2f}\n'.format(average))
+    outFile.close()
+
+# Calculate stats for values stored in a file
+# Save results in a an output file
+# Demo how to use the with statement so files
+# are automatically closed
+def withDemo(filename):
+    with open(filename, 'r') as inFile :
+        total = 0.0
+        count = 0
+        
+        # Read one line at the time
+        line = inFile.readline() 
+        while line != '' :  # an empty string indicates the EOF
+            total = total + float(line) 
+            count += 1
+            line = inFile.readline()
+            
+        # Saving results to output file
+        outFile = open('stats2.txt', 'w')
+        outFile.write('Stats for data in file\n')
+        outFile.write('Number of values: {:d}\n'.format(count))
+        outFile.write('Sum of values: {:.2f}\n'.format(total))
+        outFile.write('Average of values: {:.2f}\n'.format(total / count))
+        
+        # By using with both files are automatically closed
+
+    # Display results
+    print('\nStats for data in file')
+    print('Number of values:', count)
+    print('Sum of values: {:.2f}'.format(total))
+    print('Average of values: {:.2f}'.format(total / count))
+    print('Results have been saved to file stat2.txt')
+    
\ No newline at end of file
diff --git a/cs171/lect08/QuizAverages.py b/cs171/lect08/QuizAverages.py
new file mode 100644
index 0000000000000000000000000000000000000000..22f9c742ebe2db62483ff881f35155a5ef381565
--- /dev/null
+++ b/cs171/lect08/QuizAverages.py
@@ -0,0 +1,88 @@
+#Program:  QuizAverages.py
+#Purpose:  Calculate the average of 3 quizzes for each student in a course.
+#          Data for each quiz is stored in a separate text file.
+#          The data file is formatted as follows:
+#          firstName\tlastName\tuserID\tquizGrade
+#          For example: Harry	Potter	hp123	95.75
+#          The results will be saved in an output file. The should be
+#          a line for each student, in the format:
+#          userID\tquizAverage
+#          
+#Author:   Adelaida Medlock
+#Date:     March 8, 2024
+
+'''
+Purpose: This function asks the for the name of a file to be open for reading.
+         If the file exists and it can be open then the contents of the file are
+         read and returned as a list. Otherwise the user gets an error message
+         and is asked to try again
+Parameters:   a string that the contains the prompt for the user
+Return Value: a list with the data from the file
+Sample Call:  fileData = getData('Enter the name of the data file:')
+'''
+def getData(prompt) :
+    validFile = False
+    while not validFile :
+        filename = input(prompt)
+        try :
+            inFile = open(filename, 'r')
+            validFile = True
+        except FileNotFoundError :
+            print('Error:', filename, 'not found. Try again.')
+    
+    lines = inFile.readlines()   
+    inFile.close()
+    return lines   
+
+'''
+Purpose: Given student data in a list, update a dictionary to store the total of 
+         the quiz scores for quizzes taken by each student in the list
+Parameters:   a list in which each element has the form: "firstName\tlastName\tuserID\tquizGrade\n"
+              a dictionary that to be populated with the pairs: userID : quizTotal
+Return Value: none
+Sample Call:  accumulateScores(studentsData, scoresDictionary )
+'''
+def accumulateScores(dataList, runningTotal):
+    for line in dataList :
+        line = line.split('\t')
+        userID = line[2]
+        grade = line[3]
+        runningTotal[userID] = runningTotal.get(userID, 0) + float(grade)
+        
+    
+# the main script
+if __name__ == "__main__":
+    
+    # create a dictionary to store the sum of quizzes per student
+    quizzesTotal = {}
+    
+    # get the data from each data file and process it
+    quiz1_Data = getData('Enter name of file 1: ')
+    accumulateScores(quiz1_Data, quizzesTotal)
+    
+    quiz2_Data = getData('Enter name of file 2: ')
+    accumulateScores(quiz2_Data, quizzesTotal)
+    
+    quiz3_Data = getData('Enter name of file 3: ')
+    accumulateScores(quiz3_Data, quizzesTotal)
+    
+    # store each student's quiz average in a second dictionary
+    averages = {}
+    for userID in quizzesTotal :
+        average = quizzesTotal[userID] / 3
+        averages[userID] = round(average, 2)
+    
+    # save results to output file
+    outFile = open('report.txt', 'w')
+    for userID in averages :
+        outFile.write('{}\t{:.2f}\n'.format(userID, averages[userID]))
+    outFile.close()
+    
+    # print results to screen
+    print('\nUser ID\tQuiz Average')
+    for userID in averages :
+        print('{}\t{:.2f}'.format(userID, averages[userID]))
+        
+    print('\nResults have been save to output file')
+    
+    
diff --git a/cs171/lect08/codes.xlsx b/cs171/lect08/codes.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/cs171/lect08/data.txt b/cs171/lect08/data.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e018eba51391bac1ac57553473d361517bf0dfc1
--- /dev/null
+++ b/cs171/lect08/data.txt
@@ -0,0 +1,36 @@
+Brenda
+1000.00
+1500.50
+4700.00
+5010.75
+6629.35
+3007.50
+2153.44
+2531.50
+8507.35
+8516.44
+6675.60
+1433.44
+4963.88
+6832.88
+1953.35
+3059.90
+1860.50
+4488.44
+3678.00
+8575.50
+3548.25
+2000.50
+3500.75
+9366.30
+1098.35
+1587.50
+5871.60
+8099.88
+7925.75
+2562.50
+5706.44
+6901.35
+3033.60
+6720.50
+5190.75
diff --git a/cs171/lect08/dict.py b/cs171/lect08/dict.py
new file mode 100644
index 0000000000000000000000000000000000000000..76c9b88c4d2ee2aebf2f3871ac22921b95c5179b
--- /dev/null
+++ b/cs171/lect08/dict.py
@@ -0,0 +1,9 @@
+
+
+scores = {'jb214' : 66, 'led125' : 65, 'hc357' : 70, 'kc368' : 95}
+
+while True:
+    user = input("Enter userID to Lookup: ")
+    answer = scores.get(user, "Unknown")
+    print(answer)
+
diff --git a/cs171/lect08/flower.jpg b/cs171/lect08/flower.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/cs171/lect08/hello.py b/cs171/lect08/hello.py
new file mode 100644
index 0000000000000000000000000000000000000000..93b4915f0ed822452caf2c31756bd9028ff85337
--- /dev/null
+++ b/cs171/lect08/hello.py
@@ -0,0 +1,22 @@
+print("Hello CS 171")
+
+# container = ["Blue", "Yellow", "Red"]
+# 
+# for i in range(len(container)):
+#     print(f"The item at position {i} is {container[i]}")
+#     
+# for item in container:
+#     print(f"This item is {item}")
+
+file = open("data.txt", "r")
+# text = file.read() -- gives us all the text
+# text = file.readline() -- gives us one line
+list = file.readlines()
+sum = 0
+for lineNumber in range(len(list)):
+    try:
+        value = float(list[lineNumber])
+        sum = sum + value
+    except:
+        print(f"Ignoring line {lineNumber+1}")
+print(f"The total is {sum}")
diff --git a/cs171/lect08/hello.txt b/cs171/lect08/hello.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/cs171/lect08/news.txt b/cs171/lect08/news.txt
new file mode 100644
index 0000000000000000000000000000000000000000..301543b6be26d66885795594f177b8d2b9b89486
--- /dev/null
+++ b/cs171/lect08/news.txt
@@ -0,0 +1,18 @@
+Earliest-known 'dead' galaxy spotted by Webb telescope
+By Will Dunham
+March 6, 202411:07 AM EST
+WASHINGTON, March 6 (Reuters) - The James Webb Space Telescope since becoming operational in 2022 has uncovered numerous surprises about what things were like in the universe's early stages. We now can add one more - observations of a galaxy that was already "dead" when the universe was only 5% of its current age.
+Scientists said on Wednesday that Webb has spotted a galaxy where star formation had already ceased by roughly 13.1 billion years ago, 700 million years after the Big Bang event that gave rise to the universe. Many dead galaxies have been detected over the years, but this is the earliest by about 500 million years.
+In some ways, this galaxy is like the late Hollywood actor James Dean, famous for his "live fast, die young" life story.
+"The galaxy seemed to have lived fast and intensely, and then stopped forming stars very rapidly," said astrophysicist Tobias Looser of the Kavli Institute for Cosmology at the University of Cambridge, lead author of the study published in the journal Nature, opens new tab.
+"In the first few hundred million years of its history, the universe was violent and active, with plenty of gas around to fuel star formation in galaxies. That makes this discovery particularly puzzling and interesting," Looser added.
+This galaxy is relatively small, with perhaps 100 million to one billion stars. That would put it in the neighborhood of the mass of the Small Magellanic Cloud dwarf galaxy situated near our Milky Way, though that one is still forming new stars.
+After a galaxy stops forming new stars, it becomes a bit like a stellar graveyard.
+"Once star formation ends, existing stars die and are not replaced. This happens in a hierarchical fashion, by order of stellar weight, because the most massive stars are the hottest and shine the brightest, and as a result have the shortest lives," Kavli Institute astrophysicist and study co-author Francesco D'Eugenio said.
+"As the hottest stars die, the galaxy color changes from blue - the color of hot stars - to yellow to red - the color of the least massive stars," D'Eugenio added. "Stars about the mass of the sun live about 10 billion years. If this galaxy stopped forming stars at the time we observed it, there would be no sun-like stars left in it today. However, stars much less massive than the sun can live for trillions of years, so they would continue to shine long after star formation stopped."
+The researchers determined that this galaxy experienced a burst of star formation spanning 30 to 90 million years, then it suddenly stopped. They are trying to figure out why.
+It could be, they said, due to the action of a supermassive black hole at the galactic center or a phenomenon called "feedback" - blasts of energy from newly formed stars - that pushed the gas needed to form new stars out of the galaxy.
+"Alternatively, gas can be consumed very quickly by star formation, without being promptly replenished by fresh gas from the surroundings of the galaxy, resulting in galaxy starvation," Looser said.
+NASA's Webb is able to look at greater distances, and thus farther back in time, than its Hubble Space Telescope predecessor. Among other discoveries, Webb has enabled astronomers to see the earliest-known galaxies, which have turned out to be larger and more plentiful than expected.
+In the new study, the researchers were able to observe the dead galaxy at one moment in time. It is possible, they said, that it later resumed star formation.
+"Some galaxies may undergo rejuvenation, if they can find fresh gas to convert into new stars," D'Eugenio said. "We do not know the ultimate fate of this galaxy. This may depend on what mechanism caused star formation to stop."
\ No newline at end of file
diff --git a/cs171/lect08/nextyear.py b/cs171/lect08/nextyear.py
new file mode 100644
index 0000000000000000000000000000000000000000..3a24fe85a0f25b876c77a02ed0bf30321ab02ca7
--- /dev/null
+++ b/cs171/lect08/nextyear.py
@@ -0,0 +1,12 @@
+
+
+age = None
+while age is None:
+    try:
+        # Code that could fail
+        age = int(input("Enter your age: "))
+    except:
+        # What to do in case of failure
+        print("Oops. Try again")
+    
+print(f"Next year you will be {age + 1}")
\ No newline at end of file
diff --git a/cs171/lect08/out.txt b/cs171/lect08/out.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d774b1f28eeec9b51819e208d0cc9e4c04dfc347
--- /dev/null
+++ b/cs171/lect08/out.txt
@@ -0,0 +1,30 @@
+ka123	83.67
+ha146	87.00
+ra158	93.67
+ca170	88.00
+bfb234	65.00
+gb246	87.00
+hmb257	79.50
+inb268	88.67
+job279	85.00
+db280	83.00
+edb291	80.67
+jb214	80.67
+led125	82.00
+hc357	80.67
+kc368	91.00
+sc379	87.67
+fac380	84.33
+jdc391	82.00
+abc302	89.33
+brc313	73.00
+aed468	81.50
+jd479	88.00
+cbd479	94.00
+ed480	84.00
+fd491	87.00
+mwd402	88.00
+bda413	84.00
+idc424	88.00
+jdl435	90.00
+ldl457	95.50
diff --git a/cs171/lect08/quiz1.txt b/cs171/lect08/quiz1.txt
new file mode 100644
index 0000000000000000000000000000000000000000..30b525fb302327b6a712c90059b8383636dab52d
--- /dev/null
+++ b/cs171/lect08/quiz1.txt
@@ -0,0 +1,20 @@
+Karen	Abbott	ka123	85
+Henry	Abraham	ha146	77
+Robert	Abrahams	ra158	100
+Cornelia	Adair	ca170	95
+Benjamin	Bache	bfb234	47
+Gamaliel	Bailey	gb246	78
+Henry	Baird	hmb257	64
+Newton	Baker	inb268	88
+John	Balderston	job279	80
+Dirk	Ballendorf	db280	79
+Digby	Baltzell	edb291	76
+Josiah	Bancroft	jb214	66
+Leslie	Banks	led125	65
+Henry	Cadbury	hc357	70
+Kacen	Callender	kc368	95
+Stephanie	Camp	sc379	89
+Francesca	Canfield	fac380	74	
+John	Carr	jdc391	75
+Beverly	Carter	abc302	87	
+Barrie	Cassileth	brc313	51
\ No newline at end of file
diff --git a/cs171/lect08/quiz2.txt b/cs171/lect08/quiz2.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ec11b35bc2d29ddbde2ff33b78a8d9e8a47187b3
--- /dev/null
+++ b/cs171/lect08/quiz2.txt
@@ -0,0 +1,30 @@
+Karen	Abbott	ka123	90
+Henry	Abraham	ha146	89
+Robert	Abrahams	ra158	85
+Cornelia	Adair	ca170	84
+Benjamin	Bache	bfb234	83
+Gamaliel	Bailey	gb246	96
+Henry	Baird	hmb257	95
+Newton	Baker	inb268	91
+John	Balderston	job279	83
+Dirk	Ballendorf	db280	87
+Digby	Baltzell	edb291	87
+Josiah	Bancroft	jb214	89
+Leslie	Banks	led125	87
+Henry	Cadbury	hc357	91
+Kacen	Callender	kc368	81
+Stephanie	Camp	sc379	98
+Francesca	Canfield	fac380	88	
+John	Carr	jdc391	85
+Beverly	Carter	abc302	91	
+Barrie	Cassileth	brc313	87
+Alice	Dark	aed468	88
+Joie	Davidow	jd479	88
+Charles	Davis	cbd479	94
+Emilie	Davis	ed480	84
+Francis	Davis	fd491	85
+Marianna	Davis	mwd402	88
+Barbara	Angelis	bda413	84
+Benjamin	Casseres	idc424	88
+John	Lancie	jdl435	89
+Louis	Lange	ldl457	100
\ No newline at end of file
diff --git a/cs171/lect08/quiz3.txt b/cs171/lect08/quiz3.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4928994ddd075263e7f83d1381a4fff6a8413ed9
--- /dev/null
+++ b/cs171/lect08/quiz3.txt
@@ -0,0 +1,24 @@
+Karen	Abbott	ka123	76
+Henry	Abraham	ha146	95
+Robert	Abrahams	ra158	96
+Cornelia	Adair	ca170	85
+Newton	Baker	inb268	87
+John	Balderston	job279	92
+Dirk	Ballendorf	db280	83
+Digby	Baltzell	edb291	79
+Josiah	Bancroft	jb214	87
+Leslie	Banks	led125	94
+Henry	Cadbury	hc357	81
+Kacen	Callender	kc368	97
+Stephanie	Camp	sc379	76
+Francesca	Canfield	fac380	91	
+John	Carr	jdc391	86
+Beverly	Carter	abc302	90	
+Barrie	Cassileth	brc313	81
+Alice	Dark	aed468	75
+Francis	Davis	fd491	89
+Marianna	Davis	mwd402	88
+Barbara	Angelis	bda413	84
+Benjamin	Casseres	idc424	88
+John	Lancie	jdl435	91
+Louis	Lange	ldl457	91
diff --git a/cs171/lect08/quiz_average.py b/cs171/lect08/quiz_average.py
new file mode 100644
index 0000000000000000000000000000000000000000..a55e3a1e10311146b3a9f9e2e713ae08294ab1ef
--- /dev/null
+++ b/cs171/lect08/quiz_average.py
@@ -0,0 +1,37 @@
+
+def loadScores(filename, scores):
+    try:
+        file = open(filename, "r")
+        for line in file.readlines():
+            parts = line.split("\t")
+            username = parts[2]
+            score = float(parts[3])
+            if username in scores:
+                theirScores = scores[username]
+                theirScores.append(score)
+            else:
+                scores[username] = [score]
+        file.close()
+    except:
+        print(f"Error importing {filename}. Skipping.")
+        
+def saveAverages(filename, scores):
+    try:
+        file = open(filename, "w") # This erases filename
+        for userid in scores:
+            studentScores = scores[userid]
+            average = sum(studentScores) / len(studentScores)
+            file.write(f"{userid}\t{average:.02f}\n")
+        file.close()
+    except Exception as e:
+        print(f"Could not write to {filename}. Oops.")
+        print(f"The exception said {e}")
+
+
+# Read first file
+scores = {}
+loadScores("quiz1.txt", scores)
+loadScores("quiz2.txt", scores)
+loadScores("quiz3.txt", scores)
+saveAverages("out.txt", scores)
+