C语言指针进阶与之前的一些练习

#include<stdio.h>
int main()
{
	int a[5][5];
	int(*p)[5];
	p = a;//p存放了数组a的首元素地址
	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
	                  //&p[4][2]  -->*(*(p+4)+2)
	//%p打印的是该结果的补码,所以是十六进制存储在内存中
	return 0;
}
#include<stdio.h>
#include<string.h>
#include<assert.h>
void nixuhanshu(char* str)//字符串逆序
{
	assert(str);
	int len = strlen(str);
	char*left = str;
	char* right = str + len - 1;

	while (left<right)
	{
		char cmp = *left;
		*left = *right;
		*right = cmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[256] = { 0 };
	//scanf_s("%s", arr,sizeof(arr));//scanf不会进行边界检查,而scanf_s会进行边界检查,所以加 
                                    //一个sizeof(数组名)给个边界
									//scanf读取到空格时就停止,所以用gets()函数读取一行赋给 
                                    //arr,不用scanf
	gets_s(arr);
	nixuhanshu(arr);	

	printf("逆序后的字符串=%s\n", arr);
	return 0;
}

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf_s("%d%d", &a,&b);
	int sum = 0;
	int ret = 0;
	for (int i = 0; i < b; i++)
	{
		ret = ret * 10 + a;
		sum += ret;
	}
	printf("%d\n", sum);
	return 0;
}
#include<math.h>
#include<stdio.h>
int main()//水仙花数
{
	for (int i = 0; i <=100000; i++)
	{
		//1.判断i是几位数
		int n = 1;//每个i的位数不同,要放在for循环中去重置
		int k = i;//如果直接用i去运算,那i需要在后面不断重置
		int sum = 0;//存放总和
		
		while (k /= 10)//如果除10后不为0,则还有位数
		{
			n++;
		}
		k = i;
		while (k)//如果该while循环中使用的是i,则i被运算后
		{
			sum += pow(k % 10, n);
			k /= 10;
		}
		
		if (sum == i)
		{
			printf("%d ", sum);
		}
		
	}
	return 0;
}

#include<stdio.h>
int main()//打印棱形
{
	int line = 0;//行数
	scanf_s("%d", &line);
	//1.打印上半行
	for (int i = 0; i <line ; i++)
	{
		for (int j = 0; j <line-1-i ; j++)
		{
			printf(" ");
		}
		for (int a = 0; a <2*i+1 ; a++)
		{
			printf("*");
		}
		printf("\n");
	}
	//打印下半行
	for (int j = 0; j < line - 1; j++)
	{
		for (int i = 0; i <1+j ; i++)
		{
			printf(" ");
		}
		for (int a = 0; a <2*(line-1-j)-1; a++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

//喝汽水,一瓶汽水一元,两个空瓶可以换一瓶汽水,给20元,可以买多少汽水
#include<stdio.h>
int main()
{
	int money = 0;
	int total = 0;//有多少瓶汽水
	int empty = 0;//空瓶数量
	scanf_s("%d", &money);
	total = money;
	empty = money;
	//交换汽水
	while (empty>=2)
	{
		total += empty / 2;
		empty = empty / 2 + empty % 2;
	}
	printf("total=%d\n", total);
	return 0;
}


//调整奇数偶数顺序
//奇数全部都位于偶数前面
#include<stdio.h>
void move(int arr[],int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left<right)
	{
		while ((left < right) && arr[left] % 2 == 1)
		{
			left++;
		}
		while ((left<right) && arr[right] % 2 == 0)
		{
			right--;
		}
		if (left < right)
		{
			int cmp = arr[left];
			arr[left] = arr[right];
			arr[right] = cmp;
		}
	}

}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	move(arr,sz);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

//实现一个函数,可以左旋字符串中的k个字符
//例:ABCD左旋一个字符得到BCDA
//ABCD左旋两个字符得到CDAB
#include<string.h>
#include<stdio.h>
#include<assert.h>
//暴力求解法
void move(char* arr, int k)
{
	assert(arr);
	int sz = strlen(arr);
	for (int j = 0; j < k; j++)
	{
		char cmp = *arr;
		for (int i = 0; i < sz-1 ; i++)
		{
			*(arr + i) = *(arr + i + 1);
		}
		*(arr+sz - 1) = cmp;
	}
}
//三步翻转法
//abcdef
//ba fedc//先将ab逆序,再将cdef逆序
//cdefab//再整体逆序
void revers(char* left, char* right)
{
	while (left<right)
	{
		char cmp = *left;
		*left = *right;
		*right = cmp;
		left++;
		right--;
	}
}
void move(char* arr, int k)
{
	int len = strlen(arr);
	revers(arr, arr + k - 1);
	revers(arr + k, arr + len - 1);
	revers(arr, arr + len - 1);
}
int int_move(char* s1, char* s2)
{
	int len = strlen(s1);
	for (int j = 0; j <len-1 ; j++)//一共六种情况,逆序六次
	{
		move(s1, 1);//每次逆序一个,如果每次逆序次数用j进行递增,则s1可能需要重置
		int ret=strcmp(s1, s2);
		if (ret == 0)
			return 1;
	}
	return 0;
}

#include<string.h>
#include<stdio.h>
#include<assert.h>
#include<string.h>//更高效的查找逆序后的字符串是否相等
int int_move(char* s1, char* s2)
{
	assert(s1);
	assert(s2);
	int len1 = strlen(s1);
	int len2 = strlen(s2);
	//如果字符串s1的长度和s2的长度不同,则s2肯定逆序后得不到s1
	if (len1 != len2)
		return 0;
	//1.在s1字符串中追加一个s1字符串,如果使用stcat函数追加,
	//则会因为找不着\0而报错(在自己对自己追加时)
	//(stcat函数的实现原理是将字符串中的内容从头开始一个个往后追加,
	//但是第一个元素会把s1的\0给代换掉,所以追加到结尾时无\0无法停止)
	//而用其他字符串追加时自带有\0,不会报错.
	//所以使用strncat函数,除了要追加的目标和内容,还增加了要追加的字符个数,
	//可以规避\0而导致的错误
	strncat_s(s1,100,s1, 6);
	//2.判断s2指向的字符串是否是s1的字符串的子串
	char* ret=strstr(s1, s2);
	if (ret == NULL)//不是就返回空指针
		return 0;
	else//是就返回s1中(找到的子集)/s2的首元素地址
		return 1;
}
int main()
{
	//写一个函数判断两个数组逆序后是否相同
	//相同返回1,不同返回0
	char arr1[] = "abcdef";
	char arr2[] = "bcdefa";
	int ret= int_move(arr1, arr2);
	if (ret == 1)
		printf("Yes\n");
	else
		printf("No\n");
	return 0;
}



#include<stdio.h>//二维数组中元素的查找
int FindNum(int arr[3][3], int k, int*px, int*py)
{
	int x = 0;
	int y = *py - 1;
	while (x<*px && y<*py)
	{
		if (arr[x][y] < k)
		{
			x++;
		}
		else if (arr[x][y] > k)
		{
			y--;
		}
		else
		{
			//通过x,y传来的地址去改变x,y的值
			*px = x;
			*py = y;
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	int k = 0;
	scanf_s("%d", &k);
	int x = 3;
	int y = 3;
	//返回型参数,拖出去打一顿再遍体鳞伤的回来
	int ret=FindNum(arr, k, &x, &y);
	if (ret == 1)
	{
		printf("找到了,下标是:%d %d\n",x,y);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值