## 1.计算 n 的阶乘

#include <stdio.h>
int main()
{
int i = 1;
int n = 0;
int sum = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
sum *= i;
}
printf("%d\n", sum);
return 0;
}


## 2.计算 1!+2!+3!+……+10!’

#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 3; n++)
{
ret = 1;//初始化ret
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
sum = sum + ret;
}

printf("%d", sum);

return 0;
}

## 或

int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;

for(n=1; n<=3; n++)
{

ret = ret * n;

sum = sum + ret;
}
//ret = 1*1 = 1
//ret = 1*1*2 = 2
//ret = 1*1*2*3 = 6

printf("sum = %d\n", sum);
return 0;
}

## 3.在一个有序数组中查找具体的某个数字n

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int i = 0;
//用数组占用字节长度除以数组首地址占用字节长度，可得出数组元素个数
int sz = sizeof(arr) / sizeof(arr[0]);
for(i=0; i<=sz; i++)
{
if (k == arr[i])
{
printf("找到了，下标是%d\n",i);
}
else
{
printf("没找到\n");
}
}
return 0;
}


#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
//用数组占用字节长度除以数组首地址占用字节长度，可得出数组元素个数
//从数组中所有元素中一个个查找，所以i<=sz
for(i=0; i<=sz; i++)
{
if (k == arr[i])
{
printf("找到了，下标是%d\n",i);
break;
}
}
if(i == sz)
printf("没找到\n");
return 0;
}

*二、折半查找算法*（二分法）

int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int left = 0;//数组左下标
int right = sizeof(arr) / sizeof(arr[0]) - 1;//数组右下标
//用数组占用字节长度除以数组首地址占用字节长度，可得出数组元素个数,元素个数减一得数组右下标
while (left <= right)
{
int mid = (left + right) / 2;//必须放到循环内部，选取新的元素作中间值
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了，下标是%d\n", mid);
break;
}
}
if (left > right)//left>right是，说明数组元素全部被寻找还是没找要找的元素
printf("没找到\n");
return 0;
}


## 4. 编写代码，演示多个字符从两端移动，向中间汇聚。

2. 也可用strlen

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
char arr1[] = "hello,world";
char arr2[] = "###########";
int left = 0;//数组左值
int i = 0;
//因为字符串的结束是'\n',数组下标从0开始（与数组个数差一），因此用sizeof计算是应该减2
//int right = sizeof(arr2) / sizeof(arr2[0])-2;
int right = strlen(arr1) - 1;//数组长度减一，strlen不会计算'\n'
while (left <= right)
{
arr2[left] = arr1[left];//将arr1中左边的字符传递给arr2
arr2[right] = arr1[right];//将arr1中右边的字符传递给arr2
printf("%s\n", arr2);
Sleep(1000);//延迟函数，单位为ms
system("cls");//执行系统命令的一个函数-cls-清空屏幕
left++;
right --;
}
printf("hello, world\n");
return 0;
}

## 5、模拟用户登录情景，并且只能登录三次

int main()
{
int i = 0;
char password[] = "123456";
for (i = 0; i < 3; i++)
{
printf("请输入密码： ");

//== 不能用来比较两个字符串是否相等，应该使用一个库函数-strcmp
{
printf("输入正确，登录成功\n");
break;
}
else
{
printf("密码错误\n");
}
}
if (i == 3)
{
printf("三次输入错误，退出程序\n");
}
return 0;
}

三、goto语句举例

goto语句可以直接跳转到设定的位置，但易造成程序逻辑错误，较少用。

//goto语言，30s关机程序
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 30");//设置30s关机
again:
printf("你的电脑将在30s后关机，请输入：我是猪，取消关机\n");
scanf("%s", &input);
if (strcmp(input, "我是猪") == 0)//设置取消关机的判断条件
{
system("shutdown -a");//取消关机
printf("你已取消关机\n");
}
else
{
goto again;
}
return 0;
}