函数数组

本文深入探讨了C语言编程中的多种实用技巧与算法实现,包括数组操作、字符串处理、矩阵运算、递归算法、查找算法等核心内容。通过具体实例展示了如何使用C语言解决实际问题,适用于初学者及进阶开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

#include<stdio.h>
#include<algorithm>
using namespace std;
bool compare(int a,int b)
{
    return a>b;
}
int s[20];
int serch(int k)
{   
    int low,mid,high;
    low=0;
    high=14;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(s[mid]==k) return mid+1;
        else if(s[mid]<k) high=mid-1;
        else  low=mid+1;
    }
    return 0;
}
int main()
{
    int i,k;
    for(i=0;i<15;i++)
        scanf("%d",&s[i]);
    sort(s,s+15,compare);
    scanf("%d",&k);
        if(serch(k)==0) 
            printf("wucishu!\n");
        else 
            printf("%d\n",serch(k));
        return 0;
}

在这里插入图片描述

#include<stdio.h>
#include<string.h>
int main()
{
    int a,n,i;
    char m[1000],c2;   
    while(scanf("%d",&a)!=EOF)
    {
        if(a==0) break;			//输入a个数值
        scanf("%s",m);			
    n=strlen(m);
    for(i=0;i<n;i++)
    { 
           
        if('a'<=m[i]&&m[i]<='z')
        {
            c2=m[i]-32;		 //小写转大写
            printf("%c",c2);
        }
        else if('A'<=m[i]&&m[i]<='Z')
        {
            c2=m[i]+32;		//大写转小写
            printf("%c",c2);
        }
        else 
            printf("%c",m[i]);
    }
    printf("\n");
    }
       
       
    return 0;
}

在这里插入图片描述

int main()
{
	int	m, n, i, j;
	char a[105][105], b[105][105];
	scanf("%d%d", &m, &n);	//m行n列的数据
	for (i = 0; i < m; i++)	
		for (j = 0; j < n; j++)
		{
			scanf("%d", &a[i][j]);
			b[j][i] = a[i][j];		//a[i][j]存到b[j][i]
		}
	for (i = 0; i < n; i++)
		for (j = 0; j < m; j++)
		{
			if (j != m - 1)	
				printf("%d ", b[i][j]);
			else
				printf("%d\n", b[i][j]);
		}
	return 0;

}

在这里插入图片描述

#include<stdio.h>
int square(int x)
{
    int ans;
    if (x == 0) ans = 0;
    else
        ans = square(x - 1) + x*x;
    return ans;
 
}
int main()
{
    int x, ans;
    while (scanf("%d", &x) != EOF)
    {
        ans = square(x);
        printf("%d\n", ans);
    }
 
    return 0;
}

在这里插入图片描述


#include<stdio.h>

int fuc(int n,int r)
{
	int i,sum=1;
	for (i = 1; i <= r; i++)
	{
		sum = sum * (n - i + 1) / i;
	}
	return sum;
}

int main()
{
	int x, y, sum;
	while (scanf("%d%d", &x, &y) != EOF)
	{
		if (x == 0 && y == 0)
			break;
		if (x < y)
		{
			printf("error!\n");

		}
		else
		{
			sum = fuc(x, y);
			printf("%d\n", sum);
		}
	}
	return 0;
}

在这里插入图片描述

int main()

{
	int m, n, i, j;
	scanf("%d%d", &m, &n);
	i = (m > n ? n : m);
	while (!(m%i == 0 && n%i == 0))	i--;
	j = (m > n ? m : n);
	while (!(j%m == 0 && j%n == 0))	j++;
	printf("%d %d\n", i, j);
	return 0;
}

在这里插入图片描述

#include<stdio.h>

int main()

{
	int a[3][3], b[3][3], c[3][3];
	int m, n, i, j, k,x,y;

	for (x = 0; x < 3; x++)
	{
		for (y = 0; y < 3; y++)
		{
			scanf("%d", &a[x][y]);
		}
	}

	for (x = 0; x < 3; x++)
	{
		for (y = 0; y < 3; y++)
		{
			scanf("%d", &b[x][y]);
		}
	}

	for (i = 0; i < 3; i++)
		for (j = 0; j < 3; j++)
		c[i][j] = 0;

	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			for(k=0;k<3;k++)
			c[i][j] += a[i][k] * b[k][j];
		}
	}

	for (m = 0; m < 3; m++)
	{
		for (n = 0; n < 3; n++)
		{
			printf("%d ",c[m][n]);
			
		}
		printf("\n");
	}

}

在这里插入图片描述

#include<stdio.h>
#include<string.h>
int main()

{
	int n, a, b, i, j;
	char x[100][50], y[50];
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%s", x[i]);
	for(j=1;j<n;j++)
		for (a = 0; a < n - 1; a++)
		{
			if (strcmp(x[a], x[a + 1]) > 0)
			{
				strcpy(y,x[a]);
				strcpy(x[a],x[a+1]);
				strcpy(x[a+1],y);

			}
			
		}
	for (b = 0; b < n; b ++)
		printf("%s\n", x[b]);

		return 0;
}

在这里插入图片描述

#include<string.h>
#include<stdio.h>

int main()
{
	char l[36];
	int n,s,i;
	scanf("%s", l);
	scanf("%d", &n);
	s = strlen(l);
	for (i = s-n; i < s; i++)
	{		
		printf("%c", l[i]);
	}

	for (i = 0; i < s - n; i++)

	{
		printf("%c", l[i]);
	}
		
	printf("\n");
	return 0;

}

在这里插入图片描述

#include<stdio.h>

