指针习题回顾(C语言)

目录

数组指针和指针数组

编程题:

字符串逆序

字符串左旋

题目1概述:

代码实现:

题目2概述:

 代码实现:

调整奇偶顺序

题目概述:

代码实现:

冒泡排序

 二级指针

代码解读:

杨氏矩阵

题目概述:

代码实现:

猜凶手

题目概述:

代码实现:

杨辉三角

题目概述:

代码实现:

判断题1:

判断题2:

判断题3:

判断题4:

指针返回值:


数组指针和指针数组

int *p[10]定义了一个指针数组,数组中10个元素,每个元素都是int*类型的指针

int (*p)[10]定义了一个数组指针,该指针只能指向存储10个整形元素的数组

编程题:

字符串逆序

法一:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void Reserve(char* str)//指针数组
{char* left = str;char* right = str + strlen(str) - 1;while (left < right)//左右交换-逆序{char temp = *left;*left = *right;*right = temp;left++;//right--;}
}
int main()
{char str[10000] = { 0 };//while(scanf("%s",str)!=EOF)//遇到空格就不读了while (gets(str)){Reserve(str);//printf("%s", str);}return 0;
}

法二:

#include <stdio.h>#include <string.h>int main() {char str1[10000];char str2[10000];gets(str1);int i = 0;int len = strlen(str1);for (i = 0; i < len; i++) {str2[i] = str1[len - i - 1];printf("%c", str2[i]);}return 0;}
字符串左旋
题目1概述:
实现一个函数,可以左旋字符串中的k个字符。例如:ABCD左旋一个字符得到BCDAABCD左旋两个字符得到CDAB
代码实现:

