易语言教程_易语言源码_易语言视频教程_易语言论坛

 找回密码
 点击注册

Vip新手入门区
新手学习指南  学员作品展示 Vip课程总纲  Vip绝密课程系列

Vip相关下载区
Vip模块下载   Vip模块绑定   Vip模块例子 魔鬼插件下载  魔鬼插件例子  教程工具下载

Vip论坛服务区
教程问题提问区   模块问题提问区 技术交流区   魔鬼插件建议   忘记密码找回

VIP会员办理QQ: 8643245   
【请先加好友,然后到好友列表双击联系客服,办理VIP会员。】
【基础篇】易语言辅助入门基础教程
VIP模块办理QQ: 7189694 办理正版魔鬼作坊VIP模块 【基础篇】OD与CE入门基础教程
办理【终身VIP会员】“秒杀价” 仅需 RMB278.00元… 【基础篇】零基础绝密汇编语言入门课程 (共26课已完成)…
办理VIP详情…猛击这里查看详情 【基础篇】VIP辅助入门基础教程-新手必学 已发布10课 ……
VIP教程免费试看章节…猛击下载 【第1款】制作“辅助挂”教程目录查看(共107+16_x64下更新课已完成)…
亲爱的VIP学员,请到此写下你学习的感受与发布作品截图… 【第2款】制作“任务挂”教程目录查看(共77+1_x64下更新课已完成)…
卍解吧!不用bp send类封包断点找CALL的各种通杀思路 【第3款】驱动过保护技术课程(共38课已完成)…
【绝密教程】VIP绝密教程系列---注意:随时会更新! 【第4款】VIP邪恶二叉树辅助课程 (共31+17_x64下更新课已完成)…
【精品第13款】3D射击游戏与页游透视 智辅课程 已完成17课… 【第5款】零基础易语言按键辅助教程 (30课已完成)…
【精品第14款】变态功能辅助是如何炼成的 已完成36课… 【第6款】从零开始学习封包辅助技术教程(20课已完成) …
【精品第15款】DNF商业变态辅助的修炼之路 已完成27课… 【第7款】大杀特杀分析来源与CALL吸血鬼课程 (56课已完成)
【精品第16款】中控台多线程多开自动化商业辅助课程 已完成66课… 【第8款】完全零基础网页辅助课程(40课已完成)
【全新精品第17款】检测原理与过游戏内存检测技术课程 已发布9课… 【第9款】自动登录与操控LUA技术课程 (共46+8_x64下更新课已完成)…
【全新精品第18款】手游全自动化任务脚本辅助课程 已发布25课…… 【第10款】网页辅助封包脱机进阶课程 已完成30课…
【全新精品第19款】D3D方框骨骼透视与自瞄辅助课程进阶篇 已发布34课…… 【第11款】VC++ Lua脚本辅助课程 已完成112课…
【全新精品第20款】 X64模拟器吃鸡游戏方框透视自瞄辅助课程 发布中... 【第12款】网游脱机封包智辅课程 已完成35课…
查看: 3989|回复: 14

C++新手学习(附教程下载地址)

[复制链接]

54

主题

98

回帖

130

积分

终身VIP会员

花钱是让你服务的,不是叫你大哥 ...

Rank: 7Rank: 7Rank: 7

魔鬼币
10632
发表于 2011-4-16 16:33:14 | 显示全部楼层 |阅读模式
发这个贴的目的,主要是让很多和曾经的我一样的迷途的人找到一个突破口,谋求共同进步。
教材是C++ PRIMER 4TH 中文版的,个人感觉这本教材,新手自学入门,是不错的!(作业会不断补全)
教程下载地址:http://www.verycd.com/topics/147662/

谈下这几天的C++自学,这本书,我看了5天了吧,1天看一章。
乍看,进度似乎不慢,但事实我知道,从这本教材的信息量来看,对于我这个新手,这样的学习进度有点囫囵吞枣了,自己是必然不能完全消化的。
直接导致的问题是,学习过程中疑问和问题实在太多,而有一部分问题,似乎又只能通过今后的学习才能找到答案,还有一些常识性的计算机问题,或许是先前打了一些计算机的基础,所以通过查询资料一般都能克服和解决。
另外,需要时刻告诫自己,第一点是坚持,第二点是欲速则不达
前置我学习了汇编语言,计算机基本原理之类的,是一些基础的计算机知识,比如内存的基本知识、进制转换,补码 原码 ASCII码,线程,指针,以及一些简单的计算机程序思维,这对现在的C++学习确实有不少的帮助。
即便如此,依然感觉有点累...
文中有些英语术语、以及一些代码原文标注,对于一些英语不是特别擅长的人来说可能有一点困难,我推荐 金山词霸2011,又不了解的单词和词组,可以加入生词本,还可以翻译一些短句以便理解。
说实话,我现在也很无奈和迷茫,前路中谁给我指引一盏明灯呢???
---------------------------------------------------------------------------------------------分界线以下是作业:
习题1.3
#include<iostream>
using namespace std;
int main()
{
        cout<<"Hello World."<<endl;
        return 0;
}

习题1.4
int product(int,int);
int main()
{
        int x,y;
        cout<<"请输入一个乘数和一个被乘数:\n";
        cin>>x>>y;
        cout<<product(x,y)<<endl;
        cout<<"Hello World."<<endl;
        return 0;
}
int product(int x,int y)
{
        return x*y;
}

习题1.6
int main()
{
        int v1,v2;
        cout<<"The sum of "<<v1;
            <<" and "<<v2; //少一个cout或者可以将前一句的;去掉
                <<" is "<<v1+v2 //同上
        <<endl;
    return 0;
}
cpp(7) : error C2143: syntax error : missing ';' before '<<'

习题1.9        
int sum=0;
        for(int i=-100;i<=100;++i)
        {
                sum+=i;
        }
        cout<<sum<<endl;
答:sum=0

习题1.10
用for循环编程,求从50到100的所有自然数的和,然后用while重写该代码。
        int sum=0;
        for(int i=50;i<=100;++i)
        {
                sum+=i;
        }
    // sum=3825
        cout<<sum<<endl;

