c++primer plus 第六版 中文版 第五章重点内容总结 以及小白手码编程题答案

本文深入解析C++11中的for循环基础知识,包括循环的执行顺序、测试条件、更新表达式,以及如何使用for循环实现阶乘、遍历数组和字符串。探讨了递增递减运算符、逗号运算符的应用,以及字符串比较的方法。同时,文章介绍了基于范围的for循环、文本输入处理技巧,以及如何使用嵌套循环和二维数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c++11.for 循环基础知识

明确一下顺序,1.设置初始值2执行测试,看看循环是否应当继续进行3执行循环操作4更新用于测试的值。测试表达式部分可以使用任何表达式,不需要限制为只能为真或者假,c++将把结果转化为bool类型。因此表达式的值为非零则被强制转化为bool值true。为0则被转化为bool值false,并且在需要整数值的时候将true和false变为1和0.c++的规则允许以下表达式(c++表达式是值或值与运算符的组合,每个c++表达式都有值):maids=(cooks=4)+3;x=y=z=0(赋值运算符从右向左结合);但并不鼓励这种做法。注意<<运算符的优先级比表达式中使用的运算符高,因此cout<<(x=100)需要添加括号。cout在显示bool值之前将它们转为为int类型,但cout.setf(ios::boolalpha);函数设置了一个标记使得cout显示true和false而不是1和0.注意,在for循环语句中声明变量只存在于for语句中,程序离开循环后,变量将消失。

使用for循环实现阶乘的逻辑思想:阶乘是该整数与前一个阶乘的乘积。P131。遍历数组时,需要在索引为长度-1处停止。

使用for循环可通过索引访问string和char型字符串。

关于递增递减运算符,a++表示先用a计算表达式后再+1,++a表示先将a+1再计算表达式。

2.顺序点

意义是:程序执行过程中的一个点,语句中的分号就是一个顺序点。这意味着程序在处理吓一跳语句之前,赋值/递增递减执行的所有修改都必须完成。任何完整的表达式(不是一个更大表达式的子表达式)末尾都是一个点。如while循环中检测条件的表达式。

while(guests++<10) cout<<guests<<endl;其中guests++<10是一个完整表达式,则测试完成后将guests的值+1并输出。

3.递增/递减和指针

优先级顺序:前缀递增/递减=解除引用运算符*,所以从右到左的方式结合。后缀递增/递减>前缀递增/递减运算符,这两个运算符从左到右结合。如double x=*++pt;从右到左,先将pt指针+1然后解引用获得其值。但++*pt意味着先取得pt指向的值,再将这个值加1.若x=*pt++则首先对pt指针应用后缀++,但是获得pt指向的值解引用之后再++,因此*pt++=arr【2】,但该语句执行完毕后pt将指向arr【3】的地址。注意,组合赋值运算符+=/-=左边的操作数必须能够被赋值。

4.逗号运算符在循环中

逗号运算符允许将两个表达式放到c++句法只允许放一个表达式的地方。如假设有一个循环更新测试条件语句可以是两个组成++j,--i两个组成。逗号还保证了运算顺序,先计算第一个表达式再计算第二个表达式。

关系运算符,如>,<==等,可以对数字和string类对象的字符进行比较,但不能将它们用于c风格字符串。另关系运算符的优先级比算术运算符的优先级低。

5.字符串的比较

对于c风格字符串应该使用strcmp()函数来进行比较,若直接采用word==“mate”则达不到效果,因为数组名是数组的地址字符串常量也是其地址,因此上述表达式比较的是地址的异同而非字符串。strcmp()接受两个字符串地址(指针,字符串常量或者字符数组名)作为参数。相同返回0,若第一个字符串按字母顺序排在第二个字符串之前则返回负数。反之返回正数。其实字符是根据字符的系统编码来进行比较的,使用ASCII码时,所有大写字母的编码都比小写字母小。

且c风格字符串是通过结尾的空值字符定义的而不是由其在数组的长度定义的,这意味着两个字符串即使被存储在长度不同的数组中也可能是相同的。

string字符串的比较很简单,因为string类重载了运算符,使得可以将关系运算符用于string对象。string word;word!=“mate”;string类重载运算符可以用于此处:至少有一个操作数为string对象,另一个操作数可以是string对象也可以是c风格字符串。

6。while

while是没有初始化和更新表达式的for循环。只有测试条件和循环体。循环体中的代码必须完成某种影响测试条件表达式的操作。对于C风格字符串采用while进行空字符遍历直到遇到空值字符的技术是c++常采用的方式。注意要打印字符的acaii码必须通过强制类型转换将其变为整形,此处可以用int等。注意,在for循环中省略了测试条件时,将认为条件为true。通常程序员用for循环来计数,在无法知道循环将执行的次数时用while循环。

