练习分析小结

只要你愿意 开始总比放弃好。 Roman.

愿我们都有自己的目标并正在为其不懈努力。

-----------------------------------------------------------------------

1、实现大小写转换

//实现大小写转换
//利用 getchar 实现 :注意 缓存空间

#include<stdio.h>
int main()
{
	char ch = 0;
	printf("请输入:\n");
	while ((ch = getchar()) != EOF)
	{
		if ((ch >= 'a') && (ch <= 'z'))//小写转大写
		{
			ch -= 32;
		}
		else if ((ch >= 'A') && (ch <= 'Z')) //大写转小写
		{
			ch += 32;
		}
		else
		{
			printf("非法输入!\n");
			continue;
		}
		getchar();//清空缓存区
		printf("转换后结果为:\n");
		printf("%c\n", ch);
	}
	return 0;
}

***********************************************************

2、字符串逆置(不使用库函数 不是逆序打印)

//字符串逆置(不使用库函数 不是逆序打印)

#include<stdio.h>
//计算字符串长度
int getlen(char ch[])
{
	int count = 0;
	while (*ch != '\0')
	{
		count++;
		ch++;
	}
	return count;
}

//方法一:非递归实现逆置:下标
void Fturn1(char ch[], int len)
{
	int left = 0;
	int right = len - 1;
	while (left < right) //注意条件
	{
		char tmp = ch[left];
		ch[left] = ch[right];
		ch[right] = tmp;
		left++;
		right--;
	}
	printf("方法一:非递归(下标)实现逆置:\n");
	printf("%s\n", ch);//注意打印方法不需要i循环打印
}

//注意指针方法!!
//方法一:非递归实现逆置:指针
void Fturn2(char* ch, int len)
{
	char* left = ch;
	char* right = ch + len - 1;
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
	printf("方法一:非递归(指针)实现逆置:\n");
	printf("%s\n", ch);//注意打印方法不需要i循环打印
}

//方法二:递归实现逆置:赋值\0法
//实现手段:交换首尾+turn(中间一串字符)
//注意该方法!!!

void turn(char* ch, int len)
{
	char tmp = *ch;
	*(ch) = *(ch+len-1);
	*(ch + len - 1) = '\0';
	//递归要有限制条件:中间的个数大于等于2
	len = (getlen(ch + 1));
	if (len >= 2)
	{
		turn(ch+1, len);
	}
	*(ch + len + 2 - 1) = tmp; //注意此处!!!:一定要加2
}

int main()
{
	//定义一串字符串
	char ch[] = "abcdefgh";
	printf("原字符串:%s\n", ch);
	//计算字符串长度
	int len = getlen(ch);
	//逆置:首尾字符进行交换,依次进行交换
	//区分逆序打印:反过来打印即可
	
	//方法一:非递归实现逆置
	Fturn1(ch, len);//下标

	char ch1[] = "abcdefgh";
	Fturn2(ch1, len);//指针

	//方法二:递归实现逆置
	char ch2[] = "abcdefgh";
	turn(ch2, len);
	printf("方法二:递归实现逆置:\n");
	printf("%s\n", ch2);//注意打印方法不需要i循环打印

	return 0;
}

注意点:

  • 函数内 strlen 可以求字符串长度,但是 sizeof 不可以
  • 注:strlen 只记录'\0' 之前的字符个数 ,但是 sizeof 把 '\0' 也算作字符,计算长度
  • 注意代码中使用递归的part

***********************************************************

3、递归实现n的k次方

//递归实现n的k次方

#include<stdio.h>

double Power(int n, int k)
{
	//三种情况:k 大于0  等于0  小于0
	if (0 == k)
	{
		return 1.0;
	}
	else if (k > 0)
	{
		return n * Power(n, k-1);
	}
	else
	{
		return (1.0 / Power(n, -k));//注意是 -k
	}
}

int main()
{
	int n = 0;
	int k = 0;
	printf("请输入底数n 和指数k:\n");
	scanf("%d %d", &n, &k);
	double put = Power(n, k);
	printf("%d的%d次方结果为:%lf\n", n, k, put); //注意double 对应是 %lf
	return 0;
}

***********************************************************

4、区分 数组长度 与 字符串长度

  • 字符串长度 strlen 是看 '\0' ,记录此前的字符个数, 遇到 '\0' 才停止计数
  • 注意 strlen 作用于字符串, 而不是整型数组
  • 例:
char acX[] = “abcdefg”;
char acY[] = {‘a’,’b’,’c’,’d’,’e’,’f’,’g’};
  • 数组长度 : 对于 acX 数组而言: a b c d e f g \0   共8个字符长度
  •                     对于 acY 数组而言: a b c d e f g    共7个字符长度
  • 字符串长度 : strlen 计算
  •               对于 acX 数组而言: a b c d e f g \0   共7个字符长度(计算 \0 之前字符个数)
  •               对于 acY 数组而言: a b c d e f g  后没有出现 \0 ,即:后面是随机值,何时出现 \0 未知 ,即其字符串长度未知

***********************************************************

5、函数追求 高内聚低耦合:函数尽量独立,功能单一

---------------------------一个人所有的愤怒都来源于对自己无能的痛苦。---------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'Dream是普通小孩耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值