while语句:
        int sum=0,i=50;
    while(i<=100)
        {
                sum+=i;
                ++i;
        }

习题1.11
        int i=10;
    while(i>=0)
        {
                cout<<i<<" ";
                --i;
        }

用for语句重写:
        int i=10;
    for(i=10;i>=0;--i)
        {
                cout<<i<<" ";
        }

习题1.12
For语句相对while语句更简洁。

习题1.13
略。
习题1.14
如果输入的值相等,那么条件v1<=v2成立,执行:
  Lower=v1;upper=v2;
然后for循环执行一句sum+=val,接着++val,跳出for循环,输出Sum of……=val;

习题1.15


习题1.16
        cout<<"Enter two numbers:"<<endl;
        int v1,v2;
        cin>>v1>>v2;
        int upper;
        if(v1<=v2){
                upper=v2;
        } else {
                upper=v1;
        }
        cout<<upper<<endl;

习题1.17
int main()
{
        int count=0,value;
        while(cin>>value) // 使用”/”作为文件结束符。
                if(value<=0){
                        ++count;}
    cout<<"负数一共有 :"<<count<<endl;
        return 0;
}

习题1.18
        int lower,upper;
        cout<<"请输入两个整数:";
        int x,y;
        cin>>x>>y;
        if(x<=y){
                lower=x;
                upper=y;}
        else {
                upper=x;
                lower=y;}
        for(int val=lower;val<=upper;++val)
        {
                cout<<val<<" ";}
        return 0;

习题1.19
        int lower,upper;
        cout<<"请输入两个整数:";
        int x,y;
        cin>>x>>y;
        int sum=0;
        for(int val=lower;val<=upper;++val)
        {
                sum+=val;}
        cout<<sum<<endl;

因为x和y没有初始化赋值,(for循环第一个条件没通过)所以标准输出了一个编译器给定的随机数。

54

主题

98

回帖

130

积分

终身VIP会员

花钱是让你服务的,不是叫你大哥 ...

Rank: 7Rank: 7Rank: 7

魔鬼币
10632
 楼主| 发表于 2011-4-16 16:33:46 | 显示全部楼层
习题2.7
(a). 字符字面值、宽字符字面值、字符串字面值、宽字符串字面值。
(b). int、unsigned int、long int、unsigned long int、八进制数、十六进制数
(c). 浮点型、浮点型、扩展精度浮点型。

习题2.8
(a). signed int、unsigned int、float、double

习题2.9
a、c、e、f
a使用了转义符作为字符串内容;
c字符串字面值和宽字符串字符串,这个程序可能会执行,也可能会崩溃或者产生没有用的值,而且在不同的编译器下程序的动作可能不同。
e  错误,错误的数值后缀。bad suffix on number
f “multiple line”
   “comment”

习题2.10
cout<<"2M\12"<<"2\t"<<"M\n";

习题2.11
        int base,pow;
        cout<<"请输入一个底数和一个指数:";
        cin>>base>>pow;
        int result=1;
        for(int cnt=0;cnt!=pow;++cnt)
        {
                result*=base;
        }
        cout<<base<<" raised to the power of "<<pow<<":\t"<<result<<endl;
return 0;

习题2.12
略。

习题2.13
略。

习题2.14
(a)        double不能作为标识符来使用
(c) 错误
(d) 首字符不能为数字

习题2.15
Int month=09,day=07;错误,可以改成int month=9,day=07;

习题2.16
(a). auto不能作为标识符使用
(c) 改成 int input_value;
        Cin>>input_value;
(d).         double wage=0;
        double salary=wage=9999.99;
(e). 错误原因不明….

习题2.18
1.        extern std::string name; 外部声明,不分配内存存储空间
2.        std::string name(“exercise 3.5a”); 直接初始化定义;
3.        extern std::string name(“exercise 3.5a”); 外部声明,并且有初始化定义,所以应当被看做是定义。

习题2.19
j=100;

习题2.20
不合法。

习题2.21
合法。

习题2.22
略。(没看出有什么糟糕的地方。)

习题2.23
(a)        错误const object must be initialized if not extern
(b)        错误l-value specifies const object。

习题2.24
(a). 合法;
(b). 非法 const int &rvall=1.01;
(c). 合法;
(d). 合法。

习题2.25
(a). 合法,给整形引用ival赋一个双精度的字面常量值;
(b). 合法,将一个常量引用别名的值赋值给一个非常量引用别名;
(c). 合法,将一个常量引用别名的值赋值给一个非常量变量;
(d). 非法,左值rval3是一个常量引用别名,而右值ival是一个非常量变量。

习题2.26
(a)        合法,(b)非法。

习题2.27
10 10

习题2.28
类定义少一个分号;

习题2.29
'Foo' followed by 'int' is illegal (did you forget a ';'?)
在紧跟着int 之前的Foo类 为 非法;

习题2.30
类中public部分乘以的成员在程序的任何部分都可以访问。一般把操作放在public部分,这样程序的任何代码都可以执行这些操作。
程序不能访问类中的private成员。

习题2.31
(a). 定义
(b). 声明;
(c). 声明;
(d). 定义。

习题2.32
略。

习题2.33
略。

习题3.1
#include<iostream>
using namespace std;
int main(){
        cout<<"2 raised to the power of 10: ";
        cout<<2*2*2*2*2*2*2*2*2*2;
        cout<<endl;
        return 0;}

习题3.2
什么是默认构造函数?
答:不好回答;

习题3.3
列举出3种初始化String对象的方法:
I.        string s2(s1) 将s2初始化为s1的一个副本;
II.        string s3(“value”) 将s3初始化为一个字符串字面值副本;
III.        string s4(n,’c’); 将s4初始化为字符‘ c’的n个副本。

习题3.4
s的值为空字符串 “”;
s2的值也为空字符串。
没搞明白这个题出的目的是什么….

