C语言代码题解析(二)

        今天我们来进行C语言代码题解析第二弹,与诸君共同努力。

目录

1.选择题

1.1 下面代码的结果是:( )

 1.2  以下说法正确的是( )

1.3 下面代码的结果是:( )

2.实操题

2.1 打印闰年

2.2 【一维数组】输入10个整数,求平均值

 2.3 矩阵转置

2.4  【一维数组】交换数组

2.5 最大公约数

2.6 从小到大输出

 2.7 三角形判断

 2.8 求最大值

 2.9 分数求和

 2.10 数9的个数

 2.11 打印素数


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进行自增。第二层循环完了之后,用于判断这个数是不是素数。

        代码如下:

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值