实验五 结构体和指针

1 实验目的
(1)学习如何使用结构体的指针作为函数的参数,通过传指针(本质也是传值)的方式,在被调用函数中修改主调函数中的多个结构体变量的方法。
(2)学习如何把逻辑结构相同的部分抽象为函数,以提高代码的可重用性,达到提高程序可维护性的目的。
2 实验内容
2.1 模拟画图功能
(1)问题描述
模拟计算机的画图功能,能够模拟画圆和长方形的功能。程序主要功能如下:
① 提供一个如下的主菜单。


  1. Circle (圆)
  2. Rectangle (长方形)
  3. Exit (退出)

② 不断接受用户的选择(整数),直至用户选择0为止。如果用户输入了系统尚未支持的选择(比如3),则给出相应的提示信息,并继续选择。
③ 如果用户选择了圆或长方形,则进一步提示用户输入两个点,分别称为起点和终点,如下图所示。坐标仅考虑正整数的情况。要求终点的坐标大于起点的坐标,否则给出相关的提示信息并返回主菜单。

图1. 显示屏的坐标系与起点、终点位置
④ 模拟画出圆和长方形。画圆时,要计算startPoint和endPoint所构成的正方形的内切圆的圆心和半径。若startPoint和endPoint所构成的不是正方形,则给出相关的提示信息并返回主菜单。
(2)问题要求
① 定义一个Point结构体,用来表示显示屏上的点;
② 实现以下函数(图2),使得主程序(图3)输出图4中的结果。

图2. 需要实现的函数雏形
主程序如图3所示。

图3. 主程序
运行结果如图4所示。

图4. 运行结果
注意,上述结果未能列出所有可能的执行情况。请认真思考,相关的提示信息应该分别在由哪些函数中输出?
源代码:

#include<iostream>
using namespace std;

struct Point {
	int x;
	int y;
};



void displayMenu() {
	cout << "***********************************" << endl;
	cout << "		1. Circle(圆)" << endl;
	cout << "		2. Rectangle(长方形)" << endl;
	cout << "		0. Exit(退出)" << endl;
	cout << "***********************************" << endl;
	cout << "Please select the shape: ";
}

void getTwoPoints(struct Point* startP, struct Point* endP) {
	cout << "Please input the coordinate(x,y) of the start point: ";
	cin >> startP->x;
	cin >> startP->y;
	cout << "Please input the coordinate(x,y) of the end point: ";
	cin >> endP->x;
	cin >> endP->y;
}

void printPoint(struct Point* P) {
	cout << "(" << P->x << "," << P->y << ")" ;
}


void drawCircle(struct Point* startP, struct Point* endP) {
	struct Point center; // 圆心坐标
	int radius; // 半径

	if ((endP->x - startP->x) != (endP->y - startP->y))
		cout << "Not a circle, Select again\n";
	else {
		center.x = (startP->x + endP->x)/2; // 计算圆心横坐标
		center.y = (startP->y + endP->y)/2; // 计算圆心纵坐标
		radius = (endP->x - startP->x)/2; // 计算半径

		// 模拟画圆
		cout << "Draw a circle at center ";
		printPoint(&center);
		cout << " with radius " << radius << endl;
	}

}


void drawRectangle(struct Point* startP, struct Point* endP) {
	int width, height;

	width = endP->x - startP->x; // 长
	height = endP->y - startP->y; // 宽

	// 模拟画长方形
	cout << "Draw a rectangle at topleft ";
	printPoint(startP);
	cout << ", whose width is " << width << " and height is " << height << endl;

}


int main() {
	int choice = 1; // 用户选择

	struct Point startP; // 起点
	struct Point endP; // 终点

	while (choice) {
		displayMenu();
		cin >> choice;

		switch (choice) {
		case 1:
			getTwoPoints(&startP, &endP);
			drawCircle(&startP, &endP);
			break;
		case 2:
			getTwoPoints(&startP, &endP);
			drawRectangle(&startP, &endP);
			break;
		case 0:
			cout << "Good Bye!\n";
			break;
		default:
			cout << "Error Input! Please select again!\n";
			break;
		}
	}
}

2.2	计算所得税
(1)问题描述
一个国家计算所得税的规则由如下的不确定多条规则构成:
 
其中,n是规则的条数,由用户输入。对于任意的 , 表示个人收入中在区间 的部分的税率,它是一个整数,代表百分之几。 为税率起征点, 。
(2)问题要求
① 请定义一个结构体,用来存放一条规则。
② 根据用户输入的规则条数,使用结构体的数组存放所有的规则。
③ 定义一个子函数inputRules(struct Rule rules[], int n),根据用户输入的规则条数,从键盘得到所有规则,存放至数组。
④ 定义一个子函数计算所得税。
// 参数income表示个人收入
double computeTax(struct Rule rules[], int n, int income);
⑤ 在主函数中,一次录入规则后,可以循环计算任意多个人的所得税,直到输入的收入为-1为止。
⑥ 请至少测试以下情况
	输入规则后,在录入收入时,直接录入-1;
	收入为0;
	收入小于 ;
	收入等于 的各种情况;
	收入大于 ;
	收入在 和 之间的情况。