习题3.7
#include<iostream>
#include<string>
using namespace std;
int main()
{
        string a,b;
        cin>>a>>b;
        if(a==b){
                cout<<"字符串a和字符串b相等。"<<endl;}
        else if(a>=b){
        cout<<"字符串a大于字符串b。"<<endl;}
        else cout<<"字符串a小于字符串b。"<<endl;
        return 0;
}

        string a,b;
        cin>>a>>b;
        if(a.size()==b.size()){
                cout<<"字符串a的长度和字符串b的长度相等。"<<endl;}
        else if(a.size()>=b.size()){
        cout<<"字符串a的长度大于字符串b的长度。"<<endl;}
        else cout<<"字符串a的长度小于字符串b的长度。"<<endl;

习题3.8
        string a="start:",b,c,d,e;
        cin>>b>>c>>d>>e;
        string abcde;
        abcde=a+" "+b+" "+c+" "+d+" "+e;
        cout<<abcde<<endl;
return 0;

习题3.9
实现的功能是输出字符串首字符,不合法,因为s是空字符串。
习题3.10
#include<iostream>
#include<string>
using namespace std;
int main()
{
        string a;
        //string::size_type cnt=0;
        cin>>a;
        for(string::size_type index=0;index!=a.size();++index)
        {
                if(ispunct(a[index]))
                        ;
                else cout<<a[index];
        }
    return 0;
}

习题3.11
(a)        vector<vector<int>>ivec; 非法;
(b)        vector<string>svec=ivec; 非法;
(c)        vector<string>svec(10,"null"); 合法(有警告)。

习题3.12
(a)        0个;
(b)        10个 , 0;
(c)        10个,42;
(d)        0个;
(e)        10个,空字符串;
(f)        10个,字符串hello。

习题3.13
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
        //string ivec="Xx";
        vector<int>ioval(10,2);
        for(vector<int>::size_type index=0;index!=10;++index)
        {
                if(index<9)
                {
                cout<<ioval[index]+ioval[index+1]<<" ";
                }
                else cout<<"最后一个元素没有求和."<<endl;
        }
    return 0;
}

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
        //string ivec="Xx";
        vector<int>ioval(10,2);
        for(vector<int>::size_type index=0;index!=5;++index)
        {
                cout<<ioval[index]+ioval[9-index]<<" ";
        }
    return 0;
}

习题3.14

习题3.15
非法,vector<int>ivec(1);
      Ivec[0]=42;

习题3.16
1.vector<int>ivec(10,42);
2.        vector<int>ivec(10);
        for(vector<int>::size_type ix=0;ix!=10;++ix)
                ivec[ix]=42;
4.        ???

习题3.17
重做3.3.2的习题,用迭代器而不是下标操作来访问vector中的元素:
#include<vector>
using namespace std;
int main()
{
        vector<int>nums(10);
        for(vector<int>::iterator cit=nums.begin();cit!=nums.end();++cit)
        {
                *cit=42;
        }
    return 0;
}

习题3.18
*cit*=2;

习题3.19
略。

习题3.20
略。

习题3.21
Const_iterator对象 不能改写容器中的元素值,而const vector一旦被初始化后,只能用来修改其指向的元素,但不能使它指向任何元素。

习题3.23
(a)bitset<64>bitvec(32);
bitvec:0000000000000000000000000000000000000000000000000000000000100000;
(b)        bitset<32>bv(1010101);
bv: 00000000000011110110100110110101;
(c) string bstr; cin>>bstr; bitset<8>bv(bstr);

54

主题

98

回帖

130

积分

终身VIP会员

花钱是让你服务的,不是叫你大哥 ...

Rank: 7Rank: 7Rank: 7

魔鬼币
10632
 楼主| 发表于 2011-4-16 16:34:20 | 显示全部楼层
习题4.1
假设get_size是一个没有参数并且返回int值的函数,下列哪些定义是非法的?为什么?
Unsigned buf_size=1024;
(a) int ia[buf_size];   错误,buf_size是非常量变量,所以不能作为数组的维数;
(b)int ia[get_size()];  错误,get_size()是一个桉树,它的返回值要到运行时调用get_size函数后才能知道,因此,它也不能用于定义数组维数。
(c) int ia[4*7-14]; ok; unreferenced local variable
(d) char st[11]=”fundamental”; 错误,数组越界;

习题4.2
下列数组的值是什么?
String sa[10];
int ia[10];
int main(){
     string sa2[10];
     int   ia2[10];
}
sa[10]={‘0’ +‘0’ +‘0’ +‘0’ +‘0’ +‘0’ +‘0’ +‘0’ +‘0’ +‘0’};
ia[10]={0,0,0,0,0,0,0,0,0,0};
在main函数体内定义的数组 sa2以及ia2,其元素没有初始化;

习题4.3
下列哪些定义是错误的?
(a)        正确;
(b)        错误; non-aggregates cannot be initialized with initializer list
(c)        错误cannot convert from 'int [2]' to 'int []'; 初始化的时候,ia1是确定维数的数组,不能赋值给维数未确定的数组;
(d)        错误, cannot convert from 'class std::vector<int,class std::allocator<int> >' to 'int []'

习题4.4
i.        int ia[5]={0,1,2};  确定维数的大小,然后直接给确定维数大小的数组赋元素值;
ii.        int ia[3]={0,1,2}; 初始化数组维数大小和元素赋值数的数量相等,就是初始化全部元素。

习题4.5
列出使用数组而不是vector的缺点:
与vector类型相比,数组的显著缺陷在于:数组的长度是固定的,而程序员无法知道一个给定数组的长度。数组没有获取其容量大小的size操作,也不提供push_back操作在其中自动添加元素。如果需要更改数组的长度,程序员只能创建一个更大的新数组,然后把原数组的所有元素复制到新数组空间中去。

习题4.6
const size_t array_size=10;
int ia[array_size];
for (size_t ix=1;ix<=array_size;++ix)
     ia[ix]=ix;
第一个错误,数组ia的第一个元素的下标为0,所以第一个元素未赋值成功;
第二个错误,当size_t ix=10的时候,超出了数组最大下标值,如果访问该数组,会导致数组越界并让缓冲区溢出。

习题4.7
        const size_t array_size=7;
    int ia1[]={0,1,2,3,4,5,6};
        int ia2[array_size];
        for(size_t ix=0;ix!=array_size;++ix)
                ia2[ix]=ia1[ix];
        return 0;
然后改用vector实现,考虑如何将一个vector赋给另一个vector:

习题4.10
略;

