中山大学程序设计与实验 实验二 数据类型、常量、变量、表达式 、顺序语句简单程序设计

程序设计与实验第二次实验报告

  • 一.实验目的

1.进一步熟悉C++程序设计流程:编辑、编译、连接、运行、调试测试。

2.熟悉C++语言数据类型,掌握定义整型、字符型、实型变量以及对它们赋值的方法。

3.学会使用C++的运算符及表达式。

4.掌握运算符的优先级。

5.学会常见数学函数库函数的调用。

6.初步了解string类,并会简单使用。

7.掌握不同的类型数据之间运算的类型转换规则,理解自动类型转换和会使用强制类型转换。

8.掌握vc++调试程序,学会查看变量和表达式的值。

二.实验原理

1. C++标识符是⽤来标识变量、函数、类、模块,或任何其他⽤户⾃定义项⽬的名称。⼀个标识符以字⺟A-Z或a-z或下划线_开始,后跟零个或多个字⺟、下划线和数字(0-9)。C++标识符内不允许出现标点字符,⽐如@、&和%。C++是区分⼤⼩写的编程语⾔。

2. 变量与数据类型:变量就是由标识符引⽤的内存中的⼀个位置,其中包含可以更改的数据值。

3. C++程序结构(框架)语句:语句(statement)是C++程序(program)中的组成成分,通常由“;”分号结尾。函数主体(body)由⼀系列语句组成。

三.实验内容

实验一:基本数据类型的长度

1.基本数据类型的长度 验证你的 C++编译环境中每个基本数据类型的长度(即在内存空间
所占的字节个数)。用 sizeof 运算符获取类型或数据的所占字节数。
# include <iostream>
using namespace std;
int main() {
cout << "字符'a' 所占字节数: " << sizeof('a') << endl;
cout << "字符串\"a\"所占字节数: " << sizeof("a") << endl;
cout << "字符串\"China\" 所占字节数: " << sizeof("China") << endl;
cout << "整型常量默认为 int,int 型所占字节数: " << sizeof(123) << endl;
cout << "短整型 short 类型所占字节数: " << sizeof(short) << endl;
cout << "float 型数据所占字节数:" << sizeof(float) << endl;
cout << "double 型数据所占字节数:" << sizeof(double) << endl;
cout << "bool 型数据所占的字节数:" << sizeof(bool) << endl;
cout << sizeof(123)<<endl;
cout<<sizeof(1.23)<<endl;
cout<<sizeof(float(1.23))<<endl;
cout<<sizeof(double(1.23))<<endl;
cout << "汉字\"中国\"所占的字节数 :" << sizeof ( “中国”) << endl;
return 0;
}
(1)上述程序有一处错误,编译找出出处,读懂错误提示,进行改正。
(2)人工分析程序,写出应得结果,上机后将二者对照,分析结果。
(3)基本数据类型的长度在不同计算机系统上不一样,告诉我们什么道理?

将所给代码进行编译运行得:

编译结束后显示'expected primary-expression before ';' token'。这种错误经常出现在使用分号来结束一个语句时,但语句的结构不正确造成的。当前情况下的报错应该是sizeof()函数语法错误导致的。观察错误行sizeof()函数可知,“中国“两边的双引号应该用英文输入法中的双引号,否则sizeof()无法读取“中国”这一字符串。

# include <iostream>
using namespace std;
int main() {
cout << "字符'a' 所占字节数: " << sizeof('a') << endl;
cout << "字符串\"a\"所占字节数: " << sizeof("a") << endl;
cout << "字符串\"China\" 所占字节数: " << sizeof("China") << endl;
cout << "整型常量默认为 int,int 型所占字节数: " << sizeof(123) << endl;
cout << "短整型 short 类型所占字节数: " << sizeof(short) << endl;
cout << "float 型数据所占字节数:" << sizeof(float) << endl;
cout << "double 型数据所占字节数:" << sizeof(double) << endl;
cout << "bool 型数据所占的字节数:" << sizeof(bool) << endl;
cout << sizeof(123)<<endl;
cout<<sizeof(1.23)<<endl;
cout<<sizeof(float(1.23))<<endl;
cout<<sizeof(double(1.23))<<endl;
cout << "汉字\"中国\"所占的字节数 :" << sizeof ( "中国") << endl;
return 0;
}

改正错误后,编译运行得结果:

基本数据类型的长度在不同计算机系统上不一样,告诉我们什么道理?

答:C语言中不同数据类型的长度是由操作系统的位数决定的,更根本上来说是由硬件体系架构决定的。在32位平台和64位平台上,同一种数据类型可能有不同的数据长度,就比如说,int类型,在32位和64位系统上都是4字节,但是在16位的系统上,它就是2字节。因此,不同系统的同一类型数据所占用的空间与精度会有所不同。

