一.试题
1.编写一段代码,输出1/1 + 1/2 +1/3 ····· +1/100的和
有问题的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i++){
sum = sum + 1 / i;
}
printf("sum=%d\n", sum);
getchar();
return 0;
}
上述代码创建了变量i与sum,其中i代表分母,sum用来接收每次相加的结果,创建了一个for循环,当变量i小于100的时候则循环执行for循环中的语句,乍一看这段代码好像没什么问题,但是当我们运行程序的时候我们会发现程序并未输出我们想要的结果,而只是输出了一个1,如图所示:
原因是在计算1/1 = 1 但是在计算 1/2的时候则商0余1,程序会自动抛弃余数,只取商,这导致了1+0+0 ··· 0,最后的结果也就是1,如果需要让程序计算小数部分则需要将变量sum的数据类型改为double(双精度浮点型),for循环中的 sum = 1 / i 也需要改成 sum = 1.0 / i 最后调用printf函数输出的时候 %d 也需要改成 %lf ,因为%d代表需要输出的内容数据类型为整型 %lf则代表输出的内容数据类型为双精度浮点型,这时候我们再来运行程序就可以发现程序运行正常,如图所示:
2.求出10个数字中的最大值
示例代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
int main(void){
int arr[] = {10,9,8,7,6,5,4,3,2,1};
int i = 0;
int max = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i <= sz; i++){
if (max < arr[i]){
max = arr[i];
}
}
printf("max = %d\n",max);
system("pause");
return 0;
}
代码解析:我们首先创建了一个数组变量arr,其数组的元素为10~1的数字,然后创建了变量i用来判断数组下标,变量max用来存储数组中最大元素的值,变量sz则是用来计算数组的元素个数使用for循环当变量i<=sz的时候进入循环,利用if语句如果max的值小于数组中的值则将当前值赋值给max,若max的值大于当前数组元素值则不进入循环,最后调用printf()函数输出max的值,这样就可以找到数组中最大的一个数了,如图所示:
3.编写一段代码,输出9*9乘法口诀表
示例代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
int main(void){
for (int x = 1; x < 10; x++){
for (int y = 1; y < 10; y++){
printf("%d*%d=%d ",x,y,x*y);
}
printf("\n");
}
system("pause");
return 0;
}
代码解析:我们知道乘法口诀表是写成 x*y=z 的形式,那我们可以将x看作列,y看成列,外层for循环用于处理x,内层for循环用于处理y,其条件是x<10 y<10的时候,每次外层for循环执行完一次就调用printf()函数进行换行操作,这样我们就可以得到一张乘法口诀表了,如图所示:
2023/8/1
王起舟