只要你愿意 开始总比放弃好。 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、函数追求 高内聚低耦合:函数尽量独立,功能单一
---------------------------一个人所有的愤怒都来源于对自己无能的痛苦。---------------------------