#import <Foundation/Foundation.h>
#include "Function.h"
int main(int argc, const char * argv[])
{
// printf("%d\n",sum(10, 8));
//
// int (*p)(int x,int y) = sum;
// //函数指针类型 int (*)(int x,int y)
// //描述: 指向 返回值为 int 两个int参数 的 指针类型
// //函数指针变量: p
// //初始值: sum
//
// printf("%d", p(8,9));
//
//
// void (*q)() = printHello;
// q();
// char str[10] = {0};
// printf("请输入 maxValue 或者 sum:");
// scanf("%s",str);
//
// typedef int (*FP)(int x,int y);
// //FP是新类型int (*)(int x,int y)是旧类型
// //此时此刻 FP 就是int (*)(int x,int y)
// //int (*p)(int x,int y) = NULL;
// FP p = NULL;
// if (strcmp(str, "maxValue") == 0) {
// p = maxValue;
// }else if(strcmp(str, "sum")==0){
// p = sum;
// }
// printf("%d",p(3,5));
// printf("%d\n",getValue(10, 8, minValue));
// printf("%d\n",getValue(10, 8, maxValue));
Student stus[3] = {
{"haojianming",89.95,45,1},
{"yaozhaodi",91,13,0.5},
{"dengyongjun",99.99,37,0.3}
};
//printArray(stus, 3);
sortArray(stus, 3,compareByName );
printArray(stus, 3);
// printStudents(stus, 3,"(高富帅)",test);
return 0;
}
#import "Function.h"
//函数声明:声明我是一个什么函数
//求两个数的和
//函数的类型:int (int x,int y)
//即:我是一个 返回值为整型,有两个整型参数的函数.
//函数名为 sum
int sum(int x,int y);
int minValue(int x,int y);
int maxValue(int x,int y);
int getValue(int x,int y, int(*p)(int a,int b));
int max2Value(int x,float y);
//int minValue(int x,int y,int z);
void printHello();
struct Student{
char name[30];
float score;
int age;
float attendance;
};
typedef struct Student Student;
//比较两个学生的年龄大小
BOOL compareByAge(Student s1,Student s2);
//比较两个学生的分数大小
BOOL compareByScore(Student s1,Student s2);
//比较两个学生的出勤率大小
BOOL compareByAttendance(Student s1,Student s2);
//比较两个学生的姓名大小
BOOL compareByName(Student s1,Student s2);
typedef BOOL (*CFP)(Student s1,Student s2);
void sortArray(Student stus[],int count,CFP p);
void printArray(Student stus[],int count);
void mark(char originStr[],char markStr[]);
void replace(char originStr[],char markStr[]);
void test(char originStr[],char markStr[]);
typedef void (*PPP)(char originStr[],char markStr[]);
void printStudents(Student stus[],int count,char str[],PPP p);
#import "Function.m"
int sum(int x,int y)
{
return x + y;
}
int maxValue(int x,int y)
{
return x > y ? x : y;
}
int minValue(int x,int y)
{
return x < y ? x : y;
}
int getValue(int x,int y, int(*p)(int a,int b))
{
return p(x,y);
}
void printHello()
{
printf("Hello\n");
}
void mark(char originStr[],char markStr[])
{
strcat(originStr,markStr);
}
void test(char originStr[],char markStr[])
{
}
void replace(char originStr[],char markStr[])
{
strcpy(originStr, markStr);
}
void printStudents(Student stus[],int count,char str[],PPP p)
{
for (int i = 0; i < count; i++) {
if (stus[i].score >= 90)
{
p(stus[i].name,str);
printf("%s %.2f\n",stus[i].name,stus[i].score);
}
}
}
BOOL compareByAttendance(Student s1,Student s2)
{
return s1.attendance > s2.attendance ? YES : NO;
}
BOOL compareByName(Student s1,Student s2)
{
return strcmp(s1.name, s2.name) > 0 ? YES : NO;
}
BOOL compareByScore(Student s1,Student s2)
{
return (s1.score > s2.score) ? YES : NO;
}
BOOL compareByAge(Student s1,Student s2)
{
return (s1.age > s2.age) ? YES : NO;
}
void sortArray(Student stus[],int count,CFP p)
{
for (int i = 0; i < count - 1; i++) {
for(int j = 0; j < count - 1 - i;j++){
//按年龄排 stus[j].age > stus[j+1].age
//按分数排 stus[j].score > stus[j+1].score
//按出勤率 stus[j].attendance > stus[j+1].attendance
if (p(stus[j],stus[j+1])) {
Student temp = stus[j];
stus[j] = stus[j+1];
stus[j+1] = temp;
}
}
}
}
void printArray(Student stus[],int count)
{
for (int i = 0; i < count; i++){
printf("%s %f %d % f\n",stus[i].name,stus[i].score,stus[i].age,stus[i].attendance);
}
}
#import <Foundation/Foundation.h>
#import "GetValue.h"
int main(int argc, const char * argv[])
{
/**
* 建立一张映射表,存储 字符串-函数名 对儿
函数调用时,检查给定的字符串是否在映射表中,如果在,取出对应的函数名
使用取出的函数名,调用函数,完成结果.
*/
printf("%d\n",getValue(8, 12, "mul"));
return 0;
}
#import "GetValue.h"
typedef int (*PFUN)(int x,int y);
//新类型 PFUN 旧类型int (*)(int x,int y)
//映射表是一个 结构体数组,为了建立映射表,我们先建立一个结构体.此结构体包含 一个字符串 和一个函数指针
struct NameFunctionPair {
char name[30]; //字符串
PFUN function; //函数指针
};
typedef struct NameFunctionPair NameFunctionPair;
//求2个数的最大值
int maxValue(int x,int y);
//求2个数的最小值
int minValue(int x,int y);
int sum(int x,int y);
int minus(int x,int y);
int multiple(int x,int y);
int divide(int x,int y);
int gcd(int x,int y);//最大公约数
int gbs(int x,int y);//最小公倍数
//根据字符串 获取 函数名
PFUN functionOfName(char *name);
//三个参数 ,前2个是参与运算的数字,第三个参数用于查询映射表
//返回值是 运算结束后的结果,如何运算,取决于第三个参数.
int getValue(int x,int y, char *name);
#import "GetValue.m"
NameFunctionPair nfps[] = {
{"max",maxValue},
{"min",minValue},
{"sum",sum},
{"minus",minus},
{"mul",multiple},
{"div",divide},
{"gcd",gcd},
{"gbs",gbs}
};
PFUN functionOfName(char *name)
{
for (int i = 0; i < sizeof(nfps)/sizeof(nfps[0]); i++) {
if (strcmp(name, nfps[i].name) == 0){
//如果映射表里 有对应的 function, 返回这个 function
return nfps[i].function;
}
}
//如果没找到,默认求最大值
return maxValue;
}
int getValue(int x,int y, char *name)
{
PFUN fun = functionOfName(name);//根据 name 获取对应的函数
return fun(x,y);//使用选定的函数计算结果
}
int gbs(int x,int y)
{
return x * y / gcd(x, y);
}
int gcd(int x,int y)
{
while (x % y != 0) {
int temp = x % y;
x = y;
y = temp;
}
return y;
}
int divide(int x,int y)
{
return x/y;
}
int multiple(int x,int y)
{
return x * y;
}
int minus(int x,int y)
{
return x - y;
}
int sum(int x,int y)
{
return x + y;
}
int minValue(int x,int y)
{
return x < y ? x : y;
}
int maxValue(int x,int y)
{
return x > y ? x : y;
}
C语言--函数指针,布布扣,bubuko.com
C语言--函数指针