結構體和函式指標實現加減乘除
構思:
建立結構體,結構體的成員中有一個成員為函式指標,賦值後可指向各個演算法的地址;
當輸入add 1 2時,指標陣列分別指向add,1和2;
隨後進行字串比較,判斷進入哪一個演算法;
實現:
char optr;
int(*pf)(int, int) = NULL; //函式指標
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
struct operation
{
char *name;
int (*pf)(int, int); //結構體的成員為一個函式指標
char c;
}ops[] = {
{ "add", add, '+' },
{ "sub", sub, '-' },
{ "mul", mul, 'X' }
};
void math_man(char *buf[], int num)
{
int a = atoi(buf[1]);
int b = atoi(buf[2]);
int r = pf(a, b);
printf("%s%c%s=%d\n", buf[1], optr,buf[2 ], r);
}
void do_action(char *pbuff[], int num)
{
int i = 0;
for (i = 0; i < sizeof(ops) / sizeof(ops[0]); i++)
{
if (strcmp(pbuff[0], ops[i].name) == 0) //判斷字串
{
pf = ops[i].pf; //函式指標指向
optr = ops[i].c; //optr指向算術符
break;
}
}
math_man(pbuff,num);
}
void parse(char *buff1)
{
int num = 0;;
int i = 0;
char *str[3]; //陣列指標 指向三個字串的地址
int status = 0;
for (i = 0; buff1[i] != '\0'; i++)
{
if (!isspace(buff1[i])&&(status == 0)) //記錄字串的位置
{
status = 1; //可以讓buff1[0] 指向add buff1[1] buff1[2]分別指向後面的兩個數字
str[num++] = buff1+i;
}
else if(isspace(buff1[i])) //遇到空格則下一個位置是下一個字串的起始位置,並截斷上一個字串的末尾
{
status = 0;
buff1[i] = '\0';
}
}
do_action(str, num);
}
int main()
{
char buff[200] ;
while (1)
{
printf("input>:");
scanf("%[^\n]%*c",buff);
parse(buff);
memset(buff, 0x00, sizeof(buff));//每次讀取後進行初始化以免發生衝突
}
system("pause");
return 0;
}
相關推薦
結構體和函式指標實現加減乘除
構思: 建立結構體,結構體的成員中有一個成員為函式指標,賦值後可指向各個演算法的地址; 當輸入add 1 2時,指標陣列分別指向add,1和2; 隨後進行字串比較,判斷進入哪一個演算法; 實現:
C程式設計--結構體(結構體和函式之間的引數使用)
結構體型別(掌握點): 建立結構體型別 定義結構體型別變數 初始化結構體和引用結構體變數(3種方法,見下) 使用結構體陣列 結構體指標(重要) 指向結構體變數的指標 指向結構體陣列的指標 程式碼案例
結構體中函式指標初始化
/** * 為結構體中的指標陣列賦值 */ #include <stdio.h> typedef struct test { void (*p)(void); void (*q)(void); void (*y)(void); }t
C++類 給結構體成員 函式指標 賦值
myStruct標頭檔案 myStruct.h class CMyClass; struct { int nFlag; void (CMyClass::*myinit)(int n); void (CMyClass::*myopen)(int n,void* arg)
為結構體中函式指標賦值的兩種方法
/** 02. * 為結構體中的指標陣列賦值 03. */ 04. 05.#include <stdio.h> 06. 07.typedef struct test 08.{ 09. void (*p)(void); 10.
C語言結構體定義函式指標的簡單高效的使用例子
對於大型專案來說,struct的使用會使整個程式碼更加簡約,閱讀起來和寫起來都更加簡便,以後就要多嘗試這種用法了。下面是一個簡單例子,可以參考一下。 #include <stdio.h>
qemu 中關鍵結構體和函式理解
關鍵結構 ./target-arm/translate.c(DisasContext存在於該檔案中,專門為TB塊的生成而服務) typedef struct DisasContext { target_ulong pc; int is_jmp;
位操作實現加減乘除四則運算
tle 參與 nbsp pre 圖片 操作數 整數 spa 或操作 解決方案 需要熟練掌握一些常見的位操作實現,具體為: 1)常用的等式:-n=~(n-1)=~n+1 2)獲取整數n的二進制中最後一個1:n&(-n)或者n&~(n-1)如:n=010100,
c語言設計簡單計算器實現加減乘除運算
編寫程式的目的就是使程式有他應用的地方,編寫一個簡單的計算器來實現我們計算的目的。 利用swich case 語句和迴圈結構來實現簡單程式的編寫。利用選擇語句來進行輸入的選
資料結構__不含括號的加減乘除法混合運算
這個程式我一共寫了5個檔案,4個是標頭檔案,最後1個則是main函式的cpp檔案。 第一個檔名為head.h 用於包含一些基本的標頭檔案,如下所示: #pragma once #include<iostream> #include<stdlib.h> #inclu
使用位運算實現加減乘除
在不使用+,-,*,/,四則運算子號的情況下,通過基本位運算實現加減乘除四則運算。 1. C++中使用位運算實現加法 首先,我們通過對x和y進行&位運算,得出每一位上的進位。然後對x和y進行^位運算,得出沒有加進位的和。最後將所得的和當做新的x,所得的進位往
實現加減乘除任意組合的語法解析
給定一個字串如:2/(3+4))*(3-1)+6-8 ,用程式解析出來,輸出最終的值。這是個AST 語法解析問題,最直觀的是建立一顆語法樹,然後遍歷語法樹來獲得最終的效果。如下圖,建立這麼一個語法樹,然後廣度優先搜尋,進行操作就能得到最終的結果。 但是,其實我們有更方便的方法去做
使用面向物件的程式設計思想實現加減乘除運算
指令碼1Main 函式的程式碼: using System; using System.Collections.Generic; using System.Linq; using System.Tex
c#簡單版計算機實現加減乘除
①在檢視的工具箱中給form1視窗新增如下: ②combobox1的屬性ltems賦值 並頁面載入時設定combobox1無法編輯,只讀; ③button1的text屬性賦值"="; ④textbox3設定readonly屬性,賦值true,讓textbox3為只
利用棧實現加減乘除冪功能
如何用棧來實現加減乘除冪的運算呢?應考慮下面幾點。 1.分別用一個棧x存符號,另一個棧y存數值。 2.遇到數字就壓棧,遇到符號ch要比較棧頂的符號與當前的符號ch,編寫一個判別函式prev,若能進行運算,則返回真,不能返回假.以下是判別函式的幾種情況: (1)如果棧頂符
【演算法】位元位計算(A+B Problem)-位運算子介紹、位運算實現加減乘除
問題描述 問題:計算A+B,不適用“+”運算子(LintCode 1.A + B Problem) 注意:A B均為32位整數,可使用位元位計算 解決思路 演算法示例 程式碼如下:(通過LintCode測試) class Solution
BigDecimal這個類來實現加減乘除呢
package com.mmall.util; import java.math.BigDecimal; / ** *敲程式碼的wqq * / public class BigDecimalUti
位運算-實現加減乘除
res oid font ont 分享圖片 != family highlight args 基本性質:1:~n=-(n+1),比如:~3=-4 2:獲取整數n的二進制串中最後一個1:-n&n=~(n-1)&n
使用位操作實現加減乘除運算
前言 在實際應用中一定要注意邊界問題,包括上邊界和下邊界 注意: 位操作中常用的公式 a=n&(n-1);//去掉n中最右邊的1; b=n&(-n);//得到n中最右邊的1 -n==~
java程式碼例項 使用switch實現簡易的計算器(實現加減乘除)
import java.util.Scanner; /* * 使用switch實現簡易的計算器(實現加減乘除); */ public class test { public static v