当前位置: 首页 > article >正文

C语言第三十六弹--实现转移表的多种方法

使用C语言通过多种方法实现转移表

方法一、普通法

在这里插入图片描述

思路:如图实现多种操作,首先创建菜单,需要运行一次再判断条件,所以通过do{}while(); 循环来实现多次。有多种选择,使用switch case选择语句,再在对应case内容中实现相应算法即可。

1.创建菜单

 void menu()
{
	printf("************************\n");
	printf("************************\n");
	printf("****1.Sum    2.Sub******\n");
	printf("****3.Mul    4.Div******\n");
	printf("*****   0.退出    ******\n");
	printf("************************\n");
	printf("************************\n");
}

2.通过do{}while()x循环和switch{}case:选择语句进行操作实现

int main()
{
		int input = 1;
		int a = 0, b = 0;
		int ret = 0;
			do
			{
				menu();//调用菜单显示
				printf("请输入需要进行的计算模式:");
				scanf("%d",&input);
				switch (input)//选择对应操作 不同操作通过不同函数实现
				{
				case 1:
					printf("请输入两个操作数:");
					scanf("%d %d",&a,&b);
					Sum(a, b);
					break;
				case 2:
					printf("请输入两个操作数:");
					scanf("%d %d", &a, &b);
					Sub(a, b);
					break;
				case 3:
					printf("请输入两个操作数:");
					scanf("%d %d", &a, &b);
					Mul(a, b);
					break;
				case 4:
					printf("请输入两个操作数:");
					scanf("%d %d", &a, &b);
					Div(a, b);
					break;
				case 0:
					printf("已退出\r\n");
					break;
				default:
					printf("输入有误 请重新输入\n");
					break;
				}
			} while (input);
	return 0;
}

3.函数方法实现

 int  Sum(int x,int y)
{
	printf("%d\n",x+y);
}

int  Sub(int x, int y)
{
	printf("%d\n", x - y);
}

int Mul(int x, int y)
{
	printf("%d\n", x * y);
}

int  Div(int x, int y)
{
	printf("%d\n", x / y);
}

总代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

 void menu()
{
	printf("************************\n");
	printf("************************\n");
	printf("****1.Sum    2.Sub******\n");
	printf("****3.Mul    4.Div******\n");
	printf("*****   0.退出    ******\n");
	printf("************************\n");
	printf("************************\n");
}

 int  Sum(int x,int y)
{
	printf("%d\n",x+y);
}

int  Sub(int x, int y)
{
	printf("%d\n", x - y);
}

int Mul(int x, int y)
{
	printf("%d\n", x * y);
}

int  Div(int x, int y)
{
	printf("%d\n", x / y);
}
 
//普通法
int main()
{
		int input = 1;
		int a = 0, b = 0;
		int ret = 0;
			do
			{
				menu();
				printf("请输入需要进行的计算模式:");
				scanf("%d",&input);
				switch (input)
				{
				case 1:
					printf("请输入两个操作数:");
					scanf("%d %d",&a,&b);
					Sum(a, b);
					break;
				case 2:
					printf("请输入两个操作数:");
					scanf("%d %d", &a, &b);
					Sub(a, b);
					break;
				case 3:
					printf("请输入两个操作数:");
					scanf("%d %d", &a, &b);
					Mul(a, b);
					break;
				case 4:
					printf("请输入两个操作数:");
					scanf("%d %d", &a, &b);
					Div(a, b);
					break;
				case 0:
					printf("已退出\n");
					break;
				default:
					printf("输入有误 请重新输入\n");
					break;
				}
			} while (input);
	return 0;
}

函数指针数组法

思路:通过把函数方法放在指针数组中,并巧妙利用下标和操作数数字相同来调用函数方法。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

 void menu()
{
	printf("************************\n");
	printf("************************\n");
	printf("****1.Sum    2.Sub******\n");
	printf("****3.Mul    4.Div******\n");
	printf("*****   0.退出    ******\n");
	printf("************************\n");
	printf("************************\n");
}

int  Sum(int x,int y)
{
	return x + y;
}

int  Sub(int x, int y)
{
	return x - y;
}