(3)程序运行要求
程序的一次运行结果如下:
①
请输入规则的条数:3
请输入第 1 条规则:800   3
请输入第 2 条规则:2000  4
请输入第 3 条规则:5000  3
②
纳税规则如下:
纳税线        税率
800          3
2000          4
5000          3
③
请输入您的收入:0
您的收入是:0,应缴所得税:0.00元。
④
请输入您的收入:800
您的收入是:800,应缴所得税:0.00元。
⑤
请输入您的收入:801
您的收入是:801,应缴所得税:0.03元。
⑥
请输入您的收入:2000
您的收入是:2000,应缴所得税:36.00元。
(2000 – 800) × 3 / 100
⑦
请输入您的收入:1999
您的收入是:1999,应缴所得税:35.97元。
⑧
请输入您的收入:5000 
您的收入是:5000,应缴所得税:156.00元。
[(2000 – 800) × 3 + (5000 – 2000) × 4] / 100
请输入您的收入:10000
您的收入是:10000,应缴所得税:306.00元。
[(2000 – 800) × 3 + (5000 – 2000) × 4 + (10000 – 5000) × 3] / 100
⑨
请输入您的收入:-1
再见
请按任意键继续···

```cpp
#include<iostream>
using namespace std;

struct Rule {
	int M;
	int R;
};

void inputRules(struct Rule rules[], int n) {
	for (int i=0; i < n; i++) {
		printf("请输入第%d条规则:", i + 1);
		cin >> rules[i].M >> rules[i].R;
	}
}

void outputRules(struct Rule rules[], int n) {
	cout << "\t纳税线\t\t税率" << endl;
	for (int i = 0; i < n; i++) {
		cout << "\t" << rules[i].M << "\t\t\t" << rules[i].R << endl;
	}
}

double computeTax(struct Rule rules[], int n, int income) {
	double sum = 0;
	if (income <= rules[0].M)
		return sum;
	else {
		if (income >= rules[n - 1].M) {
			for (int i = 0; i < n - 1; i++) {
				sum += 0.01 * (double)((rules[i + 1].M - rules[i].M) * rules[i].R);
			}
			sum += 0.01 * (double)((income - rules[n - 1].M) * rules[n - 1].R);
			return sum;
		}
		for (int i = 0; i < n - 1; i++) {
			if (income >= rules[i].M && income < rules[i + 1].M) {
				for (int k = 0; k < i; k++) {
					sum += 0.01 * (double)((rules[k + 1].M - rules[k].M) * rules[k].R);
				}
				sum += 0.01 *(double)((income - rules[i].M) * rules[i].R) ;
				return sum;
			}
			
		}
	}

}



int main() {
	int count;
	int income;
	struct Rule rules[20];
	cout<<"请输入规则的条数:";
	cin >> count;
	inputRules(rules, count);
	outputRules(rules, count);
	cout << "请输入您的收入:";
	cin >> income;
	while (income != -1) {
		cout<<"您的收入是:"<<income<<"应缴所得税:"<< computeTax(rules, count, income)<<endl;
		cout << "请输入您的收入:";
		cin >> income;
	}
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一份实验报告,主要涉及指针结构。 ## 实验名称:指针结构 ## 实验目的 - 理解指针结构的概念 - 学会使用指针结构进行编程 - 掌握指针结构的常见用法 ## 实验内容 ### 1. 指针 指针是一种特殊的变量,它存储了一个地址,该地址指向内存中的另一个变量。指针可以用于传递变量的地址,从而实现函数间的参数传递和数据共享。 指针的声明方式为: ```c type *pointer_name; ``` 其中,`type`表示指针所指向的变量类型,`pointer_name`表示指针的名称。 指针的初始化方式为: ```c type var_name; type *pointer_name = &var_name; ``` 其中,`&`表示取地址符,`var_name`表示要指向的变量名称。 指针的使用方式为: ```c type var_name; type *pointer_name = &var_name; *pointer_name = value; ``` 其中,`*`表示解引用符,`value`表示要赋给变量的值。 ### 2. 结构 结构是一种用户自定义的数据类型,可以包含多个不同类型的成员变量。结构的声明方式为: ```c struct struct_name { type member1; type member2; ... }; ``` 其中,`struct_name`表示结构的名称,`member1`和`member2`表示结构的成员变量,可以是任意类型。 结构的初始化方式为: ```c struct struct_name var_name = {value1, value2, ...}; ``` 其中,`value1`和`value2`表示结构的成员变量的值。 结构的使用方式为: ```c struct struct_name var_name = {value1, value2, ...}; var_name.member1 = new_value1; var_name.member2 = new_value2; ``` 其中,`new_value1`和`new_value2`表示要赋给成员变量的新值。 ## 实验结果 本次实验我们使用指针结构编写了一个程序,实现了以下功能: 1. 定义了一个名为`student`的结构,包含学生的姓名、年龄和成绩三个成员变量。 2. 使用指针动态分配了一个`student`结构对象,并对其进行初始化。 3. 使用指针访问结构成员变量,并输出结果。 4. 释放动态分配的内存。 程序代码如下: ```c #include <stdio.h> #include <stdlib.h> struct student { char name[20]; int age; float score; }; int main() { struct student *p = (struct student *)malloc(sizeof(struct student)); if (p == NULL) { printf("Memory allocation failed!\n"); return -1; } strcpy(p->name, "Jack"); p->age = 18; p->score = 90; printf("Name: %s\n", p->name); printf("Age: %d\n", p->age); printf("Score: %.2f\n", p->score); free(p); return 0; } ``` ## 实验结论 本次实验我们深入学习了指针结构的概念,并掌握了指针结构的常见用法。通过实现一个简单的程序,我们进一步加深了对指针结构的理解,为以后的编程工作打下了坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值