实验二:求出算术表达式的值

  1. x+(int)a%3*(int)(x+y)%2/4 设 x = 2.5,y = 4.7,a = 7

分析题目:x+y=7.2,属于浮点数,将其强制转换为整型则会丢失小数部分,因此(int)(x+y)=7,同时,因为2和4都是整型,因此2/4结果应该为整型类型,即int(2/4)=0

由于算式开头的x属于浮点型,因此算式的最终结果应该也为浮点型,计算得出结果应该为2.5

将算式化作代码输入计算机编译运行得:

#include<iostream>
using namespace std;
int main()
{
	float x=2.5,y=4.7;
	int a=7;
	cout<<x+(int)a%3*(int)(x+y)%2/4;
	return 0;
}

与预期结果相同

2.(float)(a+b)/2-(int)x%(int)y 设 a = 2,b = 3,x = 3.5,y = 2.5

分析题目:a+b=5,属于整型,将其转化为浮点数,则为5.0,5.0/2=2.5;将浮点数x和y强制转化为整型,则舍去小数部分,即(int)x=3,(int)y=2,预期结果为2.5-1=1.5

将算式化作代码输入计算机编译运行得:

#include<iostream>
using namespace std;
int main()
{
	float x=3.5,y=2.5;
	int a=2,b=3;
	cout<<(float)(a+b)/2-(int)x%(int)y;
	return 0;
}

与预期结果相符

3.'a'+x%3+5/2-'\24' 设 x = 8

分析题目:字符’a’在ASCII码中对应十进制数字为97,’\24’表示的是八进制下的24,即十进制中的20,因此’\24’的值为20,5/2的结果应为整型,即(int)2.5=2,将上述数据代入算式中计算结果应为81

将算式化作代码输入计算机编译运行得:

#include<iostream>
using namespace std;
int main()
{
	int x=8;
	cout<<'a'+x%3+5/2-'\24'<<endl;
	return 0;
}

实验三

原代码:

#include <iostream>
using namespace std;
#include<iomanip> //cout 格式化输出
int main()
{
Const double PI = 3.1415926;
cout <<”1.PI = [[“<<setw(15)<<PI<<”]]”<<endl;
cout <<”2.PI = [[“<<setprecision(2)<<PI<<”]]”<<endl;
double x,y,z;
x=3.0;
y=4.0;
x=y+z;
cout<<”With z not initialized,x=y+z=”<<x<<endl;
int i=39990;
cout<<”i=”<<i<<endl;
double a=7,b=6,c=5,d=4,e,p,q,x,y,z;
int k1=10,k,h,m,n;
k=k1++;
h=++k1;
cout<<”k=”<<k<<endl;
cout<<”h=”<<h<<endl;
m=6/4;
n=6/4.0;
cout<<”m=”<<m<<”,n=”<<n<<endl;
k1*=(8/4);
cout<<”k1=”<<k1<<endl;
e=3;
x=a+b-c/d*e;
y=a+(b-c)/d*e;
z=((a+b)-c/d)*e;cout<<”x=”<<x<<endl;
cout<<”y=”<<y<<endl;
cout<<”z=”<<z<<endl;
}

将原代码输入编译器中编译运行得

根据报错对代码进行调试:

  1. Const→const
  2. 将所有中文双引号替换成英文双引号
  3. 主函数没有返回值,在语句最后加上return 0;
  4. 第9行和第16行的x,y,z被重复定义,故删去第16行的x,y,z

调试后代码如下

#include <iostream>
using namespace std;
#include<iomanip> //cout 格式化输出
int main()
{
	const double PI = 3.1415926;
	cout <<"1.PI = [["<<setw(15)<<PI<<"]]"<<endl;
	cout <<"2.PI = [["<<setprecision(2)<<PI<<"]]"<<endl;
	double x,y,z;
	x=3.0;
	y=4.0;
	x=y+z;
	cout<<"With z not initialized,x=y+z="<<x<<endl<<z<<endl;
	int i=39990;
	cout<<"i="<<i<<endl;
	double a=7,b=6,c=5,d=4,e,p,q;
	int k1=10,k,h,m,n;
	k=k1++;
	h=++k1;
	cout<<"k="<<k<<endl;
	cout<<"h="<<h<<endl;
	m=6/4;
	n=6/4.0;
	cout<<"m="<<m<<",n="<<n<<endl;
	k1*=(8/4);
	cout<<"k1="<<k1<<endl;
	e=3;
	y=a+(b-c)/d*e;
	z=((a+b)-c/d)*e;
	cout<<"x="<<x<<endl;
	cout<<"y="<<y<<endl;
	cout<<"z="<<z<<endl;
	return 0;
}

运行结果如下

