AP Computer Science Principles

Create Task Submission Guide

PPR, video, and program code PDF.
4 screenshots. 6 points. No pressure.

Overview

What Is the PPR?

The Personalized Project Reference is a document you submit in the AP Digital Portfolio before the exam. On exam day, College Board gives it back to you so you can reference your own code while answering written-response questions.

It contains exactly 4 code screenshots, organized into two sections: Procedure and List.

Each section has two parts: (i) showing the code itself and (ii) showing it being used.

Your code screenshots must not contain any comments. Comments in the PPR result in an automatic zero for that row.

Overview

Screenshot Requirements

Every screenshot in the PPR must meet these basic standards.

  • Not blurry: take the screenshot at full resolution, do not resize it below readable size.
  • At least 10-point font size: zoom your editor so the text is clearly legible.
  • No comments: remove all //, #, /* */, or any other comment syntax before capturing. This includes commented-out code.
  • Student-developed: the code must be code you wrote, not library code or starter code you copied without modification.
🚫
Comments in the PPR = automatic 0 on that row College Board scorers will not give partial credit. They score the row 0 and move on.
Section 1 of 2

Procedure

Screenshots i and ii

Procedure i Your procedure definition

Show the full student-developed procedure with parameters that affect behavior and an algorithm that includes sequencing, selection, and iteration.

Procedure ii A call to that procedure

Show where that same procedure is actually called in your program with real arguments.

Procedure · Screenshot i

What Must Your Procedure Include?

Screenshot i shows the full definition of your student-developed procedure. College Board checks for three things.

Name and return type: the procedure must have a clear name. If it returns a value, that return must be visible in the code.
Parameters that affect behavior: the procedure must accept at least one parameter, and that parameter must actually change what the procedure does, not just be ignored.
Algorithm with sequencing, selection, and iteration: the procedure body must contain all three. Selection means an if/else. Iteration means a loop. Sequencing means steps in order.

All three must be present in the same procedure. You cannot split them across separate functions.

Procedure · Screenshot i · Examples

Study the Two Examples

Example A — Python
def calculate_grade(scores):
    total = 0
    for score in scores:
        total = total + score
    average = total / len(scores)
    if average >= 90:
        return "A"
    elif average >= 80:
        return "B"
    else:
        return "C or below"
Example B — Python
def greet_user():
    name = input("Name: ")
    if name == "Alice":
        print("Hello, Alice!")
    else:
        print("Hello, stranger!")


Look over the examples then go down one slide and pick which example meets all Procedure i requirements.

Procedure · Screenshot i · MCQ

Which One Works?

Choose the example that includes a parameter affecting behavior and has sequencing, selection, and iteration in the same procedure.

  • A Example A — calculate_grade(scores)
  • B Example B — greet_user()
Procedure · Screenshot i · Quiz Answer

Which One Works?

Example A — Python
def calculate_grade(scores):
    total = 0
    for score in scores:
        total = total + score
    average = total / len(scores)
    if average >= 90:
        return "A"
    elif average >= 80:
        return "B"
    else:
        return "C or below"
Meets all requirements
  • Has a name (calculate_grade) and returns a value.
  • Has a parameter (scores) that drives all the logic.
  • Iteration: for score in scores.
  • Selection: if / elif / else on the average.
  • Sequencing: accumulate total, compute average, then evaluate grade.
Example B — Python
def greet_user():
    name = input("Name: ")
    if name == "Alice":
        print("Hello, Alice!")
    else:
        print("Hello, stranger!")


Does not meet requirements
  • No parameters: greet_user() takes nothing. No parameter means no effect on functionality.
  • No iteration: there is no loop anywhere in the body.
  • Has selection (if/else) and sequencing, but that is not enough.
Procedure · Screenshot i · Examples

Spot the Dealbreaker

Version 1 — No citation
def find_max(values, threshold):
    best = None
    for v in values:
        if v > threshold:
            if best is None or v > best:
                best = v
    return best
Version 2 — Code with citation
# My student developed procedure
  def find_max(values, threshold):
    
    best = None
    for v in values:
        if v > threshold:
            if best is None or v > best:
                best = v
    return best

Look over both versions, then go down one slide to answer the question.

Procedure · Screenshot i · MCQ

Spot the Dealbreaker

  • A Version 1 — No citation
  • B Version 2 — Code with citation
Procedure · Screenshot i · Comments Rule Answer

Spot the Dealbreaker

Version 1 — No citation
def find_max(values, threshold):
    best = None
    for v in values:
        if v > threshold:
            if best is None or v > best:
                best = v
    return best
Safe to submit
  • No comments. The code is clean and ready for the PPR.
  • Has parameters, a loop, nested selection, and returns a value.
