首页 > 其他分享 >c语言(1.指针、2.回调函数)实现简易计算器

c语言(1.指针、2.回调函数)实现简易计算器

时间:2024-03-25 18:31:26浏览次数:18  
标签:return 函数 int 计算器 简易 cheng printf input 指针

一级标题:简易计算器的实现。

二级标题:代码中运用的知识

在这里我会使用函数数组指针与回调函数分别写一份简易计算器的代码;那么函数数组指针与回调函数是什么呢?
1、函数数组指针,形如intint (p[5])(int ,int )的代码就是函数数组指针,p就是函数名,函数类型为int([])(int ,int),其返值为int,参数类型也为int;
2、回调函数是什么?回调函数是一个被作为参数传递的函数,它不是由调用者直接调用,而是在特定的事件或条件发生时由其他代码调用。

三级标题:代码实现

一、函数数组指针:首先计算器我们知道计算器实现的就是加减乘除的四册简单运算;那我们可以先写四个简单计算的函数``

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

int jian(int x,int y)
{
	return x-y;
 } 
 
 int cheng(int x,int y)
 {
 	return x*y;
 }
 
 int chu(int x,int y)
 {
 	return x/y;
 }

然后我们得明白怎么使用,我们可以先制作一个菜单函数,在里面用数字来定义执行什么;例如1、加,2、减,3、乘,4、除,0、退出。

void menu()
{
	printf("*******************\n");
	printf("***1.加 2.减*******\n");
	printf("***3.乘 4.除*******\n");
	printf("***  0.退出********\n");
}

然后我们就要思考如何让我们输入定义的数字就进入对应的函数;这个就需要函数数组指针的帮助了,我们可以定义一个int (*p[5])(int ,int )来分别指向这四个函数,就像int (*p[5])(int ,int)={0,sub,jian,cheng,chu};为什么要定义一个0;这是因为数组下标是原数顺序-1,为了使更好对应,所以多写一个0;那么我们如何使用呢?我们可以定义一个input作为选择函数的数,x,y作为我们需要计算的数,那就只需要n=pinput;就可以将计算的结果返回到n里。
总的代码:

#include<stdio.h>

void menu()
{
	printf("*******************\n");
	printf("***1.加 2.减*******\n");
	printf("***3.乘 4.除*******\n");
	printf("***  0.退出********\n");
}
int sub(int x,int y)
{
	return x+y;
}

int jian(int x,int y)
{
	return x-y;
 } 
 
 int cheng(int x,int y)
 {
 	return x*y;
 }
 
 int chu(int x,int y)
 {
 	return x/y;
 }
 
int main()
{
	int input;
	int ret=0;
	int x=0,y=0;
	int n=0;
	do{
		menu();
		printf("请选择:\n");
		scanf("%d",&input);
		int (*p[5])(int ,int)={0,sub,jian,cheng,chu};
		printf("请输入x,y->");
		scanf("%d %d",&x,&y);
		n=p[input](x,y);
		printf("%d\n",n);
	}while(input);
	return 0;
 } 

二、回调函数:
在使用回调函数时,也需要定义四个函数来计算加减乘除,这里我就不重复写了,这个代码我们需要使用switch语句,我们一般想的是例如1、加函数case 1:printf(“请输入两个数”);再定义x,y然后再调用加函数,这样的话四个函数就需要重复四次,为了简便代码我们使用了回调函数,也就是定义一个单独的函数,在这个函数里实现相同的代码,而在case语句中我们给它传入对应的运算函数的首地址;然后在这个回调函数里再使用对应运算函数来计算。
代码:

#include<stdio.h>

void menu()
{
	printf("*********************\n");
	printf("*****1.jia 2.jian****\n");
	printf("*****3.cheng 4.chu***\n");
	printf("*****0.exit**********\n");
	printf("*********************\n");
}


int jia(int x,int y)
{
	return x+y;
}
int jian(int x,int y)
{
	return x-y;
}
int cheng(int x,int y)
{
	return x*y;
}
int chu(int x,int y)
{
	return x/y;
}


void jisuan(int(*p)(int,int))
{
	printf("请输入两个数字:");
	int x=0;
	int y=0;
	int n=0;
	scanf("%d %d",&x,&y);
	n=(*p)(x,y);
	printf("--%d-- \n",n);
}

