目录
1、计算n的阶乘
#include <stdio.h>
int main()
{
int n = 0;
int i = 0;
int ret = 1; //ret不能为0
scanf("%d", &n);
//循环产生1~n的数字
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
printf("%d\n", ret);
return 0;
}
思路:n!= 1*2*3*....*n,最好能产生1~n的数字,累积乘在一起,所以运用循环来实现 。
2、计算1!+2!+3!+...+10!
法一:
#include <stdio.h>
int main()
{
int ret = 1;
int sum = 0;
int i = 0;
for (i = 1; i <= 10;i++)
{
ret = ret * i;
sum = sum + ret;
}
printf("%d\n", sum);
return 0;
}
思路:1!= 1,2!=1!×2,3!= 2!×3 以此类推,避免了重复计算。
法二:
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 10; n++)
{
ret = 1; //防止有累积效果
for (i = 1; i <= n; i++)//计算一个数的阶乘
{
ret = ret * i;
}
sum = sum + ret; //求和
}
printf("%d\n", sum);
}
3、编写代码,演示多个字符从两端移动,并向中间汇聚
代码效果:
w*******************!
we*****************!!
wel***************!!!
welc*************!!!!
welco***********!!!!!
welcom*********a!!!!!
welcome*******na!!!!!
welcome *****ina!!!!!
welcome t***hina!!!!!
welcome to*China!!!!!
welcome to China!!!!!
代码实现:
#include <stdio.h>
#include <string.h> //使用strlen函数需要包含头文件
int main()
{
char arr1[] = "welcome to China!!!!!";
char arr2[] = "*********************";
int left = 0;
int right = strlen(arr2) - 1; //字符串长度-1就是右下标的长度
while (left<=right)
{
arr2[left] = arr1[left]; //将arr1的左下标放到arr2的又下标
arr2[right] = arr1[right];
printf("%s\n", arr2);
left++;
right--;
}
return 0;
}
程序运行结果:
接下来再给大家拓展一点知识,实现一秒打印一个,这时候需要调用一个函数Sleep。
#include <stdio.h>
#include <string.h> //使用strlen函数需要包含头文件
#include <Windows.h> //使用Sleep函数需要包含头文件
int main()
{
char arr1[] = "welcome to China!!!!!";
char arr2[] = "*********************";
int left = 0;
int right = strlen(arr2) - 1; //字符串长度-1
while (left<=right)
{
arr2[left] = arr1[left]; //将arr1的左下标放到arr2的又下标
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000); //Sleep是实现睡眠的(停顿),单位是毫秒
left++;
right--;
}
return 0;
}
感兴趣的小伙伴可以去vs里试试效果。
接下来还有的人问,能否在一行上让代码往中间走呢?当然可以!用一个system函数就行了。
#include <stdio.h>
#include <string.h> //使用strlen函数需要包含头文件
#include <Windows.h> //使用Sleep函数需要包含头文件
#include <stdlib.h> //使用system函数需要包含头文件
int main()
{
char arr1[] = "welcome to China!!!!!";
char arr2[] = "*********************";
int left = 0;
int right = strlen(arr2) - 1; //字符串长度-1
while (left<=right)
{
arr2[left] = arr1[left]; //将arr1的左下标放到arr2的又下标
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000); //Sleep是实现睡眠的(停顿),单位是毫秒
system("cls");
left++;
right--;
}
return 0;
}
这里讲解一下,system是一个库函数,可以执行系统命令,同时需要包含头文件,cls是清空屏幕的命令。
我们可以在开始中搜索并打开“命令提示符”,首先我输入“dir”来显示信息如下
然后我再次输入“cls”并回车,就达到了清屏的效果
4、编写代码,模拟用户登录情景,并且只能登录三次
要求:只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 0;
char password[20] = { 0 };
int flag = 0;
for (i = 1; i < 4; i++)
{
printf("请输入密码:");
scanf("%s", password);//数组名就是地址
if (password == "123456")
{
printf("登录成功\n");
flag == 1;
break;
}
else
{
printf("第%d次密码错误\n", i);
}
}
if (flag == 0)
{
printf("三次密码均输入错误,退出程序\n");
}
return 0;
}
这代码看似没毛病,其实运行起来却和我们想象的不太一样
我假设的密码不就是123456,为什么还是提醒我密码错误了呢?
原因很简单,判断两个字符串是否相等,要使用strcmp函数,不能直接使用”==“,同时,这个函数会接收一个返回值,
如果第一个字符串小于第二个字符串,返回<0的数字。(它们比的是ASCII)
如果第一个字符串大于第二个字符串,返回>0的数字。
如果第一个字符串等于第二个字符串,返回==0。
所以最后正确的代码在下面:
#include <stdio.h>
int main()
{
int i = 0;
char password[20] = { 0 };//字符串数组,可以存放字符串
int flag = 0;
for (i = 1; i < 4; i++)
{
printf("请输入密码:");
scanf("%s", password); //数组名本质就是地址,所以不需要取地址
if (strcmp(password,"123456") == 0)
{
printf("登录成功\n");
flag = 1;
break;
}
else
{
printf("第%d次密码错误\n", i);
}
}
if (flag == 0)
{
printf("三次密码均输入错误,退出程序\n");
}
return 0;
}