Version 2 — Code with citation
# My student developed procedure
  def find_max(values, threshold):
    best = None
    for v in values:
        if v > threshold:
            if best is None or v > best:
                best = v
    return best
Automatic 0
  • Contains a comment: # My student developed procedure.
  • The code is otherwise identical and would earn full marks, but the single comment costs all points for this row.
  • Remove every comment before taking the screenshot. Not just most of them.
Procedure · Screenshot ii

Showing the Call

Screenshot ii is simpler: it just needs to show a call to the same procedure from screenshot i somewhere else in your program.

  • The call must be in your actual program, not a test cell or scratch file.
  • It must pass real arguments. A call with no arguments where the procedure requires parameters will not earn credit.
  • You can include a few lines of surrounding context so the scorer can see where and why the call happens, but the call itself is what matters.
  • Screenshot ii does not need to show the procedure definition again. Just the call site.

Tip: if the call is inside another function, show enough context so it is clear the call actually runs during program execution.

Procedure · Screenshot ii · Examples

Valid Calls?

The procedure from earlier is calculate_grade(scores). Review these call examples.

Call A
result = calculate_grade([88, 92, 79])
Call B
calculate_grade()
Call C
student_scores = [70, 85, 91, 88]
letter = calculate_grade(student_scores)
print("Grade:", letter)

After reviewing, go down one slide to choose which calls earn credit.

Procedure · Screenshot ii · MCQ

Valid Calls?

  • A Call A — calculate_grade([88, 92, 79])
  • B Call B — calculate_grade()
  • C Call C — calculate_grade(student_scores)
Procedure · Screenshot ii · Quiz Answer

Valid Calls?

Call A
result = calculate_grade([88, 92, 79])
Earns credit
  • Passes a real list as an argument. The return value is captured.
Call B
calculate_grade()
Does not earn credit
  • No argument passed. The procedure requires scores. This call would crash and shows the parameter is not being used.
Call C
student_scores = [70, 85, 91, 88]
letter = calculate_grade(student_scores)
print("Grade:", letter)
Earns credit
  • Passes a real variable. The surrounding context makes it easy for the scorer to see how the call fits into the program.
Section 2 of 2

List

Screenshots i and ii

List i Storing data in your list

Show code that creates the list and/or adds data to it in a way that supports meaningful complexity management.

List ii Using the data in your list

Show code that processes data from that same list, such as iterating, transforming, or computing results.

List · Overview

What Does "Manage Complexity" Mean?

College Board does not just want to see a list. They want to see that using a list makes your program simpler or more powerful than it would be without one.

Good complexity management

The list lets you handle a variable number of items, loop over them, or store related data together. Removing the list would require you to write repetitive code or hard-code values.

Not complexity management

A list that holds exactly one value, or a list that is never iterated and whose elements are accessed only by fixed index (list[0], list[1]), does not meaningfully reduce complexity.

Ask yourself: if you replaced your list with individual variables, would your program be significantly longer or harder to write? If yes, your list manages complexity.

List · Screenshot i

Storing Data in the List

Screenshot i shows how data gets stored in your list. This could be at initialization, through a loop, or by appending values over time.

  • You can show the list being created with initial values (scores = [88, 92, 79]).
  • You can show values being added to the list (scores.append(value) inside a loop).
  • The list must hold multiple values or be designed to hold them. A list that permanently has one element does not manage complexity.
  • The code shown must be student-developed: your logic for building the list, not a single import or built-in call that builds it for you.

Tip: showing the list being populated inside a loop is a strong choice because it also demonstrates that the list scales with the data.

List · Screenshot i · Examples

Valid List Storage?

Example A
quiz_scores = []
for i in range(num_quizzes):
    score = int(input("Enter score: "))
    quiz_scores.append(score)
Example B
my_list = [42]
Example C
student_names = ["Alice", "Bob", "Carol", "David"]

Review the storage examples, then go down one slide to answer.

List · Screenshot i · MCQ

Valid List Storage?

  • A Example A — quiz_scores
  • B Example B — my_list
  • C Example C — student_names
List · Screenshot i · Quiz Answer

Valid List Storage?

Example A
quiz_scores = []
for i in range(num_quizzes):
    score = int(input("Enter score: "))
    quiz_scores.append(score)
Earns credit
  • Builds a list dynamically from user input. The number of elements scales with num_quizzes. Clearly manages complexity.
Example B
my_list = [42]
Does not earn credit
  • One element. A single-element list does not manage complexity. A plain variable would work just as well.
Example C
student_names = ["Alice", "Bob", "Carol", "David"]
Earns credit
  • Multiple values stored. Using four separate variables instead would be far more repetitive. This demonstrates meaningful complexity management.
