c语言每日一练(8)

前言:
每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。

 五道选择题:

1、请阅读以下程序,其运行结果是( )
 

#include<stdio.h>
int main()
{
char c='A';
if('0'<=c<='9') printf("YES");//1
else printf("NO");
return 0;
} 

A、YES       B、NO       C、YESNO      D、语句错误

解析:易错题,很多人看到代码1的时候就会下意识的认为,它的判定条件是变量c大于等于字符0且小于等于字符9才打印YES,实际上要实现这样的功能代码得是'0'<=c&&c<='9'

代码1的执行是先进行'0'<=c这个运算,再把运算所得到的值与'9'进行比较,c存放的是字符变量'A',ASCII码值为65,'0'的ASCII码值为48。所以'0'<=c得到的值是1,再与'9'进行比较,显然1<='9',最终表达式为真,执行YES的打印。故选A

2 、下列程序的输出结果是什么( )

#include<stdio.h>
int main()
{
int n = 1001;
int ans = 0;
for(int i = 1; i <= n; ++i)
{
ans ^= i % 3;//1
}
printf("%d",ans);
return 0;
}

A、-2         B、0        C 、1        D、2

解析:^(异或)运算符的计算规则是将两个数相同的位变为0,不同的位变为1,那么两个相同的数^等于0,^运算符还满足交换律,因此在进行^的时候可以任意地交换数字之间的位置。

观察代码发现,目标是打印出ans的值,ans在最开始的时侯被赋值为0,然后进入for循环,走向代码1,不停地^i%3的值。i%3可以看出,会在0,1,2三个数中循环,而循环的开始i是为1,所以循环是1,2,0,那么ans就在不停地^1,2,0。观察可知循环的次数为1001,1001/3=333余2。而第332次1,2,0的时候是偶数,意味着第332次时,1,2,0都是一对一对的,那么全部都会被^为0,故最后的结果为(0^1^2)^1^2,等于0,所以选B

3、下面有关空指针和未初始化指针,说法错误的是( )
A、对0x0这个地址取值是非法的
B、空指针可以确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方
C、空指针与任何对象或函数的指针值都不相等                                                                                D、malloc在其内存分配失败时返回的是一个未初始化的指针

解析:不能对空指针进行解引用操作,A正确。空指针是没有指先任何空间的指针,未初始化的指针是野指针,是不安全的可能指向任何地方,B正确。空指针没指向任何空间,没有值,故C正确。malloc创建失败的话会返回空指针,故D错误。选D

4、有以下函数,该函数的功能是( )

int fun(char *s)
{
char *t = s;
while(*t++);//1
return(t-s);//2
}

A、比较两个字符的大小         B、计算s所指字符串占用内存字节的个数
C、计算s所指字符串的长度   D、将s所指字符串复制到字符串t中

解析:易错题,遇到这种题最好的方法就是传一个东西进去试一下,我们传字符串"abc"进去,可以看出,函数fun先使用字符指针t存放s的指针,所以此时t可以等效为"abc"的首地址,走到代码1,是一个循环,循环会令t不停地走直到走到'',因为''的ASCII码值为0。而字符串"abc"走三次才会走到''。但是要注意,*t++,也就是会走到''之后的一个位置。最后走到代码2,首地址和后面的一个地址一减,就会得到字符串"abc"的长度再+1=4。综上所述,答案选B,计算的是字符串占用内存字节的个数,包含''

 5、若有float a[3]={1.5,2.5,3.5},*pa=a;*(pa++)*=3; 则 *pa 的值是()

A、1.5      B、2.5      C、3.5      D、4.5

解析:从左往右一步步看,首先定义了一个浮点型数组a,存放了1.5,2.5,3.5。接着,使用浮点型指针将浮点型数组a的首地址赋给pa,那么pa现在存放的值为1.5,最后*(pa++)*=3,先使用后++,根据优先级,解引用得到1.5*=3,那么数组a首地址所指向的值被修改为4.5。然后pa++,来到2.5所在的地址,*pa解引用,故最后得到的值为2.5,选B


  

编程题1: 

 统计每个月兔子的总数_牛客题霸_牛客网统计每个月兔子的总数_牛客题霸_牛客网

思路:通过一些计算你可以发现,第n个月的兔子总数就是第n个斐波那契数,接下来就很简单了。

#include <stdio.h>
int main()
{
    int a=1;int b=1;
    int month=0;
    scanf("%d",&month);
    if(month<3)
    //当要计算的斐波那契数<3直接打印1
    {
        printf("%d",a);
        return 0;
    }
    while(month-2)
    {
        int tmp=a;
        a=b;
        b=tmp+b;
        month--;
    }
    printf("%d",b);
}

 编程题2:

最大公约数__牛客网 (nowcoder.com)

思路:使用辗转相除法解决问题,具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。 

#include <stdio.h>
int main() {
	long long int a = 0; long long int b = 0;
    //使用long long,防止数据过大
	scanf("%lld %lld", &a, &b);
	while (b)
	{
		long long int tmp = b;
        //储存中间变量
		b = a % b;
		a = tmp;
	}
	printf("%lld", a);
	return 0;
}

  好了,今天的练习到这里就结束了,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O