【c语言】函数+指针{刷题(选择题和编程题混合)}(含图解)

今天继续刷题,我总结了不少方法,希望能对您有所帮助!:

目录

一、内容介绍:

二、指针习题:

2.1 有关分割函数

①基础部分:分割函数的使用

②深化学习:用c语言实现strtok函数

plan A:

plan B:

 ③指针知识补充:指针与二维函数

2.2 选择题 

1.​

 2.

3.

三、函数习题

3.1 有关统计个数

①题目实例

②具体算法

3.2 分解质因数

四、总结:


一、内容介绍:

本次做题总结方法如下:

1.指针函数混合题:strtok函数的具体实现

2.算法:统计字母个数

3.质因数分解(学会阅题)

4.指针知识补充:指针与二维函数

5.指针选择题(易错混淆)

二、指针习题:
2.1 有关分割函数
①基础部分:分割函数的使用

题目:

在主函数中确定字符串以及想进行的分割符号,实现字符串的分割。

输入:暂无

输出:

split
string
to
many
single
part
ok

代码如下: 

#include <stdio.h>
#include <string.h>
#define SIZE 10
 
int my_split(char *p[SIZE], char str[], char const *sep)//传入要实现分割的部分
 {
    int num = 0;
    for (p[num] = strtok(str, sep); p[num] != NULL; p[++num] = strtok(NULL, sep));
    return num; // 返回被分割成单独部分的个数
}
 
int main() {
    char line[] = "split@string/to#many single,part]ok";
    char *p[SIZE];//存储分割后得到的子字符串
    char const *token = " ,/@#]";//用指针才能够实现跨函数操作
    int num = my_split(p, line, token);
    for (int i = 0; i < num; i++) {
        printf("%s\n", p[i]);
    }
    return 0;
}

知识点总结:

1.这里比较需要注意的指针知识点在于,一维指针变量的使用(如图):

即*p[SIZE]的作用:储存每次被分割下来的子字符串

2.接下来就是strtok函数的使用,其作用是根据分割符号对字符串进行分割

②深化学习:用c语言实现strtok函数

标题即题目哈

输入:即将被分割的字符串以及分割标志

输出:分割出的子串

这里提供两种方法:

plan A:
char **split(char *str, char *splitor)
{
    char *temp; // 保存临时字符串
    int n = 0; // 字符串个数
    char **strs;
    char *tempStr;

    tempStr = malloc(sizeof(char) * strlen(str) + 1);
    mallocJudge(tempStr);//这个函数麻烦大家自己写一下哈,判断一下有没有申请成功
    strcpy(tempStr, str);

    temp = strtok(tempStr, splitor);
    while (temp)
    {
        n++;
        temp = strtok(NULL, splitor);
    }
    if (n == 0)return NULL;

    strs = malloc(sizeof(char *) * n);
    mallocJudge(strs);
    free(tempStr);
    temp = strtok(str, splitor);
    for (int i = 0; temp; ++i)
    {
        strs[i] = malloc(sizeof(char) * strlen(temp) + 1);
        mallocJudge(strs[i]);
        strcpy(strs[i], temp);
        temp = strtok(NULL, splitor);
    }
    return strs;
}
plan B:
char **split(char *str, char *splitor)
{
    char **q;//指向指针数组空间的二维指针变量
    int numberOfSplitor = 0;
    int lengthOfStr = strlen(str);
    int startIndex = -1, endIndex = -1;
    int subStrNo = 0;

    for (int i = 0; i < lengthOfStr; ++i)
    {
        if (str[i] == *splitor)numberOfSplitor++;
    }
    q = malloc(sizeof(char *) * (numberOfSplitor + 1));
    mallocJudge(q);

    for (int i = 0; i <= lengthOfStr; ++i)
    {
        if (startIndex == -1 && str[i] == *splitor)
        {
            continue;
        }
        if (str[i] != *splitor && startIndex == -1)
        {
            startIndex = i;
            endIndex = i;
            continue;
        }
        if (str[i] != *splitor && endIndex >= startIndex)
        {
            endIndex = i;
        }
        if ((str[i] == *splitor || str[i] == '\0') && endIndex >= startIndex)
        {
            int tempLength = (endIndex - startIndex + 2);
            q[subStrNo] = malloc(sizeof(char) * tempLength);
            mallocJudge(q[subStrNo]);
            for (int j = 0; j < tempLength - 1; ++j)
            {
                q[subStrNo][j] = str[j + startIndex];
            }
            if (q[subStrNo][tempLength - 1] != '\0')q[subStrNo][tempLength - 1] = '\0';
            startIndex = endIndex = -1;
            subStrNo++;
        }
    }
    return q;
}
 ③指针知识补充:指针与二维函数

