第二章 数据类型、运算符和表达式学习要求和实验
n 学习要求:
了解数据类型概念。
掌握常量和变量的使用。
掌握各种运算符的运算结合性和优先级,掌握各类表达式正确格式。
掌握数据类型转换。
进一步熟悉VC集成编程环境的使用,熟练掌握程序设计过程和步骤,积累程序调试经验。
n 实验作业
1.输入课本各个例题,调试运行程序,并分析程序,将每一个程序改写2到3个版本,自己分析程序结果,然后再调试运行,核对分析结果的对错。
2.编写程序输入一个三角形的三条边,计算其面积和周长;
3.编写程序计算并输出课本本章习题3表达式的值并分析结果。
4.编写一个程序,输入一个一元二次方程的三个系数,并计算其方程的解,然后输出。
5.编写程序,自己确定一个加密算法,将自己的音标姓名(英文)加密,并输出加密后结果,请注释你的加密算法。
6.在一个自动控制设备中,控制字位数16位,控制设备产生机械动作(如削,压等)的是指令字的低8位,其中保护强制停机动作的控制命令是低8位是全为0,控制报警声音是指令的高第1位,0为报警,1为不报警。请编写程序,在紧急状况启动时,向控制器输入控制指令。
7.积累调试程序经验,收集错误信息原因(每个同学收集3-5条错误信息原因,并输入电脑形成文字)。
n 作业要求
网上提交各个程序和相关要求提交的文字。
作业1:
例2.1
/*******************************************
***** 功能:布尔类型使用举例 *****
*******************************************/
#include <iostream>
#include <iomanip> //使用控制符boolalpha需使用此头文件
using namespace std; //使用标准名空间std
int main() //主函数
{
bool flag=true; //定义布尔型变量,并初始化为true
cout<<flag<<endl; //默认情况下为非bool字母(noboolalpha),输出整型值1
cout<<boolalpha<<flag<<endl; //使用控制符boolalpha,输出布尔型值为true
cout<<flag+5<<endl; //在算数元算中,把布尔型当做整型数据,输出6
flag=0; // 可以给bool类型的变量赋给任意整型的值
cout<<"执行语句flag=0;后flag的值为:"<<boolalpha<<flag<<endl;
flag=0.0; //0.0为double类型的数值
cout<<"执行语句flag=0.0;后flag的值为"<<boolalpha<<flag<<endl;
return 0;
}
修改版本1/*******************************************
***** 功能:布尔类型使用举例 *****
*******************************************/
#include <iostream>
#include <iomanip> //使用控制符boolalpha需使用此头文件
using namespace std; //使用标准名空间std
int main() //主函数
{
bool flag=false; //定义布尔型变量,并初始化为false
cout<<flag<<endl; //默认情况下为非bool字母(noboolalpha),输出整型值0
cout<<boolalpha<<flag<<endl; //使用控制符boolalpha,输出布尔型值为false
cout<<flag/2<<endl; //在算数元算中,把布尔型当做整型数据,输出0
flag=1; // 可以给bool类型的变量赋给任意整型的值
cout<<"执行语句flag=1;后flag的值为:"<<boolalpha<<flag<<endl;//输出值为true
flag=0.001; //0.01为double类型的数值
cout<<"执行语句flag=0.001;后flag的值为"<<boolalpha<<flag<<endl; //输出true
return 0;
}
经编译,分析结果正确。
修改版本2:
/*******************************************
***** 功能:布尔类型使用举例 *****
*******************************************/
#include <iostream>
#include <iomanip> //使用控制符boolalpha需使用此头文件
using namespace std; //使用标准名空间std
int main() //主函数
{
bool a,b; //定义布尔型变量a,b;
bool flag1=false; //定义布尔型变量flag1,flag2,并分别初始化为false ,true
bool flag2=true;
a=flag1|flag2; //将flag1,flag2相或后赋值给a
b=flag1&flag2; //将flag1,flag2相与后赋值给b
cout<<a<<endl; //输出a的整型值1
cout<<b<<endl; //输出b的整型值0
cout<<boolalpha<<a<<endl; //输出a的布尔类型值true
cout<<boolalpha<<b<<endl; //输出b的布尔类型值false
return 0;
}
经编译,分析结果正确。例题2.2
/***********************************
** 功能:赋值表达式语句的使用 **
***********************************/
#include <iostream>
using namespace std;
int main() //主函数
{
int a,b,c,d; //定义整型变量a,b,c,d
a=4; //给变量a赋值4
b=a; //将变量a的值赋给b
a=5; //给变量a赋值5
c=d=6; //将6赋给变量d,再将d的值赋值给c
c*=a; // 将a与c相乘,再将值赋给c
d%=a+b; //该式与d=d%(a+b)相同
cout<<"a="<<a<<endl; //输出a的值
cout<<"b="<<b<<endl; // 输出b的值
cout<<"c="<<c<<endl; //输出c的值
cout<<"d="<<d<<endl; //输出d的值
return 0;
}
修改版本1:
/***********************************
** 功能:赋值表达式语句的使用 **
***********************************/
#include <iostream>
using namespace std;
int main() //主函数
{
int a,b; //定义整型变量a,b
a=1; //给变量a,b赋值1
b=1;
while(b<100) //while函数,当b<100时,执行while函数里面程序,直到b>=100时退出函数
{
b+=1; //b加1后的值赋给b
a+=b; //a加上b的值再赋值给a
}
cout<<"输出从1加到100的总和"<<endl;
cout<<"a="<<a<<endl; //输出从1加到100的总和值5050
return 0;
}
修改版本2:
/***********************************
** 功能:将浮点数拆成小数和整数部分 **
***********************************/
#include <iostream>
using namespace std;
int main() //主函数
{
float num,b; //定义浮点型变量num,b
int a; //定义整数a
cout<<"请输入num的值:";
cin>>num; //输入一个数赋值给变量num
b=num; //将num的值赋给b
a=num; //将浮点型变量num的值赋值给整型变量a,得到num的整数部分
b-=a; //将b减去a后的值赋给b,得到num的小数部分
cout<<"输出num的整数部分:"<<a<<endl;
cout<<"输出num的小数部分"<<b<<endl;
return 0;
}
例题2.3数据溢出举例
#include<iostream>
using namespace std;
int main()
{
short i,j,m,n; //定义短整型变量i,j,m,n
i=1000;//给i,j分别赋值1000
j=1000;
m=i+j;//将i,j的值相加后赋值给m ,m值等于2000
n=i*j;//将i,j的值相乘后赋值给短整型变量n,n的值为1000000,溢出了
cout<<"m="<<m<<endl;
cout<<"n="<<n<<endl;
return 0;
}
修改版本1:
#include<iostream>
using namespace std;
int main()
{
int c;
float a,b;
a=56.3;
b=200.5;
c=a+b; //a+b=56.3+200.5=256.8,为浮点值,但c为整型值,赋值后小数溢出了,所以c=256
cout<<"c="<<c<<endl;
return 0;
}
修改版本2:
#include<iostream>
using namespace std;
int main()
{
short a,b,c,d,e,f; //short类型的取值范围为-32768~32767
a=10; //a=10
b=10*10; //b=100
c=10*10*10; //c=1000
d=10*10*10*10; // d=10000
e=10*10*10*10*10; //e=100000,数据溢出,为乱码
f=10*10*10*10*10*10; //f=1000000,数据溢出,为乱码
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
cout<<"c="<<c<<endl;
cout<<"d="<<d<<endl;
cout<<"e="<<e<<endl;
cout<<"f="<<f<<endl;
return 0;
}
例题2.4 ++运算符使用举例
/*************************
*** 功能:++运算使用 ****
*************************/
#include <iostream>
using namespace std;
int main()
{
int i=6,j,k,temp;
j=++i; //先对变量i自增,i的值变为7,之后把i的值7赋给变量j
k=i++; // 先把变量i的值7赋给变量k,然后i的值自增,i的值变为8
++i=1; //++i可以作为左值,执行完该语句后变量i的值为1
cout<<"i="<<i<<endl
<<"j="<<j<<endl
<<"k="<<k<<endl;
return 0;
}
修改版本1:
/*************************
*** 功能:++运算使用 ****
*************************/
#include <iostream>
using namespace std;
int main()
{
int i=1,j=2,k=3;
j-=i++;//先将j-i后的值赋给j,然后i的值自增1;得j=1,i=2
++i=1;//i++作为左值,执行完该语句后i的值为1
k*=i++; // 先执行k=k*i,然后i的值自增1;得k=3,i=2
cout<<"i="<<i<<endl
<<"j="<<j<<endl
<<"k="<<k<<endl; //输出i=2,j=1,k=3
return 0;
}
修改版本2:
/*************************
*** 功能:++运算使用 ****
*************************/
#include <iostream>
using namespace std;
int main()
{
int i=10,j=5,k=1;
j+=--i;//先执行i自减1,再执行j=j+i;得j=14,i=9
i=-k++;//先执行i=-k,再执行k++,得i=-1,k=2
k*=i++; // 先执行k=k*i,然后i的值自增1;得k=-2,i=0
cout<<"i="<<i<<endl
<<"j="<<j<<endl
<<"k="<<k<<endl; //输出i=0,j=14,k=-2
return 0;
}
例题2.5
#include <iostream>
using namespace std;
int main()
{
char ch;
cout<<"please input a character:";
cin>>ch; //输入一个字符
ch=ch>='a'&&ch<='z'?ch-'a'+'A':ch; //先判断ch>'a'&&ch<='z'是否成立,若成立,则ch=ch-'a'+'A',否则ch=ch
//上述语句等价于ch=ch>='a'&&ch<='z'?ch-32:h;
cout<<"The result is:"<<ch<<endl;
return 0;
}
修改版本1:
/***********************************
**** 功能:输出两个数中的最大值 ****
***********************************/
#include <iostream>
using namespace std;
int max(int a,int b);//函数声明
int main() //主函数
{
int m,n;
cout<<"请输入两个整型数据"<<endl;
cin>>m>>n;
cout<<"输出两个数中最大值:"<<max(m,n)<<endl;
return 0;
}
int max(int a,int b)//子涵数:求两数中的最大值
{
int t;
t=a>b?a:b;
return t;
}
修改版本2:
/***********************************
**** 功能:输出三个数中的最大值和最小值 ****
***********************************/
#include <iostream>
using namespace std;
int max(int a,int b,int c);//函数声明
int min(int a,int b,int c);
int main() //主函数
{
int m,n,k;
cout<<"请输入三个整型数据"<<endl;
cin>>m>>n>>k;
cout<<"输出三个数中最大值:"<<max(m,n,k)<<endl;
cout<<"输出三个数中最小值:"<<min(m,n,k)<<endl;
return 0;
}
int max(int a,int b,int c)//子涵数:求三数中的最大值
{
int t;
t=a>b?a:b;
t=t>c?t:c;
return t;
}
int min(int a,int b,int c)//子函数:求三数中的最小值
{
int j;
j=a<b?a:b;
j=j<c?j:c;
return j;
}
例题2。7强制类型转换实例
#include <iostream>
using namespace std;
int main()
{
int ab,ac;
double b=3.14;
char c='A';
ab=int(b); //将浮点型数据b强制转换为整型值,赋值给ab
ac=int(c); //将字符型数据c强制转换为整型值,赋值给ac
cout<<"b="<<b<<endl;
cout<<"ab="<<ab<<endl;
cout<<"c="<<c<<endl;
cout<<"ac="<<ac<<endl;
return 0;
}
修改版本1:
#include <iostream>
using namespace std;
int main()
{
char a,b;
int ab=23;
float ac=2.3;
a=char(ab); //将整型数据ab强制转换为字符型值,赋值给a
b=char(ac); //将浮点型数据ac强制转换为字符型值,赋值给b
cout<<"a="<<a<<endl;
cout<<"ab="<<ab<<endl;
cout<<"b="<<b<<endl;
cout<<"ac="<<ac<<endl;//结果不知
return 0;
}
修改版本2:
#include <iostream>
using namespace std;
int main()
{
int a=0;
char b;
while(a<=20)//当a<=20,执行while函数,否则退出
{
b=char(a);
cout<<b<<endl;
a++;
}
//输出0 ~20所对应的符号
return 0;
}
作业2:
/********************************
** 输入三边长求三角形面积和周长**
********************************/
#include <iostream>
#include<math.h>
using namespace std;
float perimeter(float x,float y,float z)//子函数:求周长perimeter
{
float m; //周长等于三边长之和
m=x+y+z;
return m;
}
float area(float x,float y,float z)//子函数:求三角形的面积area
{
double a1,a2,a3,a4; //面积公式:海伦公式
double n,p;
a1=x+y+z;
a2=x+y-z;
a3=x+z-y;
a4=y+z-x;
p=a1*a2*a3*a4;
p=sqrt(p);
n=p/4;
return n;
}
bool abc(float x,float y,float z)
{
bool t;
if((z<x+y)&&(z>x-y)&&(z>y-x))
t=true;
else
t=false;
return t;
}
/**以下是主函数**/
int main()
{
float a,b,c;
cout<<"请输入三角形的三边长:"<<endl;
cout<<"a=";
cin>>a;
cout<<"b=";
cin>>b;
cout<<"c=";
cin>>c;
while(!abc(a,b,c))
{
cout<<"输入三边长不能组成三角形,请重新输入:"<<endl;
cout<<"a=";
cin>>a;
cout<<"b=";
cin>>b;
cout<<"c=";//输入三边长度
cin>>c;
cout<<"三角形的周长perimeter="<<perimeter(a,b,c)<<endl; // 输出周长
cout<<"三角形的面积area="<<area(a,b,c)<<endl; // 输出面积
cout<<"*******流星在颤抖*******"<<endl;
return 0;
}
}
作业3
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int e=1,f=4,g=2;
float m=10.5,n=4.0,k;
k=(e+f)/g+sqrt((double)n)*1.2/g+m;//(e+f)/g=(1+4)/2=2;sqrt
((double)n)*1.2/g=1.2;m=10.5
cout<<"k="<<k<<endl;//输出k=13.7
return 0;
}
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
float x=2.5,y=4.7,k;
int a=7;
k=x+a%3*(int(x+y)%2)/4;//a%3=1;int(x+y)%2=1;
cout<<"k="<<k<<endl;
return 0;
}
作业4
/******************************************
** 功能:求一元二次方程的根 **
******************************************/
#include<iostream>
#include<math.h>
using namespace std;
bool panduan(float x,float y,float z);
/*** 以下是主函数 *****/
int main()
{
float a,b,c;
float x1,x2;
cout<<"请输入方程的三个参数a,b,c:"<<endl;
cout<<"a=";
cin>>a;
cout<<"b=";
cin>>b;
cout<<"c=";
cin>>c;
if(panduan(a,b,c)==true) //如果有根,执行if语句里面程序
{
x1=float((-b+sqrt(b*b-4*a*c))/(2*a)); //求两个根x1,x2的值
x2=float((-b-sqrt(b*b-4*a*c))/(2*a));
cout<<"输出方程的根x1="<<x1<<endl;
cout<<"输出方程的根x2="<<x2<<endl;
}
else //如果没根,执行else语句程序
{
cout<<"该方程无根"<<endl;
}
return 0;
}
bool panduan(float x,float y,float z)//判断方程是否有根,有根则返回true,没根则返回false
{
bool t;
float m;
m=y*y-4*x*z;
if(m>=0){t=true;}
else{t=false;}
return t;
}
作业5:
/*****************************
**** 功能:加密算法 ****
*****************************/
#include<iostream>
using namespace std;
void encrypt(char m,int i);//对函数进行声明
void main()
{
int t,k;
char a[20];
cout<<"请输入你的英文名:";
cin.get(a,20);//输入字符并存在a【20】数组中
k=strlen(a);//计算出输入字符的长度
cout<<"输出加密后的字符码:";
for(t=0;t<k;t++)
{
encrypt(a[t],t+1);
}
}
void encrypt(char m,int i)//加密函数,对输入的第i个字符m进行加密
{
m=m+i;
cout<<m;
}
作业6:
/************************************
**** 程序功能:模拟控制设备 ****
************************************/
#include<iostream>
using namespace std;
void xianshi(int x,int y);
int main()
{
char k,h,g;
int al,ah;
cout<<"按T键启动设备"<<endl;
cin>>k;
if(k=='t'||k=='T')
{
ah=0xff;
al=0xff;
cout<<"设备已启动!!!!"<<endl;
xianshi(ah,al);
cout<<"按F键可打开报警装置,按其他键则不打开报警装置"<<endl;
cin>>h;
if(h=='F'||h=='f')
{
ah=ah&0xfe;
cout<<"报警装置已开启!!如遇紧急情况会自动报警"<<endl;
xianshi(ah,al);
}
cout<<"机器正在运行中........"<<endl;
cout<<"机器正在运行中........"<<endl;
cout<<"机器正在运行中........"<<endl;
cout<<"机器正在运行中........"<<endl;
cout<<"机器正在运行中........"<<endl;
cout<<"机器正在运行中........"<<endl;
cout<<"机器正在运行中........"<<endl;
cout<<"紧急情况!!!请马上按S键强制停止机器"<<endl;
cin>>k;
if(k=='S'||k=='s')
{
al=al&0x00;
xianshi(ah,al);
cout<<"机器已经停止完毕!!!";
}
}
return 0;
}
void xianshi(int x,int y)//显示出指令码
{
int b,i;
cout<<"输出高八位ah:";
for(i=0;i<8;i++)
{
b=x&0x01;
x=x>>1;
cout<<b<<' ';
}
cout<<endl;
cout<<"输出低八位al:";
for(i=0;i<8;i++)
{
b=y&0x01;
y=y>>1;
cout<<b<<' ';
}
cout<<endl;
}
作业7:
错误1
efefa.obj : error LNK2005: _main already defined in ew3.obj
Debug/4t4.exe : fatal error LNK1169: one or more multiply defined symbols found
执行 link.exe 时出错.
有时编译时无出错,连接时就出现这个错误,不知道什么原因。不过重新建个工程把内容复制进去就可以了
错误2
efefa.obj : error LNK2005: _main already defined in ew3.obj
Debug/4t4.exe : fatal error LNK1169: one or more multiply defined symbols found
每当子函数写于主函数后时前面没有进行声明就会遇到这种错误,所以,记得要声明哦!
错误3
E:\C++程序设计\lesson2_1\lesson2_1.cpp(19) : error C2679: binary '>>' : no operator defined which takes a right-hand operand of type '' (or there is no acceptable conversion)
经常习惯性地在cin>>a后面多加了一个>>endl造成这种错误