目录
😀 1. 计算 n 的阶乘。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n = 0;
int i = 0;
int ret = 1;
printf("请输入一个整型数字:");
scanf("%d/n", &n);
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
printf("%d\n", ret);
return 0;
}
✨运行结果:
请输入一个整型数字:5
120
❗ 注意:❗
当求20的阶乘时,出现错误。这是因为其结果大到一个整型存储不下了,所以,这是不考虑溢出情况下的代码。
😜 2. 计算 1!+2!+3!+……+10!
//代码1
#include<stdio.h>
int main()
{
int i = 0;
int ret = 1;
int n = 0;
int sum = 0;
for (n = 1; n <= 3; n++)
{
ret = 1; //每次都要使ret=1,再开始运算
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
sum = sum + ret;
}
printf("%d\n", sum);
return 0;
}
//9
//代码2
#include<stdio.h>
int main()
{
int i = 0;
int ret = 1;
int n = 0;
int sum = 0;
for (n = 1; n <= 3; n++)
{
ret = ret * n;
sum = sum + ret;
}
printf("%d\n", sum);
return 0;
}
//9
代码2效率更高,写起来更加简洁。
😮 3. 在一个有序数组中查找具体的某个数字n。(折半查找、二分查找)
编写 int binary_search(int x, int v[], int n);
功能:在v[0]<=v[1]<=v[2]<= ….<=v[n-1]的数组中查找x。
💡方法一:
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
//计算数组的元素个数
//sizeof(arr) 计算数组的总大小,单位是字节 -40
//sizeof(arr[0]) 计算数组第一个元素的大小,单位是字节 - 4
int i = 0;
int flag = 0;
for (i = 0; i < sz; i++)
{
if (7 == arr[i])
{
flag = 1;
break;
}
}
if (flag == 1)
printf("找到了,下标是:%d\n", i);
else
printf("没找到\n");
return 0;
}
✨运行结果:
找到了,下标是:6
💡方法二:更高效
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int mid = 0;
int k = 7;
int flag = 0;
while (left <= right)
{
mid = (left + right) / 2;//每一次二分查找都要求出中间元素的下标
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
//找到了
flag = 1;
break;
}
}
if (flag == 1)
printf("找到了,下标是:%d\n", mid);
else
printf("没找到\n");
return 0;
}
✨演示动画:
❗ 注意:❗
折半查找(二分查找)条件:数据必须是有序的。
😋 4. 编写代码,演示多个字符从两端移动,向中间汇聚。
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
char arr1[] = "welcome to here!";
char arr2[] = "################";
int left = 0;
int right = strlen(arr2) - 1;
printf("%s\n", arr2);
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);
left++;
right--;
}
return 0;
}
✨运行结果:
💡当加上system时,运行结果会怎样呢?
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
char arr1[] = "welcome to here!";
char arr2[] = "################";//换成char arr2[]=" ";也可
int left = 0;
int right = strlen(arr2) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);
system("cls");//system使用来执行系统命令的--cls清空屏幕
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
✨运行结果:
😁 5. 编写代码实现,模拟用户登录情景,并且只能登录三次。
只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = 0;
//假设真实的密码是:"123456"
char password[20] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入密码:");
scanf("%s", password);//数组名即地址
//if (password == "123456"); 错误
//两个字符串的比较不能使用==
if (strcmp(password, "123456") == 0)
{
printf("登录成功\n");
break;
}
else
{
printf("密码错误\n");
}
}
if (i == 3)
printf("三次密码错误,退出登录\n");
return 0;
}
😉 6. 猜数字游戏实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("*********************************\n");
printf("*********** 1.play **********\n");
printf("*********** 0.exit **********\n");
printf("*********************************\n");
}
void game()
{
int random_num = rand() % 100 + 1;//生成1~100的随机数
int input = 0;
while (1)
{
printf("请输入猜的数字>:");
scanf("%d", &input);
if (input > random_num)
{
printf("猜大了\n");
}
else if (input < random_num)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
//时间戳
srand((unsigned)time(NULL));//设置随机数的生成起点--不要频繁调用
do
{
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
✨运行结果:
🍇🍇🍇 goto语句
👉
C语言中提供了可以
随意滥用
的 goto语句和标记跳转
的标号。
即goto语句可向前/向后跳转
到任意地方
并可无限跳转
。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
flag://标记
printf("你好\n");
printf("haha\n");
goto flag;
return 0;
}
✨运行结果:(无限循环)
👉
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
#define _CRT_SECURE_NO_WARNINGS 1
//关机程序
//只要程序运行起来,电脑就倒计时1分钟
//1分钟后就关机,如果在1分钟内输入:我是猪,就取消关机
//shutdown -s -t 60 倒计时60秒关机
//shutdown -a 取消关机
#include <stdio.h>
#include <stdlib.h>
int main()
{
char input[10] = { 0 };
system("shutdown -s -t 60");
again:
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
//判断用户输入的是否是我是猪
if (0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
用while循环替换goto语句
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int main()
{
char input[10] = { 0 };
system("shutdown -s -t 60");
while (1)
{
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
//判断用户输入的是否是我是猪
if (0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
break;
}
}
return 0;
}
但是某些场合下goto语句还是用得着的,最常见的用法就是
终止程序在某些深度嵌套的结构的处理过程
,例如:一次跳出两层或多层循环。
这种情况使用break是达不到目的的。break只能从最内层循环退出到上一层的循环。
🌸goto语言真正适合的场景如下:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;//跳出多层循环
}
}
…
error:
if(disaster)
// 处理错误情况
如有问题,欢迎批评指正呀!