C++测绘程序设计课后练习题2编程
- 一、前言
- 二、具体内容
- 练习题2第5题: 编写一个非main函数,用动态数组保存用户键盘输入的数据,计算输入数据的平均值与中误差。
- 第7题:编写一个函数(利用math函数库中的数学函数)计算下面式子的值。
- 第8题:使用结构体定义圆柱体,成员变量为其半径和高。以圆柱体的引用作为形参,定义两个函数,分别计算圆柱体的表面积和体积。编写main()函数,测试这两个函数。
- 第9题:编写学生结构体(内容为姓名、学号和两门课程成绩的数组),为学生结构体重载提取符“>>”和插入符“<<”,在main函数中定义一个动态的学生数组,通过for循环输入学生数组的数据并输出到文本文件“学生s.txt”中.
- 第10题:编写程序练习C语言的三种循环结构(do,while,for)。
- 第11题:编写程序练习C语言的选择结构(if和switch-case)。
- 第12题:编写程序定义参数类型和个数不同的乘积计算重载函数,编写main函数测试这些重载函数。在重载函数中使用缺省参数值方法,分析可能导致的程序应用问题。
- 第13题:编写两个函数,其形参分别使用引用与指针,比较两者在应用上的区别。
- 第14题:修改第8题程序,定义一个圆柱体动态数组,动态数组的阶数与每个圆柱体的参数由键盘输入,计算每个圆柱体的表面积与体积并向屏幕输出计算结果。
一、前言
为了记录自己学习 C++测绘程序设计(长安大学编) 而创作,代码仅供参考,如有问题请多赐教。(Visual Studio 2019)
二、具体内容
练习题2第5题: 编写一个非main函数,用动态数组保存用户键盘输入的数据,计算输入数据的平均值与中误差。
#include<iostream>//从C++标准库里直接提取输入输出iostream头文件
using namespace std;//开辟命名空间,不用再担心重定义现象
void calculate(int n, double A[])//计算函数声明和定义
{
double average=0, m=0, sum=0, s=0;//初始化为0
for (int i = 0; i<n; i++)//for循环求和
{
sum += A[i];
}
average = sum / n;
cout << "该数组的平均数为:" << average;
for (int i = 0; i<n; i++)//for循环求方差
{
s += pow(average - A[i], 2);
}
m = sqrt(s);
cout << "该数组的中误差为:" << m;
}
int main()
{
int n ;//用户自定义数组元素个数
cout << "请输入数组个数:" << endl;
cin >> n;
double* A = new double[n] ;//动态内存分配创建数组
for (int i = 0; i < n; i++)//for循环依次输入每个元素的值
{
cout << "请输入第" << i+1 << "个数字" << endl;
cin >> A[i];
}
calculate(n,&A[0]);//用A或者&A[0],而不是用&A[n]
delete[]A;//不要忘记释放内存
return 0;
}
第7题:编写一个函数(利用math函数库中的数学函数)计算下面式子的值。
要求通过限制条件控制当x不满足计算条件时直接终止程序。需要应用的库函数分别为cos()、sin()、tan()、powf()、fabs()和sqrt()。编写main函数,输入一个角度的弧度值,调用函数计算其上式的值。
#include<iostream>
#include<cmath>
using namespace std;
float calculate(float x)
{
float result;
if (cos(5 / x) == 0 || x == 0)//记住x!=0
{
cout << "错误:x不满足计算条件!" << endl;
exit(1);//exit(0)表示程序正常退出,其他参数为异常
}
else
{
result = sqrt(fabs(powf(cos(x), 3) * powf(sin(2 * x), 5) - tan(5 / x)));//pow()和powf()为double和float之分
}
return result;
}
int main()
{
float x;
cout << "请输入一个角度的弧度值:" << endl;
cin >> x;
cout<<"计算结果为:"<<calculate(x);
}
第8题:使用结构体定义圆柱体,成员变量为其半径和高。以圆柱体的引用作为形参,定义两个函数,分别计算圆柱体的表面积和体积。编写main()函数,测试这两个函数。
#include<iostream>
double PI=3.14159265;
using namespace std;
struct YZT
{
double r, h;
};
YZT YZT1;
double SurfaceCalculate(YZT YZT1)
{
double s=0;
s = YZT1.r * YZT1.h * 2 * PI + YZT1.r * YZT1.r * 2 * PI;
return s;
}
double VolumeCaculate(YZT YZT1)
{
double v=0;
v = YZT1.r * YZT1.r * YZT1.h * PI;
return v;
}
int main()
{
YZT1.r = 3;
YZT1.h = 4;
cout << "圆柱体半径为:" << YZT1.r << "高为:" << YZT1.h << endl <<
"表面积为:" << SurfaceCalculate(YZT1) << "体积为:" << VolumeCaculate(YZT1) << endl;
}
第9题:编写学生结构体(内容为姓名、学号和两门课程成绩的数组),为学生结构体重载提取符“>>”和插入符“<<”,在main函数中定义一个动态的学生数组,通过for循环输入学生数组的数据并输出到文本文件“学生s.txt”中.
#include<iostream>
#include<fstream>
using namespace std;
struct student
{
string name;
int num;
double core[2];
};
istream& operator>>(istream& in, student &stu)
{
in >> stu.name >> stu.num;
for (int i = 0; i < 2; i++)
{
in >> stu.core[i];
}
return in;
}
ostream& operator << (ostream& out, student &stu)//传student &stu而不是student stu
{
out << stu.name << "\t" << stu.num << "\t";
for (int i = 0; i < 2; i++)
{
out << stu.core[i]<<" ";
}
out << endl;
return out;
}
int main()
{
int n = 0;
cout << "请输入学生人数n:" << endl;
cin >> n;
student* stu = new student[n];
for (int i = 0; i<n;i++)
{
cout << "请依次输入第"<<i+1<<"学生姓名、学号和两门课的成绩" << endl;
cin >> stu[i];
}
ofstream ou;
ou.open("D:\\C++测绘程序设计\\编程作业\\test2\\学生s.txt",ios::_Nocreate);
if (!ou)
{
cout << "文件打开失败" << endl;
return -1;
}
for (int i = 0; i < n; i++)
{
ou << stu[i];
}
ou.close();
delete[]stu;
return 0;
}
第10题:编写程序练习C语言的三种循环结构(do,while,for)。
#include<iostream>
using namespace std;
int sum = 0, i = 0;
int A[101];
int dowhileloop()
{
do
{
A[i] = i ;
i++;
} while (i<101);
i = 0;
do
{
if (A[i] % 2 == 0)
{
sum += A[i];
}
i++;
} while (i < 101);
return sum;
}
int whileloop()
{
while (i < 101)
{
A[i] = i;
i++;
}
while (i < 101)
{
while (A[i] % 2 == 0)
{
sum += A[i];
}
i++;
}
return sum;
}
int forloop()
{
for (i; i < 101; i++)
{
A[i] = i;
}
for (i; i < 101; i++)
{
if (A[i] % 2 == 0)
{
sum += A[i];
}
}
return sum;
}
int main()
{
cout << "0-100偶数和为" << dowhileloop() << endl;
cout << "0-100偶数和为" << whileloop() << endl;
cout << "0-100偶数和为" << forloop() << endl;
return 0;
}
第11题:编写程序练习C语言的选择结构(if和switch-case)。
#include<iostream>
using namespace std;
int getrand(int min, int max)
{
return(rand() % (max - min + 1)) + min;
}
int main()
{
int a=getrand(1,7);
if (a % 2 == 0)
{
cout << "随机数a为偶数" << endl;
}
else
{
cout << "随机数a为奇数" << endl;
}
switch (a)
{
case 1:cout << "Monday"; break;
case 2:cout << "Tuesday"; break;
case 3:cout << "Wednesday"; break;
case 4:cout << "Thursday"; break;
case 5:cout << "Friday"; break;
case 6:cout << "Saturday"; break;
case 7:cout << "Sunday"; break;
}
return 0;
}
第12题:编写程序定义参数类型和个数不同的乘积计算重载函数,编写main函数测试这些重载函数。在重载函数中使用缺省参数值方法,分析可能导致的程序应用问题。
#include <iostream>
using namespace std;
int test(int a, int b = 1) {
return a * b;
}
double test(double a, double b = 1.0, double c = 1.0) {
return a * b * c;
}
int main() {
cout << "test(2) = " << test(2) << endl;
cout << "test(2, 3) = " << test(2, 3) << endl;
cout << "test(2.0) = " << test(2.0) << endl;
cout << "test(2.0, 3.0) = " << test(2.0, 3.0) << endl;
cout << "test(2.0, 3.0, 4.0) = " << test(2.0, 3.0, 4.0) << endl;
return 0;
}
/*使用缺省参数值方法,可以方便地定义参数个数不同的重载函数。但是,缺省参数值可能会导致一些程序应用问题,例如:
1、如果重载函数的参数类型相同,而且缺省参数值也相同,那么程序可能会调用错误的函数,导致结果不正确。
2、如果重载函数的参数类型不同,但缺省参数值相同,那么程序可能会产生二义性,编译器无法确定应该调用哪个函数,导致编译错误。
因此,在使用缺省参数值方法时,需要慎重考虑函数的设计和调用方式,以避免以上问题。*/
第13题:编写两个函数,其形参分别使用引用与指针,比较两者在应用上的区别。
#include <iostream>
using namespace std;
void test1(int& x)
{
x = x + 1;
}
void test2(int* x)
{
*x = *x + 1;
}
int main()
{
int a = 0;
cout << "a = " << a << endl;
test1(a);
cout << "a = " << a << endl;
test2(&a);
cout << "a = " << a << endl;
return 0;
}
/*这两个函数的作用相同,都是将形参加1。在main函数中,首先定义了一个变量a,并输出其初始值。然后分别调用了这两个函数,将变量a加1,并输出其结果。
使用引用作为函数形参的主要优点是语法简洁,可以像使用变量一样使用形参。同时,使用引用可以避免指针操作中可能产生的空指针和非法指针问题。
使用指针作为函数形参的主要优点是可以更灵活地控制变量的访问和修改,可以通过指针指向变量的地址来进行操作。
在实际应用中,需要根据具体情况选择使用引用或指针作为函数形参。如果需要直接操作变量,或者函数形参需要修改变量的值,
则通常使用引用。如果需要更灵活地控制变量的访问和修改,则通常使用指针。*/
第14题:修改第8题程序,定义一个圆柱体动态数组,动态数组的阶数与每个圆柱体的参数由键盘输入,计算每个圆柱体的表面积与体积并向屏幕输出计算结果。
#include<iostream>
double PI = 3.14159265;
using namespace std;
struct YZT
{
double r, h;
};
double SurfaceCalculate(YZT &YZT)
{
double s = 0;
s = YZT.r * YZT.h * 2 * PI + YZT.r * YZT.r * 2 * PI;//错误原因#define PI的问题
return s;
}
double VolumeCaculate(YZT &YZT)
{
double v = 0;
v = YZT.r * YZT.r * YZT.h * PI;
return v;
}
int main()
{
int n;
cout << "请输入圆柱体个数n:" << endl;
cin >> n;
YZT * A = new YZT[n];
for (int i = 0; i < n; i++)
{
cout << "请输入第" << i + 1 << "个圆柱体的半径r和高h" << endl;
cin >> A[i].r >> A[i].h;
}
for (int i = 0; i < n; i++)
{
cout << "圆柱体半径为:" << A[i].r << "高为:" << A[i].h << endl <<
"表面积为:" << SurfaceCalculate(A[i]) << "体积为:" << VolumeCaculate(A[i]) << endl;
}
delete[]A; //别忘记释放内存空间!
return 0;
}
后续持续更新中…