实验内容:从文本文件获取程序的输入,利用重载函数实现圆、矩形、梯形、三角形的面积计算
# 前言
1、重载函数通常用来在同一个作用域内,用同一个函数名,命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处;
2、重载函数允许不同的函数使用相同的名字,这使得完成类似的任务时可以使用相同的函数名,注意:重载函数的参数个数,参数类型或参数顺序三者中必须有一个不同;
3、编译器在编译.c文件时,只会给函数进行简单的重命名,具体的方法是给函数名之前加上”_”,所以加入两个函数名相同的函数在编译之后的函数名也照样相同,调用者会因为不知道到底调用哪个而出错,因此c语言不能实现函数重载。
一、输入格式:
单个字符[]参数1[]参数2[]…<回车换行>
说明:
(1) 以空格分隔,以回车换行结束一组输入,然后读取下一行输入,直至文件结束;
(2) 单个字符代表形状类型:C(圆形) 参数:半径
R(矩形) 参数:长、宽
L(梯形) 参数:上底、下底、高
T(三角形) 参数:底、高
(3) 若输入参数个数大于所需参数个数,则忽略多余的输入;若小于所需参数个数,则调用之前的输入值(若之前有输入)或0(若之前无输入);
(4) 圆形面积的计算,给出默认参数,输出单位圆的面积;
示例:
二、实验代码
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
#define pi 3.14159265
double area(double radius); //C圆形
double area(double a,double b); //R矩形
double area(double a,double b,double h); //L梯形
double area(double a,double h,int c); //T三角形
int main()
{
ifstream infile;
infile.open("Test.txt");
if(infile.fail()){
cout<<"*输入文件打开失败*"<<endl;return -1;}
if(infile.good()){
cout<<"*输入文件打开正常*"<<endl;}
if(infile.bad()){
cout<<"*输入文件打开错误*"<<endl;return -1;}
char ch;
double radius,a,b,h,c;
double copy_1, copy_2, copy_3;
do{
ch=infile.get();
if(ch=='C')
{
infile>>radius;
copy_1 = radius;
copy_2 = 0;
copy_3 = 0;
cout<<"圆形的面积="<<area(radius)<<endl;
}
else if(ch=='R')
{
infile>>a>>b;
copy_1 = a;
copy_2 = b;
if(infile.fail()) //返回非0值表示操作失败,当输入参数小于所需参数个数,调用上一轮的输入
{
b=copy_2;
infile.clear(); //初始化流状态
}
copy_3 = 0;
cout<<"矩形的面积="<<area(a,b)<<endl;
}
else if(ch=='L')
{
infile>>a;
infile>>b;
if(infile.fail())
{
b=copy_2;
infile.clear();
}
infile>>h;
if(infile.fail())
{
h=copy_3;
infile.clear();
}
copy_1 = a;
copy_2 = b;
copy_3 = h;
cout<<"梯形的面积="<<area(a,b,h)<<endl;
}
else if(ch=='T')
{
infile>>a;
copy_1 = a;
infile>>h;
if(infile.fail())
{
h=copy_2;
infile.clear();
}
infile>>c;
if(infile.fail())
{
c=copy_3;
infile.clear();
}
copy_2 = h;
copy_3 = c;
cout<<"三角形的面积="<<area(a,h,0)<<endl;
}
}while(ch!=EOF);
infile.close();
return 0;
}
double area(double radius)//C
{
return pi*radius*radius;
}
double area(double a,double b)//R
{
return a*b;
}
double area(double a,double b,double h)//L
{
return (a+b)*h*0.5;
}
double area(double a,double h,int c)//T
{
return 0.5*a*h;
}
三、实验结果
结果分析
①先判断计算哪个类型的面积,以空格分隔,以回车换行结束一组输入,然后读取下一行输入,直至文件结束,结果输出每轮计算结果。
②若输入参数个数大于所需参数个数,则只使用所需的参数计算,忽略多余的输入,但每轮依然copy三个输入参数(不足三个的补0);
若输入参数个数小于所需参数个数,则调用上一轮的输入值或0,当没有输入足够参数,infile.fail() 返回非0值表示操作失败,此时将上一轮对应位置的数值赋值到本轮相应位置,例如:三角形(T)输入3.5 6.6 1,参数使用3.5 6.6,下一轮三角形(T)只输入3.1,参数使用3.1 6.6进行调用,再下一轮梯形(L)只输入3.4,参数使用3.4 6.6 1