目录
数组指针和指针数组
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左旋一个字符得到BCDA
ABCD左旋两个字符得到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;//2
char tmp[256] = { 0 };
strcpy(tmp, str + time);//cd
strncat(tmp, str, time);//cdab tmp中存储的就是cdab
strcpy(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;//2
ReverseRange(str, 0, time - 1);//bacd
ReverseRange(str, time, len - 1);//badc
ReverseRange(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左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到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
}
else
return 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);//10
return 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--;
}
else
return 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("找到了");
else
printf("没找到");
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,20
return 0;
}