List · Screenshot ii

Using the Data in the List

Screenshot ii shows the same list from screenshot i being actively used. The code must do something meaningful with the list's contents.

  • Iterating over the list to compute something (sum, average, filter, search) is the most common and clearest approach.
  • Accessing multiple elements by index to create new data also works.
  • Simply printing the list (print(my_list)) or passing the whole list to a function without processing it does not demonstrate meaningful use.
  • The list name in screenshot ii must match the list name in screenshot i.

Same list rule: screenshots i and ii must show the same list. You cannot use two different lists.

List · Screenshot ii · Examples

Valid List Use?

The list from earlier is student_names. Review these usage examples.

Usage A
for name in student_names:
    print("Welcome,", name)
Usage B
print(student_names)
Usage C
roster = []
for name in student_names:
    roster.append(name.upper())
display_roster(roster)

When ready, go down one slide and choose which usages earn credit.

List · Screenshot ii · MCQ

Valid List Use?

  • A Usage A
  • B Usage B
  • C Usage C
List · Screenshot ii · Quiz Answer

Valid List Use?

Usage A
for name in student_names:
    print("Welcome,", name)
Earns credit
  • Iterates over every element. Each item is accessed and used. Fulfills the program's purpose of greeting each student.
Usage B
print(student_names)
Does not earn credit
  • Just prints the whole list as a single object. No individual elements are processed. This does not demonstrate meaningful use of the list's data.
Usage C
roster = []
for name in student_names:
    roster.append(name.upper())
display_roster(roster)
Earns credit
  • Iterates and creates new data from the list. Each element is accessed and transformed. This clearly fulfills the program's purpose.
List · Screenshot ii · Examples

More List Usage

Part i (List storage)
student_names = []
absent_names = []
for record in attendance_records:
    student_names.append(record["name"])
    if record["absent"]:
        absent_names.append(record["name"])
Part ii (List use)
for n in absent_names:
    print("Follow up:", n)

Look at these responses carefully, then go down one slide to answer.

List · Screenshot ii · MCQ

More List Usage

  • A Yes, it meets the requirement
  • B No, it does not meet the requirement
List · Screenshot ii · MCQ Answer

More List Usage

B — No, it does not meet the requirement
  • Part i shows student_names first, but Part ii uses absent_names.
  • For this check, the list used in Part ii must be the first list shown in Part i. Using a different list does not meet the requirement.
  • Fix: use that first Part i list consistently in both screenshots.
The Other Two

Video &
Program Code

Requirements beyond the PPR

Video

Video Requirements

Your video must show your program running, but it has strict constraints. All of these must be true at the same time.

At most 60 seconds long. Over a minute means automatic rejection, even by one second. Aim for 45–55 seconds so you have a buffer.
Shows input, a program feature, and output. All three must appear. A video that only shows output is not sufficient.
No personally identifying information. No student name, school name, teacher name, or any other identifier, spoken or on-screen.
Accepted format and size. File must be .mp4, .wmv, .avi, .mov, or webm. Maximum file size is 30 MB.

Note: text captions are allowed but not required. If you include them, make sure you do not show your name, school, or any other identifying information.

Program Code PDF

Program Code Requirements

The Program Code PDF is your entire source code exported as a PDF. Unlike the PPR, comments are allowed here, and citation comments are required when code was not written entirely by you.

All of your code, as a PDF. Not a screenshot. Not selected sections. The entire program, exported or printed to PDF from your IDE or coding environment.
Citations for any code you did not write alone. If you wrote code with a partner, used starter code, or adapted code from another source, add a comment citing the source next to that code.
Review the exported PDF before submitting. Make sure all code pages are included and text remains readable after export.
⚠️
Comments belong HERE, in the Program Code PDF, not the PPR The PPR and the Program Code PDF are two separate documents with opposite rules about comments.
Before You Submit

Full Submission Checklist

Run through all three components before marking anything as final in the AP Digital Portfolio.

PPR

  • Screenshots are clear, at least 10-point font.
  • No comments in any of the 4 screenshots.
  • Procedure i: named procedure, parameters, loop, and conditional all present.
  • Procedure ii: real call with actual arguments.
  • List i: list stores multiple values.
  • List ii: same list's elements accessed or processed individually.
  • All code is student-developed.

Video

  • 60 seconds or less.
  • Shows input, a feature, and output.
  • No student name or school name.
  • .mp4/.wmv/.avi/.mov/.webm, max 30 MB.

Program Code PDF

  • Entire source code, exported as PDF.
  • Citations for borrowed or partner code.
  • Confirm all pages are present and readable before upload.