初始C语言02-分支与循环(中)
【摘要】 5.for循环for( 初始化;判断 ;调整 ){}初始化,判断,调整三个部分:1.可以省略2.判断部分只要省略了,就意味着判断恒为“真”3.尽量不要省略int i = 0;int j = 0;for(;i < 10; i++){ for(; j < 10; j++) { printf("hehe\n"); }}//只打印10个hehe //原因:第一次进...
5.for循环
for( 初始化;判断 ;调整 )
{}
初始化,判断,调整三个部分:
1.可以省略
2.判断部分只要省略了,就意味着判断恒为“真”
3.尽量不要省略
int i = 0;
int j = 0;
for(;i < 10; i++)
{
for(; j < 10; j++)
{
printf("hehe\n");
}
}
//只打印10个hehe
//原因:第一次进入循环,j初始化为0 第二次进入循环之后,j没有重置,,j已经是10了,不满足J < 10了,不打印了。
练习题1:计算n的阶乘
// n! = 1*2*3*...*n
//写法1
int main()
{
int n = 0;
scanf("%d",&n);
int i = 0;
int sum = 1; //注意sum和i不能初始化为0,因为0乘任何数为0
for(i = 1; i <= n; i++)
{
sum*=i;
}
printf("%d\n",sum);
return 0;
}
//写法2-- n! = 1*2*3*...*n
int Fic(int n )
{
return n <=1 ? 1 : Fic(n-1)*n;
}
int main()
{
int n = 0;
scanf("%d",&n);
int ret = Fic(n);
printf("%d\n",ret);
return 0;
}
练习题2:计算1!+2!+3!+…+10!
int main()
{
int n = 0;
scanf("%d",&n);
int i = 0;
int sum = 1; //注意sum和i不能初始化为0,因为0乘任何数为0
for(i = 1; i <= n; i++)
{
sum*=i; //计算每一个阶乘
ret += sum; //阶乘相加
}
printf("%d\n",sum);
return 0;
}
练习题3:在一个有序数组中查找具体的某个数字 - 二分查找
//二分法
int BinarySearch(int* arr, int sz,int k)
{
int right = sz - 1; //右下标
int left = 0; //左下标
while (left <= right)
{
int mid = (right + left) >> 1; //中间值
//mid = (right + left)/2
//左移 == 除2 右移 == 乘2
if (arr[mid] > k)
{
right = mid - 1; //右下标 变成中间值-1位置
}
else if (arr[mid] < k)
{
left = mid + 1; //左下标 变成中间值+1位置
}
else
return mid;
}
return -1; //找不到
}
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 7; //要找的数字
int ret = BinarySearch(arr, sz,k);
if (ret != -1)
{
printf("找到了,下标为:%d\n", ret);
}
else
{
printf("找不到\n");
}
return 0;
}
练习题4:演示多个字符从两端移动,向中间汇聚
int main()
{
char arr1[] = "hello world";
char arr2[] = "***********";
int len = strlen(arr1);
int left = 0;
int right = len - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf(arr2);
printf("\n");
right--;
left++;
Sleep(1000);//Sleep-休眠函数,C语言中,单位为毫秒 1000毫秒 = 1秒
system("cls"); //清屏函数-用来执行系统命名 引用windows.h头文件
}
printf(arr2);
return 0;
}
练习题5:模拟用户登陆场景,并且只能登陆三次(只允许输入三次密码。如果密码正确则提升登录成功,三次均输入错误,则退出程序)
//字符串比较使用strcmp 函数,若字符串相同,返回0
int main()
{
int count = 0;//统计输入密码次数
char arr[20] = { 0 };
//输入密码
printf("请输入密码:->\n");
while (count < 3)
{
gets(arr);
if (strcmp(arr, "Mango") == 0)
{
count++;
printf("登陆成功,你共输入了%d次密码\n", count );
break;
}
else
{
count++;
printf("密码错误,重新输入,剩余机会%d\n",3-count);
}
}
return 0;
}
6.goto语句
//情形1
int main()
{
again:
printf("hehe\n");
goto again;
return 0;
}
//死循环打印hehe
//情形2 --err
//原因:goto不可以跨函数跳转
int test()
{
again:
printf("hehe\n");
}
int main()
{
printf("hehe\n");
goto again;
return 0;
}
关机程序
int main()
{
int count = 0; //次数确认
char arr[20] = { 0 };
printf("请输入:我是猪 否则将在1min内关机,你只有3次机会\n");
system("shutdown -s -t 60");
again:
gets(arr);
if (strcmp(arr, "我是猪") == 0)
{
printf("取消关机\n");
system("shutdown -a");
}
else
{
count++;
if (count == 3)
{
printf("你没有机会啦,拜拜\n");
return 0;
}
printf("仅剩机会%d次\n", 3 - count);
goto again;
}
return 0;
}
//使用循环的写法
int main()
{
int count = 0; //次数确认
char arr[20] = { 0 };
printf("请输入:我是猪 否则将在1min内关机,你只有3次机会\n");
system("shutdown -s -t 60");
while (1)
{
gets(arr);
if (strcmp(arr, "我是猪") == 0)
{
printf("取消关机\n");
system("shutdown -a");
break;
}
else
{
count++;
if (count == 3)
{
printf("你没有机会啦,拜拜\n");
break;
}
printf("仅剩机会%d次\n", 3 - count);
}
}
return 0;
}
//简易写法
printf("1min内关机,输入我是猪取消关机\n");
system("shutdown -s -t 60");
while(1)
{
gets(arr);
if (strcmp(arr, "我是猪") == 0)
{
printf("取消关机\n");
system("shutdown -a");
break;
}
}
7.猜数字游戏
规则:
1.生成一个随机数
2.猜数字(大,小,正确)
3.可以反复玩
rand()函数:
如何产生随机数:
生成随机数-- 引用stdllib.h头文件
rand()生成的随机数:0-32767
想要产生范围为0-99的数字:rand() %100
想要产生范围为1-100的数字: rand()%100 +1
想要产生范围为0-3的数字: rand() % 3
//产生随机数,但这样的话产生的值是固定的
int main()
{
printf("%d\n", rand());
return 0;
}
srand()函数
为了防止每次产生的随机数都是一样的:
在使用rand()函数前,引用srand()函数初始化随机数生成器
srand(): --引用stdlib.h ,注意函数参数为size_t -unsigned int
当srand()函数的参数发生变化时,产生的随机数也发生变化,否则还是产生一样的数
int main()
{
srand(0);
printf("%d\n", rand());
srand(1);
printf("%d\n", rand());
return 0;
}
//两次产生的随机值都不一样
时间戳
时间戳:当前时间与计算机起始时间(1970年1月1日0时0分0秒)的差值
C语言中如何使用时间戳:
time()函数
time()函数 -引用头文件 time.h
参数返回类型:time_t
返回类型为:time_t
本质上是长整形
函数参数类型为:长整形指针
设置随机数生成起点
srand(unsigned int)time(NULL) //拿时间戳作为参数
//只需设置一次即可
代码
注意:
1.生成的随机数要放在while外面 不然每次循环都又生成一个新的随机数 2.每次游戏都产生一个新的随机数
3.因为至少要进入循环一次进行选择->使用do-while循环
void menu()
{
printf("***********************\n");
printf("***** 1.猜数字游戏*****\n");
printf("***** 0.退出游戏 *****\n");
printf("***********************\n");
}
void game()
{
//生成随机数范围:1-100
// rand() % 100 -> 0 - 99
int ret = rand() % 100 + 1;
int guess = 0;
int count = 0;
//猜数字
while (1)
{
printf("请输入你猜的数字,范围为:1-100\n");
scanf("%d", &guess);
if (guess > ret)
{
count++;
printf("猜大了\n");
}
else if (guess < ret)
{
count++;
printf("猜小了\n");
}
else
{
count++;
if (count < 5)
{
printf("你真牛,共猜了%d次,才猜对\n", count);
}
else
{
printf("你运气真差,猜了%d次才猜对\n", count);
}
break;
}
}
}
int main()
{
srand((size_t)time(NULL)); //设置随机数生成起点,以时间戳为参数
int input = 0;
do
{
menu();
printf("请选择->\n");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("请重新选择\n");
break;
}
} while (input);
//0表示假,非0表示真
return 0;
}
今天就先到这吧~感谢你能看到这里!希望对你有所帮助!欢迎老铁们点个关注订阅这个专题! 同时欢迎大佬们批评指正!
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)