个人介绍:初学C语言的小白,热爱编程的菜鸟。
人生,就要活得漂亮,走得铿锵。自己不奋斗,终归是摆设。无论你是谁,宁可做拼搏的失败者,也不要做安于现状的平凡人。造船的目的不是停在港湾,而是冲击风浪;做人的目的不是窝在家里,而是打造梦想。
文章目录
编程实战练习
1.计算n的阶乘 (阶乘计算)
#include<stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 0;
scanf("%d", &n);
//i = 1;//方法一:while语句结构
//ret = 1;
//while (i <= n)
//{
// ret *= i;
// i++;
//}
//方法二:for语句结构
//for (i = 1, ret = 1; i <= n; i++)
//{
// ret *= i;
//}
//方法三:do while语句结构
i = 1;
ret = 1;
do
{
ret *= i;
i++;
} while (i <= n);
printf("%d\n", ret);
return 0;
}
2.计算1!+ 2!+ 3!+ …. + 10!(阶乘计算求和)
普通的方式:
int main()
{
int i = 0;
int n = 0;
int sum = 0;
//printf("请输入一个数来计算其阶乘:>>\n");
//scanf("%d", &n);
for (n = 1; n <= 3; n++)
{
int s = 1;
for (i = 1; i <= n; i++)
{
s = s * i;
}
sum = sum + s;
}
printf("前n项阶乘之和为:%d\n", sum);
return 0;
}
这种方式虽然实现了阶乘求和,但是效率并不高,每次求阶乘都需要从1开始乘。
实际上n! = (n - 1!) * n; 例如3! = 2! * 3,按照这种思想我们优化以下原来的代码,变成:
int main()
{
int i = 0;
int n = 0;
int s = 1;
int sum = 0;
//printf("请输入一个数来计算其阶乘:>>\n");
//scanf("%d", &n);
for (i = 1; i <= 3; i++)
{
s = s * i;
sum = sum + s;
}
printf("sum = %d\n", sum);
return 0;
}
3.在一个有序数组中查找具体的某个数字n。(有序数组查找数字)
普通的方式,遍历数组中所有的元素
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 (arr[i] == k)
{
printf("找到了,下标为%d\n", i);
break;
}
}
if (i == sz)
printf("找不到\n");
return 0;
}
上面这种方式虽然可以查找某个数字,但是效率很低(效率为n)。
实际上我们已经知道这是一个有序的数组,那么我们就可以根据数组的排序关系去做查找。
下面是利用二分查找法\折半查找法来查找,效率为log2n
#include<stdio.h>
//二分查找法查找特定数字
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left <= right)//left小于=right代表中间还有元素可查找
{
int mid = (left + right) / 2;//找到中间元素
if (arr[mid] > k)//中间元素与被查找变量的比较
right = mid - 1;
else if (arr[mid] < k)
left = mid + 1;
else
{
printf("找到了,下标是:%d\n", mid);
break;//找到后要退出循环体
}
}
if (left > right)//需要进行判断,因为来到这一步的也有可能是通过break来的,不一定是执行完循环才到这里的
printf("找不到了\n");
return 0;
}
4.编写代码,演示多个字符从两端移动,向中间汇聚。
首先我们要明白题目的含义,知道是什么意思。
比如说:类似于这种效果
这里有两串字符,所以我们可以定义两个字符数组去存储他们
我们可以将 上方这个数组的元素移动到下面数组中,然后打印下方数组
代码展示:
#include<stdio.h>
#include<string.h>
//welcome to c_code!!!!!!
//#######################
//w#####################!
//we###################!!
//wel#################!!!
//.......
//welcome to c_code!!!!!!
int main()
{
char arr1[] = "welcome to c_code!!!!!!";
char arr2[] = "#######################";
int left = 0;
/*int right = sizeof(arr1) / sizeof(arr1[0]) - 1;*///这种是错误的,arr1最后一个字符是字符串结束标志\0
/*int right = sizeof(arr1) / sizeof(arr1[0]) - 2;*///-2是正确的,但是我们不推荐这种方式,容易出错
int right = strlen(arr1) - 1;//strlen计算字符串长度是不会将\0计算进去
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
left++;
right--;
}
return 0;
}
结果展示:
我们发现这个结果以下就打印出来了,感受不到其中的变化,所以希望每打印一次,就能停顿一小段时间
利用Sleep()函数 头文件Windows.h
Sleep(1000) 休息 1000ms = 1s
运行程序,就能查看其中的变化
除了让程序每次打印停顿一定的时间外,我们还能对齐进行另一步改造,比如清空屏幕
system()函数 头文件为 stdlib.h
system(“cls”) 执行系统命令的一个函数 cls-- - 清空屏幕
5.编写代码实现,模拟用户登录情景,并且只能登陆三次。
(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序)
易错点:使用 == 直接比较字符串是否相等
解决方式 :利用库函数strcmp比较字符串是否相等 如果两个字符串相等
strcmp(arr1,arr2) 返回值为0,只需要判断strcmp返回值是否为0就可以判断字符串是否相等
#include<stdio.h>
#include<string.h>
int main()
{
char password[20];
int i = 0;
for (i = 0; i < 3; i++)
{
printf("Please input your password:>>\n");
scanf("%s", password);
/*if (password == "123456")*///不能直接用==来比较两个字符串是否相等
if (strcmp(password, "123456") == 0)
{
printf("password is right,good luck to you!");
break;
}
}
if (i == 3)
printf("you idiot,put the wrong password three times,don't have another chance!");
return 0;
}
结果展示:
为了提升用户交互体验,我们可以在密码输入错误的时候给个提示:
strcmp字符串比较解析
char string1[] = “abcdef”;
char string2[] = “abccqqqqqq”
strcmp(string1, string2)
使用strcmp在比较string1和string2的时候,从左到右依次比较每个字符,string1与string2前三个字符"abc"相同,string1的第四个字符为d string2第四个字符为c,d的ASCII码大于c的ASCII码,所以strcmp会判断string1 > string2 返回一个大于0的值。
猜数字游戏
要求:
1)电脑会生成一个随机数
2)猜数字
猜数字游戏思路:
1、进入游戏后先打印菜单栏
提示是否进行猜数字游戏 (1为是,0为否)
2、首先要至少玩一次游戏,使用do while语句 只要不退出游戏就一直进行
3、使用switch语句对输入内容进行判断
1 玩游戏 调用game函数进行猜数字游戏
0 打印 退出游戏
其它 打印 选择错误
菜单栏实现 menu函数
猜数字实现 先要生成一个随机数 比如1 - 200
1.先生成一个随机数 rand()
2.rand()是伪随机,在使用之前要调用srand
3.为了让srand生成一个随机值,使用电脑时时刻刻都在变动的时间-- - 时间戳
srand((unsigned int)time(NULL)) //强制类型转换
4.为了产生1 - 200之间的随机数 我们让rand去模上200 + 1
5.猜数字具体操作
(1)先提示输入数字
(2)判断输入数字和随机数之间的大小关系并给予提示
(3)猜对了之后退出本回合猜数字游戏
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("***************************\n");
printf("**** 1.play 0.exit ****\n");
printf("***************************\n");
}
//RAND_MAX
void game()//猜数字函数
{
int guess = 0;
int ret = 0;
//拿时间戳来设置随机数的起点 time_t time( time_t *timer ); time_t long类型
//需要一个变化的数字,电脑上的时间是变化的
//1.生成随机数
ret = rand() % 100 + 1;//设置生成1-100之间的随机数
//printf("%d\n",ret);
//2.猜数字
//printf("猜数字\n");
while (1)
{
printf("请猜数字:>>\n");
scanf("%d", &guess);
if (guess > ret)
printf("猜大了\n");
else if (guess < ret)
printf("猜小了\n");
else
{
printf("你真棒!猜对了!\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do//游戏至少进行一次,可以进行多次,选择do...while语句
{
menu();
printf("请选择:>>\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
结果展示:
goto语句
goto语句作用:跳转到特点语句位置
goto语句应用
自动关机小游戏
提示:
系统设置:shutdown - s - t 60 设置电脑在60s后自动关机
system(“shutdown -s -t 60”) //system( )函数头文件为 stdlib.h
#include<stdio.h>
//设置电脑2分钟后自动关机,如果输入“我是猪”就取消关机
int main()
{
char input[20];
//shutdown -s -t 120 设置在120s后关机
system("shutdown -s -t 120");
again:
printf("电脑将在两分钟后自动关机,如果输入“我是猪”将取消关机\n请输入:>>\n");
scanf("%s", input);
if (strcmp(input, "我是猪") == 0)
{
printf("成功取消关机\n");
system("shutdown -a");
}
else
{
printf("输入错误,请重新输入\n");
goto again;
}
return 0;
}