今天我们来进行C语言代码题解析第二弹,与诸君共同努力。
目录
1.选择题
1.1 下面代码的结果是:( )
A.4
B.16
C.20
D.5
#include <stdio.h>
int main()
{
int arr[] = {1,2,(3,4),5};
printf("%d\n", sizeof(arr));
return 0;
}
在int arr[]={1,2,(3,4),5}数组中,里面总共有四个元素,其中 (3,4) 为逗号表达式,取其后者,因此数组元素分别为1,2,4,5。
sizeof(arr) 是求整个数组所占空间的大小,所以4*4=16。选择B。
打印出数组arr看结果及大小。
1.2 以下说法正确的是( )
A.数组acX和数组acY等价
B.数组acX和数组acY的长度相同
C.sizeof(acX)>sizeof (acY)
D.strlen (acX)>strlen (acY)
char acX[] = "abcdefg";
char acY[] = { 'a','b','c','d','e','f','g'};
A 等价:即元素一样。虽然acX和acY都是char类型的。但是数组acX是字符串,所以它有8个元素,分别是:'a','b','c','d','e','f','\0'。但是在数组acY中只有7个元素,分别是:'a','b','c','d','e','f'。
B 正如上面说的,数组acX,比acY多一个'\0',所以在计算数组acX时,遇到'\0'就会停止计算,所以数组acX的长度为7。但是数组acY中没有'\0',所以数组acY的长度是一个随机值。
C sizeof是计算有效元素的个数,所acX中的'\0'也算,总共是8个。数组acY中是7个。所以C正确
D 如B中所说,数组acX的长度1是7,而数组acY的长度是一个随机值。
1.3 下面代码的结果是:( )
A.10 9
B.9 9
C.10 10
D.9 10
#include <stdio.h>
int main()
{
char str[] = "hello bit";
printf("%d %d\n", sizeof(str), strlen(str));
return 0;
}
sizeof是计算元素有效个数的,所以会将'\0'也计算上,sizeof(str)值为10,。
而strlen计算长度,遇到'\0'就会停止,所以长度为9.
2.实操题
2.1 打印闰年
题目:打印1000-2000年之间的闰年。
分析:能够被4整除并且不能被100整除,或者能够被400整除的,是闰年。
可以设置一个变量,对年份从1000开始递增到2000,如果满足这个条件就是闰年,然后打印出来。
代码如下:
2.2 【一维数组】输入10个整数,求平均值
题目:编写一个程序,从用户输入中读取10个整数并存储在一个数组中。然后,计算并输出这些整数的平均值。
分析:当数组需要输入输入值时,就需要使用到循环来进行输入。求平均值,可以先将存入数组中的值累加,之后再除以10计算平均值。
需要注意的是,求平均值的变量需要使用浮点型,如果定义sum变量时,使用的是整形,那么久需要使用到强制转换。也可以在定义sum时,就是用float或者double类型。
2.3 矩阵转置
题目:有一个矩阵,求转置后的矩阵(将矩阵的行列互换得到的新矩阵称为转置矩阵)。
第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)
从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。
分析:先输入n,m的值,在输入数组元素时,n代表的是行,m代表的是列。打印时,就需要将行和列的值进行调换,用m表示行,n表示列。
给数组输入值时,需要使用双循环给数组元素赋值。可以设置两个变量,用于表示数组中的行和列的下标,用这两个变量小于行或列作为循环的条件。
在数组输出时,需要将行和列的循环条件进行置换,也要使用相对应的变量来表示数组行和列的下标。
代码如下:
2.4 【一维数组】交换数组
题目:将数组A中的内容和数组B中的内容进行交换。(数组一样大)
分析:如果是通过scanf函数输入数组的元素,那么就需要使用循环,通过递增元素的下标来输入元素。
在对两个数组进行交换时,可以使用一个中间数组,来对这两个数组进行置换。
在打印时,也需要使用循环,使下标递增来打印数组的元素。
代码如下:
int main()
{
int arr1[5];
int arr2[5];
printf("请输入5个数字:");
for (int i = 0; i < 5; i++)
{
scanf("%d",&arr1[i]);
}
printf("请输入5个数字:");
for (int i = 0; i < 5; i++)
{
scanf("%d", &arr2[i]);
}
for (int i=0; i < 5; i++)
{
int arr[10];
arr[i] = arr1[i];
arr1[i] = arr2[i];
arr2[i] = arr[i];
}
printf("数组arr1:");
for (int i = 0; i < 5; i++)
{
printf("%d",arr1[i]);
}
printf("\n数组arr2:");
for (int i = 0; i < 5; i++)
{
printf("%d", arr2[i]);
}
return 0;
}
运行结果:
2.5 最大公约数
题目:给定两个数,求这两个数的最大公约数。
分析:求最大公约数有很多中方法,比如枚举法、辗转相除法等。枚举法就是对小于这两个数的数一个个进行测试找约数,最后找出最大的那一个。
这里使用的是辗转相除法。假设a=24,b=16,计算a%b得到c=8;然后再计算b%c,得到结果为0,那么c就是最大公约数。在第一次计算中a%b=c,在第二次计算中b%c=0。其实我们可以将第二次计算转化一下,b就是第一次计算中的a,c就是第二次计算中的b。
所以我们可以进行循环,当a%b=c为0时,就求到了最大公约数。可以将这个做为循环的条件,将b赋给a,将c再赋给b,即a=b,b=c。
代码如下:
2.6 从小到大输出
题目: 写代码将三个整数数按从大到小输出。
分析:假设有三个整数a,b,c,为了求它们三个的大小关系,应该使用一个数a,与另外两个数bc进行比较,再让另外两个数bc之间进行比较,这样就可以求出三个数的大小关系。
在每两个数进行比较之后,可以使用一个中间变量,将它们进行置换,将大的数转到前面,小的数转到后面。这样直接按照a,b,c的顺序打印,就可以按照降序打印出数字了。
需要注意的是,在比较时,应该让a分别与b,c进行比较,然后置换,再让b.c之间进行比较,然后置换。而不是a和b比较,置换,再让b和c进行比较,置换,最后再a和c进行比较,置换。这样的顺序比较会打乱顺序,导致程序结果 运行错误。
代码如下:
2.7 三角形判断
题目:多组输入数据,对给出的三条边a,b,c能否构成三角形,如果能构成三角形,判断三角形的类型(等边三角形、等腰三角形或普通三角形)。
分析:在判断三角形的类型之前,首先要判断输入的数能不能构成三角形,只有构成三角形才能继续接下来的判断。
等腰三角形和等边三角形比较具有特点,所以在判断是可以先对这两个进行判断,如果郑亮都不是那么就是普通三角形了。
至于先对哪个进行判断。首先我们要知道,等边三角形是特殊的等腰三角形,所以能够构成等边三角形的条件也能构成等腰三角形的条件,但是等腰三角形不一定能够构成等边三角形。
所以可以先判断等边三角形,先判断它的三边是不是三边都相等,若不相等再来判断两边两不相等。
代码如下:
2.8 求最大值
题目:求10 个整数中最大值
分析:可以使用一个一维数组来数,通过循环的方式来输入10个值。
之后再使用循环,使arr数组中的每一个值与变量max进行比较,比max大的,就将值赋给max,这样到了最后max就是最大值了。
代码如下:
2.9 分数求和
题目:计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
分析:观察题目可以看出,分子是不变的,分母从1加到100.符号正负交替。
由于要算的是分数,所以变量的类型要给float或者double。给一个变量flag初始值为1,flag需要与1/i进行相乘,然后再每次相加之后让flag=-flag。这样就做到了符号正负交替。
代码如下:
2.10 数9的个数
题目:编写程序数一下 1到 100 的所有整数中出现多少个数字9
分析:求1-100之间的9的个数时,不应只看个位,也应该计算十位。
代码如下:
但是当题目变化一下,求1-100中包含9的个数。只需要将两个if做成并列的关系就好了。在上面99算作了两个9,但是这里99就要算作一个数了,所以为19个。
代码如下:
2.11 打印素数
题目:写一个代码:打印100~200之间的素数
分析:如果一个数可以被除1和它本身的数整除,那么这个数就不是素数。
可以使用一个双循环,再给一个变量count,初始值为0。第一个循环遍历100-200之间的数字,第二个循环遍历1-n的数,用于对100-200之间的数进行整除,如果能够整除,就对count进行自增。第二层循环完了之后,用于判断这个数是不是素数。
代码如下: