面向对象程序设计C++:函数的重载和变量的作用域

实验内容:从文本文件获取程序的输入,利用重载函数实现圆、矩形、梯形、三角形的面积计算


# 前言

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

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值