实验心得

  1. 实验三中出现两个没见过的函数,分别为setw()与setprecision(),通过查找资料了解到,setw()函数是用来预设输出宽度的,比如题目中出现的setw(15)是设定输出宽度为15,而常量PI的宽度不到15,因此会在前面补上空格使宽度达到15;setprecision()函数是控制输出流显示浮点数的有效数字个数,如题中setprecision(2)表示只输出PI的两位有效数字,即3.1
  2. 注意到++a和a++的区别:a++:计算过程是先执行a,之后在增加1,++a:计算过程是先加上1,之后再执行a。例如题中的k=k1++表示k1先将值赋给k,自身再加1,此时k=10,k1=11.之后的h=++k1表示k1加1之后将值赋给h,此时h=k1=12。
  3. 声明变量z为double后,未给z赋值,此时z的值为UFL,因此x=y+z=4
  4. 代码中m=6/4与n=6/0结果均为1,原因是m和n均为整型,6/4结果为整型1,6/0结果应为1.5,但由于n为整型,1.5被强制转换为整型后结果为1,因此n的值也为1
  5. 在第25行代码中,k1*=(8/4)表示k1=k1*(8/4)=k1=2*k1,因此k1的值为24
  6. 在运算中,计算顺序为先+-(表示正负性),后幂运算,其次乘除运算,最后加减运算。

    实验四

原代码如下

#include<iostream>
using namespace std;
#define PI 3.1415926;
int main()
{
double a,b,c,d,E,f,g,h,i,j;
// 取绝对值
cout << "abs(-100.01) = " << abs(-100.01) << endl;
//求实数的绝对值
a= - 1.82021;
afabs =fabs(a);
cout<<"求实数的绝对值:"<<a<<endl;
//求正数的平方根
b=6.6;
bsqrt =sqrt(b);
cout<<"求实数的平方根:"<<b<<endl;
//求不大于某数的最大整数,向下取整
c=2.3;
c=floor(c);
cout<<"不大于某数的最大整数,向下取整:"<<c<<endl;
//求不小于某数的最小整数,向上取整d=4.3;
d=ceil(d);
cout<<"求不小于某数的最小整数,向上取整"<<d<<endl;
//求 x 的常用对数
E=100;
E=log(E);
cout<<"E 的以 e 为底的对数为:"<<E<<endl;
//求 e 的 x 次方
f=exp(E);
cout<<"e 的 E 次方"<<f<<endl;
//求 x 的 y 次方
g=pow(3,4);
cout<<"3 的 4 次方为:"<<g<<endl;
//三角、反三角函数
h=PI;
cout<<sin(h/6)<<" "<<tan(h/4)<<endl;
cout<<asin(0)<<" "<<asin(-0.3)<<endl;
// 四舍五入
cout << "round(10.45753) = " << round(10.45753) << endl;
return 0;
}

将原代码输入编译器中,根据错误指示对代码进行以下调试:

  1. 引用头文件math.h以实现fabs等函数的使用
  2. 对变量afabs,bsqrt进行声明

修改后代码如下:

#include<iostream>
using namespace std;
#include<math.h>
#define PI 3.1415926;
int main()
{
double a,b,c,d,E,f,g,h,i,j,bsqrt,afabs;
// 取绝对值
cout << "abs(-100.01) = " << abs(-100.01) << endl;
//求实数的绝对值
a= - 1.82021;
afabs =fabs(a);
cout<<"求实数的绝对值:"<<a<<endl;
//求正数的平方根
b=6.6;
bsqrt =sqrt(b);
cout<<"求实数的平方根:"<<b<<endl;
//求不大于某数的最大整数,向下取整
c=2.3;
c=floor(c);
cout<<"不大于某数的最大整数,向下取整:"<<c<<endl;
//求不小于某数的最小整数,向上取整d=4.3;
d=ceil(d);
cout<<"求不小于某数的最小整数,向上取整"<<d<<endl;
//求 x 的常用对数
E=100;
E=log(E);
cout<<"E 的以 e 为底的对数为:"<<E<<endl;
//求 e 的 x 次方
f=exp(E);
cout<<"e 的 E 次方"<<f<<endl;
//求 x 的 y 次方
g=pow(3,4);
cout<<"3 的 4 次方为:"<<g<<endl;
//三角、反三角函数
h=PI;
cout<<sin(h/6)<<" "<<tan(h/4)<<endl;
cout<<asin(0)<<" "<<asin(-0.3)<<endl;
// 四舍五入
cout << "round(10.45753) = " << round(10.45753) << endl;
return 0;
}

 编译运行得

四.实验心得

通过本次实验,我了解并初步掌握了sizeof()、setw()等函数的用法,同时加深了对运算符的优先级的理解,并且会调用一些常见的数学函数库,例如math.h,并掌握了变量赋值的方法,掌握不同的类型数据之间运算的类型转换规则,理解自动类型转换和会使用强制类型转换。具体心得在各个实验之后有列出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tt*tt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值