《accelerated c++》第三章练习

(测试环境为windows8下vs2013)

3-0编译运行测试本章程序

#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    cout << "please enter your 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<double> homework;
    double x;
    while (cin >> x){
        homework.push_back(x);
    }
    typedef vector<double>::size_type vec_sz;
    vec_sz size = homework.size();
    if (size == 0){
        cout << endl << "no grade,please try again!" << endl;
        return 1;
    }
    sort(homework.begin(), homework.end());
    vec_sz mid = size / 2;
    double median;
    median = size % 2 == 0 ? (homework[mid] + homework[mid + 1]) / 2 : homework[mid];
    streamsize prec = cout.precision();
    cout << "you final grade is " << setprecision(3)
        << 0.2*midterm + 0.4*final + 0.4*median
        <<setprecision(prec)<< endl;
    return 0;
}

文件结束:Ctrl+Enter+z

prec:重新恢复cout的精度



3-2写一个程序计算并输出一个整数集的四位分数(也就是,最大值的1/4,然后是下一个最大值的1/4,如此而已)

(四分位数:即统计学中,把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。)

相关算法如下:

1.将n个数从小到大排列:

2.Q2为n个数组成的数列的中数;

3.当n为奇数时,中数Q2将该数列分为数量相等的两组数,每组有 (n-1)/2 个数,Q1为第一组 (n-1)/2 个数的中数,Q3为为第二组(n+1)/2个数的中数;

当n为偶数时,中数Q2将该数列分为数量相等的两组数,每组有n/2数,Q1为第一组 n/2个数的中数,Q3为为第二组 n/2 个数的中数。

#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    cout << "please input the set of integer :" << endl;
    vector<double> sets;
    double x;
    while (cin >> x){
        sets.push_back(x);
    }

    typedef vector<double>::size_type vec_sz;
    vec_sz size = sets.size();
    vec_sz mid = size / 2;

    if (size == 0){
        cout << "no number! " << endl;
        return 1;
    }
    sort(sets.begin(), sets.end());

    double q1, q2, q3;
    if (size % 2 == 0){
        q2 = (sets[mid] + sets[mid - 1]) / 2;
    }else{
        q2 = sets[mid];
    }
    if (mid % 2 == 0){
        q1 = (sets[mid / 2] + sets[mid / 2 - 1]) / 2;
        q3 = (sets[size - 1 - mid / 2] + sets[size - mid / 2]) / 2;
    }else{
        q1 = sets[mid / 2];
        q3 = sets[size - 1 - mid / 2];
    }

    streamsize prec = cout.precision();
    cout << "the first block is: " <<setprecision(3)<< q1 << endl;
    cout << "the second block is: " << q2 << endl;
    cout << "the third block is: " << q3 <<setprecision(prec)<< endl;
    return 0;
}

测试结果:



3-3写一个程序,计算输入中每个不同的单词出现了多少次

算法思路:

1.用一个vector<string>存储输入文本中所有的单词

2.用另一个vector<string>存储不同的单词,即重复的就没有了

3.用一个int变量输出单词出现的次数(要存储的话用vector即可)

#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    cout << "please input the text: " << endl;
    vector<string> text;
    string word;
    while (cin >> word){
        text.push_back(word);
    }

    if (text.size() == 0){
        cout << "no text! please try again: " << endl;
        return 1;
    }
    // put the different word to vector for temp
    vector<string> temp;
    int i, j;
    for (i = 0; i != text.size(); i++){
        for (j = 0;; j++){
            if (j == temp.size()){
                temp.push_back(text[i]);
                break;
            }else{
                if (temp[j] == text[i])
                    break;
            }
        }
    }

    //output the count of word
    int count;
    for (i = 0; i != temp.size(); i++){
        count = 0;
        for (j = 0; j != text.size(); j++){
            if (temp[i] == text[j]){
                count++;
            }
        }
        cout << "the word: " << temp[i] << " present " << count << " times" << endl;
    }
    return 0;
}

运行结果:



3-4写一个程序,找出输入中最长和最短的字符串

#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    cout << "please input the text: " << endl;
    vector<string> text;
    string word;
    while (cin >> word){
        text.push_back(word);
    }

    if (text.size() == 0){
        cout << "no text! please try again: " << endl;
        return 1;
    }