int Mul(int x, int y)
{
	return x * y;
}

int  Div(int x, int y)
{
	return x / y;
}
int main()
{
	int input = 1;
	int a = 0, b = 0;
	int ret = 0;
	//函数指针数组法
	int(*ptr[])(int a, int b) = {0,Sum,Sub,Mul,Div};//放入函数指针
	do
	{	
		menu();
		printf("请输入计算模式:");
		scanf("%d",&input);
		if (input <= 4 && input >= 1)//通过if语句来判断输入值是否符合条件
		{
			printf("请输入操作数:");
			scanf("%d %d",&a,&b);
			int ret=(*ptr[input])(a, b);//调用函数指针中的input方法
			printf("%d\n",ret);
		}
		else if(input==0)
		{
			printf("退出计算器\n");
		}
		else
		{
			printf("输入有误 请重新输入\n");
		}
	} while (input);
	return 0;
}

回调函数法

思路:在一个函数方法中,定义一个函数指针来调用函数方法。

总代码如下

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

 void menu()
{
	printf("************************\n");
	printf("************************\n");
	printf("****1.Sum    2.Sub******\n");
	printf("****3.Mul    4.Div******\n");
	printf("*****   0.退出    ******\n");
	printf("************************\n");
	printf("************************\n");
}

int  Sum(int x,int y)
{
	return x + y;
}

int  Sub(int x, int y)
{
	return x - y;
}

int Mul(int x, int y)
{
	return x * y;
}


int  Div(int x, int y)
{
	return x / y;
}

void calc(int(*pf)(int, int))
{
	int ret = 0;
	int x, y;
	printf("请输入操作数:");
	scanf("%d %d",&x,&y);
	ret = (*pf)(x, y);//函数指针 *pf(可以接收任何方法)
	printf("%d\r\n",ret);
}
int main()
{
	int input = 1;
	int a = 0, b = 0;
	int ret = 0;
	do
	{
		menu();
		printf("请输入计算模式:");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			calc(Sum);
			break;
		case 2:
			calc(Sub);
			break;
		case 3:
			calc(Mul);
			break;
		case 4:
			calc(Div);
			break;
		case 0:
			printf("已退出\r\n");
			break;
		default:
			printf("输入有误 请重新输入!\r\n");
			break;
			}
	} while (input);

	return 0;
}

http://www.kler.cn/news/149034.html

相关文章:

  • redis基本数据结构
  • FFA 2023|字节跳动 7 项议题入选
  • 计算机基础知识57
  • Ubuntu 上使能 SELinux
  • 王者小游戏
  • 【好用的个人工具】在Docker环境下部署Simple mind map思维导图工具
  • 云原生系列Go语言篇-泛型Part 2
  • 【Python】jieba分词基础
  • 【C++初阶】五、类和对象(日期类的完善、流运算符重载函数、const成员、“”取地址运算符重载)
  • python与机器学习1,机器学习的一些基础知识(完善ing)
  • Prometheus的详细部署
  • spring boot spring-retry重试机制
  • 算法 离散化
  • CVE-2022-4886 ingress命令注入复现与分析
  • 设计模式—依赖倒置原则(DIP)
  • Android frameworks 开发总结之十一
  • 郑州数字孪生技术推进制造业升级,工业物联网可视化应用加速
  • YOLO改进系列之SKNet注意力机制
  • GitHub 2023排名前十的最佳开源项目
  • 微信小程序+中草药分类+爬虫+torch
  • Linux命令(136)之zcat
  • 芯知识 | 混音播报语音芯片的优势:革新音频应用的新力量
  • 使用 Mybatis 的 TypeHandler 存取 Postgresql jsonb 类型
  • 【数学】旋转矩阵
  • xv6 磁盘中断流程和启动时调度流程
  • Java中实现精度准确的浮点数运算
  • SpringBoot——模板引擎及原理
  • RK3568平台开发系列讲解(Linux系统篇)通过OF函数获取设备树中断信息实验
  • 2023年国赛试题:配置inux1 为 CA 服务器
  • Linux dd命令详解:如何从标准输入或文件中读取、转换并输出数据(附实例教程和注意事项)