一.导入
我们前面讲了 while 循环 for 循环以及 do...while 循环,今天就让我们使用这些循环语句来解决一些实际问题
二.练习题
(1)请你编写一段代码,求 n 的阶乘,n的值由用户输入的值为准(不考虑溢出的情况)
示例代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
int main(void){
int n = 0;
int ret = 1;
printf("Please enter num:");
scanf("%d",&n);
for (int i = 1; i <= n; i++){
ret = ret * i;
}
printf("ret = %d\n",ret);
system("pause");
return 0;
}
代码解析:我们首先使用 scanf() 函数获取用户输入的值并将其赋值给 n 作为阶乘的参数,随后后初始化了一个变量 ret 用来存储结果,随后使用 for 循环来生成 1-n 的数字并将其乘以 ret 然后赋值给 ret,最终的结果就是 1-n 的阶乘,如图所示:
(2)利用循环,计算1!+ 2!+ 3! ...... +10!
示例代码(有误):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
int main(void){
int n = 0;
int i = 1;
int ret = 1;
int sum = 0;
for (n = 1; n <= 10; n++){
for (i = 1; i <= n; i++){
ret = ret * i;
}
sum = sum + ret;
}
printf("sum = %d\n",sum);
system("pause");
return 0;
}
上面我们是输出的 1 - n 的阶乘,这里我们需要输出 1 -10 的阶乘,所以这里我们用到了 for 循环的嵌套,内层 for 循环用于输出每一个数字的阶乘,并将值赋值给 ret ,外层 for 循环则是生成 1 - 10 的数字并将内层 for 循环的结果赋值给 sum ,这样貌似没什么问题,但是当我们运行起来时候却会发现问题,程序居然输出了:1444231215 而正确的答案应该是:4037913 ,其原因就是我们没有在每一次循环之前对 ret 进行重新初始化为 1 ,所以会导致结果出现问题,正确的代码应该写成如下形式:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
int main(void){
int n = 0;
int i = 1;
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("sum = %d\n",sum);
system("pause");
return 0;
}
(3)利用循环在一个有序数组中查找数字 n
示例代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
int main(void){
int arr[] = {1,2,3,4,5,6,7,8,9};
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
int num = 0;
printf("please enter the number:");
scanf("%d",&num);
for (i = 0; i < sz; i++){
if (num == arr[i]){
printf("num is %d in arr[%d]\n",arr[i],i);
break;
}
}
if (i == sz){
printf("Can't found number!\n");
}
system("pause");
return 0;
}
我们使用 for 循环进行遍历数组的操作,将用户输入的预期值 num 与数组中的每一个元素进行比较,如果用户输入的数字能在数组中找到则输出数字与下标,若 i 的值已经等于 sz 也就是将数组全部遍历完了还没有找到则告诉用户找不到,如图所示:
2024/2/18
王起舟