int main()
{
	int x, i, j;
	while (scanf("%d", &x) != EOF)
	{
		for (i = 1; i <= x; i++)
		{
			printf("%d", i);
			for (j = 0; j < x - 1; j++)
			{
				printf(" %d", (i + j) % x + 1);		//核心代码
				
			}
			printf("\n");
		}
	}
	return 0;
}

在这里插入图片描述

#include<math.h>
#include<stdio.h>

int main()
{
	int a[100001] = { 0 };
	int M, L, x, y, i, j;
	scanf("%d %d", &L, &M);
	for (i = 0; i < M; i++)
	{
		scanf("%d %d", &x, &y);
		if (x >= y)
		{
			int t = x;
			x = y;
			y = t;
		}
		for (j = x; j <= y; j++)
		{
			a[j] = 1;
		}
	}
	int count = 0;
	for(i=0;i<=L;i++)
	{ 
		if (a[i] == 0)
		{
			count++;
		}
	}
	printf("%d\n", count);
	return 0;
}
<think>嗯,用户问的是“函数数组指针”,这个术语有点容易混淆,我得先弄清楚他们具体指的是什么。首先,函数数组指针可能涉及三个概念:函数指针、数组指针,以及它们的组合。可能用户是想了解如何定义指向函数数组的指针,或者指向数组函数指针?不过更常见的情况可能是指向函数的指针数组,或者数组的指针,但需要结合函数的情况。 首先,我需要回顾一下C/C++中的相关概念。函数指针是指向函数的指针变量,例如int (*funcPtr)(int, int)可以指向一个接受两个int参数并返回int的函数数组指针则是指向数组的指针,比如int (*arrPtr)[10]指向一个包含10个int元素的数组。而函数数组指针可能是指一个数组,其元素是函数指针,或者是一个指针指向这样的数组。 用户可能是在学习这些复合类型时遇到了困惑。例如,定义一个包含多个函数指针的数组,或者一个指针指向这样的数组。这时候需要明确语法结构,因为C/C++的声明语法有时比较复杂。 比如,函数指针数组的正确声明应该是int (*funcArray[5])(int),这表示funcArray是一个有5个元素的数组,每个元素都是指向返回int且接受一个int参数的函数的指针。而如果要定义一个指向这个数组的指针,应该怎么写?这时候可能需要使用typedef来简化。例如: typedef int (*FuncPtr)(int); FuncPtr (*arrPtr)[5] = &funcArray; 或者直接声明:int (*(*arrPtr)[5])(int) = &funcArray; 这样的声明看起来复杂,但分解起来可能更容易理解。用户可能需要具体的例子来理解如何声明和使用这样的指针。 另外,用户可能在实际编程中遇到需要传递函数指针数组的情况,或者需要动态分配这样的数组,这时候正确的指针操作就很重要了。例如,在回调机制或状态机设计中,函数指针数组很常见,而了解如何通过指针来操作这些数组是必要的。 还需要注意,函数指针和数组指针在语法上的区别。函数指针的声明需要参数列表,而数组指针则需要指定数组的大小。当它们结合在一起时,声明的可读性可能会变差,因此使用typedef来分步定义可能是个好方法。 总结来说,用户需要了解如何正确声明和使用指向函数数组的指针,或者函数指针数组的指针。这时候,分步解析声明语法,提供示例代码,并解释每一步的作用,会很有帮助。同时,提醒用户注意语法中的括号位置,因为错误的放置会导致完全不同的类型解释。例如,int *funcArray[5]()表示一个返回int指针的函数数组,而int (*funcArray[5])()才是一个函数指针数组,返回int。 最后,可能还需要讨论应用场景,比如在实现策略模式、插件系统或者命令解析时,函数指针数组的指针如何被用来动态调用不同的函数,增强程序的灵活性和模块化。</think>好的,我来逐步解释“函数数组指针”的概念: 1. **基础概念分解** - **函数指针**:存储函数地址的变量,如 `int (*pFunc)(int)` - **数组指针**:指向数组的指针,如 `int (*pArr)[5]` - **函数数组指针**:指向“函数指针数组”的指针,属于复合类型 2. **语法结构解析** ```c // 定义函数指针类型 typedef int (*FuncPtr)(int); // 创建函数指针数组 FuncPtr funcArray[3] = {func1, func2, func3}; // 定义指向这个数组的指针 FuncPtr (*pFuncArray)[3] = &funcArray; ``` 等效的直接声明: ```c int (*(*pFuncArray)[3])(int) = &funcArray; ``` 3. **关键符号解析** ``` int (*(*ptr)[N])(params) │ │ │ └── 函数参数列表 │ │ └── 指向的数组长度 │ └── 指针声明符 └── 函数返回类型 ``` 4. **使用场景** - 需要传递整个函数指针数组时 - 需要修改函数指针数组的指向时 - 实现动态函数调度系统 5. **示例代码演示** ```c #include <stdio.h> int add(int a) { return a + 1; } int sub(int a) { return a - 1; } int main() { // 定义函数指针数组 int (*funcs[2])(int) = {add, sub}; // 定义指向数组的指针 int (*(*pFuncs)[2])(int) = &funcs; // 通过指针调用 for(int i = 0; i < 2; i++) { printf("Result: %d\n", (*pFuncs)[i](5)); } return 0; } ``` 6. **易错点注意** - 括号嵌套顺序错误会导致类型改变 - 数组长度必须与目标数组匹配 - 解引用时需要先取数组再访问元素 理解函数数组指针的关键是:它本质上是二级指针,指向一个包含函数指针的数组。通过分步类型定义和使用typedef可以显著提高代码可读性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值