Accelerated C++学习笔记5―(组织程序和数据)(一)

2014-11-24 13:11:03 · 作者: · 浏览: 17

第4章 组织程序和数据


从前面的学习中,我们可以发现程序并不是我们所想的那么简短,他们都有一个共同的特性,那就是 1)都能解决某些特定类型的问题 2)与其他的大多数工具都互相独立 3)都具有一个自己的名称 C++中提供两种基本的方法来让我们组织大型的程序,函数(子程序)和数据结构。 1、组织计算 1)计算总成绩 子函数grade
//根据学生的期中考试、期末考试、家庭作业成绩来计算总成绩
double grade(double midterm, double final, double homework)
{
	return 0.2 * midterm + 0.4 * final + 0.4 * homework;
}

2)查找中值 子函数median
/计算一个vector
   
    类型的变量的中值 double median(vector
    
      vec) { typedef vector
     
      ::size_type vec_sz; vec_sz size = vec.size(); if(size == 0) throw domain_error("median of an empty vector"); sort(vec.begin(), vec.end()); vec_sz mid = size/2; return size % 2 == 0   (vec[mid] + vec[mid - 1]) / 2 : vec[mid]; }
     
    
   

3)重新制定计算成绩的策略
//根据期中、期末考试成绩和保存家庭作业的向量来计算学生的总成绩
double grade(double midterm, double final, const vector
   
    & hw) { if (hw.size() == 0) throw domain_error("student has done no homework"); return grade(midterm, final, median(hw)); }
   

程序说明: 1)const vector & hw,这个类型被称为“对参数类型为double的向量常量的引用”,const确保了我模拟将不会对hw做任何可能改变它的值得动作。 2)这个函数名叫做grade,可以让几个函数具有同样的函数名,叫做函数的重载 3)最后有一个检查程序,这样做的目的主要就是抛出自己的异常,希望给用户更多的提示。
4)读家庭作业成绩
//从输入流中将家庭作业的成绩读入一个vector
    
     中 istream read_hw(istream& in, vector
     
      & hw) { if(in) { //清除原先的内容 hw.clear(); //读家庭作业成绩 double x; while (in >> x) hw.push_back(x); //清除流以使输入动作对下一个学生有效 in.clear(); } return in; }
     
    

程序说明: 1)这里与上面不一样的地方,去掉了const,说明这里可以修改作为函数参数的对象的值; 2)对于istream对象,它清除了所有的错误标记以使输入动作可以继续;而对于向量对象,它删除了向量中可能已经含有的全部内容,这样就会让我们再次拥有一个空的向量。
5)使用函数来计算学生的成绩
// lesson4_1.cpp : 定义控制台应用程序的入口点。
//功能:使用函数来计算学生的成绩
//时间:2014.5.12

#include "stdafx.h"
#include 
    
      #include 
     
       //#include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            using std::cin; using std::cout; using std::domain_error; using std::endl; using std::istream; using std::ostream; using std::setprecision; using std::sort; using std::streamsize; using std::string; using std::vector; //根据学生的期中考试、期末考试、家庭作业成绩来计算总成绩 double grade(double midterm, double final, double homework) { return 0.2 * midterm + 0.4 * final + 0.4 * homework; } //计算一个vector
           
            类型的变量的中值 double median(vector
            
              vec) { typedef vector
             
              ::size_type vec_sz; vec_sz size = vec.size(); if(size == 0) throw domain_error("median of an empty vector"); sort(vec.begin(), vec.end()); vec_sz mid = size/2; return size % 2 == 0   (vec[mid] + vec[mid - 1]) / 2 : vec[mid]; } //根据期中、期末考试成绩和保存家庭作业的向量来计算学生的总成绩 double grade(double midterm, double final, const vector
              
               & hw) { if (hw.size() == 0) throw domain_error("student has done no homework"); return grade(midterm, final, median(hw)); } //从输入流中将家庭作业的成绩读入一个vector
               
                中 istream& read_hw(istream& in, vector
                
                 & hw) { if(in) { //清除原先的内容 hw.clear(); //读家庭作业成绩 double x; while (in >> x) hw.push_back(x); //清除流以使输入动作对下一个学生有效 in.clear(); } return in; } int _tmain(int argc, _TCHAR* argv[]) { //请求并读入学生姓名 cout << "Please enter your first name: "; string name; cin >> name; cout << "Hello, " << name << "!" << endl; //请求并读入期中和期末考试的成绩 cout << "Please enter your midterm and final exam grades: "; double midterm, final; cin >> midterm >> final; //请求用户输入家庭作业成绩 cout << "Enter all your homework grades, " "followed by end-of-file: "; vector
                 
                   homework; //读入家庭作业成绩 read_hw(cin, homework); //如果可以的话,计算生成总成绩 try { double final_grade = grade(midterm, final, homework); streamsize prec = cout.precision(); cout << "Your final grade is " << setprecision(3) << final_grade << setprecision(prec) << endl; } catch (domain_error) { cout << endl << "You must enter your grades. " << "Please try again." << endl; return 1; } return 0; } 
                 
                
               
              
             
            
           
          
         
        
       
      
     
    

运行结果: \

程序说明: 这里需要讲解下的就是try语句,它尝试执行在{}中紧跟那一条trry语句,如果在这语句中的任何一个地方发生了一个domain_error异常,它就会停止这些语句。
注意:这里我在仿真的时候istream& read_hw(istream& in, vectZ http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcjxkb3VibGU+JmFtcDsgaHcp16LS4mlzdHJlYW0mYW1wOyC1xNXiuPa3+7rFo6zI57n7sru806OsQyYjNDM7JiM0Mzu74bGotO2jrGVycm9yCiBDMjI0ODogobBzdGQ6OmJhc2ljX2lvczxfRWxlbSxfVHJhaXRzPjo6YmFzaWNfa