第四十二天学习记录:C语言进阶:笔试题整理Ⅲ

news2025/1/8 5:46:50

问:解释一下int(*a[20])(int)是什么?
ChatAI答:
int (*a[20])(int) 是一个数组,该数组中每个元素都是一个指向函数的指针,该函数具有一个int类型的参数,并返回一个int类型的值。

具体来说,a是一个数组,包含20个函数指针元素。每个函数指针指向的函数都具有一个int类型的参数,并返回一个int类型的值。可以使用下标访问数组中的任何函数指针元素,并将其赋值为指向满足该条件的函数的指针。

以下是一些使用该数组类型的示例:

#include <stdio.h>

int add(int n) {
    return n + 1;
}

int sub(int n) {
    return n - 1;
}

int main() {
    int (*a[20])(int);
    a[0] = add;   // 将a[0]指向add函数
    a[1] = sub;   // 将a[1]指向sub函数
    int x = 10;
    x = a[0](x);  // 调用add函数,将a[0]作为函数指针传递
    x = a[1](x);  // 调用sub函数,将a[1]作为函数指针传递
    printf("%d\n", x);
    return 0;
}

在这个示例中,我们声明了一个包含20个函数指针元素的数组a,并将其第一个元素指向add函数,第二个元素指向sub函数。我们还定义了一个变量x并将其初始化为10。然后,我们通过调用a[0]a[1]中的函数指针来操作x的值,并在最后打印出x的值。

请注意,在声明函数指针时,需要使用一对括号将函数名括起来,这是因为()的优先级高于*,否则会被解释为函数原型。

单选题:
题目名称:
关于回调函数描述错误的是(D)
题目内容:
A、回调函数就是一个通过函数指针调用的函数。
B、回调函数一般通过函数指针实现。
C、回调函数一般不是函数的实现方调用,而是在特定的场景下,由另一方调用。
D、回调函数是调用函数指针指向函数的函数。
(回调函数是调用函数指针指向的那个函数,而不是指向函数的函数。)

求下列程序输出结果:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int a[5] = { 5,4,3,2,1 };
	int* ptr = (int*)(&a+1);
	printf("%d,%d", *(a + 1), *(ptr - 1));
	return 0;//4,1
}

输出:4,1

求下列程序输出结果:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int aa[2][5] = { 10,9,8,7,6,5,4,3,2,1 };
	int* ptr1 = (int*)(&aa + 1);
	int* ptr2 = (int*)(*(aa + 1));
	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
	return 0;//1,6
}

输出:1,6

题目名称:

字符串左旋
题目内容:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
第一种写法:暴力求解法

#define _CRT_SECURE_NO_WARNINGS 1

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

//暴力求解法
void left_move(char arr[], int k)
{
	assert(arr != NULL);
	int i = 0;
	int len = strlen(arr);
	for (i = 0; i < k; i++)
	{
		char tmp = *arr;
		int j = 0;
		for (j = 0; j <len-1 ; j++)
		{
			*(arr + j) = *(arr + j + 1);
		}
		*(arr + len - 1) = tmp;
	}
}

int main()
{
	char arr[] = "abcdef";
	left_move(arr, 2);
	printf("%s\n", arr);
	return 0;
}

在这里插入图片描述

第二种写法:三部翻转法

#define _CRT_SECURE_NO_WARNINGS 1

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