法一:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void leftRound(char* str, int k)//左旋
{int len = strlen(str);int time = k % len;for (int i = 0; i < time; i++){char tmp = str[0];int j = 0;for (j = 0; j < len - 1; j++){str[j] = str[j + 1];//左移}str[j] = tmp;}
}
int main()
{char str[] = "ABCD";leftRound(str, 5);printf("%s\n", str);return 0;
}

法二(使用库函数):

strcpy();//字符串拷贝
strncat();//字符串拼接int main()
{char str1[10] = { 0 };char* str2 = "abcd";strcpy(str1, str2);//将str2拷贝到str1中printf("%s\n", str1);printf("%s\n", str2);char str3[100] = "abc";char* str4 = "hello";//strcat(str3, str4);//将str4中的所有内容拼接到str3中strncat(str3, str4, 2);//只拷贝str4中的2个字符printf("str3=%s\n", str3);return 0;
}
void leftRound(char* str, int k)
{int len = strlen(str);int time = k % len;//2char tmp[256] = { 0 };strcpy(tmp, str + time);//cdstrncat(tmp, str, time);//cdab  tmp中存储的就是cdabstrcpy(str, tmp);
}
int main()
{char str[] = "abcd";leftRound(str, 2);printf("%s\n", str);
}

法三(局部逆序):

void ReverseRange(char* str, int start, int end)//局部逆序
{int left = start;int right = end;while (left < right){char tmp = str[left];str[left] = str[right];str[right] = tmp;left++;right--;}
}
void leftRound(char* str, int k)
{int len = strlen(str);int time = k % len;//2ReverseRange(str, 0, time - 1);//bacdReverseRange(str, time, len - 1);//badcReverseRange(str, 0, len - 1);//cdab}int main()
{char str[] = "abcd";leftRound(str, 2);printf("%s", str);return 0;
}

法四:

int main(){char str1[] = "ABCD";int i = 0, k, j = 0;int len = strlen(str1);scanf("%d", &k);for (i = 0; i < k; i++){char temp = str1[0];//取出最左边的字符for (j = 0; j < len - 1; j++){str1[j] = str1[j + 1];//将剩下的字符左移			}str1[len - 1] = temp;//将取出的字符放至末尾}printf("%s", str1);return 0;}
题目2概述:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。例如:给定s1 =AABCD和s2 = BCDAA,返回1给定s1=abcd和s2=ACBD,返回0.AABCD左旋一个字符得到ABCDAAABCD左旋两个字符得到BCDAAAABCD右旋一个字符得到DAABC
 代码实现:

法一:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int leftRound(char* str, char* str2, int k)//左旋
{int len = strlen(str);int time = k % len;for (int i = 0; i < time; i++){char tmp = str[0];int j = 0;for (j = 0; j < len - 1; j++){str[j] = str[j + 1];//左移}str[j] = tmp;}if (strcmp(str, str2) == 0)//str和str2进行比较  str>str2返回正数;str=str2返回0;str<str2返回负数  根据ASCII码值比较{return 1;//str=str2}elsereturn 0;
}
int main()
{char str[] = "ABCD";char str2[] = "CDAB";printf("%d", leftRound(str, str2, 2));//printf("%s\n", str);return 0;
}

法二(使用库方法):

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char str1[] = "abcde";//主串char* str2 = "bcd";//子串char* p = strstr(str1, str2);//字符串查找printf("%s", p);return 0;
}

int findRound(char* str1, char* str2)
{char tmp[256] = { 0 };strcpy(tmp, str1);//拷贝 strcat(tmp, str1);//拼接return strstr(tmp, str2) != NULL;//字符串查找
}
int main()
{char str1[] = "abcde";//主串char* str2 = "bcd";//子串int ret = findRound(str1, str2);if (ret == 1){printf("是旋转后的结果");}else{printf("不是旋转后的结果");}
}
调整奇偶顺序
题目概述:
输入一个整数数组,实现一个函数, 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void Function(int* p, int len)
{int* left = p;int* right = p + len - 1;while (left < right){while ((left < right) && (*left % 2 != 0))//奇数{left++;}while ((left < right) && (*right % 2 == 0))//偶数{right--;}int tmp = *left;*left = *right;*right = tmp;//交换}
}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9 };int len = sizeof(arr) / sizeof(arr[0]);Function(arr, len);for (int i = 0; i < len ; i++){printf("%d ", arr[i]);//arr[i]=*(arr+i)      arr[i][j]=*(*(arr+i)+j)}return 0;
}
冒泡排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int data[] = { 1,2,3,4,5,6 };int sz = sizeof(data) / sizeof(data[0]);int i = 0, j = 0;for (i = 0; i < sz; i++){for (j = 0; j < sz - i - 1; j++){if (data[j] < data[j + 1]){int temp = data[j];data[j] = data[j + 1];data[j + 1] = temp;}}}for (i = 0; i < sz; i++){printf("%d ", data[i]);}return 0;
}
 二级指针
int main()
{int a = 10;int* p = &a;int** p2 = &p;printf("%d", **p2);//10return 0;
}
代码解读:

解引用2次, 第一次得到的是p的值,第二次得到的是a的值;p2——>p——>a=10;

杨氏矩阵
题目概述:

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int FindNum(int arr[][3], int x, int y, int key)
{int i = 0;int j = y - 1;//判断i和j是合法的while (i < x && j >= 0){if (arr[i][j] < key){i++;}else if (arr[i][j] > key){j--;}elsereturn 1;//找到了}return 0;//没有找到
}
int main()
{int arr[][3] = { {1,2,3},{4,5,6},{7,8,9} };int ret = FindNum(arr, 3, 3, 5);//printf("%d", ret);if (ret == 1)printf("找到了");elseprintf("没找到");return 0;
}
猜凶手
题目概述:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词:A说:不是我。B说:是C。C说:是D。D说:C在胡说已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手。
代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void Find()
{for (char killer = 'a'; killer <= 'd'; killer++)//穷举法-假设法{if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3){printf("%c是凶手", killer);}}
}
int main()
{Find();return 0;
}

杨辉三角

题目概述:
在屏幕上打印杨辉三角。1
1 1
1 2 1
1 3 3 1
……
代码实现:

 

判断题1:

判断题2:

解析:release版本,宏不起作用(A错误);在Linux情况下,release版本也会起作用(B错误);

判断题3:

解析:D选项左边是 int ,右边是 int ()[10],类型不一样;

判断题4:

指针返回值:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void Func(int* p1, int* p2)//输出型参数
{int a = 10;int b = 20;*p1 = a;*p2 = b;
}
int main()
{int k1 = 0;int k2 = 0;Func(&k1, &k2);printf("%d,%d", k1, k2);//10,20return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阅读笔记(BMSB 2018)Video Stitching Based on Optical Flow

参考文献 Xie C, Zhang X, Yang H, et al. Video Stitching Based on Optical Flow[C]//2018 IEEE International Symposium on Broadband Multimedia Systems and Broadcasting (BMSB). IEEE, 2018: 1-5. 摘要 视频拼接在计算机视觉中仍然是一个具有挑战性的问题&#xff0…

概率基础——二项分布

概率基础——二项分布 介绍 在统计学中&#xff0c;二项分布是一种离散型概率分布&#xff0c;它描述了在一系列独立同分布的伯努利试验中成功的次数。这里我们以抛硬币为例&#xff0c;将一个硬币抛掷 n n n次&#xff0c;每次抛掷结果为正面向上的概率为 p p p&#xff0c;…

吴恩达深度学习-L1 神经网络和深度学习总结

作业地址&#xff1a;吴恩达《深度学习》作业线上版 - 知乎 (zhihu.com) 写的很好的笔记&#xff1a;吴恩达《深度学习》笔记汇总 - 知乎 (zhihu.com) 我的「吴恩达深度学习笔记」汇总帖&#xff08;附 18 个代码实战项目&#xff09; - 知乎 (zhihu.com) 此处只记录需…

顺序表(下)

1.扩容的实现&#xff08;在使用这些函数时包含其头文件&#xff09; 2.初始化&#xff08;给定一个初始值&#xff09; 3.销毁 &#xff08;也就是将空间释放&#xff0c;并将指针赋为空指针&#xff09; 4.插入 1.头插 2.尾插 3.任意位置插入 5.删除 1.头删 2.尾删 3.任意…

池化层1x1的作用!

池化层11的尺寸虽然很小&#xff0c;但在卷积神经网络中仍然具有降维的作用。尽管它不会改变特征图的空间尺寸&#xff0c;但通过减少特征图的通道数&#xff0c;池化层11可以实现降维的效果。这有助于减少计算量和参数数量&#xff0c;提高模型的效率和性能。 11的池化层具体…

mysql 2-16

安全等于<> 最大最小LEAST,GREATEST BETWEEN AND 条件一是下限 IN LIKE关键字 转移字符 逻辑运算符 位运算符 排序数据 升序降序&#xff0c;默认升序 二级排序 8.0新特性 小拓展 多表查询 多表查询 别名 多表查询的分类 非等值连接 自连接 内连接与外连接 sql92实现外连…

c高级day4作业

终端输入一个字符&#xff0c;判断是大写字母小写字母还是数字字符。 #!/bin/bash read -p "input字符--->" a case $a in[[:upper:]])echo 大写字母$a;;[[:lower:]])echo 小写字母$a;;[0-9])echo 数字字符$a;;*)echo "error" esac终端输入年月&#x…

防御保护--内容安全过滤

目录 文件过滤 内容过滤技术 邮件过滤技术 应用行为控制技术 DNS过滤 URL过滤 防火墙 ---- 四层会话追踪技术 入侵防御 ---- 应用层深度检测技术 深度包检测深度流检测 随着以上俩种的成熟与完善&#xff0c;提出了所谓的内容安全过滤 当然上网行为确实需要治理&…

CCF编程能力等级认证GESP—C++8级—20231209

CCF编程能力等级认证GESP—C8级—20231209 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)奖品分配大量的工作沟通 答案及解析单选题判断题编程题1编程题2…

Linux系统——拓展LVM逻辑卷分区与磁盘配额

一、LVM逻辑卷分区 1.检测并确认新硬盘 1.1fdisk 查看或管理硬盘分区 fdisk -l&#xff08;小写的L&#xff09; &#xff08;硬盘设备&#xff09; 或 fdisk 硬盘设备 1.2实际操作 1.2.1fdisk查询结果详解 Device&#xff1a;分区的设备文件名称Boot&#xff1a;是否…

【刷题】牛客— NC21 链表内指定区间反转

链表内指定区间反转 题目描述思路一&#xff08;暴力破解版&#xff09;思路二&#xff08;技巧反转版&#xff09;思路三&#xff08;递归魔法版&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&…

typescrip接口 interface详解,以及ts实现多态

ts 接口 当一个对象类型被多次使用时,一般会使用接口(interface)来描述对象的类型,达到复用的目的 示例如下 当一个对象类型被多次使用时,可以看到,很明显代码有大量的冗余 let personTom: { name: string, age?: number, sayHi(name: string): void } {name: Tom,sayHi(n…