//the strmax use for store the longest string
//the max use for store the length of the longest string
//the strmin and the min also
    string strmax, strmin;
    string::size_type max, min;
    strmax = strmin = text[0];
    max = min = text[0].size();
    for (int i = 1; i != text.size(); i++){
        if (text[i].size() > max){
            max = text[i].size();
            strmax = text[i];
        }else if (text[i].size() < min){
            min = text[i].size();
            strmin = text[i];
        }else
            continue;
    }
    cout << "the longest word is: " << strmax <<endl
        << " and the length is: " << max << endl;
    cout << "the shortest word is " << strmin <<endl
        <<" and the length is: " << min << endl;
    return 0;
}

测试结果:



3-5写一个程序,可以一次计算多个学生的成绩,这个程序需要同时使用两个vector:

第一个vector要保存学生的姓名,第二个vector要保存根据输入计算出的最终成绩。

假定家庭作业成绩的数目是确定的(本文假定为3,计算的为平均成绩)。

#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    vector<string> name;
    vector<double> grade;
    string sname;
    double x;

    while (cin >> sname){
        name.push_back(sname);
        double sum = 0;
        int count = 0;
        while (cin >> x){
            sum += x;
            count++;
            if (count == 3)
                break;
        }
        grade.push_back(sum / count);
    }

    if (name.size() == 0){
        cout << "no student ,try again!" << endl;
        return 1;
    }

    streamsize prec = cout.precision();
    for (int i = 0; i != name.size(); i++){
        cout << "the student: " << name[i]
            << setprecision(3) << " ‘s grade is :"
            << grade[i] << setprecision(prec)
            << endl;
    }
    return 0;
}

运行结果:



3-6在3.1节程序中,如果学生没有输入任何家庭作业成绩,那么计算平均值时

可能会除以0,在c++中,除以0是不确定的,也就是说系统会进行随意的操作

在你的c++系统中会怎么样呢?重写这个程序,使得程序的行为不依赖于系统

如何对待除以0的情况。

出现情况:

在程序中加入检查代码即可,如本文3-0程序

if (size == 0){
        cout << endl << "no grade,please try again!" << endl;
        return 1;
    }

再次出现时:

时间: 2024-08-27 09:31:59

《accelerated c++》第三章练习的相关文章

构建之法前三章读后感

一. 软件作为一个产品,在提供用户使用前经历了许多工序,我们用工程的方式将开发软件的工序,过程加以工程化,系统化.成立了一套完整的体系后,有利于帮助我们开发软件,乃至于大型的系统. 软件具有一定的特殊性,使得软件工程师们做开发提升了一定的难度,但软件工程有助于软件系统的开发,帮助工程师们设计,构建,测试和维护软件.所以,软件工程的最终目的是帮助工程师们创造“足够好”的软件,提高软件的质量,用户满意度,可靠性,可维护性等. 第一章问题:怎么才算是一个真正的软件工程师? 二.   一个优秀的软件,通

0320 《构建之法》前三章观后感

第一章.为我们解释什么是软件,什么是软件工程,读完这章对这些概念有一定的认识这章让我明白,代码不能盲目的敲,好的软件并非两三天,并非一两个人就能赶出来的,需要大家的精诚合作.同时,在编写程序之前,还需要做一系列的分析.设计,要满足客户的需求,后续还要对软件进行测试.维护等.在这之前,我一直觉得能把程序运行,能有正确的结果,那就完成任务了,可这只是整个软件流程的一部分而已.看了邹老师的书,才知道其实创新有很多的方面,除了技术,还有商业思路,差异化等等,这些都给了我很大的感触,作为一名程序员,我们不

家庭作业——第三章