int main()
{
	int input=0;
	do
	{
		menu();
		printf("请输入你的选择->");
		scanf("%d",&input);
		switch(input)
		{
			case 1:
				jisuan(jia);
				break;
			case 2:
				jisuan(jian);
				break;
			case 3:
				jisuan(cheng);
				break;
			case 4:
				jisuan(chu);
				break;
			case 0:
				printf("退出");
				break;
			default:
				printf("输入错误,重新输入:");
				break; 
		}
	}while(input);
	return 0;
 } 

标签:return,函数,int,计算器,简易,cheng,printf,input,指针
From: https://blog.csdn.net/2301_81205182/article/details/136886059

相关文章

  • LVM逻辑卷 简易操作
    pvdispaly查看所有物理卷信息pvs命令提供了可以对其进行格式配置的物理卷信息,每行显示一个物理卷pvscan命令扫描系统中所有支持的物理卷LVM块设备。您可以在lvm.conf文件中定义过滤器,以便这个命令避免扫描特定物理卷vgs查看卷组lvs命令提供了可以对其进行格式配置的......
  • 指针的大小判别;
    目录代码1:代码2:代码3:代码4:代码5:代码6:代码1:#include<stdio.h>intmain(){ inta[]={1,2,3,4}; printf("%d\n",sizeof(a));//16a是数组名;计算的是整个数组大小; printf("%d\n",sizeof(a+0));//4a+0是首元素地址; printf("%d\n",sizeo......
  • C++智能指针
    为什么需要智能指针对于普通指针,在程序结束前我们需要将每个指针都进行free,以免造成内存泄漏。但是手动释放指针是麻烦的,并且一旦漏掉就会造成内存泄漏。因此在C++11中引入智能指针避免此种情况的发生。智能指针包括std::shared_ptr/std::unique_ptr/std::weak_ptr,需要使用头文......
  • C++开发基础——指针与引用
    一,关于指针1.指针的基础概念指针是可存储地址的变量,存储在指针中的地址可以是变量或者其他数据的地址。指针不仅仅是指向某地址,指针还关注指向该地址的数据类型。例如:long*num_ptr{};这里的num_ptr指针今后只能存储long类型的变量地址,尝试用它存储非long类型的变量地址......
  • 简易的取款多线程
    首先建立一个classAccount类,设置全局变量money,这个变量会被所有的线程使用。设置条件。classAccount{publicstaticintmoney=3000;//建立全局变量publicsynchronizedvoidtaking(intm){if(m>money){System.out.println("余额不足");}else{System.out.pr......
  • 指针的学习
    .指针:一个变量的地址指针变量:存放指针(变量地址)的变量& 取变量的地址单目运算符*取指针所指向变量的内容int*i_point,i; i=10; i_point=&i; printf("%x\n",&i);//变量对其取地址结果62fe14 printf("%x\n",&i_point);//对指针变量取地址,指针变量也需要空间存......
  • 指向结构体类型数据的指针
    一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量.用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。1指向结构体变量的指针下面通过一个简单例子来说明指向结构体变量的指针变量的......
  • 基础算法--双指针练习总结
    Acwing部分练习:799.最长连续不重复子序列暴力未AC(53points):#include<iostream>usingnamespacestd;constintN=1e5+5;intn,a[N];boolcheck(intl,intr){for(inti=l;i<=r;i++){for(intj=i;j<=r;j++){if(i!=j&&a[i]==a[j]){......
  • LaTex学习实践(简易快速LaTex上手例子)
    目录前言正文完全参考前言这篇博客完全是博客https://blog.csdn.net/NSJim/article/details/109066847?spm=1001.2014.3001.5506的实践产物因为写的太好了,所以我进行了实践(overleaf平台)所有的代码和图片我已上传,下载后,上传到自己的overleaf平台即可编......
  • 智能指针详解
    文章目录前言unique_ptrshared_ptrweak_ptr前言智能指针本质上来讲是一个存储指向堆内存指针的类,目的就是帮助我们管理内存,一旦使用了智能指针就就尽量使用new产生的指针,因为智能指针只维护同类型指针的引用计数,混用很容易造成内存重复释放的问题unique_ptrstd:......