习题4.11
(c) 错误 类型转换错误;

习题4.12
已知一指针p,你可以确定该指针是否指向一个有效的对象吗?如果可以,如何确定?如果不可以,请说明原因。
答:可以,第一看该指针的类型,第二看该指针是否被初始化定义了或者该指针是否已经被赋值。

习题4.13
下列代码中,为什么第一个指针的初始化是合法,而第二个则不合法?
Void*可以保存任何类型的对象的地址,而long*只能保存long类型对象的地址。

习题4.14
编写代码修改指针的值;然后再编写代码修改指针所指对象的值:
        int i=42,j=30;
        int *p=&i;
        cout<<p<<endl;
        p+=100;
        cout<<p<<endl;

        int i=42;
        int *p=&i;
        cout<<*p<<endl;
        i=24;
        cout<<*p<<endl;
        return 0;

习题4.15
解释指针和引用的主要区别:
第一个区别在于引用总是指向某个对象:定义引用时没有初始化是错误的。第二个重要区别则是赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值,而并不是使使用与另一个对象关联。引用一经初始化,就始终指向同一个特定对象。

习题4.16
系列程序段实现了什么功能?
初始化指向变量i和变量j的int型指针为p1、p2;
改变指针p2指向的对象的值为42*1024=43008;
改变指针p1指向的对象的值为42*42=1724.

习题4.17
        const size_t arr_sz=5;
        int int_arr[arr_sz]={0,1,2,3,4};
        int *p1=&int_arr[0];
        int *p2=&int_arr[2];
        cout<<p1<<" "<<p2<<endl;
        p1+=p2-p1;
        cout<<p1<<" "<<p2<<endl;

当p1和p2具有什么值时,这个语句是非法的?
答:不知道!

习题4.18
编写程序,使用指针把一个int型数组的所有元素置为0:
        const size_t arr_sz=5;
        int int_arr[arr_sz]={0,1,2,3,4};
        for(int *pbegin=int_arr,*pend=int_arr+arr_sz;pbegin!=pend;++pbegin)
        {
                *pbegin=0;
                cout<<*pbegin<<" ";}

习题4.19
(b) 错误,const object must be initialized if not extern
(d) 错误,const object must be initialized if not extern
(e) 错误,const object must be initialized if not extern

习题4.20
(e)        错误cannot convert from 'const int *' to 'int *const '

习题4.21
根据上述定义,下列哪些赋值运算是合法的?为什么?
(a)        i=ic;
(b)        pic=cpic;
(c)        pic=&ic;    错误,以为上述定义本身就是错的;
(d)        pic=cpic;   
(e)        cpi=pic;     错误,左值为常量对象,不能直接赋值;
(f)        ic=*cpic;    错误,error C2166: l-value specifies const object。
(g)        ----------------------------------------------------------------这里确实非常搞,呵呵!~~~~~!

习题4.27
Delete [] pa;

习题4.28

54

主题

98

回帖

130

积分

终身VIP会员

花钱是让你服务的,不是叫你大哥 ...

Rank: 7Rank: 7Rank: 7

魔鬼币
10632
 楼主| 发表于 2011-4-16 16:34:48 | 显示全部楼层
习题5.1
在下列表达式中,加入适当的圆括号以标明其计算顺序。编译该表达式并输出其值,从而检查你的回答是否正确。
12/3*4+5*15+24%4/2=91;

习题5.2
计算下列表达式的值,并指出哪些结果值依赖于机器?
-30/3*21%4;  这条表达式依赖于机器。

习题5.3
        int ival;
        cin>>ival;
        if(ival%2==0)
                cout<<"你输入的数是偶数。"<<endl;
        else cout<<"你输入的数是奇数。"<<endl;
        return 0;

习题5.4
定义术语”溢出”的含义,并给出导致溢出的三个表达式。
溢出:计算机的数值超出了其所属类型的表示范围;
        short int ival=50000;
数组越界访问;
还没想出来;

习题5.5
解释逻辑与操作符、逻辑或操作符以及相等操作符的操作数在什么时候计算。
条件判断的时候计算,与操作数组成一个条件表达式;

习题5.6
解释下列while循环条件的行为:
char *cp=”hello world”;
while (cp&& *cp)
当满足 cp不为0 且*cp也不为0 的时候,while条件满足,反之,即,只要两者有一个值为0,那么条件失败。

习题5.7
编写while循环条件从标准输入设备读入整形(int)数据,当读入值为42时循环结束;
标准输入还是有点生疏;以后补完。

习题5.8
a>b>c>d ;
a>b && b>c && c>d;

习题5.9
Ul1 & ul2=3;
Ul1 && ul2=1; (TURE)
UL1 | ul2=7;
Ul1 || ul2=1;

习题5.10
重写bitset表达式;使用下标操作符对测验结果进行置位(置1)和复位(置0)。

习题5.11
请问每次赋值操作完成后,i和d的值分别是多少?
Int I;double d;
d=i=3.5; //i=3;d=3
i=d=3.5; //i=3;d=3.5

习题5.12
第一个条件判断语法错误;
第二个条件判断,首先将42赋值给变量i,此时条件字面值常量!=0,所以条件为真,执行if循环语句内的内容。

习题5.13
显然是不合法的,类型不匹配。
        double dval;int ival;int *pi;
    dval=0;
    ival=0;
pi=0;

习题5.14
虽然下列表达式都是合法的,但并不是程序员期望的操作,为什么?怎么样修改这些表达式以使得其能反映程序员的意图?(鬼知道你妹的程序员是怎么想的!?)
(a).ptr=retrieve_pointer();
if(ptr!=0)
(b).if(ival==1024)
(c).ival+=1;

习题5.15
解释前自增操作和后自增操作的差别:
前自增先进行自增运算,然后进行赋值运算,后自增操作先进行赋值运算然后进行赋值操作。

习题5.16
你认为为什么C++不叫做++C?
呵呵!

习题5.17
如果输出vector内容的while循环使用前自增操作符,那会怎么样?
带来数组越界访问的错误;

习题5.18
编写程序定义一个vector对象,其每个元素都是指向string类型的指针,读取该vector对象,输出每个string的内容及其相应的长度。

