第一节 认识第一个C++程序
1、准备工作:
2、启动 Dev C++,点击桌面上的图标
7、保存,编译,调试、运行。
一个好的习惯是创建了一个新程序后,在还未输入代码之前先将该程序保存到硬盘某个目录下,然后在程序的编辑过程中经常性地保存程序,以防止机器突然断电或者死机。要保存程序,只需从主菜单选择“文件”—〉”保存”就可以将文件保存到指定的硬盘目录。如下图所示。
编译:从主菜单选“运行”—〉“编译运行”或快捷键“F9”(如下左图)。如果程序中存在词法、语法等错误,则编译过程失败。编译器会在屏幕右下角的“Compile Log”标签页中显示错误信息,如(如下右图)所示,并且将源程序相应的错误行标成红色底色。
8、C++程序的执行过程
9、动手练习编程:
#include<iostream>
using namespace std;
int main()
{
cout<<"春眠不觉晓,处处蚊子咬。";
return 0;
}
2、注释:(//及其后面的内容表示注释行)
- 注释部分只是起到对原程序行的解释说明作用,而本身并不参与编译。C++忽略注释,并把每个注释都视为一个空格。
- 在程序适当的地方加上的注释是良好的编程习,使得程序功能一目了然,便于后来者了解程序。
- 两种注释方法:
- 用 “/*” 和“*/” 将需要注释的部分括起来,可跨行。
- 用“//” 对这一行进行注释,内容只限于单行。
// 在显示器上显示一行文字
#include<iostream>
using namespace std;
/*使用命名空间 std
----
---- 以下为程序主体部分----*/
int main()
{ cout<<"my frist program."<<endl;
return 0;
}
3、预处理指令
#include <iostream> //预处理
using namespace std;
int main()
{ cout<<"my frist program."<<endl;
return 0;
}
- iostream是C++中一个库文件,文件中定义了cout对象 , cin对象和endl等,程序中如果要用到这些对象就要调入iostream库文件;
- 以 # 开头的指令行在程序编译前就会由预处理器先行处理。将头文件iostream的具体代码代替 #include命令行,然后再对该程序进行整体编译。
- 每个预处理指令都必须占据一行。而预处理命令不是语句,故末尾无分号。
4、名字空间
一个中大型软件往往由多名程序员共同开发,会使用大量的变量名和函数名,不可避免地会出现变量或函数重复命名冲突。当各人代码测试通过,没有问题,但将它们结合到一起,就有可能会出现重命名错误。
如两家公司的类库中都有一个名为“Stack”的类,那么当你需要同时用到这两个公司的类库时,就会产生名字冲突,无法区分是哪一个Stack,因此,一般公司都会把自己的类,函数,变量等放在一个名字空间中,防止冲突。
比如: namespace s1 {int a = 10;} namespace s2 {int a = 20;}
这样就在两个名字空间中声明了两个不同的变量 a,如果想要同时在一个源文件中使用这两个 a,可以这样做:
int c = s1::a; // 表示 s1 中的 a
int d = s2::a; // 表示 s2 中的 a
为了解决合作开发时的命名冲突问题,C++ 引入了命名空间。C++标准库中的所有组件都是在 std 名字空间中声明和定义的。
最开始时,大家用std::cout来表示输出,cout 是std标准名空间下的名字。
#include <iostream>
int main()
{ std::cout<<“my frist program.“<<std::endl;
return 0;
}
但是这样就要在每一个变量或函数前都要加上其所属的系统名。后来为了方便,演变为在程序头统一书写如下:
#include <iostream>
using std::cout;
using std::endl;
int main()
{ cout<<“my frist program.“<<endl;
return 0;
}
表示程序中的cout、endl等是标准公司std的对象名或变量名。这样在程序中就不要每个变量前都写所属系统名std。但如果变量名多,那在程序头要写上很多的声明。最后演变为在程序头统一写一条声明:using namespace std;表示程序中用到的cout,endl等都是标准公司的。
#include <iostream>
using namespace std;
int main()
{ cout<<“my frist program.“<<endl;
return 0;
}
5、主函数
1、int main()后面跟一对括号,说明它是一个函数。每个C++程序都必须有一个且只能有一个main()函数。不管main()函数在程序的什么位置,整个程序总是从主函数 main() 开始被执行。
2、每条C++语言必须用分号来结束。但预处理命令、函数头和花括号后不加分号。
#include <iostream>
using namespace std;
int main() //函数头,程序从此开始运行
{ cout<<“my frist program.“<<endl;
return 0;
}//花括号内的是函数体
6、C++程序的书写
- 每条语句占一行
#include <iostream>
using namespace std;
int main()
{
cout<<“my “;
cout<<“program”<<endl;
}
- 一行内写多条语句。
#include <iostream>
using namespace std;
int main()
{ cout<<“my ”; cout<<“program”<<endl; //这是两条语句写在一行;
}
- 一条语名写在多行上。
#include <iostream>
using namespace std;
int main()
{ //这是一条语句写在两行
cout<<“my ”
<<“program”<<endl;
}
- C++语言以分号来判断语句是否结束。
7 、函数类型 int 及 返回值 return
- return 0 表示 返回整数0 给 main() ;
-
int 表明 主函数main()的返回值是一个整数,这个值由reture语句返回;
-
在新修定的语法标准下,“int ” 和 “return 0”都可以省略,最好不要省略。
8、看程序写结果:
#include<cstdio> //printf和scanf调用cstdio库,在C语言中可调用stdio.h库
#include<cstdlib> // 使用system( )调用cstdlib库
using namespace std; //在C语言中要省略,
int main() //整个程序开始
{ float s,h,up,down; // float定义s,h,up,down为单精度实型变量
up=15; //已知上底
down=25; //已知下底
h=2*150/up; //根据上底求出梯形的高
s=(up+down)*h/2; //求出梯形的面积
printf("s=%0.2f\n",s); // \n是换行控制符,0.2f按实际位数输出,保留2位小数
system("pause"); //暂停作用
return 0; //结束程序
}
运行结果:
例2、 已知一位小朋友的电影票价是10元,计算x位小朋友的总票价是多少?
【分析】 假设总票价用y来表示,则这个问题可以用以下几个步骤来实现: ①输入小朋友的数目x; ②用公式y=10*x计算总票价; ③输出总票价y的值。
#include<iostream> //使用cin,cout,须调用iostream库
using namespace std;
int main()
{ int x,y; //定义整型变量
cout<<"Input x="; //输入提示
cin>>x; //小朋友的人数
y=10*x; //计算总票价
cout<<"total="<<y<<endl; //输出总票价
return 0; //结束程序
}
输入:5
输出:
例3、 有一个牧场,牧场上的牧草每天都在匀速生长,这片牧场可供15头牛吃20天,或可供20头牛吃10天,那么,这片牧场每天新生的草量可供几头牛吃1天?
【分析】解决这类问题的关键是利用牛吃的草量,最终求出这片牧场每天新生长的草量,我们设1单位的草量为1头牛1天所需的草量,于是15头牛20天所食的草量为300单位(包括这20天内的新生草量),20头牛10天所食的草量为200单位(包括这10天内的新生草量),两者的差值即为10天内的新生草量。
#include<iostream> //使用cin,cout,须调用iostream库
using namespace std;
int main()
{ int s1,s2,s3; //变量定义
s1=15*20; //15头牛20天所食的草量
s2=20*10; //20头牛10天所食的草量
s3=(s1-s2)/(20-10); //每天新生的草量单位数
cout<<"s="<<s3<<endl; //1单位为1头牛1天的食量
return 0; //结束程序
}
输出:
#include<iostream> //使用cin,cout,须调用iostream库
using namespace std;
int main()
{ char a; //定义字符变量,
cin>>a; //输入给定一个字符
cout<<" "<<a<<endl; //输出1个字符,先输出2个空格
cout<<" "<<a<<a<<a<<endl; //输出3个字符,先输出1个空格
cout<<a<<a<<a<<a<<a<<endl; //输出5个字符
return 0; //结束程序
}
例5、输入两个正整数A和B,试交换A、B的值(使A的值等于B,B的值等于A)。
【分析】 交换两个变量的值方法很多,一般我们采用引入第三个变量的算法,二个变量交换,可以想像成一瓶酱油和一瓶醋进行交换,这时容易想到拿一个空瓶子过来:
① 将酱油倒到空瓶中;② 将醋倒到酱油瓶中;③ 将原空瓶中的酱油倒到醋瓶中。
#include<iostream> //使用cin,cout,须调用iostream库
using namespace std;
int main()
{ int a,b,c; //定义三个变量
cout<<"Input a,b="; //输入提示Input a,b=
cin>>a>>b; //输入A、B的值
c=a; a=b; b=c; //交换A、B的值
cout<<"a="<<a<<" b="<<b<<endl; //输出结果
}
9、练习
1、在屏幕上输出一幅画。可以是一棵圣诞树,一个苹果,自主创作。
第二节 常量与变量
1、常量
- 使用符号常量是为了方便程序的修改,增强程序的读性。
- 符号常量必须先定义,同时进行初始化它表示一个数值。
- 符号常量的值在其作用域内不能改变,也不能再被赋值。
- 为了更清晰地区别常量和变量,常量名通常用大写字母表示。
2、变量
- C++要求变量必须先定义后使用。在第一次使用该变量之前进行定义即可。
- 多个同一类型的变量可以在一行中定义,中间用逗号隔开,也可以分别定义。例如:
- 变量在定义的同时,可以给它指定一个初始值,称为变量的初始化。
- 变量的赋值 在 C++ 中,可以通过“赋值”语句来修改变量的值。赋值语句的格式如下:
变量名 = 值或者表达式 ; 其中,“=” 称为“赋值号”。
3、变量名及常量名的命名要遵守以下规则:
- 变量名除了使用26个英文大小写字母和数字外,还可以使用下划线。
- 第一个字符必须是字母或下划线,不能用数字开头,中间不能有空格。
- 一般不要超过31个字符。
- 变量名不要与C++中的库函数名、类名和对象名相同。不能用C++保留字,C++具体的保留字如下表:
- 尽量使用汉语拼音或含有一定意义的英语单词来定义变量,做到见名知义,便于记忆。
c++关键字分类:
数据类型:void,int,char,float,double,bool,w_char
类型定义:struct,union,enum,class,typedef
常量值:true,false
类型修饰符:long,short,singed,unsigned
类型限定符:const,volatile,restrict
存储说明符:auto,register,static,extern,thread_local,mutable
其它修饰符:inline,asm
循环控制:for,while,do
跳转控制:break,continue,return,goto
分支结构: if,else,switch,case,default
内存管理:new, delete
运算符:sizeof,and,and_eq,bitand,bitor,compl,not,not_eq,or,or_eq,xor,xor_eq
访问限定符:this,friend,virtual,mutable,explicit,operator
类访问修饰符:private,protected,public
模板:template,typename
命名空间:namespace,using
异常处理:throw,try,catch
4、练习:
1、下列变量名哪些是合法的变量名?
a123 c3b file_1 ¥3 cout Cout 5ab return 0 Mr.Wang sum Day school_name a>=b ¥1234lotus sum123 day 234NUM #34 int
第三节 数据类型
1、简介
- 数据有数据类型、取值范围、运算类型三个要素。
常用的数据类型有:整型、字符型、布尔型、实数型(浮点型)。
动手编程:
用sizeof()函数测试各种数据类型在计算机中所占的空间大小;
#include <iostream> //预处理
using namespace std;
int main()
{ cout<<"short="<<sizeof(short)<<endl;
cout<<"int="<<sizeof(int)<<endl;
cout<<"long="<<sizeof(long)<<endl;
cout<<"long long="<<sizeof(long long)<<endl;
cout<<"char="<<sizeof(char)<<endl;
cout<<"bool="<<sizeof(bool)<<endl;
cout<<"float="<<sizeof(float)<<endl;
cout<<"double="<<sizeof(double)<<endl;
cout<<"long double="<<sizeof(long double)<<endl;
return 0;
}
2、整数类型:
整数分“有符号”类型和“无符号”类型,无符号整数取值只会是正数和0。例如int 类型取值范围为 -2147483648 ~ 2147483647 ,unsigned int类型的取值范围为0~4294967295。
- 定义变量时,要注意数据的大小,避免数据溢出,C++程序中出现这类错误时,编译和运行过程中并不报错。所以,需要特别细心,注意范围检查。
#include<iostream>
using namespace std;
int main(){
int a = 2147483647;
a = a + 1;
cout << "a=" << a << endl;
return 0;
}
输出:
- 在 C++ 程序中,使用的各种变量都应“先声明,后使用”。以下程序会报错:
#include<iostream>
using namespace std;
int main(){
cin>>a>>b>>d;
int a,b,c;
double d,e;
c = a + b;
e = c + d;
cout << a << " + " << b << " = " << c << endl;
cout << c << " + " << d << " = " << e << endl;
return 0;
}
- 在C++中,字符型数据可以直接参与整型或者实型数据的运算,按照其ASCII码值使用。
- int(ch)可以把char字符型强制转换成int整数类型。
#include<iostream>
using namespace std;
int main(){
int b = 0, a = 100;
char ch = 'A';
b = a + ch;
cout << ch << " " << int(ch) << " " << b << endl;
return 0;
}
输出:
- 不同进制表示法:20(十进制)=024(八进制)=0x14(十六进制)
3、字符类型
-
运用转义字符 \ddd,\xhh输出字符运用转义字符\ddd,\xhh可以调用ASC码表中的任意字符;(只有序号为32到126之间的字符可以显示)。ddd代表八进制数,hh代表十六进制数;
#include<bits/stdc++.h>
using namespace std;
int main()
{ cout<<'\x41'<<'\t'<<'\101'<<'\n';
cout<<'\x42'<<'\t'<<'\102'<<'\12';
cout<<'\x43'<<'\t'<<'\103'<<'\xa';
}
运行以上程序,思考下面的问题;
#include<cstdio>
using namespace std;
int main(){
char a ='A' ;
putchar(a); // 输出一个A
putchar('\\'); // 输出‘\ ’
putchar('\n' ); // 输出回车换行
char c;
c = getchar();
putchar(c + 1);
//输入一个字符, 输出它在ASCII 码表中的后一个字符
return 0;
}
输出:
#include<iostream>
using namespace std;
int main(){
char c1,c2,c3;
c1 = ‘a’;
c2 = ‘Z’;
c1 = c1 - 32;
c2 = c2 + 32;
c3 = ‘0’ + 9;
cout << c1 << “ ” << c2 << “ ” << c3 << endl;
return 0;
}
输出:
#include<iostream>
using namespace std;
int main()
{
int i,j;
i='A'; j='a';
cout<<i<<" "<<j<<'\n';
}
输出:
3、字符串
4、布尔数据类型
5、练习
1、输入a,b两个值,并交换他们的值。
2、五位好朋友相聚。第一位朋友带来了 很多糖块赠送给各位朋友,使每人的糖块 在各自原有的基础上翻了一倍;接着第二位好友也同样向每人赠送糖块,他同样使每人的糖块在各人已有的数量上翻了一倍;第三、第四、第五位好友都照此办理。经过这样的赠送之后,每人的糖块恰好都为32块。问各位好友原先的糖块数分别是多少?
3、分钱游戏。甲、乙、丙三人共有24元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。 求原先各人的钱数分别是多少?
4、输入或者字符a,输出全由字符a字符组成的图形。
例如: 输入8,则输出由8组成的圣诞树。 输入T,则输出由T组成的苹果。
5、输入一个数字a和一个字符b,输出全是由字符b组成的图形,并且图形整体向右平移a的位置。
6、输出各种类型的所占存储空间大小。
7、运用Sizeof() 函数,输出“hello world”字符串占用的存储空间大小。
第四节 运算符
1、运算符及优先级列表
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 |
|
() | 圆括号 | (表达式)/函数名(形参表) |
| ||
. | 成员选择(对象) | 对象.成员名 |
| ||
-> | 成员选择(指针) | 对象指针->成员名 |
| ||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 |
| ||
++ | 自增运算符 | ++变量名/变量名++ | 单目运算符 | ||
-- | 自减运算符 | --变量名/变量名-- | 单目运算符 | ||
* | 取值运算符 | *指针变量 | 单目运算符 | ||
& | 取地址运算符 | &变量名 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof(表达式) |
| ||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式/整型表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 | ||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 |
|
/= | 除后赋值 | 变量/=表达式 |
| ||
*= | 乘后赋值 | 变量*=表达式 |
| ||
%= | 取模后赋值 | 变量%=表达式 |
| ||
+= | 加后赋值 | 变量+=表达式 |
| ||
-= | 减后赋值 | 变量-=表达式 |
| ||
<<= | 左移后赋值 | 变量<<=表达式 |
| ||
>>= | 右移后赋值 | 变量>>=表达式 |
| ||
&= | 按位与后赋值 | 变量&=表达式 |
| ||
^= | 按位异或后赋值 | 变量^=表达式 |
| ||
|= | 按位或后赋值 | 变量|=表达式 |
| ||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左向右顺序运算 |
2、算术运算符(+、-、*、/、%、++、--)
#include<iostream>
using namespace std;
int main()
{
int n,a,b,c;
cin >> n; //从键盘输入一个整数给n
a = n % 10;
b = n / 10 % 10;
c = n / 100;
cout << a + b + c << endl;
return 0;
}
输入:321
输出:
计算下面表达式的值:
17/3= 18.0/4= 4567%1000= 17%3= -17/4= 4567/100=
#include <iostream>
using namespace std;
int main()
{ int i,j;
i=3; j=++i;
cout<<“j=”<<j<<'\t'<<"i="<<i<<endl;
}
输出: j= i=
#include <iostream>
using namespace std;
int main()
{ int i,j;
i=3; j=i++;
cout<<“j=”<<j<<'\t'<<"i="<<i<<endl;
}
#include <iostream>
using namespace std;
int main()
{ int i,j;
i=3; j=i--;
cout<<“j=”<<j<<'\t'<<"i="<<i<<endl;
}
#include <iostream>
using namespace std;
int main()
{ int i,j;
i=3; j=--i;
cout<<“j=”<<j<<'\t'<<"i="<<i<<endl;
}
#include<iostream>
using namespace std;
int main()
{ int x,y,z1,z2;
x=7; y=8;
z1=y-(x++); //计算z1=1,计算后x=8
z2=y-(++x); //计算前x的值自加1,x的值为9,再与y求差
cout<<"z1="<<z1<<endl<<"z2="<<z2; //分别输出z1和z2的值
}
输出:z1= z2=
#include <bits/stdc++.h>
using namespace std;
int main()
{ int i=1;
i=(++i)+(++i);
cout<<i;
}
输出:
#include<bits/stdc++.h>
using namespace std;
int main()
{ int a,b,x,y,x1,y1;
a=100;
cout<<a<<" "<<a++<<" "<<a++<<endl;
a=100; b=100;
x=a++; y=++a;
cout<<x<<" "<<y<<endl;
a=100; b=100;
x1=a--; y1=--a;
cout<<x1<<" "<<y1<<endl;
}
输出:
- 自增(++)、自减(--)运算符为变量的增1和减1提供了紧凑格式。
- 自增、自减运算符都是单目运算符,其作用是使变量的值增1或减1。
- 自增、自减运算符有四种应用格式:
int a=3; b=a++; 等价于 b=a; a=a+1;
int a=3; b=a- -; 等价于 b=a; a=a-1;
- (运算符后置用法,代表先使用变量,然后对变量增值)
int a=3; b=++a; 等价于 a=a+1; b=a;
int a=3; b=- -a; 等价于 a=a-1; b=a;
- (运算符前置用法,代表先对变量增值,再使用变量)
- C++编译器在处理时尽可能多的自左向右将运算符结合在一起。
- 在调用函数时,实参的求值顺序一般为自右向左。
#include <iostream>
using namespace std;
int main()
{ int a=1;
printf("%d,%d,%d",a++,a++,a++);
}
输出的结果为3,2,1而不是1,2,3。
4、 赋值运算符(=)
1、表达形式: int a,b,c; a=3; b=3; c=3; 也可以表达为 a=b=c=3;
a=5+(c=6); 表达式的a值为11;c的值为6;
a=(b=4)+(c=6); 表达式的a值为10;b的值为4;c的值为6;
#include <bits/stdc++.h>
using namespace std;
int main()
{ int a=10,b,c,t=0,s=100;
a+=20;
c=b*=b=a;
(s/=c)%=a;
t+=(a+b)*c;
cout<<a<<" "<<b<<" "<<c<<" "<<s<<" "<<t<<endl;
}
输出:
#include <bits/stdc++.h>
using namespace std;
int main()
{ int b=13,a=10;
(a=(b*=b))+=4;
cout<<a<<" "<<b;
}
输出:
- 关系运算符用于两个值进行比较,运算结果为true(真)或false(假),
- 关系运算符都是双目运算符,其结合性是从左到右,<、<=、>、>=运算符的优先级相同,==和!=运算符的优先级相同,前者运算的优先级高于后者。
- 关系运算符的优先级低于算术运算符。
#include<iostream>
using namespace std;
int main()
{ int n1=4,n2=5,n3;
n3=n1>n2; //n3的值为0
n3=n1<n2; //n3的值变为1
n3=n1==4; //n3的值变为1
n3=n1!=4; //n3的值变为0
n3=n1==1+3; //n3的值变为1
}
6、逻辑运算符
#include<bits/stdc++.h>
using namespace std;
int main()
{ int a=2,b=3,c=0,d;
d=(a>b)&&(c=4);
cout<<c<<" "<<d<<endl;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{ int a=2,b=3,c=0,d;
d=(a<b)&&(c=4);
cout<<c<<" "<<d<<endl;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{ int a=0,b=1;
bool flag=(a++)&&(b++);
cout<<a<<" "<<b<<endl;
flag=a++ && b++;
cout<<a<<" "<<b<<endl;
flag=a++ || b++;
cout<<a<<" "<<b<<endl;
}
输出:
7、 条件运算符
- 条件运算符“?:”是C++中唯一的三目运算符,其形式为: 表达式1 ?表达式2 :表达式3
- 条件运算符的结合性是自右向左。例如有以下条件表达式:
- 条件运算符的优先级别高于赋值运算符,低于关系运算符和算术运算符。
8、 位运算符
- 位(bit)是计算机中表示信息的最小单位,一般用0和1表示。一个字符在计算机中用8个位表示,8个位组成一个字节。C++语言需要将人们通常所习惯的十进制数表示为二进制、八进制或十六进制数来理解对位的操作。C++中所有的位运算符如下:
- 位运算符是对其操作数按其二进制形式逐位进行运算,参加位运算的操作数必须为整数。
9、 sizeof()运算符(求字节运算符)
- sizeof()运算符是单目运算符,用于计算运算对象在内存中所占字节的多少,它有两种形式:
- sizeof()可以接受的类型标识符很多,
例如:sizeof(int)表示求整型数据在内存中所占字节数。
例如:sizeof(“Hello,Wlord!”)表示求字符串在内存中所占字节数。
例如:int a,则sizeof(a)表示求变量a在内存中所占字节数。
- 逗号运算符用于将多个表达式连在一起,并将各表达式从左到右的顺序依次求值,但只有其最右端的表达式的结果,作为整个逗号表达式的结果。
- 逗号表达式的一般格式为:表达式1,表达式2,……,表达式n
#include <iostream>
using namespace std;
int main()
{ int a=3,b=4,c=5,d;
d=(a+b,b+c,c+a);
cout<<d;
}
- 逗号运算符的运算级别是所在运算符中最低的。
#include <bits/stdc++.h>
using namespace std;
int main()
{ int a,b,c,d;
cin>>a>>b;
a*=b; b--;
(c=d=a)=b;
d=(a++,b+10,c--);
cout<<a<<" "<<b<<" "<<c<<" "<<d;
}
输入: 100 20
输出:
- 强制转换的一般形式;(类型名)(表达式)
#include <iostream>
using namespace std;
int main()
{ int x;
float a=15.75;
double b=323.01;
cout<<(int)a<<endl;
cout<<(int)(b+0.5)%10 << endl;
cout<<(int)b%(int)a+1 << endl;
return 0;
}
- 运算符优先级决定了在表达式中各个运算符执行的先后顺序。高优先级运算符先于低优先级运算符进行运算。在优先级相同的情形下,则按从左到右的顺序进行运算。
- 当表达式中出现了括号时,会改变优先级。先计算括号中的子表达式值,再计算整个表达式的值。
-
运算符的结合方式有两种:左结合和右结合。左结合表示运算符优先与其左边的标识符结合进行运算,如加法;右结合表示运算符优先与其右边的标识符结合,如单目运算符+、-。
- 同一优先级的优先级别相同,运算次序由结合方向决定。
如1*2/3,*和/的优先级别相同,其结合方向自左向右,则等价于(1*2)/3。
- 不同的运算符要求有不同的运算对象个数,单目运算符只需一个运算对象,如 i++,-a,sizeof(b)等。
读程序写结果:
#include<bits/stdc++.h>
using namespace std;
int main()
{ int s=200,a=10;
int b=20,c=50;
s-=a;
s-=b;
s-=c;
cout<<s<<endl;
}
输出:
#include<bits/stdc++.h>
using namespace std;
int main()
{ int i=1,sum=0;
sum+=i; i*=2;
sum+=i; i*=2;
sum+=i; i*=2;
sum+=i;
cout<<"i="<<i<<"," <<"sum="<<sum<<endl;
}
输出:
#include<bits/stdc++.h>
using namespace std;
main()
{ int a=50,b=200;
a=b-a; b=b-a;
a=a+b;
cout<<"a="<<a<<"b="<<b<<endl;
}
输出:
#include<bits/stdc++.h>
using namespace std;
main()
{ int a=17,b=5,c,d;
c=a/b; d=a%b;
cout<<c<<" "<<d<<endl;
}
输出:
五、库函数
1、 字符处理 ctype.h
2、 数学函数 math.h
3 、输入输出 stdio.h
4 、实用工具程序 stdlib.h
5 、字符串处理 string.h
包含在math.h库文件中的函数 | ||||||
函数类型 | 函数形式 | 功能 | 类型 | |||
数 学 函 数 | abs(int i) | 求整数的绝对值 | int | |||
fabs(double x) | 返回浮点数的绝对值 | double | ||||
floor(double x) | 向下取整 | double | ||||
ceil(double x) | 向上取整 | double | ||||
trunc(double x) | 取整数部分 | int | ||||
round(double x) | 四舍五入 | int | ||||
fmod(double x, double y) | 计算x对y的模, 即x/y的余数 | double | ||||
int(double x) | 取整数部分 |
| ||||
exp(double x) | 指数函数 | double | ||||
log(double x) | 对数函数ln(x) | double | ||||
log10(double x) | 对数函数log | double | ||||
labs(long n) | 取长整型绝对值 | long | ||||
modf(double value, double *iptr) | 把数分为指数和尾数 | double | ||||
pow(double x, double y) | 指数函数(x的y次方) | double | ||||
sqrt(double x) | 计算平方根 | double | ||||
rand() | 产生0到RAND_MAX之间的随机整数 | int | ||||
sin(double x) | 正弦函数 | double | ||||
asin(double x) | 反正弦函数 | double | ||||
sinh(double x) | 双曲正弦函数 | double | ||||
cos(double x); | 余弦函数 | double | ||||
acos(double x) | 反余弦函数 | double | ||||
cosh(double x) | 双曲余弦函数 | double | ||||
tan(double x) | 正切函数 | double | ||||
atan(double x) | 反正切函数 | double | ||||
tanh(double x) | 双曲正切函数 | double | ||||
包含在ctype.h库文件中的函数 | ||||||
函数类型 | 函数形式 | 功能 | 类型 | |||
字 符 函 数 | isalpha(int ch) | 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0 | int | |||
isalnum(int ch) | 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9')返回非0值,否则返回0 | int | ||||
isascii(int ch) | 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0 | int | ||||
iscntrl(int ch) | 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F)返回非0值,否则返回0 | int | ||||
isdigit(int ch) | 若ch是数字('0'-'9')返回非0值,否则返回0 | int | ||||
isgraph(int ch) | 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0 | int | ||||
islower(int ch) | 若ch是小写字母('a'-'z')返回非0值,否则返回0 | int | ||||
isprint(int ch) | 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0 | int | ||||
ispunct(int ch) | 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0 | int | ||||
isspace(int ch) | 若ch是空格(' '),水平制表符('\t'),回车符('\r'), 走纸换行('\f'),垂直制表符('\v'),换行符('\n'),返回非0值,否则返回0 | int | ||||
isupper(int ch) | 若ch是大写字母('A'-'Z')返回非0值,否则返回0 | int | ||||
isxdigit(int ch) | 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值,否则返回0 | int | ||||
tolower(int ch) | 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z') | int | ||||
toupper(int ch) | 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z') | int | ||||
|
|
|
| |||
包含在string.h库文件中的函数 | ||||||
函数类型 | 函数形式 | 功能 | 类型 | |||
字 符 串 函 数 | strcat(char *dest,const char *src) | 将字符串src添加到dest末尾 | char | |||
strchr(const char *s,int c) | 检索并返回字符c在字符串s中第一次出现的位置 | char | ||||
strcmp(const char *s1,const char *s2) | 比较字符串s1与s2的大小,并返回s1-s2 | int | ||||
stpcpy(char *dest,const char *src) | 将字符串src复制到dest | char | ||||
strdup(const char *s) | 将字符串s复制到最近建立的单元 | char | ||||
strlen(const char *s) | 返回字符串s的长度 | int | ||||
strlwr(char *s) | 将字符串s中的大写字母全部转换成小写字母,并返回转换后的字符串 | char | ||||
strrev(char *s) | 将字符串s中的字符全部颠倒顺序重新排列,并返回排列后的字符串 | char | ||||
strset(char *s,int ch) | 将一个字符串s中的所有字符置于一个给定的字符ch | char | ||||
strspn(const char *s1,const char *s2) | 扫描字符串s1,并返回在s1和s2中均有的字符个数 | char | ||||
strstr(const char *s1,const char *s2) | 描字符串s2,并返回第一次出现s1的位置 | char | ||||
strtok(char *s1,const char *s2) | 检索字符串s1,该字符串s1是由字符串s2中定义的定界符所分隔 | char | ||||
strupr(char *s) | 将字符串s中的小写字母全部转换成大写字母,并返回转换后的字符串 | char | ||||
包含在stdio.h库文件中的函数 | ||||||
函数类型 | 函数形式 | 功能 | 类型 | |||
输
入
输
出
函
数 | getch() | 从控制台(键盘)读一个字符,不显示在屏幕上 | int | |||
putch() | 向控制台(键盘)写一个字符 | int | ||||
getchar() | 从控制台(键盘)读一个字符,显示在屏幕上 | int | ||||
putchar() | 向控制台(键盘)写一个字符 | int | ||||
getc(FILE *stream) | 从流stream中读一个字符,并返回这个字符 | int | ||||
putc(int ch,FILE *stream) | 向流stream写入一个字符ch | int | ||||
getw(FILE *stream) | 从流stream读入一个整数,错误返回EOF | int | ||||
putw(int w,FILE *stream) | 向流stream写入一个整数 | int | ||||
fclose(handle) | 关闭handle所表示的文件处理 | FILE * | ||||
fgetc(FILE *stream) | 从流stream处读一个字符,并返回这个字符 | int | ||||
fputc(int ch,FILE *stream) | 将字符ch写入流stream中 | int | ||||
fgets(char *string,int n,FILE *stream) | 流stream中读n个字符存入string中 | c har * | ||||
fopen(char *filename,char *type) | 打开一个文件filename,打开方式为type,并返回这个文件指针,type可为以下字符串加上后缀 | FILE * | ||||
fputs(char *string,FILE *stream) | 将字符串string写入流stream中 | int | ||||
fread(void *ptr,int size,int nitems,FILE *stream) | 从流stream中读入nitems个长度为size的字符串存入ptr中 | int | ||||
fwrite(void *ptr,int size,int nitems,FILE *stream) | 向流stream中写入nitems个长度为size的字符串,字符串在ptr中 | int | ||||
fscanf(FILE *stream,char *format[,argument,…]) | 以格式化形式从流stream中读入一个字符串 | int | ||||
fprintf(FILE *stream,char *format[,argument,…]) | 以格式化形式将一个字符串写给指定的流stream | int | ||||
scanf(char *format[,argument…]) | 从控制台读入一个字符串,分别对各个参数进行赋值,使用BIOS进行输出 | int | ||||
printf(char *format[,argument,…])
| 发送格式化字符串输出给控制台(显示器),使用BIOS进行输出 | int |
#include<iostream>
#include<cmath>//使用数学函数前必须添加cmath或者math.h
using namespace std;
int main()
{ double x1,y1,x2,y2;
cin >> x1 >> y1 >> x2 >> y2;
cout << sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
return 0;
}
六、输入输出语句
1、cin、cout、endl语句
- cout是C++系统中,由iostream文件定义的一个对象名,称为输出流对象。读作c-out。
- “<<” 是插入运算符。
- cout<<“my frist program.“是将字符串“my frist program”插入到输出的队列cout中(输出的队列也称作“输出流”)。
- cin是C++系统中,由iostream文件定义的一个对象名,称为输出流对象。读作c-in。
- “>>” 是插入运算符。
- cin>>a是从键盘输入内容给a。
- endl是换行, 是 end line的缩写;
- C++语言区分大小写,cout 、endl不能写成Cout、Endl。
控
制
符
|
作
用
|
dec
|
设置整数为十进制(相当于
"%d
)
|
hex
|
设置整数为八进制(相当于
"%x
)
|
oct
|
设置整数为十六进制(相当于
"%o
)
|
setbase(n)
|
设置整数为
n
进制
(n=8,10,16)
|
setfill(n)
|
设
置字符填充,c可以是字符常或
字符变量
|
setprecision(n)
|
设置浮点数的效数字为
|
setw(n)
|
设置字段宽度为n位
|
setiosflags(ios::fixed)
|
设置浮点数以固定的小数位数显示
|
setiosflags(ios::scientific)
|
设置浮点数以科学计数法表示
|
setiosflags(ios::left)
|
输出左对齐
|
setiosflags(ios::right)
|
输出右对齐
|
setiosflags(ios::skipws)
|
忽略前导空格
|
setiosflags(ios::uppercase)
|
在以科学计数法输出E与十六进制
输出X以大写输出,否则小写。
|
setiosflags(ios::showpos)
|
输出正数时显示
"+"
号
|
resetiosflags()
|
终止已经设置的输出格式状态,
在括号中应指定内容
|
#include<iostream>
#include<iomanip>
using namespace std;
int a[20]={0,1};
int main()
{ int i=17;
char c='q';
float a=1.3456;
cout<<setfill(c)<<setw(10)<<setbase(8)<<i;
}
输出:
2、getchar()和putchar()
- getchar()函数是接收从键盘输入的单个字符。
- putchar()函数是向标准输出设备(显示器)输出单个字符。
#include<bits/stdc++.h>
using namespace std;
int main()
{ char c='B';
putchar(c); // 输出字符变量
putchar('B'); //直接输出
putchar('\102'); // 转义字符八进制输出字符
putchar('\x42'); // 转义字符十六进制输出字符
putchar(66); // 十进制数输出字符
putchar(0x42); //十六进制数输出字符
putchar(0102); // 八进制数输出字符
}
- 格式控制字符串用于指定输出格式。
- 格式控制字符串由格式字符串和非格式字符串两种组成。
- 格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。
- 非格式字符串原样输出,在显示中起提示作用。
- 输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。
#include <cstdio>
using namespace std;
int main()
{ int a=88,b=89;
printf("%d %d\n",a,b);
printf("%d,%d\n",a,b);
printf("%c,%c\n",a,b);
printf("a=%d,b=%d",a,b);
}
输出:
类型字符用以表示输出数据的类型,其格式符和意义如下表所示:
格式字符
|
意义
|
%d
|
以十进制形式输出带符号整数(正数不输出符号)
|
%o
|
以八进制形式输出无符号整数(不输出前缀0)
|
%x或%X
|
以十六进制形式输出无符号整数(不输出前缀Ox)
|
%u
|
以十进制形式输出无符号整数
|
%f
|
以小数形式输出单、双精度实数
|
%e或%E
|
以指数形式输出单、双精度实数
|
%g或%G
|
以%f或%e中较短的输出宽度输出单、双精度实数
|
%c
|
输出单个字符
|
%s
|
输出字符串
|
标 志
|
意义
|
-
|
结果左对齐,右边填空格
|
+
|
输出符号(正号或负号)
|
空格
|
输出值为正时冠以空格,为负时冠以负号
|
#
|
对c、s、d、u类无影响;
对o类,在输出时加前缀o; 对x类,在输出时加前缀0x; 对e、g、f 类当结果有小数时才给出小数点。 |
0
|
将空出的列宽补上0,(不可以搭配使用)
|
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
精度格式符以“.”开头,后跟十进制整数。本项的意义是:
(5) 长度
长度格式符为h、l两种:
#include <stdio.h>
int main()
{ int a=15; float b=123.1234567;
double c=12345678.1234567;
char d='p';
printf("a=%d\n", a); // %% 可以输出 %
printf("a(%%d)=%d, a(%%5d)=%5d, a(%%05d)=%05d ,a(%%-5d)=%-5d, a(%%o)=%o, a(%%x)=%x\n\n",a,a,a,a,a,a);
printf("a=%f\n", b);
printf("b(%%f)=%f, b(%%lf)=%lf, b(%%5.4lf)=%5.4lf, b(%%e)=%e\n\n",b,b,b,b);
printf("c=%f\n", c);
printf("c(%%lf)=%lf, c(%%f)=%f, c(%%8.4lf)=%8.4lf\n\n",c,c,c);
printf("d=%c\n", d);
printf("d(%%c)=%c, d(%%8c)=%8c\n",d,d);
printf("******(%%5.3s)=%5.3s","******");
}
#include<cstdio>
using namespace std;
int main()
{ int i=1;
long j=123;
printf("%d,%2d,%03d,%1d,%-4ld,%05ld",i,i,i,j,j,j);
}
#include <stdio.h>
int main()
{
int a,b,c;
printf("input int a,b,c\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
或
7
8
9
格式
|
字符意义
|
d
|
输入十进制整数
|
o
|
输入八进制整数
|
x
|
输入十六进制整数
|
u
|
输入无符号十进制整数
|
f或e
|
输入实型数(用小数形式或指数形式)
|
c
|
输入单个字符
|
s
|
输入字符串
|
(2)“ * ”符
用以表示该输入项读入后不赋予相应的变量,即跳过该输入值。
用十进制整数指定输入的宽度(即字符数)。
长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数
scanf(" %d,%d,%d",&a,&b,&c);
七、动手练习编程
2、用putchar(),printf()分别有几种方法输出一个ASC码字符。
3、读入一个单精度浮点数,保留3位小数,输出这个浮点数。
4、读入一个双精度浮点数分别按输出格式“%f”,“%f”保留5位小数, “%e ”和“%g”的形式输出这个数,每次在单独一行上输出。