编写一个程序,用同一函数名对圆、矩形和梯形求面积,参数自行设置,要求所有输入输出在主函数内进行。
#include <iostream>
using namespace std;
// 函数名:Area(radius)
// 参数:radius 圆的半径
// 返回值:圆的面积
double Area(double radius) {
return 3.14 * radius * radius;
}
// 函数名:Area(width, height)
// 参数:width 矩形的宽,height 矩形的高
// 返回值:矩形的面积
double Area(double width, double height) {
return width * height;
}
// 函数名Area(width, height, depth)
// 参数:width 梯形的上底,height 梯形的高,depth 梯形的下底
// 返回值:梯形的面积
double Area(double width, double height, double depth) {
return (width * depth) * height / 2;
}
int main() {
double radius, width, height;
cout << "请输入圆的半径 (单位:米):";
cin >> radius;
double area = Area(radius);
cout << "圆的面积是:" << area << endl;
double width, height;
cout << "请输入矩形的宽和高 (单位:米):";
cin >> width >> height;
double area = Area(width, height);
cout << "矩形的面积是:" << area << endl;
double depth, height, width;
cout << "请输入梯形的上底、高和下底:";
cin >> depth >> height >> width;
double area = Area(width, height, depth);
cout << "梯形的面积是:" << area << endl;
return 0;
}
#include <stdio.h>
// 函数声明
double calculateArea(double radius);
double calculateArea(double length, double width);
double calculateArea(double upper, double lower, double height);
int main() {
int shape;
double area;
// 获取图形类型
printf("请选择图形类型:\n");
printf("1. 圆形\n");
printf("2. 矩形\n");
printf("3. 梯形\n");
printf("请输入数字选择:");
scanf("%d", &shape);
// 计算面积
switch (shape) {
case 1:
double radius;
printf("请输入圆的半径:");
scanf("%lf", &radius);
area = calculateArea(radius);
printf("圆形的面积为:%.2f\n", area);
break;
case 2:
double length, width;
printf("请输入矩形的长度和宽度,用空格分隔:");
scanf("%lf %lf", &length, &width);
area = calculateArea(length, width);
printf("矩形的面积为:%.2f\n", area);
break;
case 3:
double upper, lower, height;
printf("请输入梯形的上底、下底和高,用空格分隔:");
scanf("%lf %lf %lf", &upper, &lower, &height);
area = calculateArea(upper, lower, height);
printf("梯形的面积为:%.2f\n", area);
break;
default:
printf("不支持的图形类型!\n");
break;
}
return 0;
}
// 计算圆形面积的函数
double calculateArea(double radius) {
return 3.14159 * radius * radius;
}
// 计算矩形面积的函数
double calculateArea(double length, double width) {
return length * width;
}
// 计算梯形面积的函数
double calculateArea(double upper, double lower, double height) {
return (upper + lower) * height / 2.0;
}
首先比较链表和顺序表的总体差异:
链表是含有头结点,且一般头结点不存储数据或只存储长度等附加信息。尾结点存储数据且尾结点的指针域指向空。实现方法多为对已经定义的结构体指针进行动态分配并作为头结点,之后再进行各类操作。
引用https://blog.csdn.net/oqqHuTu12345678/article/details/52677935中的总结:
其实若有足够多的结构体,无需动态分配也可以创建链表,但这违背了动态扩展的初衷,另外,直接在全局定义的结构体,存储在静态存储区;在函数内定义的结构体,存储在栈区;而使用malloc来申请空间的结构体,存储在堆空间中。链表一般都放在堆空间中。
静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。
顺序表含有头结点与尾结点,且头尾结点皆存储数据。实现方法为对已经定义的结构体中的指针变量进行动态分配。
接下来我们分别了解下顺序表和链表中栈与队列的异同。
1.顺序栈
实现方法:其定义的结构体(设结构体名为S)中普遍包含base与top这两个指针变量(base作为栈底,top作为栈顶),一般对S.base进行动态分配,而base存储数据,top指向栈顶元素的下一个空间,无数据。(这样做方便通过判定top=base是否成立,来判断是否空栈)
2.顺序队列
由于其先进先出的特点,不同于栈,队列的顺序实现其实是一种循环队列。
实现方式:对结构体中(设名为Q)的base指针进行动态分配,而队头front与队尾rear,则以int形式来表示,即单纯看作一个记号来充当“指针”,而非真正的指针变量。此外,不同于栈可以通过top=base的判定来进行空栈判断,顺序队列由于其循环的特性,满栈时front=rear同样成立。为了避免混淆,通常牺牲一个空间来进行判定,即队列Q的最大存储数据量为实际申请量-1(此处不考虑malloc可能额外申请的空间)
3.链栈
实现方法同链表,但是其头结点是有数据的。另外,链栈的指针next是从栈顶指向栈底的,这意味这在初始化函数中需要先定义栈顶作为"第一个"结点。与逻辑上“先为栈底元素开空间”的想法不同。
4.链队列
链队列较为特殊,由于结构体Q中只存在数据及表示结点之间关系的指针next,头指针和尾指针需要在另一个结构体内定义,即总共需要两个结构体(或者也可以直接定义全局变量)且头结点无数据,尾结点有数据。
实现方法:对于头指针和尾指针进行动态分配(一开始指向同一地址),Q存储数据和指针域。
总结:不同于顺序表,顺序栈和顺序队列都是头结点有数据,尾结点无数据。而链队列与链表的头尾结点特点基本一致,都是头结点不存而尾结点存,但链队列任一结点都存储数据。
本文参考栈与队列的特点基于学校教材,供交流复习使用,若有理解不到位或错误处,希望各位在评论区指正。
解决方案:
根据题目要求,需要编写一个能够计算圆、矩形和梯形面积的程序,使用同一个函数名来实现对不同图形的面积计算,但需要在函数内部根据不同的形状进行相应的计算。以下为解决方案:
double calculateArea(int type, double... params);
其中,type表示图形的类型,如0表示圆形,1表示矩形,2表示梯形;params为图形的参数,具体根据不同的图形类型来赋值。使用可变参数(...表示)来支持不同参数个数的图形计算。
double calculateArea(int type, double... params) {
double area = 0.0;
switch(type) {
case 0: // 圆形计算
area = 3.1415926 * params[0] * params[0];
break;
case 1: // 矩形计算
area = params[0] * params[1];
break;
case 2: // 梯形计算
area = (params[0] + params[1]) * params[2] / 2.0;
break;
default: // 错误类型就返回0
break;
}
return area;
}
在函数体内使用switch语句来根据type参数的值不同进行不同图形的面积计算,最后返回计算结果。此处使用默认的0值来表示错误类型的返回结果。
int main() {
int type;
double params[3];
printf("请输入图形类型: 0-圆形 1-矩形 2-梯形\n");
scanf("%d", &type);
printf("请输入图形参数:\n");
for(int i = 0; i < 3; i++) {
scanf("%lf", ¶ms[i]);
}
double area = calculateArea(type, params[0], params[1], params[2]);
printf("图形面积为: %.2lf\n", area);
return 0;
}
在主函数内先通过输入函数将图形类型type和图形参数params读入,然后调用calculateArea函数进行面积计算,并输出计算结果。
完整代码如下:
#include <stdio.h>
// 计算图形面积的函数,type表示图形类型,如0表示圆形,1表示矩形,2表示梯形
double calculateArea(int type, double... params) {
double area = 0.0;
switch(type) {
case 0: // 圆形计算
area = 3.1415926 * params[0] * params[0];
break;
case 1: // 矩形计算
area = params[0] * params[1];
break;
case 2: // 梯形计算
area = (params[0] + params[1]) * params[2] / 2.0;
break;
default: // 错误类型就返回0
break;
}
return area;
}
int main() {
int type;
double params[3];
printf("请输入图形类型: 0-圆形 1-矩形 2-梯形\n");
scanf("%d", &type);
printf("请输入图形参数:\n");
for(int i = 0; i < 3; i++) {
scanf("%lf", ¶ms[i]);
}
double area = calculateArea(type, params[0], params[1], params[2]);
printf("图形面积为: %.2lf\n", area);
return 0;
}
通过以上方案,可以实现对不同图形面积计算的支持,并且使用同一个函数名来简化函数调用过程。