第三章家庭作业    3.69和3.70 3.69 A:long trace(tree_ptr tp)    {        long ret = 0;        while(tp != NULL)        {           ret = tp->val;           tp = tp->left;        }        return ret;    } B:作用是从根一直遍历左子树,找到第一个没有左子树的节点的值. 3.70 A:long traverse(t

第三章 Linux操作系统的安装

第三章 Linux操作系统的安装 因为笔者一直都是使用CentOS,所以这次安装系统也是基于CentOS的安装.把光盘插入光驱,设置bios光驱启动.进入光盘的欢迎界面. 其中有两个选项,可以直接按回车,也可以在当前界面下输入 linux text 按回车.前者是图形下安装,可以动鼠标的,后者是纯文字形式的.建议初学者用前者安装.直接回车后,出现一下界面: 这一步是要提示你是否要校验光盘,目的是看看光盘中的安装包是否完整或者是否被人改动过,一般情况下,如果是正规的光盘不需要做这一步操作,因为太费

《C#高级编程》【第三章】对象和类型 -- 学习笔记

在看过C++之后,再看C#的面向对象感觉就不难了,只是有一些区别而已. 1.类定义 使用class关键字来声明类,其和C++不同的地方是在大括号之后不需要冒号 class 类名 { //类的内部 } //C++这里有一个冒号,而C#没有 2.类成员 3.字段与属性 首先我们先区分一下C#数据成员中的字段.常量与事件成员.字段.常量是与类的相关变量.事件是类的成员,在发生某些行为时(如:改变类的字段或属性,或进行某种形式的用户交互操作),它可以让对象通知调用方. 那么现在我们在来看看字段与属性,属

标准库》第三章 包装对象和Boolean对象

第三部分  标准库 ***************第三章   包装对象和Boolean对象******************* 一.包装对象的定义[1]有人说,JavaScript语言"一切皆对象",数组和函数本质上都是对象,就连三种原始类型的值--数值.字符串.布尔值--在一定条件下,也会自动转为对象,也就是原始类型的"包装对象". 所谓"包装对象",就是分别与数值.字符串.布尔值相对应的Number.String.Boolean三个原生对象

2017.06.29数据挖掘基础概念第二.三章

第二章21.研究的属性类型标称属性:值是一些符号或事物的名称,代表某种类型.编码或状态二元属性:是一种标称属性,只有两个类别或状态,又称布尔属性序数属性:是一种属性,其可能的值之间具有有意义的序或秩评定,但是相续值之间的差是未知的数值属性:是定量的,即他是可度量的量,可用整数或实数值表示(区间和比率标度)22.数据散布常见的度量量(数据如何分散的方法/识别离群点)极差 四分位数.四分位数极差.五数概括图.方差和标准差23.审视数据的图形条形.饼图.线图.分位数图.分位数-分位数图.直方图和散点图

杨森翔:春节文化大观上编 第三章 春节古诗词 目录 第一节:春节诗词概述 一、 除夕诗词概述 二、元日诗词概述 三、 元宵诗词概述 第二节:春节古诗词拾萃

杨森翔:春节文化大观上编 第三章 春节古诗词 目录 第一节:春节诗词概述 一. 除夕诗词概述 二.元日诗词概述 三. 元宵诗词概述 第二节:春节古诗词拾萃 一.腊祭诗词 二.祭灶诗词 三.除夕诗词 四.元旦诗词 五.人日诗词 六.元宵诗词 第一节:春节古诗词概述 中国的春节,作为除旧迎新的节日,时间相当长,从年前的腊月二十三,天空中就似乎弥漫了节日的气息.这种节日的气氛,在保持传统风俗较好的地方,甚至会持续到二月二龙抬头的时候,但欢度春节的高潮,应该说是自除夕始一直到上元之夜.因此,历代歌咏和反

Android艺术开发探索第三章————View的事件体系(下)

Android艺术开发探索第三章----View的事件体系(下) 在这里就能学习到很多,主要还是对View的事件分发做一个体系的了解 一.View的事件分发 上篇大致的说了一下View的基础知识和滑动,现在我们再来聊聊一个比较核心的知识点,那就是事件分发了,而且他还是一个难点,我们更加应该掌握,View的滑动冲突一直都是很苦恼的,这里,我们就来一起探索一下 1.点击事件的传递规则 我们分析的点击事件可不是View.OnClickListener,而是我们MotionEvent,即点击事件,关于M

web—第三章XHTML

web—第三章XHTML 又是一周 我们学的了做表单:一开始我以为表单是表格.但结果:表单是以采集和提交用户输入数据的,这样讲很迷,说简单点就是登陆端.比如:Facebook.twitter.Instagram .非常强大的是表单不仅仅可以做登录端,注册.做一些像我们在网上购买东西选择数量或者是点菜的时候选票等等都可以. 首先最开始,就是理解表单是什么东西:表单的作用是什么? 其实很简单:先从表单的作用说起,表单的主要作用在于网页上提供一个图形用户界面,当用户输入正确的用户名和密码后,输入的数据