比上一个版本添加了一个计算班级平均分的函数determineClassAverage()
还是3个文件
GradeBook.h
#ifndef GRADEBOOK_H#define GRADEBOOK_H// GradeBook.h// GradeBook类展示了该类的公共接口。成员函数出现在GradeBook.cpp中#include// 该程序使用C++标准的string类using std::string;// GradeBook类的定义class GradeBook{ public: /** 构造函数初始化GradeBook对象 */ GradeBook( string ); /** Access courseName * 返回courseName */ string getCourseName(); /** Set courseName * 设定courseName的值 */ void setCourseName(string ); void displayMessage(); // 显示一条欢迎信息 void determineClassAverage(); // 计算用户输入的成绩的平均分 private: string courseName; //这个GradeBook的课程名称}; // GradeBook类定义结尾#endif // GRADEBOOK_H
GradeBook.cpp
// GradeBook.cpp// Implementation of the GradeBook member-function definitions.// The setCourseName function performs validation#includeusing std::cout;using std::endl;using std::cin;#include "GradeBook.h" // include definition of class GradeBook// constructor initializes courseName with string supplied as argumentGradeBook::GradeBook( string name ){ setCourseName( name ); // validate and store courseName} // end GradeBook constructor// function that sets the course name// ensures that the courseName has at most 25 charactersvoid GradeBook::setCourseName( string name ){ if( name.length() <= 25 ) // if name has 25 or fewer characters courseName = name; // store the courseName if( name.length() > 25 ) // if name has more than 25 characters { courseName = name.substr( 0, 25 ); // start at 0, length of 25 cout << "Name \"" << name << "\" exceeds maximum length (25).\n" << "Limiting courseName to the first 25 characters.\n" << endl; }} // end function setCourseName// function to get the course namestring GradeBook::getCourseName(){ return courseName; // return object's courseName} // end function getCourseName// display a welcome message to the GradeBook uservoid GradeBook::displayMessage(){ // call the getCourseName to get the coureName cout << "Welcome to the grade book for\n" << getCourseName() << "!" << endl;} // end function displayMessage// determine class average based on 10 grades entered by uservoid GradeBook::determineClassAverage(){ int total; // sum of grades entered by user int gradeCounter; // number of the grade to be entered next int grade; // grade value entered by user int average; // average of grades // initialization phase total = 0; // initialize sum gradeCounter = 1; // initialize loop counter // processing phase while( gradeCounter <= 10 ) // loop 10 times { cout << "Enter grade: "; // prompt for input cin >> grade; // input next grade total += grade; // add grade to total gradeCounter++; // increment counter by 1 } // end while // termination phase average = total / 10; // integer division yields integer result // display total and average of grades cout << "\nTotal of all 10 grades is " << total << endl; cout << "Class average is " << average << endl;} // end function determineClassAverage
测试文件 main.cpp
// main.cpp// Create GradeBook object and invoke its determineClassAverage function.#include "GradeBook.h" // include definition of class GradeBook// function main begins program executionint main(){ // Create GradeBook object myGradeBook and // pass course name to constructor GradeBook myGradeBook( "CS101 C++ Programming!" ); myGradeBook.displayMessage(); // display welcome message myGradeBook.determineClassAverage(); // find average of 10 grades return 0; // indicate successful termination} // end main
软件工程知识
- 在计算机上解决问题最困难的部分在于开发出解决该问题的算法。一旦确定了正确的算法,从算法生成C++程序通常是相当简单的。
- 每级细化的结果和顶层一样,都是完整的算法描述,只是详细的程度不同而已。
- 许多程序都可以在逻辑上划分为三个阶段:初始化程序变量的初始化阶段,输入数据的值和程序变量(如计数器变量和总和变量)做相应的调整的处理阶段,以及计算和打印最终结果的收尾阶段。
- 当伪代码算法描述的细节足以将伪代码转换成C++代码时,这种自上而下逐步求精的过程就可以结束了。此时C++程序的实现是水到渠成的事情。
- 不写伪代码在简单或熟悉的问题上或许会行得通,但是在大型的或复杂的项目中往往会导致开发陷入困境。
常见的编程错误
- 没有初始化的各种计数器变量和总数变量将导致逻辑错误
- 假定整数除法的结果采取四舍五入(而不是截尾),将会产生不正确的结果
- 在一个循环之后,使用该循环的计数器控制变量进行计算通常会导致一个常见的逻辑错误—相差1错误
- 选择的标记值(-1,输入中用作终止值)如果也是一个合法的值,将会导致一个逻辑错误
- 企图用0做除数通常会导致一个致命的逻辑错误
错误预防技巧
- 初始化每一个计数器变量(0或1)和总数变量(0),或者在声明时,或者在赋值语句中
- 进行除法运算时,如果除数有可能为0,则必须在程序中显示地测试这种可能性是否存在,如果存在,那么就必须做适当的处理
良好的编程习惯
- 将声明语句与其他语句用空行隔开,每行只声明一个变量并且添加上注释,可以增强可读性