c语言的一些零碎题目

该文提供了多个C语言编程题目,涉及指针在累计相加、打印数组、水仙花数、字符串逆序、打印菱形、调整奇偶数顺序、杨辉三角、猜凶手、猜名次以及函数指针数组和冒泡排序算法等场景的应用,展示了指针在算法实现中的重要作用。
摘要由CSDN通过智能技术生成

一.题目

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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值