习题5.19
C和e错误;

习题5.20
编写程序提示用户输入两个数,然后报告哪个数比较小。
        int x,y;
        cout<<"请输入两个数:"<<endl;
        cin>>x>>y;
        cout<<(x<y?"第一个数比较小":"第二个数比较小");

习题5.21
编写程序处理vector<int>对象的元素;将每个奇数值元素用该值的两倍替换。

习题5.30
(C) vector<string>**prec2=new vector<string>(10);
(F)
(H)

习题5.31
(a). 将浮点型数据转化为布尔型数据;
(b). 将浮点型数据和整数型数据 分别 转换为 双精度小数型数据;
(c). 将整形数据和字符型数据 分别 转换为双精度小数型数据。

30

主题

227

回帖

159

积分

终身VIP会员

Rank: 7Rank: 7Rank: 7

魔鬼币
72793
发表于 2011-4-16 19:33:57 | 显示全部楼层
这本书的确不错,我也在学习中,大家共同努力

0

主题

1

回帖

1

积分

编程入门

Rank: 1

魔鬼币
26
发表于 2011-4-17 19:15:03 | 显示全部楼层
这本书的确不错,我也在学习中,大家共同努力

54

主题

98

回帖

130

积分

终身VIP会员

花钱是让你服务的,不是叫你大哥 ...

Rank: 7Rank: 7Rank: 7

魔鬼币
10632
 楼主| 发表于 2011-4-19 12:05:58 | 显示全部楼层
习题6.1
什么是空语句?请给出一个使用空语句的例子。
程序语句最简单的形式就是空语句。
While(cin>>s && s!=sought)
  ;

习题6.2
什么是块语句?请举例一个使用块得例子。
块语句又称为复核语句,是用一对花括号括起来的语句序列。块标识了一个作用域,在块中引入的名字只能在该块内部或嵌套在块中的块里访问。
While(std::cin>>trans)
If(total.same_isbn(trans))
Total=total+trans;
Else{
Std::cout<<total<<std::endl;
Total=trans;
}

习题6.3
使用逗号操作符重写书店问题中while循环里的else分支,使它不再需要用块实现。解释一下重写后是提高还是降低了该代码的可读性;
Else cout<<total<<endl,total=trans;
个人感觉是提高了代码的可读性。

习题6.4
可能导致while语句无法找到正确的while循环结束的位置,导致程序错误或者数据不能达到预期;

习题6.5
改正下列代码:
(a). if(ival1!= ival2)
      ival1=ival2;
   else ival1=0,ival2=0;

(b). if(ival<minval){
minval=ival;
occurs=1;}

(c).if(int ival=get_value())
   Cout<<”ival=”<<ival<<endl;
   Else if(!ival)
     Cout<<”ival=0\n”;

(d). if(ival==0)
   Ival=get_value();

习题6.6
什么是”悬垂else?c++是如何匹配else字句的?
所有语言的if语句都普遍存在着潜在的二义性。这种情况往往成为悬垂else问题。
缩进的用法表明else应该与外层的if字句匹配。

习题6.7
#include<iostream>
#include<string>
using namespace std;
char ch;
int main(){
int aCnt=0,eCnt=0,iCnt=0,oCnt=0,uCnt=0;
while (cin>>ch)
{
    switch(ch)
        {
        case 'a':
        case 'A':
                ++aCnt;
                break;
        case 'i':
        case 'I':
                ++iCnt;
                break;
        case 'e':
        case 'E':
                ++eCnt;
                break;
        case 'o':
        case 'O':
                ++oCnt;
                break;
        case 'u':
        case 'U':
                ++uCnt;
                break;        }
}
cout<<"Numer of vowel a(A):\t"<<aCnt<<"\n";
cout<<"Numer of vowel e(E):\t"<<eCnt<<"\n";
cout<<"Numer of vowel i(I):\t"<<iCnt<<"\n";
cout<<"Numer of vowel o(O):\t"<<oCnt<<"\n";
cout<<"Numer of vowel u(U):\t"<<uCnt<<"\n";
return 0;}

文件结束符为ctrl+z;

习题6.8
修改元音统计程序使其可统计出读入的空格、制表符和换行符的个数。
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main()
{
        string str;
int acnt = 0,bcnt = 0,ccnt=0;
while(cin>>str){
        for(string::size_type index=0;index != str.size(); ++index)
if (str[index]=32) ++acnt;
else if (str[index]=9) ++bcnt;
else if (str[index]=23) ++ccnt;}
cout<<acnt<<endl;
cout<<bcnt<<endl;
cout<<ccnt<<endl;
   return 0;
}
注&#61516;:没能用case语句写出来。

习题6.9 修改元音统计程序使其可统计以下双字符序列出现的次数:ff、f1以及fi
        string str;
int acnt = 0,bcnt = 0,ccnt=0;
while(cin>>str){
        for(string::size_type index=1;index != str.size(); ++index)
if (str[index]=='f' && str[index-1]=='f') ++acnt;
else if (str[index]=='l' && str[index-1]=='f') ++bcnt;
else if (str[index]=='i' && str[index-1]=='f') ++ccnt;}
cout<<"ff:"<<acnt<<endl;
cout<<"fl:"<<bcnt<<endl;
cout<<"fi:"<<ccnt<<endl;
   return 0;
注&#61516;:同样没能用case语句写出来。

下面每段代码都暴露了一个常见编程错误。请指出并修改之。
(a). 两个case少一个break语句;
(b). ix的初始化式子有问题,应该放在switch语句之前就定义好;
int ival=0;
get_value(){
        return ival;}