另while循环可用于让计算机计数,以等待一段时间。long wait=0;while(wait<10000)wait++;而这种方法当计算机处理速度不同时会产生变化。因此c++ku库中有一个函数clock()返回程序执行后所用的系统时间,头文件ctime明确了clock返回的时间单位,定义了一个符号常量CLOCKS_PER_SEC(每秒包含的系统时间单位数,将系统时间除以这个数得到秒数。)以及返回类型的问题,使用clock_t作为clock返回类型的别名,意味着可以将变量声明为clock_t类型。

创建类型别名两种方式。#define BYTE char用char替换BYTE或者typedef char byte,将byte作为char的别名。即若要将a作为某种类型的别名,那么首先像声明这种类型的变量那样声明它,然后在该声明前加上关键字typedef。如要把byte_pointer作为char指针的类型名。typedef char *byte_pointer;typedef不会创建新类型,而是为已有类型建立一个新名称。

while和for都是入口条件循环。

7.基于范围的循环(c++11)

c++11新增了一种循环:基于范围的for循环,对数组或者容器类(vector和array)每个元素执行相同的操作。如

double price[5]={4.99,45.45,5656.56,534.44,443.44};

for (double x:princes)

   cout<<x<<std::endl; 若要修改数组中的元素需要使用不同的循环变量语法

for (double &x:prices)

x=x*0.8;

8.循环和文本输入

当使用cin读取输入时,会忽略空格和回车。且发送给cin的内容被缓冲,只有在按下回车键后输入的内容才会被发送给程序。如果需要读取每一个字符那么可以使用cin.get(),即使是空格也可以读取。目前遗已知,cin.get()有三种重载。

文件尾条件EOF,有些操作系统也可以通过键盘输入模拟文件尾条件。对于键盘输入来说,可以使用模拟EOF来结束循环,但稍后要读取其他输入。cin.clear()方法可能清除EOF标记,使输入继续进行,但有些情况下并不能实现该效果。

