本篇提供了关于C语言程序设计中指针部分的经典案例,可供C语言的初学者们进行一个学习和编译练习。
/*Case 1
爸爸在哪儿
晚餐时间,妈妈做好了美味的晚餐,去楼上叫爸爸和宝宝吃饭,到了卧室,发现只有宝宝,妈妈想:“爸爸在哪?”。
妈妈先让宝宝下楼去餐桌旁,然后走到书房,在书房找到正在看书的爸爸。
假设将宝宝和爸爸视为变量,书房和卧室视为存储空间,请编程求出他们在内存中的位置*/
int main() {
int father = 1; //定义爸爸变量
int baby = 2; //定义宝宝变量
int* sturoom, * bedroom; //定义指针
int* dad = &father; //获取爸爸的地址
sturoom = dad; //使用爸爸变量的地址为指针sturoom赋值
bedroom = &baby; //取宝宝变量的地址赋值给指针bedroom
//输出地址
printf("爸爸所在的地址为:%x\n", sturoom);
printf("宝宝所在的地址为:%x\n", bedroom);
// 输出变量存储的数值
printf("爸爸为:%d\n", *sturoom);
printf("宝宝为:%d\n", *bedroom);
return 0;
}
/*Case 2
猜宝游戏
某个课间,甲和乙一起玩猜硬币的游戏:初始时,甲的左手握着一枚硬币,游戏开始后,甲进行有限次或真或假的交换,最后由乙来猜测这两只手中是否有硬币
编写程序,实现游戏过程*/
//函数定义
void exc1(int l, int r) {
int temp;
temp = l; //交换形参的值
l = r;
r = temp;
}
void exc2(int* l, int* r) {
int* temp;
temp = l; //交换形参的值
l = r;
r = temp;
}
void exc3(int* l, int* r) {
int temp;
temp = *l; //交换形参变量指向内容的值
*l = *r;
*r = temp;
}
函数声明
//void exc1(int l, int r);
//void exc2(int* l, int* r);
//void exc3(int* l, int* r);
//游戏模拟
//使用随机函数获取交换的次数,和每次交换所选择的函数
int main() {
int a = 0, i = 0, j;
int l = 1, r = 0;
srand((unsigned int)time(NULL));
i = 5 + (int)(rand() % 5); //随机设置交换的次数
j = i;
printf("a:%d,i:%d\n", a, i);
printf("原始状态:\n");
printf("l=%d,r=%d\n\n", l, r);
while (i>0)
{
i--;
a = 1 + (int)(rand() % 3);
switch (a)
{
case 1:
exc1(l, r);
printf("exc1-第%d次交换后的状态\n", j - i);
printf("l=%d,r=%d\n\n", l, r);
break;
case 2:
exc2(&l, &r);
printf("exc2-第%d次交换后的状态\n", j - i);
printf("l=%d,r=%d\n\n", l, r);
break;
case 3:
exc3(&l, &r);
printf("exc3-第%d次交换后的状态\n", j - i);
printf("l=%d,r=%d\n\n", l, r);
break;
default:
break;
}
}
return 0;
}
/*Case 3
幻方
它是将从一到若干个数的自然数排成纵横各为若干个数的正方形,使在同一行、同一列和同一对角线上的几个数的和都相等。
编写程序,实现奇数阶的幻方*/
//函数声明
void array();
//主函数
int main() {
array(); //函数调用
return 0;
}
void array() {
int n, i, j, idx, num, MAX;
int* M; //定义一个一维数组指针,按行优先存储矩阵中的元素
printf("请输入n:");
input:
scanf("%d", &n);
if (n%2==0) //n是偶数则重新输入
{
printf("n不为奇数,请重新输入:");
goto input;
}
MAX = n * n; //MAX为幻方中的最大值,也是元素个数
M = (int*)malloc(sizeof(int) * MAX); //分配存储空间
M[n / 2] = 1; //获取数值1的列标
i = 0;
j = n / 2;
//从2开始确定每个数的存放位置
for ( num = 2; num <= MAX; num++)
{
i = i - 1;
j = j + 1;
if ((num-1)%n==0) //当前数是n的倍数
{
i = i + 2;
j = j - 1;
}
if (i<0) //当前数在第0行
{
i = n - 1;
}
if (j>n-1) //当前数在最后一列,即n-1列
{
j = 0;
}
idx = i * n + j; //根据二维数组下标与元素的对应关系
M[idx] = num; //找到当前数在数组中的存放位置
}
//打印生成的幻方
printf("生成的%d阶幻方:", n);
idx = 0;
for ( i = 0; i < n; i++)
{
printf("\n");
for ( j = 0; j < n; j++)
{
printf("%3d", M[idx]);
idx++;
}
}
printf("\n");
free(M);
}
/*Case 4
快速排序
用指针实现快速排序算法,并将排序结果逐个输出*/
void QuickSort(int* arr, int left, int right) {
//若果左边的索引大于或等于右边索引,说明该序列整理完毕
if (left>=right)
{
return;
}
int i = left;
int j = right;
int key = *(arr + i); //使用k来保护作为键值的数据
//本轮排序开始,当i=j时本轮排序结束,将值赋给arr[i]
while (i<j)
{
while ((i<j)&&(key<=arr[j]))
{
j--; //不符合条件,继续向前寻找
}
*(arr + i) = *(arr + j);
//从前往后找一个大于当前键值的数据
while ((i<j)&&(key>=arr[i]))
{
i++; //不符合条件,继续向后寻找
}
//直到i<j不成立时while循环结束,进行赋值
*(arr + j) = *(arr + i);
}
*(arr + i) = key;
QuickSort(arr, left, i - 1);
QuickSort(arr, i + 1, right);
}
//输出数组
void print(int* arr, int n) {
for (int i = 0; i < n; i++)
{
printf("%d ", *(arr + i));
}
}
int main() {
int arr[10] = { 3,5,6,7,2,8,9,1,0,4 };
printf("原数组:\n");
print(arr, 10);
QuickSort(arr, 0, 9); //排序算法
printf("\n排序后的数组:\n");
print(arr, 10); //输出数组
return 0;
}
本篇的所有代码是在VS编译环境下操作的,如有错误,望大家指正!!!
更多推荐
C语言经典案例——第五章 指针(上)
发布评论