🚩纸上得来终觉浅, 绝知此事要躬行。
🌟主页:June-Frost
🚀专栏:C语言
⚡注:此篇文章的 代码风格部分 将根据《高质量 C++/C 编程指南》 —— 林锐 进行说明。该部分将用紫色表示
该篇将对循环语句进行简单练习。
文章目录:
- 一个小tip:if的风格
- 二分查找
- 计算1!+2!+3!+....+n!
- 实现多个字符从两边向中间汇聚
一个小tip:if的风格
if 中与零值的比较:
📙布尔变量:
不可将布尔变量直接与 TRUE、FALSE 或者 1、0 进行比较
因为TURE的值没有统一的标准,所以对于布尔变量好的书写风格为:
if(num)
这里表示num为真
if(!num)
这里表示num为假
📙整形变量
较好的书写风格:
if(num == 0)
if(num != 0)
📙指针变量
较好的书写风格:
if(num == NULL)
if(num != NULL)
尽管 NULL的值和0相同,但是意义不同。
这样的风格不会让别人误解变量的类型。
另外,有时为了防止将 if(num == 0)
写成if(num = 0)
,可以将变量放在后面,即if(0 == num)
,就算写成了if(0 = num)
,因为0是常量,不能被赋值,当程序运行起来后,编译器会报错,可以很快发现问题。
大家如果有兴趣,可以在 《高质量 C++/C 编程指南》 —— 林锐 里了解。
二分查找
以下为二分查找的思维动图:
查找有序数组 元素 7 的下标
所以我们可以将核心分为4部:
- 确定查找范围的左右下标,left和right
- 根据左右下标(left 和 right),求出中间元素的下标;
- 根据mid指定的元素,进行比较,如果相同返回mid,不同就调整left和right,确定最新的范围。
代码如下:
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d", &k);
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int flag = 0;//作为查找标志
while (left <= right)
{
int mid = (right + left) / 2;
if (arr[mid] < k)
{
left = mid + 1;//调整范围
}
else if (arr[mid] > k)
{
right = mid - 1;//调整范围
}
else
{
flag = 1;
printf("下标为:%d\n", mid);
break;
}
}
if (flag == 0)
{
printf("不存在该元素,无法找到该下标\n");
}
return 0;
}
计算1!+2!+3!+…+n!
在这道题中,首先要考虑如何计算一个阶乘,对于n!,其实就是将1~ n累计乘在一起就可以了,对于1~ n的数值,直接用循环就可以产生。
计算阶乘:
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int ret = 1; //用来保存累乘的值
for (i = 1; i <= n; i++)
{
ret *= i;
}
printf("%d\n", ret);
return 0;
}
既然现在可以计算阶乘了,要计算阶乘的和,只需要用一个循环让n可以变动,再进行求和即可。
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int sum = 0;
int j = 0;
for (j = 1; j <= n; j++)
{
int ret = 1; //保证上次阶乘的结果不会在循环中累乘起来
for (i = 1; i <= j; i++)
{
ret *= i;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
但是在过程中出现了大量的重复计算,都需要重新从1开始累乘,导致效率不是很高。所以我们将重复计算规避。因为 (n-1)! * n 就是 n! ,根据此,改写代码。
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int ret = 1;
int i = 0;
int sum = 0;
for (i = 1; i <= n; i++)
{
ret *= i;
sum += ret;
}
printf("%d\n", sum);
return 0;
}
实现多个字符从两边向中间汇聚
实现效果如下:
这个问题我们可以通过两个相同大小的数组,用循环将一个数组的内容覆盖到另一个数组上。
#include<stdio.h>
#include<windows.h>
int main()
{
char arr1[] = "Welcome to the world";
char arr2[] = "####################";
int left = 0;
int right = strlen(arr1) - 1;
while(left<=right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
left++;
right--;
Sleep(1000);//1000毫秒
system("cls");
}
printf("%s\n", arr2);
return 0;
}
用system函数可以执行系统命令,通过“cls” 来清空屏幕产生一个好的效果。