实验一 C++基础
1.1 实验目的
1.进一步了解和熟悉VC++6.0开发环境,学会在VC++6.0环境下调试程序;
2.熟悉C++中简单的标准输入输出函数的实用;
3.理解const修饰符的作用,并学会应用const修饰符;
4.理解内置(内联)函数的优缺点并学会使用内置函数;
5.理解和使用函数重载以及带默认参数的函数;
6.使用new和delete进行动态内存管理;
7.理解和使用引用。
1.2 实验内容
1.2.1 程序阅读
1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include <iostream>
int max_def(int x, int y)
{
return (x>y?x:y);
}
int max_def(int x, int y, int z)
{
int temp = 0;
return (temp=(x>y?x:y))>z?temp:z;
}
double max_def(double x, double y)
{
return (x>y?x:y);
}
int main()
{
int x1 = 0;
int x2 = 0;
double d1 = 0.0;
double d2 = 0.0;
x1 = max_def(5,6);
x2 = max_def(2,3,4);
d1 = max_def(2.1,5.6);
d2 = max_def(12.3,3.4,7.8);-----------------------------------------------------①
cout<<"x1="<<x1<<endl;
cout<<"x2="<<x2<<endl;
cout<<"d1="<<d1<<endl;
cout<<"d2="<<d2<<endl;--------------------------------------------------------②
return 1;
}
问题一:上述程序的输出结果是什么?
答:
x1=6
x2=4
d1=5.6
d2=12
问题二:哪些情况可以参与函数的重载?
答:多个重名函数的参数个数和参数类型不同。
问题三:①处调用的是哪个函数?
答:调用函数 int max_def(int x, int y, int z)
问题四:②处的输出结果为什么是d2=12,而不是d2=12.3?
答:d2的值为函数int max_def(int x, int y, int z)得出的,返回值为int型,故取整,丢失小数点后内容。
2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include <iostream>
int main()
{
int *p1 = new int; -----------------------------------------------------①
int *p2 = new int(0); -----------------------------------------------------②
char *p3 = new char[64]; -----------------------------------------------------③
return 1;
}
问题一:①、②、③处动态申请内存分别代表什么不一样的意思?
答:①处为给p1所在地址指向一个int型的内存空间,但不进行初始化。②处为给p2所在地址指向一个int型的内存空间,且初始化值为0。③处为给p3所在地址开始指向64个连续的char型内存空间,不进行初始化。
问题二:该程序存在什么隐患?改正该程序使隐患消除。
答:当p1申请失败时,无法成功,返回值为零。改正程序如下:
#include <iostream>
using namespace std;
int main()
{
int *p1;
p1 = new int;
int *p2;
p2 = new int(0);
char *p3;
p3 = new char[64];
return 1;
}
3.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include <iostream>
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int i = 5;
int j = 10;
cout<<"Before swap: i="<<i<<",j="<<j<<endl;
swap(i,j); -----------------------------------------------------①
cout<<"After the first swap: i="<<i<<",j="<<j<<endl;
swap(&i,&j); -----------------------------------------------------②
cout<<"After the second swap: i="<<i<<",j="<<j<<endl;
return 1;
}
问题一:上述程序的输出结果是什么?
答: Before swap: i=5,j=10
After the first swap: i=5,j=10
After the second swap: i=10,j=5
问题二:①处函数调用后并不能实现两个数的交换,而②处却可以,为什么?
答:①处为传值,使用void swap(int a, int b)函数,交换的a和b的地址值。②处为传地址,使用void swap(int *a, int *b)函数,交换的a和b的值。
问题三:②处调用的是哪个重载函数?
答:②处调用的void swap(int *a, int *b)函数。
1.2.2 程序设计
1.使用函数重载的方法定义两个同名函数,分别求出整形数平面间两点间距离和双精度平面间两点间距离,如果没有输入第二点的坐标则默认为圆点(0,0)。
答:
#include<iostream>
#include<cmath>
using namespace std;
int dis(int x1,int y1,int x2,int y2){
int ans=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return ans;
}
double dis(double x1,double y1,double x2,double y2){
double ans=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return ans;
}
int main(){
cout<<"请输入两个点的坐标,以空格分割"<<endl;
double x1,y1,x2=0,y2=0;
cin>>x1>>y1>>x2>>y2;
cout<<"整型数距离:"<<dis(int(x1),int(y1),int(x2),int(y2))<<endl;
cout<<"双精度距离:"<<dis(x1,y1,x2,y2)<<endl;
return 0;
}
2、设计一个函数:exchange(float x, float y, float z),当调用exchange(a,b,c)时,将a的内容赋值给b,b的内容赋值给c,c的内容赋值给a,要求采用引用的方式来实现。
答:
#include<iostream>
#include<cmath>
using namespace std;
void exchange(float &x,float &y,float &z){
float tmp=x;
x=z;
z=y;
y=tmp;
}
int main(){
cout<<"请输入三个数,以空格分割:";
float a,b,c;
cin>>a>>b>>c;
cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;
cout<<"调用exchange函数后:"<<endl;
exchange(a,b,c);
cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;
return 0;
}
1.3 思考题
1.自己设计一个程序,测试const的三种用法:指向常量的指针,常指针,指向常量的常指针。
答:
#include<iostream>
using namespace std;
int main(){
int x=1;
int y=2;
int * const p1=&x;//指针本身是常量,不可变
*p1=1;//指向内容可变
cout<<*p1<<endl;
const int * p2;//指针所指向的内容是常量,不可变
p2=&x;//指针本身可变
int const * p3;//指针所指向的内容是常量,不可变
p3=&y;//指针本身可变
cout<<*p2<<" "<<*p3<<endl;
const int * const p4=&x;//指针本身和指向的内容两者都不可变
cout<<*p4<<endl;
return 0;
}
2.编写一个函数,实现两个字符串变量的交换,要求参数用引用。
答:
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
void swap(string &s1,string &s2){
string tmp;
tmp=s1;
s1=s2;
s2=tmp;
}
int main(){
cout<<"请输入两个字符串,以空格分割:"<<endl;
string s1,s2;
cin>>s1>>s2;
cout<<"交换后变量为:"<<endl;
swap(s1,s2);
cout<<s1<<" "<<s2<<endl;
return 0;
}