当前位置: 首页 > news >正文

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

问:解释一下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;
}

相关文章:

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

问&#xff1a;解释一下int(*a[20])(int)是什么&#xff1f; ChatAI答&#xff1a; int (*a[20])(int) 是一个数组&#xff0c;该数组中每个元素都是一个指向函数的指针&#xff0c;该函数具有一个int类型的参数&#xff0c;并返回一个int类型的值。 具体来说&#xff0c;a是一…...

GLSL 代码规范

文件 文件顶点,片段,几何和计算着色器文件应该分别有 _vert, _frag, geom 和 _comp 后缀(例如: eevee_film_fragg.glsl)。Shader文件名必须是唯一的,并且必须以它们所属的模块作为前缀(例如: workbench_material_lib.glsl eevee_film_lib.glsl)。一个 shader 文件必须包含且…...

红黑树封装map和set

文章目录 红黑树封装map和set1. 改良红黑树1.1 改良后的节点1.2 改良后的类分别添加仿函数代码 3. 封装map和set3.1 set3.2 map 3. 迭代器3.1 begin 和 end3.2 operator()和operator--()3.3 const迭代器set的迭代器map的迭代器 4. map的operator[]的重载5. 完整代码实现5.1 RBT…...

python序列

在Python中&#xff0c;序列类型包括字符串、列表、元组、集合和字典&#xff0c;这些序列支持以下几种通用的操作&#xff0c;但比较特殊的是&#xff0c;集合和字典不支持索引、切片、相加和相乘操作。 字符串也是一种常见的序列&#xff0c;它也可以直接通过索引访问字符串内…...

LeetCode35. 搜索插入位置(二分法入门)

写在前面&#xff1a; 题目链接&#xff1a;LeetCode35. 搜索插入位置 编程语言&#xff1a;C 题目难度&#xff1a;简单 一、题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会…...

macOS Ventura 13.4 RC3(22F66)发布

系统介绍 5 月 17 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.4 RC 3 更新&#xff08;内部版本号&#xff1a;22F66&#xff09;&#xff0c;本次更新距离上次发布隔了 5 天。 macOS Ventura 带来了台前调度、连续互通相机、FaceTime 通话接力等功能。其中&…...

CSI和DSI介绍

1、CSI和DSI的接触协议介绍 MIPI、CSI、CCI 协议基础介绍_csi协议_赵哈哈x的博客-CSDN博客 流媒体技术基础-摄像头接口与标准_【零声教育】音视频开发进阶的博客-CSDN博客 《摄像头 —— MIPI CSI-2简介》 USB摄像头使用 — Lichee zero 文档 2、AIO-3288J &#xff0c;and…...

vue3+antDesignVue前端纯导出

效果 <a-buttonsize"default"style"margin-left: 10px"click"exportData">导出</a-button>1.下载所需依赖 npm install xlsx --save npm install file-saver --save<script setup> import { reactive, ref } from "vue…...

卷积神经网络的剪枝及其在嵌入式视觉系统中的应用

卷积神经网络的剪枝及其在嵌入式视觉系统中的应用 摘要 在过去的十年里&#xff0c;计算机视觉的最新技术一直是由深度神经网络&#xff0c;特别是卷积神经网络所控制的。无论是分类、语义分割还是目标检测&#xff0c;神经网络现在都是一个无可争议的首选。因此&#xff0c;…...

Spring IOC - Bean的初始化

在bean的初始化阶段&#xff0c;bean已经被实例化及属性填充了&#xff0c;此时的bean已相对成熟&#xff0c;接下来的初始化阶段还会做一些额外的工作对bean做进一步处理&#xff0c;主要包括以下四个方面&#xff1a; 调用aware接口方法 初始化前&#xff1a;调用初始化前的…...

Golang 安装

学习目标 本文旨在帮助初学者了解 Golang 在不同环境下的安装方法,并提供相关资源和参考链接。 学习内容 安装 Golang on Windows 下载 Golang for Windows 安装包,地址:https://golang.org/dl/双击运行安装包,按照提示完成安装。配置环境变量: 在系统变量中添加 GOROO…...

( 位运算 ) 338. 比特位计数 ——【Leetcode每日一题】

❓338. 比特位计数 难度&#xff1a;简单 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,…...

Unity之新版输入系统InputSystem入门

一.前言 最近Unity版本全面升级到Unity2021了,着色器也全面使用URP,接下来毫无疑问,输入系统也要全面升级InputSystem,这也是Unity官方希望我们做的,毕竟现在都2023年了,我们的技术是需要跟上时代的步伐。 二.新老版本区别 老版本的InputSysten系统,其实就一个Input静…...

python 之 logging的使用

一、日志模块 import logginglogging.debug("调试日志") logging.info(消息日志) logging.warning("告警日志") logging.error(错误日志) logging.critical(严重错误日志)debug&#xff08;调试&#xff09;级别用于输出调试信息&#xff0c;这些信息主…...

gunicorn常用参数命令

Gunicorn 是一个 Python 的 WSGI HTTP 服务器。具有实现简单,轻量级,高性能等特点。更多介绍内容参考官网&#xff0c;这里介绍几个常用参数。 安装 pip3 install gunicorn通过输入gunicorn -v查看版本。 最简洁的启动。首先进入到项目目录&#xff0c;例如django项目和mana…...

TimerResolution.exe

TimerResolution.exe是一款常用的Windows实用程序,用于调整系统计时器的分辨率。它提供了一种简便的方法,让用户能够更精确地控制计时器的运行方式,从而改善系统的性能和响应时间。无论是进行游戏、音频处理还是其他需要精确计时的任务,TimerResolution.exe都能提供极大的帮…...

Qt魔法书:打造自定义鼠标键盘脚本

Qt魔法书&#xff1a;打造自定义鼠标键盘脚本 一、引言&#xff08;Introduction&#xff09;1.1 脚本的重要性&#xff08;Importance of Scripts&#xff09;1.2 Qt在脚本制作中的优势&#xff08;Advantages of Qt in Script Making&#xff09;1.3 文章目标与结构概述&…...

〖Python网络爬虫实战㉖〗- Selenium库和ChromeDriver驱动的安装

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…...

U8产成品入库API接口 --参照生产订单/产品检验/不良品

//第二步&#xff1a;构造环境上下文对象&#xff0c;传入login&#xff0c;并按需设置其它上下文参数 U8EnvContext envContext new U8EnvContext(); envContext.U8Login u8Login; //第三步&#xff1a;设置API地址标识(Url) …...

gdb打印的堆栈有些函数是??()是什么

当 gdb 打印的堆栈中出现 ??() 格式的函数名时&#xff0c;通常表示对应的函数名无法被解析&#xff0c;这可能是由以下几种原因导致的&#xff1a; 缺少符号表信息&#xff1a;如果程序的可执行文件没有包含符号表信息&#xff0c;或者 gdb 没有加载符号表信息&#xff0c;就…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...