当前位置:   article > 正文

循环语句的经典例题(1)_循环语句 习题

循环语句 习题

目录

    1.计算n的阶乘

    2.计算1!+2!+.......+10!

    3.在一个有序数组中查找具体的某个数字n。(讲解二分查找)

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

    5.编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许       输入三次密码,如果密码正确则提示登录成功,如果三次均输入错         误,则退出程序)


1.计算n的阶乘

1、概念

一个正整数的阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。

2、计算方法

(1)大于等于1

        任何大于等于1的自然数n阶乘表示方法:

        n!=1*2*3*.......*(n-1)*n

       或

      n!=n*(n-1)!

(2)0的阶乘

       0!=1

  1. #include<stdio.h>//预处理,头文件对scanf,printf函数的声明
  2. int main()
  3. {
  4. int n = 0;
  5. int i = 0;
  6. int ret = 1;
  7. scanf("%d", &n);//输入
  8. for (i = 1; i <= n; i++)//循环1-n的数
  9. {
  10. ret = ret * i;//n!=n*(n-1)!
  11. }
  12. printf("%d!=%d\n",n, ret);
  13. return 0;
  14. }

2.计算1!+2!+.......+10! 

  1. //代码1
  2. #include<stdio.h>
  3. int main()
  4. {
  5. int n = 0;
  6. int ret = 1;
  7. int sum = 0;
  8. for (n = 1; n <= 10; n++)//循环1-10的数
  9. {
  10. ret *= n;//1!,2!...10!
  11. sum += ret;
  12. }
  13. printf("%d\n", sum);
  14. return 0;
  15. }
  1. //代码2
  2. #include<stdio.h>
  3. int main()
  4. {
  5. int n = 0;
  6. int ret = 1;
  7. int sum = 0;
  8. int i = 1;
  9. for (i = 1; i <= 10; i++)//输出1-10的数
  10. {
  11. ret = 1;//防止ret累积(作用域)
  12. for (n = 1; n <= i; n++)//求n阶乘
  13. {
  14. ret *= n;
  15. }
  16. sum += ret;
  17. }
  18. printf("%d\n", sum);
  19. return 0;
  20. }

 1.代码有好坏,对比代码1效率更优

2.注意:局部变量的作用域

3.在一个有序数组中查找具体的某个数字n。(讲解二分查找)

若生活中你买了一双鞋花了500元,你叫室友猜是不是要给范围:如100-1000。猜的时候每次猜中间值是不是很快就猜到了?

我们的二分查找(也可叫折半查找)就是这个思想

注意:二分查找必须是一个有序数组

特点:每一次查找排除一半的数(速度快)

  1. //代码1
  2. #include<stdio.h>
  3. int main()
  4. {
  5. int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//定义数组并初赋值
  6. int k = 7;//要查找的数
  7. int i = 0;//数组下标
  8. int flag = 0;//找不到的时候的判断条件
  9. for (i = 0; i < 10; i++)//输出每一个数组的数
  10. {
  11. if (arr[i] == k)//判断是否找到
  12. {
  13. printf("找到了,下标是:%d\n", i);
  14. flag = 1;
  15. break;
  16. }
  17. }
  18. //1.break,2.找不到的时候也来这
  19. if (0 == flag)
  20. {
  21. printf("找不到\n");
  22. }
  23. return 0;
  24. }

效率慢,若数组有n个元素,最坏的情况要找n次

  1. //代码2
  2. #include<stdio.h>
  3. int main()
  4. {
  5. int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  6. int k = 7;//查找7
  7. int flat = 0;
  8. int left = 0;
  9. int right = 9;
  10. while (left <= right)
  11. {
  12. int mid = (left + right) / 2;//中间元素的下标
  13. if (arr[mid] < k)
  14. {
  15. left = mid + 1;
  16. }
  17. else if (arr[mid] > k)
  18. {
  19. right = mid - 1;
  20. }
  21. else
  22. {
  23. printf("找到了,下标是%d\n",mid);
  24. flat = 1;
  25. break;
  26. }
  27. }
  28. if (0 == flat)
  29. {
  30. printf("找不到\n");
  31. }
  32. return 0;
  33. }

 代码2:最坏的情况也只是4次对比代码1,效率高

循环条件:left<=right,还有元素课查找

                  left>right,下标交错,没有元素可以查找了,重复查找

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

  1. //4.编写代码,演示多个字符从两端移动,向中间汇聚。
  2. //定义两数组,注数组的大小一样
  3. //College life!!!!
  4. //****************
  5. //C**************!
  6. //Ce************!!
  7. #include<string.h>//strlen的头文件
  8. #include<stdio.h>
  9. #include<windows.h>//Sleep的头文件
  10. #include<stdlib.h>//system的头文件
  11. int main()
  12. {
  13. char arr1[] = "C0llege life!!!!";
  14. char arr2[] = "****************";
  15. int left = 0;//左下标
  16. int right = strlen(arr1) - 1;//strlen-求字符串的长度
  17. while (left <= right)//left>right时,交错重复打印
  18. {
  19. arr2[left] = arr1[left];
  20. arr2[right] = arr1[right];
  21. printf("%s\n", arr2);
  22. Sleep(1000);//Sleep函数是实现睡眠的,单位是毫秒
  23. system("cls");//system是一个库函数,可执行系统的命令,cls是清空屏幕的一个命令
  24. left++;
  25. right--;
  26. }
  27. printf("%s\n", arr2);//再打印arr2
  28. return 0;
  29. }

头文件不需要死背,多用就知道了。

数组名本身就是地址,所以不用&。

strlen-求字符串长度的,统计的是‘\0’之前的字符个数

字符串以‘\0’作为结束标志,是隐藏存在的

5.编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许       输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序)

  1. #include<stdio.h>
  2. int main()
  3. {
  4. char password[20] = { 0 };//字符数组
  5. int i = 0;
  6. int flag = 0;
  7. for (i = 0; i < 3; i++)//可循环3次
  8. {
  9. printf("请输入密码:>");//123456
  10. scanf("%s", password);
  11. //判断两个字符串是否相等,要用strcmp函数,不能直接使用==
  12. //int ret=strcmp(password,"123456")
  13. //如果第一个字符串小于第二个字符串,返回<0的数字
  14. //如果第一个字符串大于第二个字符串,返回>0的数字
  15. //如果第一个字符串等于第二个字符串,返回0
  16. //strcmp不是比数组长度,比内容(一对字符一对字符的比ASCII值)
  17. if (0 == strcmp(password, "123456"))
  18. {
  19. printf("登录成功\n");
  20. flag = 1;
  21. break;
  22. }
  23. else
  24. {
  25. printf("第%d次输入失败\n", i + 1);
  26. }
  27. }
  28. if (0 == flag)
  29. {
  30. printf("三次密码均输入错误,退出程序\n");
  31. }
  32. return 0;
  33. }
补充:判断两个字符串是否相等,要用strcmp函数,不能直接使用==
        如:int ret=strcmp(password,"123456")
        (1)如果第一个字符串小于第二个字符串,返回<0的数字
        (2)如果第一个字符串大于第二个字符串,返回>0的数字
        (3)如果第一个字符串等于第二个字符串,返回0
        注意:strcmp不是比数组长度,比内容(一对字符一对字符的比ASCII值)
我们发现只要是一件事是要重复操作的,我们就要用到循环语句。
for、while、do...while谁方便我们就用谁
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/302935?site=
推荐阅读
相关标签
  

闽ICP备14008679号