cin.get(ch);while(cin.fail()==false){//doing something;cin.get(ch);},也可以使用while(!cin.fail()),另外istream类提供了一个可以将istream对象(如cin)转换为bool对象的函数,当cin出现在需要bool值的地方时(如while循环测试条件)该函数被调用,意味着可以将上述写为while(cin)/while(cin.get(ch))。这样cin.get(ch)只被调用一次。过程顺序应该是首先调用cin.get(ch),将值放入ch中,获得返回值是cin对象,对cin进行bool转换,输入成功则为true。

cin.get()测试EOF时,函数的返回值int类型的字符编码。通常EOF的值被定义为-1,因为没有acaii码为-1的字符但并不需要知道实际的值。可将上述逻辑书写如下:

int ch;ch=cin.get();

while(ch!=EOF){cout.put(ch);++count;ch=cin.get();}其中cout。put的参数为char类型。注意如果将ch的类型声明为int,而不是char,则必须在现实ch时将其强制转换为char型。注意!=运算符顺序高于=。

9.嵌套循环和二维数组

二维数组的第一个下标可以理解为行,第二个下标可以理解为列。利用两个for循环嵌套循环可遍历每一个二维数组元素。二维数组的初始化可以由嵌套花括号组成,如

int maxtemps[3][4]=

{

{83,200,45,65},

{34,67,887,423},

{234,45,689,98}

};

另外可以定义一个指针数组初始化为一组字符串常量。const char* a[]={"hahahah","heheheh","jajajxjxj"};将a声明为一个指针数组,使得每一个元素(如a【0】)都是一个char指针,从而可被初始化为一个字符串的地址。,cout<<a[0]即可输出第一个字符串。除了使用字符串指针数组,也可以使用char数组的数组来存放字符串,

char a[3][25]={"hjdhgahu","hldlfjbdfnbjk","jugdhfugshui"};可以看出将每个字符串的长度限制在24个字符。指针数组存储5个字符串地址,char数组的数组将5个字符串分别复制到5个包含25个元素的char数组中。因此从存储空间来说使用指针数组更为经济,然而若要修改其中任意一个字符串,则二维数组是更好的选择。也可以使用string对象数组,const string a[4]={"hahahah","heheheh","hehehea","ijkiju"};如果希望字符串可修改那么不必要使用const限定。

cin.get(ch)成员函数调用通过返回转换为false的bool值来指出已到达EOF,而cin.get()成员函数调用则通过返回EOF来指出已经到达EOF,其值是在iostream。

#include<iostream>
#include<array>
#include<cstring>
#include<string>
using namespace std;
//++++++++++++++++++++++++1++++++++++++++++++++++++++++++
int main()
{
int a,b;
int sum=0;
cin>>a>>b;
for(a;a<=b;a++)
{
sum=sum+a;
}
cout<<sum<<endl;
return 0;
}

//++++++++++++++++++++2++++++++++++++++++++++++++++++++++

const long double SIZE=101;
int main()
{
array<long double,101>a;
a[0]=a[1]=1;
for(int i=2;i<SIZE;i++)
   {
   a[i]=i*a[i-1];
   }
for(int j=0;j<SIZE;j++)
   {
   cout<<j<<":"<<a[j]<<endl;
   }
return 0;
}
//++++++++++++++++++++3++++++++++++++++++++++++++++++++++
int main()
{
double a;
double sum=0;
while((cin>>a)&&a!=0)
   {
   sum=sum+a;
   cout<<sum<<endl;
   }
}
//++++++++++++++++++++4++++++++++++++++++++++++++++++++++
const double L1=0.1;
const double L2=0.05;
int main()
{
double sum1=0;
double sum2=0;
int count=0;
while (sum1>=sum2)
{
++count;
sum1+=10;
sum2=(100+sum2)*L2+sum2;
}
cout<<count<<endl;
cout<<"daphne"<<sum1<<endl;
cout<<"cleo"<<sum2<<endl;
return 0;
}
//+++++++++++++++++++++5++++++++++++++++++++++++++++++++++++

int main()
{
const char* month[12]=
{
"January","February","March","April","May","June","July","August","September","October","November","December"
};
int number[12];
int sum=0;
for(int i=0;i<12;i++)
   {
   cout<<month[i]<<endl;
   cin>>number[i];
   sum=sum+number[i];
   }
cout<<sum<<endl;
return 0;
}
//++++++++++++++++++++6+++++++++++++++++++++++++++++++++++++++++
const int YEAR=3;
const int MONTH=12;
int main()
{
int sum[3]={0,0,0};
const char* month[12]=
{
"January","February","March","April","May","June","July","August","September","October","November","December"
};
int number[YEAR][MONTH];
   for(int i=0;i<YEAR;i++)
   {
      for(int j=0;j<MONTH;j++)
      {
      cout<<month[j]<<endl;
      cin>>number[i][j];
      sum[i]=sum[i]+number[i][j];
      }
      cout<<i<<":"<<sum[i]<<endl;
   }
cout<<"all"<<endl;
cout<<sum[0]+sum[1]+sum[2]<<endl;
return 0;
}
//+++++++++++++++++++7+++++++++++++++++++++++++++++++++++++++
const int SIZE=20;
int size;
struct car
{
string factory;
int year;
};
int main()
{
cout<<"How many cars do you wish to catalog?";
cin>>size;
cin.get();
car *a=new struct car[size];
for(int i=0;i<size;i++)
{
cout<<"Car #"<<i<<endl;
cout<<"PLease enter the make:";
getline(cin,a[i].factory);
cout<<"Please enter the yearmade:";
cin>>a[i].year;
cin.get();
}
cout<<"Here is your collection"<<endl;
for(int j=0;j<size;j++)
{
cout<<a[j].year<<" "<<a[j].factory<<endl;
}
return 0;
}
//+++++++++++++++++++++++++++8+++++++++++++++++++++++++++++++++
const int SIZE=0;
char word[SIZE];
int main()
{
int count=0;
cout<<"Enter words(to stop,type the word done):";
while(cin>>word)
{
   if(strcmp(word,"done")!=0)
      ++count;
   else
      break; 
}
cout<<"You enter a total of :"<<count<<endl;
return 0;
}
//+++++++++++++++++++++++++++9++++++++++++++++++++++++++++++++++++
int main()
{
string a;
int count=0;
while((cin>>a)&&a!="done")
{
++count;
}
cout<<"you enter a total of :"<<count<<endl;
return 0;
}
//++++++++++++++++++++10++++++++++++++++++++++++++++++++++++++++++
int main()
{
cout<<"enter numbers of rows:"<<endl;
int a;
cin>>a;
for(int i=1;i<=a;i++)
{
   for(int j=i;j<a;j++)
   {
   cout<<".";
   } 
   for(int k=0;k<i;k++)
   {
   cout<<"*";
   }
   cout<<endl;
}

return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值