//三部翻转法
void reverse(char* left, char* right)
{
	assert(left != NULL);
	assert(right != NULL);
	while (left<right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

void left_move(char arr[], int k)
{
	assert(arr);
	int len = strlen(arr);
	assert(k <= len);
	reverse(arr,arr+k-1);//逆序左边
	reverse(arr+k,arr+len-1);//逆序右边
	reverse(arr,arr+len-1);//逆序整体
}

int main()
{
	char arr[] = "abcdef";
	left_move(arr, 2);
	printf("%s\n", arr);
	return 0;
}

题目名称:

字符串旋转结果
题目内容:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1=AABCD和s2=BCDAA,返回1,给定s1=ABCD和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC

方法一:穷举法

#define _CRT_SECURE_NO_WARNINGS 1

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

//三部翻转法
void reverse(char* left, char* right)
{
	assert(left != NULL);
	assert(right != NULL);
	while (left<right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

void left_move(char arr[], int k)
{
	assert(arr);
	int len = strlen(arr);
	assert(k <= len);
	reverse(arr, arr + k - 1);//逆序左边
	reverse(arr + k, arr + len - 1);//逆序右边
	reverse(arr, arr + len - 1);//逆序整体
}

int is_left_move(char* s1, char* s2)
{
	int len = strlen(s1);
	int i = 0;
	for (i = 0; i < len; i++)
	{
		left_move(s1, 1);
		int ret=strcmp(s1, s2);
		if (ret == 0)
		{
			return 1;
		}
	}
	return 0;
}

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "cdefab";
	int ret = is_left_move(arr1, arr2);
	if (ret == 1)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

输出:Yes

方法二:

#define _CRT_SECURE_NO_WARNINGS 1

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

int is_left_move(char* str1, char* str2)
{
	int len1 = strlen(str1);
	int len2 = strlen(str2);
	if (len1 != len2)
	{
		return 0;
	}
	//1.在str1字符串中追加一个str1字符串
	//strcat(str1,str1)//err不能自己给自己追加
	strncat(str1,str2,6);
	//2.判断str2指向的字符串是否是str1指向的字符串的子串
	char* ret=strstr(str1, str2);
	if (ret == NULL)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

int main()
{
	char arr1[30] = "abcdef";
	char arr2[] = "cdefab";
	int ret = is_left_move(arr1, arr2);
	if (ret == 1)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

推荐:《程序员编程艺术》

题目名称:
杨氏矩阵
题目内容:
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于0(N)。

问:时间复杂度如何理解?
ChatAI答:
时间复杂度通常用来表示一个算法的执行效率,是指通过分析算法的执行次数与输入规模之间的关系,来描述算法的时间性能。时间复杂度常见的表示方法有大O符号表示法。

大O符号表示法是一种常用的描述算法时间复杂度的方法,它描述的是算法复杂度的一个上界,可以用来衡量算法的时间性能。

具体来说,时间复杂度有三种情况,分别是最坏时间复杂度、最好时间复杂度和平均时间复杂度。最坏时间复杂度表示在最差情况下的执行次数,最好时间复杂度表示在最优情况下的执行次数,平均时间复杂度则是考虑所有输入情况下的执行次数的期望值。在实际应用中,我们常常关注最坏时间复杂度,因为它是通常情况下最能反映算法时间性能的指标。

时间复杂度可以表示为 T(n) = O(f(n)),其中 n 表示问题规模,f(n) 表示每次运行算法所需的基本操作数,O 表示“不超过”的关系。大O记号表示的是一个函数的渐进上界,即随着输入规模 n 的增大,函数 f(n) 的增长速度不超过某个常量乘以 g(n)。其中 g(n) 是已知的一个非负函数,常用的有 O(1)、O(log n)、O(n)、O(nlog n)、O(n²)、O(n³) 等复杂度级别,其中 O(1) 表示常数复杂度,O(n) 表示线性复杂度,O(n²) 表示平方复杂度,O(log n) 表示对数复杂度,O(nlog n) 表示几乎线性的复杂度。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int FindNum(int arr[3][3], int k, int *px, int *py)
{
	int x = 0;
	int y = *py - 1;
	while (x<=*px-1&&y>=0)
	{
		if (arr[x][y] > k)
		{
			y--;
		}
		else if (arr[x][y] < k)
		{
			x++;
		}
		else
		{
			*px = x;
			*py = y;
			return 1;
		}
	}
	//找不到
	return 0;
}

int main()
{
	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	int k = 7;
	int x = 3;
	int y = 3;
	int ret = FindNum(arr, k, &x, &y);
	if (ret == 1)
	{
		printf("找到了\n");
		printf("下标是:%d %d\n", x, y);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

在这里插入图片描述
问:C语言函数能返回一个数组吗?

ChatAI答:
在 C 语言中,函数不能直接返回一个数组,但可以通过以下几种方式来返回数组:

  1. 返回指针

函数可以返回一个指向数组首元素的指针。这种方式效率高,也比较常用。需要注意的是函数返回的指针变量不能指向一个局部数组或变量,因为函数调用结束后,局部数组或变量的内存会被释放,指向它们的指针变量也就失效了。下面是一个返回动态分配数组的例子:

int* allocate_array(int n) {
    int* array = malloc(n * sizeof(int));
    /* 为数组赋初值 */
    for (int i = 0; i < n; i++) {
        array[i] = i + 1;
    }
    return array;
}
  1. 传入参数

函数通过传入数组的方式,将结果保存在数组中。这种方式可以兼容局部数组和动态分配的数组。下面是一个接收参数并修改数组的例子:

void modify_array(int* array, int n) {
    /* 修改数组的元素 */
    for (int i = 0; i < n; i++) {
        array[i] += 1;
    }
}

int main() {
    int a[5] = {1, 2, 3, 4, 5};
    modify_array(a, 5);
    /* 输出修改后的数组 */
    for (int i = 0; i < 5; i++) {
        printf("%d ", a[i]);
    }
    return 0;
}
  1. 结构体返回

函数可以返回一个包含数组的结构体,但这种方式适用于较小的数组,否则会导致栈溢出的风险。下面是一个结构体返回数组的例子:

struct Array {
    int data[5];
};

struct Array get_array() {
    struct Array arr = {.data = {1, 2, 3, 4, 5}};
    return arr;
}

int main() {
    struct Array arr = get_array();
    /* 输出获取的数组 */
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr.data[i]);
    } 
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宝塔服务器(linux)服务器搭建

搭建服务器 nginx 搭配 PM2( 集合了node的功能 ) 搭建服务器 域名: http://kissface.top 流程如下: 服务器既做assets文件目录挂载 , 也当做nodejs服务使用 当我访问http://kissface.top 根目录时 展示index.html文件 同时能访问静态资源如 js/css/img/font 等 当我访问 http…

Linux:初识【VI / VIM编辑器】

Linux系统版本&#xff1a;centos 7.5 x64位 VMware版本&#xff1a; VMware Workstation Pro 16 文章目录 一、VI / VIM是什么&#xff1f;1.1 VI编辑器1.2 VIM编辑器 二、为什么要使用VI / VIM编辑器&#xff1f;三、如何使用VI / VIM编辑器&#xff1f;3.1 一般模式3.2 编辑…

keil MDK5插件推荐——Astyle代码格式化插件

前言 代码格式化是提高代码质量和可读性的重要手段之一。然而&#xff0c;在Keil MDK5中并没有内置代码格式化工具&#xff0c;因此需要寻找第三方工具来解决这个问题。开源的代码格式化工具Astyle能以插件的形式集成到Keil中以满足我们对代码格式化的需求。 本文将详细介绍如…

《永恒之塔sf私服》“龙战前传”里的更高挑战-

关于这个新版本的各种更新内容已经屡见不新&#xff0c;无论是最新关注的玩家&#xff0c;抑或是一直坚守在永恒之塔阵地的老玩家们&#xff0c;相信已经对各种感兴趣的更新倒背如流。这里就不再重复。 每一款MMO游戏升级&#xff0c;伴随着玩家技术和战术的长进&#xff0c;游…

【Unity-UGUI控件全面解析】| ScrollView 滚动视图组件详解

🎬【Unity-UGUI控件全面解析】| ScrollView 滚动视图组件详解一、组件介绍二、组件属性面板三、代码操作组件四、组件常用方法示例💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习…

火线、零线和地线及开关接线参考

火线、零线和地线及开关接线参考 1. 火线、零线和地线 1.1. What is Live wire? Live wire&#xff0c;L&#xff1a;火线&#xff0c;相线火线是电路中输送电的电源线。 1.2. What is Neutral wire? Neutral wire&#xff0c;N&#xff1a;零线零线是由发电机或变压器二…

AD 实现多 DC + 多 ADFS 高可用部署

总览 在本篇文章中, 我将记录部署多 DC 多 ADFS 实现高可用方案的详细步骤, 期间我会尽量使用 PowerShell 来实现相应的动作, 实在找不到命令或者 GUI 更方便的再附截图. 主要步骤分为: 部署 2 台 DC 服务器提供 AD 服务 (AD域名 alian.com)安装 ADCS 角色为 ADFS 提供证书服…

NodeJs模块化之下半部分

Node.js 中的模块化 更多精彩内容&#xff0c;请微信搜索“前端爱好者“&#xff0c; 戳我 查看 。 官网地址&#xff1a;https://nodejs.cn/api/ fs 文件系统 地址&#xff1a;https://nodejs.cn/api/fs.html#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F node:fs 模块能够以标准…

GPT-3 面试题

简介 1、GPT-3 是什么&#xff1f;它是基于什么模型的&#xff1f; GPT-3是一种基于深度学习原理的语言预测模型。它是由OpenAI开发的&#xff0c;可以从互联网数据中生成任何类型的文本。它只需要一小段文本作为输入&#xff0c;就可以生成大量的准确和复杂的机器生成文本⁴…

Akura Medica:新型静脉血栓切除系统,完成首次人体试验

Akura Medical公司宣布&#xff0c;其机械血栓切除平台在人体首次使用成功&#xff0c;这是一项具有突破性的技术&#xff0c;可以有效地治疗肺栓塞、深静脉血栓等血栓栓塞疾病。该平台使用了一种与众不同的方法&#xff0c;可以高效地清除血管内的血栓&#xff0c;同时保护血管…

测试分词工具Lucene.Net.Analysis.PanGu(盘古分词)

从微信公众号及百度文章来看&#xff0c;全文检索的前置工作是分词&#xff0c;首先将要做全文检索的内容分词&#xff0c;然后采用全文检索模块或工具进行全文检索。参考文献4介绍了基于Lucene.net实现全文检索的大致思路&#xff0c;其采用的是Lucene.net盘古分词的方式实现。…

蓝桥:前端开发笔面必刷题——Day1 数组(一)

文章目录 &#x1f4cb;前言&#x1f3af;数组中重复的数字&#x1f4da;题目内容✅解答 &#x1f3af;两数之和&#x1f4da;题目内容✅解答 &#x1f3af;替换空格&#x1f4da;题目内容✅解答 &#x1f3af;二维数组中的查找&#x1f4da;题目内容✅解答 &#x1f4dd;最后 …

C语言-程序环境与预处理

程序环境与预处理 程序环境翻译环境&#xff08;编译链接&#xff09;预编译编译汇编链接 执行环境 预处理预定义符#define定义的标识符 宏#define定义宏#define替换规则宏的命名约定带副作用的宏参数宏和函数的比较 其它#和##的使用字符串常量化运算符#标记粘贴运算符## 命令行…

fastled教程

文章目录 EVERY_N_MILLISECONDS(10)EVERY_N_SECONDS(5)fill_solid(leds, NUM_LEDS, CRGB::Red);fill_gradient_RGBfill_rainbow(leds, NUM_LEDS, i, 255 / NUM_LEDS);效果1fadeToBlackBy(leds, NUM_LEDS, 1); 效果2FastLED.setBrightness(2*i);// 效果3leds[i] CHSV(hue (i *…

scanf和scanf_s的区别、解决VS返回值被忽略的报错问题

一、scanf和scanf_s是什么&#xff1f; scanf()不会检查输入边界&#xff0c;可能造成数据溢出。 scanf_s()会进行边界检查。 二、分别分析 1.scanf scanf表示从键盘输入指定格式的数据。如&#xff1a;scanf("%d",x);指从键盘给x输入一个int型&#xff08;整型&…

【计网】【TCP】浅析TCP三次握手

前言 之前学习计网时不认真&#xff0c;TCP三次握手稀里糊涂就过去了&#xff0c;最近在重新查漏补缺计网这方面的知识&#xff0c;饭要一口一口吃&#xff0c;我就没有把其中涉及到的大量知识点写在此博客中&#xff0c;此文仅管中窥豹&#xff0c;之后再详细写吧。 笔记中有…

初步认识性能测试和完成一次完整的性能测试

上一篇博文主要通过两个例子让测试新手了解一下测试思想&#xff0c;和在做测试之前应该了解人几点&#xff0c;那么我们在如何完成一次完整的性能测试呢&#xff1f; 测试报告是一次完整性能测试的体现&#xff0c;所以&#xff0c;这里我给出一个完整的性能测试报告&#xff…

搞懂@DateTimeFormat 注解 和 对应的时间类型

通常而言&#xff0c;前端时间控件&#xff0c;一般情况下直接会传一个yyyy-MM-dd的日期字符串到后台。如果我们直接用java.util.Date类型来接收&#xff0c;是无法获取的。这是因为Date类型默认的格式为&#xff1a;Tue May 16 00:00:00 CST 2023这种。 举例 ApiOperation(val…

Games104现代游戏引擎学习笔记08

渲染那部分看的云里雾里的&#xff0c;等学完其他图形学的内容再回头开吧 游戏动画的三个挑战&#xff1a; 1.根据交互实时的反应各种变化 2.一帧时间里的庞大计算 3.更真实自然的表现 2D动画 sprite animation 把每一帧精灵循环绘制出来 2D技术实现3D效果 在各个视角采了一…

shell脚本——流编辑器“三剑客”之awk命令

shell脚本——流编辑器“三剑客”之awk命令 一、awk1、工作原理2、命令格式3、awk常见的内建变量&#xff08;可直接用&#xff09;4、按行输出文本5、按字段输出文本’:’6、通过管道、双引号调用shell命令 一、awk 1、工作原理 逐行读取文本&#xff0c;默认以空格或TAB键为…