Why C867 Catches People Off Guard (and Why That's Normal)

There is no objective assessment in this course. Your entire grade rests on one multi-file C++ program, and the task description reads like it was written for evaluators rather than for the students building it. Decoding what the rubric actually asks for is the first assignment, and many people spend more time on that than on writing code.

The completion timeline spreads wide here. Students with prior object-oriented experience report finishing in two or three days, while learners meeting their first real programming language report two and a half months of steady work. A thread titled "Feeling discouraged with c867" came from a working web developer who still needed weeks. Nobody should measure their pace against the two-day posts.

Three walls account for most of the friction. Compiling a program that spans six files is a different skill from writing one file that runs. Memory ownership, meaning who allocates a Student object and who releases it, is new territory for anyone coming from Python or JavaScript. Parsing a tab-delimited string table into objects that behave correctly is the third, and it is where the project stops feeling like an exercise.

One warning about resource drift: Course Tips were trimmed in late 2024, and many older threads link to videos that no longer load. When a Reddit post sends you to a dead link, that is not a sign you are doing something wrong.

Reading the Rubric Like an Evaluator: The Course Materials That Actually Matter

Treat ZyBooks as a lookup table rather than a novel. Students who read it cover to cover report losing weeks, while students who work a chapter, complete its labs, and move on report much faster progress. The pointer, class, and object chapters are the ones worth slowing down, since those concepts appear directly in the project. Everything else can wait until you need it.

Four documents get named again and again in student write-ups, and all four live in Course Tips. The requirements webinar, sometimes titled Moving Through the Fog, walks the project end to end and makes far more sense on a second viewing. Tip 6 maps which ZyBooks sections feed which rubric items, Tip 7 lists the reasons evaluators return a PA, and Tip 13 breaks the project into the incremental order the rubric expects, complete with a screenshot of the correct output.

Course Chatter and your instructor's welcome email are worth twenty minutes as well. The exact call chains the rubric looks for, such as parse calling add and printAll calling print, tend to surface there before anywhere else.

Skipping ZyBooks entirely works if you already know object-oriented programming and can read C++ syntax. If you cannot yet explain what a class member is, that shortcut will cost you more time than it saves.

Build Environment Setup: Making Sure Your Project Compiles on Someone Else's Machine

Visual Studio 2022 on Windows and Xcode on Mac are the two environments evaluators expect. Submissions built in VS Code have come back with screenshots showing missing project files, because that editor does not generate the project scaffolding the other two do. Pick a supported environment even if it feels heavier than you would like.

The project spans six files: degree.h, student.h, student.cpp, roster.h, roster.cpp, and main.cpp. The header and implementation split is where most beginners first get lost, so it helps to hold onto one idea. A header declares what a class looks like, and the matching .cpp file defines what it does.

Compiler differences cause the strangest failures. One student's counter variable defaulted to zero under Xcode's Clang and produced a garbage value under MSVC, so the program printed correctly on a Mac and failed during evaluation. Initialize every variable explicitly rather than trusting a default.

A few setup habits prevent most build errors. Add #pragma once or a header guard to each header, confirm a constructor is not declared in both the .h and the .cpp file, and write std::string unless you have already added using namespace std. When you package the submission, zip the project folder itself rather than a folder containing it, since the nested version creates a stray .vscode directory and breaks linking.

The Class Roster Project, File by File: studentData, DegreeProgram, and the Roster Array

The studentData[] array lives inside main(), and it is tab-delimited. Parsing it is the most-asked-about piece of the project. Most passing submissions use getline with a stringstream, splitting each row into temporary fields before constructing a Student.

DegreeProgram is an enum with three values: SECURITY, NETWORK, and SOFTWARE. Printing an enum gives you an integer rather than a word, and that mismatch sits behind a large share of returned PAs. The standard fix is a parallel array of strings indexed by the enum value.

The Student class needs a full-parameter constructor, getters, and setters. A recurring question is whether setters must actually be called or merely present. Most students instantiate with the full constructor and leave the setters unused, and that passes evaluation.

For the Roster class, classRosterArray is a fixed array of Student pointers. Course instructors have told students that vectors are not allowed, even though some passing submissions used them. Adding means scanning for the first nullptr slot. Removing means deleting the object and resetting that slot to nullptr so your print functions skip it.

The destructor releases whatever you allocated dynamically. If you kept allocation minimal, there is very little to clean up.

THE SIX-FILE PROJECT degree.h the DegreeProgram enum, shared by every file student.h student.cpp declares the class → defines the methods roster.h roster.cpp owns classRosterArray and the five methods main.cpp splits each tab-delimited row, then parse calls add THE ROSTER ARRAY (classRosterArray) 0 1 2 3 4 Student* Student* Student* nullptr Student* add() writes to the first nullptr slot remove() deletes it, resets it to nullptr print functions skip nullptr slots A header declares what a class looks like — the matching .cpp file defines what it does.
Figure 1. The six-file C867 project and the fixed roster array: evaluators follow the parse → add and printAll → print call chains, and an empty slot is simply a nullptr.

The Five Methods That Get PAs Returned (and How to Write Them Safely)

printInvalidEmails is the one students reconstruct from evaluator feedback. It checks three conditions: the address contains an @, it contains a period, and it contains no spaces.

printAverageDaysInCourse returns a double. Returning an array from a function creates avoidable friction, so pass the individual day values into the getter and return a single number instead.

printByDegreeProgram filters by enum and then converts that enum into a string. It is the method most often marked approaching competent.

printAll and print handle expected output. The rubric looks for printAll calling print rather than formatting inline, so keep that call chain intact.

One caution is worth stating plainly. Abstracting shared logic into a helper method is the correct engineering instinct, but evaluators have returned PAs where logic was factored out of the required function. Write the logic inline for this course and keep the cleaner version in your own repository.

Academic Integrity, Version Control, and Common Submission Traps

The Dr. Krypto Book Repository videos are the most-recommended resource for this course and also the most argued about. Instructors have pointed students toward them, yet copying the walkthrough line by line raises real integrity questions. Use them as a reference when you are stuck, then restructure the code and make sure you can explain every line.

GitLab is graded as much as the code. The task asks you to commit and push after each step from B through G, then submit the repository link along with a branch history screenshot. If you already finished everything in one commit, copy your files aside, rebuild the history in stages, and push again. Students report that evaluators accept this.

Submission failures usually come from packaging rather than logic. Zipping a folder inside another folder creates a stray .vscode directory that breaks linking. Submitting from VS Code instead of Visual Studio 2022 or Xcode can return screenshots showing missing project files.

An Actionable 6-Step Execution Routine to Complete the C867 PA in Under 7 Days

This routine assumes several focused hours a day. If you are new to programming, stretch it rather than compress it.

  1. Days 1 and 2: Watch the requirements webinar and read Tip 6, Tip 7, and Tip 13. Write the six function signatures and the expected output on paper before touching the IDE.
  2. Day 2: Build a throwaway two-file program with one class to confirm your headers, includes, and build settings work. Delete it once it compiles.
  3. Day 3: Create the six project files, add the DegreeProgram enum, and write the Student class with its constructor, getters, and setters. Commit.
  4. Day 4: Write the parsing loop in main() and confirm the roster populates correctly. Commit.
  5. Day 5: Implement add, remove, and the destructor. Commit.
  6. Days 6 and 7: Implement print, printAll, printByDegreeProgram, printInvalidEmails, and printAverageDaysInCourse in that order, comparing output against the Tip 13 screenshot after each one. Commit after every method, then submit.

References

Sikandar Ali - Academic Consultant
Written by Sikandar Ali

Sikandar Ali is a skilled academic consultant with expertise in research methodology and essay structure. With over 10 years of experience, he helps students develop critical thinking and writing skills for academic success.