int main()
{
        int ox=0;
        int ix=0;
        vector<int> ivec;
        switch(ival){
case 1:
                ix=get_value();
                ivec[ix]=ival;
                break;
        default:
                ix=ivec.size()-1;
                ivec[ix]=ival;
                break;
        }
   return 0;
}
(c).
Case应用错误:
        int oddcnt=0,evencnt=0,ival=0;
        switch(ival){
        case 1:
        case 3:
        case 5:
        case 7:
        case 9:
                        oddcnt++;
                        break;
        case 2:
        case 4:
        case 6:
        case 8:
        case 10:
                        evencnt++;
                        break;
(d).暂时不会做;

习题6.11
解释下面的循环,更正你发现的问题。
(a)        分别输入字符串bufString和word;
(b)        语法错误;
For(vector<int>::size_type ix=0;ix!=ivec.size();++ix)
(c).while(ptr==0)
  Ptr=fine_a_value(),ptr=0;
  当操作数为0的时候调用find_a_value函数;
(d). 略

习题6.12
编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词。程序应该找出满足以下条件的单词的输入位置:该单词的后面紧跟着再次出现自己本身。跟踪重复次数最多的单词及其重复次数。输出重复次数的最大值,若没有单词重复则输出说明信息,列入,如果输入是:
How,now now now brown cow cow
则输出应表明”now”这个单词出现了三次。

没写出来。

习题6.13
Dest=source;
Dest++;
Source++;

习题6.14
解释下面每个循环,更正你发现的任何问题。
(a). 类型不匹配;(这个题的出题目的不明。)
(b). 可以将条件直接放入for循环的循环条件表达式中;
(c). for循环中的if(ix!=sz)是多此一举的一句,无谓的增加了运算量;
(d). 少一个初始化式的分号,即使是空语句也需要一个分号;
(e). 表达式这样写(++sz), for语句会造成死循环;建议去掉那一句。

习题6.15
While循环特别擅长在某个条件保持为真时反复地执行:例如,当未到达文件末尾时,一直读取下一个值。一般认为for循环是一种按步骤执行的循环:使用下标遍历集合中一定范围内的元素。按某种循环的喜欢用法编写程序,然后再用另外一种结构重写。如果只能用一种循环来编写程序,你会选择哪种结构?为什么?
答:For循环,必须的,因为简洁就是美!

习题6.16
给出两个int型的vector对象,编写程序判断一个对象是否是另一个对象的前缀。如果两个vector对象的长度不相同,假设较短的vector对象长度为n,则只对这两个对象的前面n个元素做比较。例如,对于(0,1,1,2)和(0,1,1,2,3,5,8)这两个vector,你的程序应该返回true。
略。

习题6.17
解释下列的循环。更正你发现的问题。
(a).没发现核心问题所在;
(b). 改为int ival==get_response();
(c).

54

主题

98

回帖

130

积分

终身VIP会员

花钱是让你服务的,不是叫你大哥 ...

Rank: 7Rank: 7Rank: 7

魔鬼币
10632
 楼主| 发表于 2011-4-19 12:06:50 | 显示全部楼层
第六章 语句;
这个章节内容比较多和杂,习题解慢慢补充和完善;

54

主题

98

回帖

130

积分

终身VIP会员

花钱是让你服务的,不是叫你大哥 ...

Rank: 7Rank: 7Rank: 7

魔鬼币
10632
 楼主| 发表于 2011-4-21 13:32:29 | 显示全部楼层
习题7.1
形参是一个函数的操作数;实参是调用函数的时候给函数传递的参数;

习题7.2
下列哪些函数是错误的? 为什么? 请给出修改意见:
(a). 函数体中定义的返回值 与 函数声明中的返回值 类型不匹配;(前者是字符串型, 后者是整形)。
(b). f2函数 没有声明返回值类型;
(c). calc函数没有在函数定义中给出 返回值;
(d). 语法错误, 没有在函数体上加上括号;

习题7.3
编写一个带有两个int型形参的函数,产生第一个参数的第二个参数次幂的值。编写程序传递两个int数值调用该函数, 请检验其结果。
(这个代码不好写,因为如果参数也可能是负数,我们这里先假设次幂数 以及 底数都为正数)。
int pow(int x,int y);
int main()
{
        int i=10,j=5;
        cout<<pow(i,j);
        return 0;
}
int pow(int x,int y)
{
        int result=1;
        while(y!=0)
        {
                result*=x;
                --y;}
        return result;
}

习题7.4
编写一个函数, 返回其形参的绝对值;
double pow(int x);
int main()
{
        double i;
        cin>>i;
        cout<<pow(i)<<endl;
        return 0;
}
double pow(int x)
{
        if(x>=0)
                return x;
        else return -x;
}

习题7.5
int func(int i,int *p);
int main()
{
        int j=4,js=3;
        int *q=&js;
        cout<<func(j,q);
        return 0;
}
int func(int i,int *p)
{
        if(i>*p)
                return i;
        else if(i<*p)
                return *p;
        //else cout<<"两个数一样大!";
}
注:int型数据 无法和 *int型数据做比较,这题目出的让人产生歧义;

习题7.6
编写函数交换两个int型指针所指向的值,调用并检验该函数,输出交换后的值:
void func(int *p1,int *p2);
int main()
{
        int i=3,j=4;
        int *pp1=&i,*pp2=&j;
        cout<<"*pp1:"<<*pp1<<endl;
        cout<<"*pp2:"<<*pp2<<endl;
        func(pp1,pp2);
        cout<<"*pp1:"<<*pp1<<endl;
        cout<<"*pp2:"<<*pp2<<endl;
    return 0;
}
void func(int *p1,int *p2)
{
        int temp=0;
        temp=*p1;
        *p1=*p2;
        *p2=temp;
}

习题7.7
Void f(T) 传递在函数中的是一个实参的局部副本;
Void f(T&) 传递到函数中的是一个实参的别名;

习题7.8
举一个例子说明什么时候应该将形参定义为引用类型。再举一个例子说明什么时候不应该将形参定义为引用。
当希望改变主调函数中的实参的值的时候,被调函数应使用引用类型;
void func(int &val);
int main()
{
        int x=1;
        cout<<"在func函数未调用之前,x:"<<x<<endl;
        func(x);
        cout<<"在func函数被调用之后,x:"<<x<<endl;
    return 0;
}
void func(int &val)
{
        ++val;
}
// 调用func函数实现 实参+1 的功能。

习题7.9
将(7.2.2节定义的)find_val 函数的形参表中 occurs的声明修改为非引用参数类型, 并重新执行这个程序,该程序的行为发生了什么改变 ?
略!

习题7.10
略! 可用,但是不会修改~

习题7.11
主要是不希望实参被复制;在向函数传递大型对象时,需要使用引用形参,这是引用形参使用的另一种情况。虽然复制实参对于内置数据类型的对象或者规模较小的类类型对象来说没有什么问题,但是对于大部分的类类型或者大型数组,他的效率通常太低了;
如果在需要const引用时,将形参定义为普通引用,会导致程序运行效率的降低,因为会多次调用复制构造函数 以及 相关的析构函数,一定程度上降低了程序的运行速度;

习题7.12
什么时候应使用指针形参?什么时候应使用引用形参? 解释两者的优点和缺点;
答: 当函数希望操作的是数组的指针时候,应使用指针形参;但是指针形参由于编译器会忽略其指向的数组的长度,所以可能会在函数中造成数组的越界访问,程序的执行可能产生错误的输出,也可能崩溃,这取决于越界访问的内存中恰好存储的数值是什么。
如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组本身的引用本身,也就是说,当你希望直接在函数中操纵数组元素的时候,应该使用引用本身。在这种情况下,数组大小成为形参和实参类型的一部分,编译器会检查数组实参的大小与形参的大小是否匹配。

7.13 编写程序计算数组元素之和。要求编写函数三次,每次以不同的方法处理数组边界。
方法一:
int printValues(int ia[]) //直接将形参设为数组的指针;
{
        int sum=0;
        for(size_t i=0;i!=10;++i)
                sum+=ia[i];
        return sum;
}        
int main()
{
        int j[10]={0,1,2,3,4,5,6,7,8,9};
        cout<<printValues(j);
        return 0;
}
自己规划实参指针指向的数组的大小 以及 函数体中数组的大小;
方法二:
int printValues(int (&ia)[10]) //指向数组的引用;
{
        int sum=0;
        for(size_t i=0;i!=10;++i)
                sum+=ia[i];
        return sum;
}        
int main()
{
        int j[10]={0,1,2,3,4,5,6,7,8};
        cout<<printValues(j);
        return 0;
}
方法三:
int printValues(const int *beg, const int *end) //传递指向数组的第一个以及最后一个元素的位置的指针。
{
        int sum=0;
        while(beg !=end){
                sum+=*beg++;}
        return sum;
}        
int main()
{
        int j[10]={0,1,2,3,4,5,6,7,8,9};
        cout<<printValues(j,j+10);
        return 0;
}
方法四:
int printValues(const int ia[], size_t sz) //第一个形参是一个指向数组的指针,第二个参数指定数组的大小。
{
        int sum=0;
        for(size_t i=0;i!=10;++i)
        {
                sum+=ia[i];}
        return sum;
}        
int main()
{
        int j[10]={0,1,2,3,4,5,6,7,8,9};
        cout<<printValues(j,sizeof(j)/sizeof(*j));
        return 0;
}

7.14
编写程序求 vector<double>对象中所有元素之和。
暂略。

7.15
编写一个主函数main,使用两个值作为实参,并输出他们的和。
略。

7.16
编写程序使之可以接受本节介绍的命令行选项,并输出传递给main的实参的值。
略。

7.17
什么时候返回引用是正确的?而什么时候返回const引用是正确的?
答:当需要返回对象本身的时候,可以返回引用,这时候,调用函数和返回结果时,都没有复制这些对象的数据; 千万不要返回局部对象的引用,因为当函数执行完毕的时候,将释放分配给局部对象的存储空间。此时局部对象的引用就会指向不确定的内存。同时,不能返回指向局部对象的指针,因为一旦函数结束,局部对象被释放,返回的指针就变成了指向不再存在的对象的悬垂指针。
当不希望引用返回值被修改,函数返回值应该声明为const;

54

主题

98

回帖

130

积分

终身VIP会员

花钱是让你服务的,不是叫你大哥 ...

Rank: 7Rank: 7Rank: 7

魔鬼币
10632
 楼主| 发表于 2011-4-21 13:32:52 | 显示全部楼层
7.18
下面函数存在什么潜在的运行时问题?
答: 千万不要返回函数中的局部对象的引用(返回值为引用格式的返回);

7.19 判断下面程序是否合法;如果合法,解释其功能;如果不合法,更正它并解释原因。
int &get(int *arry, int index)
{return arry[index];}
int main()
{
        int ia[10]={2,2,2,2,2,2,2,2,2,2};
        for(int i=0;i!=10;++i)
                get(ia,i)=0;
        return 0;
}
这个程序应是合法的。
在main函数中 给get函数设立两个实参ia和i,其中ia是指向数组ia[]的一个指针,i是一个整形变量;然后将这两个实参传递到 返回值为引用的get函数中去。Get函数 中以引用的形式返回了数组中的数据,其中index(i传递进来的)为数组的下标,通过在main函数中的不断调用for函数,实现了循环遍历数组ia;,并且将所遍历的数组元素全部赋为0;

7.20
对迭代函数一直不是很了解;
暂略。

7.21
Val!=0 ,那么当val=1的时候会执行return factorial(val-1)*val; 这条表达式;此时, factorial(0)将产生一个编译器分配的随机值,导致结果出错;

7.22
编写下面函数的原型:
(a). 函数名为compare,有两个形参,都是命为matrix的类的引用,返回bool类型的值:
bool compare(&matrix, &matrix);
(b). 函数名为change_val ,返回vector<int>类型的迭代器,有两个形参,一个是int型形参,另一个是vector<int>类型的迭代器;
Vector<int>::iterator change_val(int , vector<int>::iterator );

7.23
给出下面 函数声明,判断哪些调用是合法的,哪些是不合法的。对于那些不合法的调用,解释原因。
Double calc(double); 合法
Int count(const string &, char); 合法
Int sum(vector<int>::iterator , vector<int>::iterator ,int ); 合法
Vector<int> vec(10); 合法
(a). calc(23.4 , 55.1 ); 非法。传递进去的实参的数量和函数的形参的数量不相等。
(b). 正确;
(c). calc(66); 正确;
(d). sum(vec.begin(), vec.end(), 3.8); 正确。

习题7.24
如果有的话,指出下面哪些函数声明是错误的? 为什么?
(a). int ff (int a, int b=0, int c=0 ); 正确
(b). char *init(int ht=24, int wd, char bckgrnd); 错误。原因是,如果有一个形参具有默认实参,那么,它后面所有的形参都必须有默认实参;

习题7.25
假设有如下函数声明和调用,指出哪些调用是不合法的? 为什么? 哪些是合法的胆可能不符合程序员的原意? 为什么?
(a). init(); 非法,必须为函数init传递一个实参;
(b). init(24,10); 合法。
(c). init(14,’*’); 合法,带式不符合程序员的原意。 因为传递进去的实参’*’是传给了 函数中的第二个形参;

习题7.26
用字符’s’作为默认实参重写函数make_plural。利用这个版本的函数输出单词 “success”和”failure”的单数和复数形式。
略。 不会写!

习题7.27
解释形参、局部变量和静态局部变量的差别。并给出一个有效使用了这三种变量的程序例子。
形参是自动对象,形参所占用的存储空间在调用函数时创建,而在函数结束时撤销;
局部变量所对象的自动对象是在函数控制经过变量定义语句时创建,当函数调用结束时,局部变量就会被撤销;
当定义静态局部变量的函数结束时,静态局部变量不会侧小,在该函数被多次调用时,静态局部变量会持续存在并保持它的值。
size_t count_calls()
{
        static size_t ctr=0;
        return ++ctr;
}
int main()
{
        int j=4;
        for(int i=0,size_t=0;i!=10;++i)
                cout<<count_calls()+j<<endl;
        return 0;
}
习题7.28 编写函数,使其在第一次调用时返回0,然后再次调用时按顺序产生正整数(即返回其当前的调用次数)。
size_t count_calls()
{
        static size_t ctr=0;
        return ctr++; //第一次返回0,第二次返回1,依次类推;
}
int main()
{
        for(int i=0,size_t=0;i!=10;++i)
                cout<<count_calls()<<endl;
        return 0;
}

7.29
对于下面的声明和定义,你会将哪个放在头文件, 哪个放在程序文本文件呢?为什么?
(a) inline bool eq(const BigInt&, const BigInt& ){…};
这个应该放在头文件中定义,以便编译器能够在调用点内敛展开该函数的代码。此时,仅有函数原型是不够的。把内敛函数的定义放在头文件中,可以确保在调用函数时所使用的定义是相同的,并且保证在调用该函数的定义对编译器可见;
(b). void putValues(int *arr, int size); 这个函数的声明可以直接放在程序文本文件中。

习题7.30
把7.2.2节的函数isShorter改写为内敛函数;
inline bool isshorter(const string &s1, const string &s2)
{ return s1.size()<s2.size(); }
//没搞清楚这出题的意图;

习题7.34
定义一组名为error的重载函数,使之与下面的调用匹配:
int index,upperBound;
char selectVal;
//.......
error("Subscript out of bounds: ",index,upperBound);
error("Division by zero");
eroor("Invalid selection",selectVal);
void error(const string s,int x,int y);
void error(const string s);
void error(const string s,char ch);

习题7.35
下面提供了三组函数声明,解释每组中第二个声明的效果,并指出哪些(如果有的话)是不合法的?
(a). int calc(int, int);
int calc(const int, const int);
合法。第一个函数声明了一个返回值为整型的函数,他有两个形参,为非常量整形;
第二个函数声明了一个返回值为整型的函数,他有两个形参,为常量整形;
(b). int get();
double get();
第二个声明是非法的。如果两个函数的形参表完全相同,但返回类型不同,则第二个声明是错误的。
(c). int *reset(int *);
   double *reset(double *);
合法。第一个函数声明,声明了一个返回类型为 int型指针,其形参为一个 int型指针的函数;
第二个函数声明,声明了一个返回类型为 double型指针,其形参为一个 double型指针的函数;

习题7.36
什么是候选函数? 什么是可行函数?
函数重载确定的第一步是确定该调用所考虑的重载函数集合,该集合中的函数称为候选函数。候选函数是与被调函数同名的函数,并且在调用点上,它的声明可见。
从候选函数中选择一个或多个函数,它们能够用该调用中指定的实参来调用。因此,选出来的函数称为可行函数。可行函数必须满足两个条件: 第一,函数的形参个数与该调用的实参个数相同; 第二,每一个实参的类型必须与对应形参的类型匹配,或者可被隐式转换为对应的形参类型。

习题7.37
已知本节所列出的f函数的声明,判断下面哪些函数调用是合法的。如果有的话,列出每个函数调用的可行函数。如果调用非法,指出是没有函数匹配还是该调用存在二义性。如果调用合法,指出哪个函数是最佳匹配。
(a). f(2.56 , 42);
调用非法。2 overloads have similar conversions;
二义性错误,存在多个与实参匹配的函数,但没有一个是明显的最佳选择,该调用具有二义性。
(b). f(42); 合法,最佳匹配
(c). f(42,0); 合法,最佳匹配
(d). f(2.56 , 3.14); 合法,最佳匹配

习题7.38
给出如下声明:
void manip(int, int );
double dobj;
对于下面两组函数调用,请指出实参上每个转换的优先等级?
(a). manip(‘a’,’z’);  
//manip函数中定义两个字符型形参 被隐式转换为 int型数据 ;
(b). manip(55.4,dobj);
// 同上;(没搞明白出题的意图!)

习题7.39  
解释一下每组声明中的第二个函数声明所造成的影响,并指出哪些不合法(如果有的话)。
(a). int calc(int, int);
   int calc(const int&,const int&);
   合法。

(b). int calc(char*,char*);
   int calc(const char*,const char*);
   合法。

(c). int calc(char*,char*);
   int calc(char* const,char* const);
   合法。

习题7.40
下面的函数调用是否合法?如果不合法,请解释原因。
enum Stat{Fail,Pass};
void test(Stat);
test(0);
不合法。
cannot convert parameter 1 from 'const int' to 'enum Stat'。
不能将一个常量对象转换为枚举对象Stat;
您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

魔鬼作坊|易语言教程|易语言源码|易语言论坛|易语言视频教程| 论坛导航|免责申明|手机版||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表魔鬼作坊立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2019 All Right Reserved.
快速回复 返回顶部 返回列表