该知识的分享更有利于对题目的理解


 

2.2 选择题 

分享3个易错选择题:

1.
参考解析:
&a[2]相当于a+2,p相当于a
 2.

 

参考解析:
定义指针的时候,要加*,然后这个时候代表的还是指针,之后再加*,代表的就是修改里面的值
3.

 

参考解析:
a是数组名,不能自加
三、函数习题
3.1 有关统计个数
①题目实例

题目描述

笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

这种方法的具体描述如下:假设 maxnmaxn 是单词中出现次数最多的字母的出现次数,minnminn 是单词中出现次数最少的字母的出现次数,如果 maxn−minnmaxn−minn 是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的单词很可能就是正确的答案。

输入格式

一个单词,其中只可能出现小写字母,并且长度小于 100100。

输出格式

共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word,那么输出 Lucky Word,否则输出 No Answer

第二行是一个整数,如果输入单词是 Lucky Word,输出 maxn−minnmaxn−minn 的值,否则输出 00。

输入输出样例

error
Lucky Word
2

代码如下:
 

#include <stdio.h>
#include <string.h>
#include <math.h>
void st(int n)
{
	if(n==0||n==1)
	{
		printf("No Answer\n");
					printf("0");
	return;
	}
	
	int t=sqrt(n);
	for(int i=2;i<=t;i++)
	{
		if(n%i==0)
		{
			printf("No Answer\n");
			printf("0");
		return;
		}
	}
	printf("Lucky Word\n");
		printf("%d",n);
		return;
}
int main()
{
	char a[100];
	scanf("%s",a);
	char b[100];
	strcpy(b,a);
	int max=0,min=100,sum=0;

	for(int i=0;a[i]!='\0';i++)
	{
		sum=0;
	for(int j=0;b[j]!='\0';j++)
	{
		if(a[i]==b[j])
		{
			sum++;
			if(sum>max)
			max=sum;
		}
	}
	if(sum<min)
	min=sum;
	}
	int n=max-min;
	st(n);
	return 0;
}
②具体算法

其中:这部分可以用算法取代

	if(a[i]==b[j])
		{
			sum++;
			if(sum>max)
			max=sum;
		}
	}
	if(sum<min)
	min=sum;

代替算法:

#include <stdio.h>
#include <string.h>
#include <math.h>
void st(int n)
{
	if(n==0||n==1)
	{
		printf("No Answer\n");
					printf("0");
				return;
	}
	
	int t=sqrt(n);
	for(int i=2;i<=t;i++)
	{
		if(n%i==0)
		{
			printf("No Answer\n");
			printf("0");
		return;
		}
	}
	printf("Lucky Word\n");
		printf("%d",n);
		return;
}
int max(int x,int y)
{
	return x>y?x:y;
}
int min(int x,int y)
{
	return x<y?x:y;
}
int main()
{
	char a[100];
	scanf("%s",a);
	char b[100];
	strcpy(b,a);
	int ma=0,mi=100,sum=0;
	int QAQ[300]={0};//字母的那ASCII码不会超过300,所以300的数组就管够
	for(int i=0;a[i]!='\0';i++)
		QAQ[a[i]]++;//这个字母出现了,然后这个字母对应的数组位置的值加1 
	for(int i=0;i<300;i++)
	{
		if(QAQ[i]!=0)//!=0 代表这个字母出现过 
		{
			ma=max(ma,QAQ[i]);//取较大值 
			mi=min(mi,QAQ[i]);//取较小值 
		}
	}
	int n=ma-mi;
	st(n);
	return 0;
}
3.2 分解质因数

题目描述

已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数。

输入格式

输入一个正整数 n。

输出格式

输出一个正整数 p,即较大的那个质数。

输入输出样例

21
7

代码如下:

void st(int n)
{
	int i,j;
//	while(1)//没用 
//	{
		for(int i=2;i<=n;i++)//从2开始 
		{
			if((n%i==0))
			{
				j=n/i;
				break;//只能结束一层循环,你加这个while成死循环了 
			}
		}
//	}
//	if(p(i)&&p(j))
//	{
//		if(i>j)
//		printf("%d",i);
//		else
//		printf("%d",j);
//	}//不用判断,直接输出,这个原理和埃筛法比较像
	printf("%d",j); 
}
int main()
{
	int n;
	scanf("%d",&n);
	st(n);
	return 0;
}

注意:!!

 

四、总结:

1,我的指针好烂o(╥﹏╥)o

2,但是进步不少,还要注意认真看题的问题

3,祝您(*^▽^*)开心!!!拜拜了~~~哈哈
 

 

 

  • 39
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值