指针的进阶
一.题目
1).题目一 :累计相加(不考虑溢出)
int main()
{
int i = 0;
int n = 0;
int sum = 0;
int ret = 0;
scanf("%d %d", &n, &i);
for (i = 0; i < n; i++)
{
ret = ret * 10 + n; //产生数字
sum = sum + ret;//求和
}
printf("%d", sum);
return 0;
}
2).题目二 :打印数组
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) /sizeof(int);
int i = 0;
int* p = arr;
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
3).题目三:水仙花数
int main()
{
int i = 0;
for (i = 0; i <= 100000; i++)
{ //1.计算i的位数-n
int sum = 0;
int n = 1;
int tmp = i;
while (tmp / 10)
{
n++;
tmp = tmp / 10;
}
//2.计算i的每一位数的n次方之和
tmp = i;
while (tmp)
{
sum += pow(tmp % 10, n);
tmp = tmp / 10;
}
//3.判断
if (sum == i)
{
printf("%d ", i);
}
}
return 0;
}
4).题目四:逆序字符串
void reverse(char* str)
{
assert(str);//断言防止空指针,需要引用头文件assert.h
int len = strlen(str);
char* left = str;
char* right = str + len - 1;
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse(arr);
printf("%s", arr);
return 0;
}
5).题目五:打印菱形
int main()
{
int line = 0;
int i = 0;
scanf("%d", &line);
for (i = 0; i < line; i++)
{
//打印一行
//打印空格
int j = 0;
for (j = 0; j < line-1-i; j++)
{
printf(" ");
}
//打印*
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
for (i = 0; i < line - 1; i++)
{
int j = 0;
//打印空格
for (j = 0; j <= i; j++)
{
printf(" ");
}
//打印*
for (j = 0; j < 2 * (line - 1 - i) - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
6).题目六:调整奇数偶数顺序
//奇数在前,偶数在后
void print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void move(int arr[], int sz)
{
int left = 0;
int right = sz - 1;
while (left < right)
{
//从前往后找一个偶数
while ((left < right) && (arr[left] % 2 == 1))//如果都是奇数left一直向后找造成越界访问
{
left++;
}
//从后往前找一个奇数
while ((left < right) && (arr[right] % 2 == 0))
{
right--;
}
//交换奇数偶数
if (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
move(arr, sz);//实现数组奇数偶数的移动
print(arr, sz);//实现数组的打印
return 0;
}
7).题目七:杨辉三角
我在test.h中定义了N,如果想改N即可从头文件中修改。
#include "test.h"
int main()
{
int i = 0;
int j = 0;
int arr[N][N] = { 0 };
for (i = 0; i < N; i++)
{
for (j = 0; j <= i; j++)
{
if (j == 0)
{
arr[i][j] = 1;
}
if (i == j)
{
arr[i][j] = 1;
}
if (i >= 2 && j >= 1)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
}
for (i = 0; i < N; i++)
{
for (j = 0; j < N - 1 - i; j++)
{
printf(" ");//打印空格
}
for (j = 0; j <= i; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
8).题目八:猜凶手
int main()
{
char killer = 0;
for (killer == 'A'; killer <= 'D'; killer++)//从A找到C
{
if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)//3人为真
{
printf("%c\n", killer);
}
}
return 0;
}
9).题目九:猜名次
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
for (a = 1; a <= 5; a++)
{
for (b = 1; b <= 5; b++)
{
for (c = 1; c <= 5; c++)
{
for (d = 1; d <= 5; d++)
{
for (e = 1; e <= 5; e++)
{
if (((b == 2) + (a == 3) == 1)
&& ((b == 2) + (e == 4) == 1)
&& ((c == 1) + (d == 2) == 1)
&& ((c == 5) + (d == 3) == 1)
&& ((e == 4) + (a == 1) == 1))
{
if (a * b * c * d * e == 120)//判断使每个人都对应1 2 3 4 5而不重复
{
printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
}
}
}
}
}
}
}
return 0;
}
10).题目十:函数指针数组例题
void menu()
{
printf("*********请选择*********\n");
printf("*********0.退出*********\n");
printf("****1.相加 2.相减****\n");
printf("****3.相乘 4.相除****\n");
printf("************************\n");
}
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y;
}
int Div(int x, int y)
{
return x / y;
}
int main()
{
int input = 0;
do {
menu();
int ret = 0;
int (*pfarr[5])(int, int) = { NULL,Add,Sub,Mul,Div };//函数指针数组初始化
int x = 0;
int y = 0;
printf("请选择:>");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
printf("请输入两个操作数:");
scanf("%d %d", &x, &y);
ret = (pfarr[input])(x, y);//运用
printf("%d\n", ret);
}
else if (input == 0)
{
printf("退出程序");
}
else
{
printf("选择错误");
}
} while (input);
}
11).题目十一:模拟qsort实现一个冒泡排序的通用算法
void Swap(char* buf1, char* buf2, int width)
{
int i = 0;
//每个元素对应的字节一个一个交换
for (i = 0; i < width; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void bubble_sort(void* base,
int sz,
int width,
int (*cmp)(const void* e1, const void* e2)
)//无具体类型的指针(排序数据的起始位置),元素个数,一个元素有多大,函数指针
{
int i = 0;
//趟数
for (i = 0; i < sz - 1; i++)
{
//一次冒泡排序
int j = 0;
for (j = 0; j < sz - i - 1; j++)
{ //如果前面一个元素大于后面一个元素,则为大于0,交换
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
void my_print(int arr[], int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d", arr[i]);
}
}
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
void my_test()
{
int i = 0;
int n = 0;
int arr[255];
for (i = 0; scanf("%d", &arr[i]) == 1; i++)
{
if (getchar() == '\n') break;
}
n = i + 1;
bubble_sort(arr, n, sizeof(arr[0]), cmp_int);
my_print(arr, n);
}
int main()
{
my_test();
}