栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

2019 linux兴趣小组纳新试题

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2019 linux兴趣小组纳新试题

1 打印“=”

#include
int main(int argc,char *argv[]){
	for(unsigned int i=3;i>=0;i--){
		putchar('=');
	}
}

 这道题问的是可以打印出来的“=”的数量,我认为可以打印出来二的三十一次方加上四个“=”,在unsigned int i=3的情况下,可以得到最重要的问题是unsigned的情况,不然可以很容易得到打印出来是四个“=“

那么unsigned是什么意思呢,在变量类型前面加上unsigned可以得到变量的补码形式,那么3的补码得到的结果最后还是3那么看样子没有什么意义,但这是int类型,在进行累减的过程中i会变成-1那么这个时候就变得有意思了,i作为一个无符号数,它会变成1但里面的int i是-1,所以在往后的过程中是会一直输出一直到无法在int类型里面保存才会停止

2.在三种交换方式中考虑如何交换

int c=a; a=b;b=c;

这里使用一个变量保存了a的值,然后把b的值赋给a,最后把c的值给b就好了

a=a-b; b=b+a;a=b-a;

这个使用数学的方法,当两边和到一起时会得到a+b=a+b,所以说可以对这个扩大数据,然后对这个进行修改放缩

a^=b; b^=a;a^=b;

这是使用的异或进行解决的,a^=b可以理解成为a=a^b,这里是使用二进制来进行行,当同一位相同时对应结果为0否则为1.举一个例子a=1011,b=0111.那么第一轮异或之后可以得到a=1100,b=1011那么这个时候再进行一次异或便可以得到a=0111,也同样交换了数值

3.

执行下面的函数,对输出进行说明,同时重复调用

#include
void f(){
	static int a=0;
	int b=0;
	printf("%d ,%dn",++a,++b);
}
int main(){
	f();
	f();
} 

在这里我调用了两次函数,但已经足以说明问题了。

1 ,1
2 ,1

这里的a会不断的上升,主要原因是这里的a被设置成为了全局变量,只不过写在了函数里面罢了。那么在每一次函数调用结束a都会被累加,但b会在下次函数调用的时候变成0准确来说,在函数调用结束,这个b变量就会被消除,在下一次函数使用的时候再进行调用变量空间。所以调用几次函数,a便会是几,但b不会变,只要调用函数,b就是1 

4. 下面程序的输出和原因

#include
int main(){
	printf("%dn",printf("xiyou linux group2%d",printf("")));
}

 这个会输出“xiyou linux group2019”这个在从外往里面输出可以得到,第一个出来的参数是0即printf("")输出部分,那么会得到第一个参数,然后对第二个进行输出,得到xiyou linux group20,最后printf会对这这一行参数进行读取,可以得知一共19个字符,所以在最后会输出19最后便可以得到答案xiyou linux group2019

5.判断输出

#include
int main(int argc,char *argv[]){
	char ch=255;
	int d=ch+1;
	printf("%d %d",ch,d);
}

这里最后可以得到结果是-1和0,char ch=255会造成溢出。 

将这里的255看作数字的补码,因为正数的补码都是其本身,这时候可以先把255看成一个int类型的变量。其反码减一可以得到1111 1110所以再返回来可以得到源码为10000001,所以结果为-1,不管其怎么去存,重点是怎么去读它。在得到的d刚刚好是-1+1得到了结果为0

6.执行代码,得到输出

#include
int main(){
	char x=-2,y=3;
	char t=(++x)|(y++);
	printf("x=%d ,y=%d,t=%dn",x,y,t);
t=(++x)||(y++);
	printf("x=%d ,y=%d,t=%dn",x,y,t);
	
}

在这里得到结果为 

x=-1 ,y=4,t=-1
x=0 ,y=5,t=1

观察代码,会发现第一次计算值后会对x和y进行计算,同时会得到 t=-1。这里是对其进行一次逻辑判断,得到的答案是-1即两个中间有一个小于0,那么进行第二次判断,得到x,y的数值之后在进行判断,即或语句。得到t为1

        

7.输出结果

#include
#define x a+b
int main(){
	int a=1,b=1;
	printf("%dn",x*x*5);
}

输出结果为3

在定义宏函数之后,#define n 10 并不是n=10的意思,而是代表用10替换掉n所以也就很好得到这个结果为3了,举个例子

#include
#define x a+b
int main(){
	int a=1,b=2;
	printf("%dn",x*5);
}

会得到答案为11。

8.

int val=2018;

这一串的意思是给val赋值2018

int *pi=2019

取地址为2019

pi=&val;

把val的地址赋给Pi

*pi=0

pi指向空

9.判断字符输入会是什么结果

#include
#include
int main(){
	char *p=(char *)malloc(sizeof(char)*20),
	*q = p;
	scanf("%s %s",p,q);
	printf("%s %sn",p,q);
}

输出为

xiyou linux
linux linux

这里从开始分析,*p得到一份空间,一共二十个字节,然后把p赋给了*q那么的话,q里面存的是p的地址,那么再输入之后,可以得到在这里P是什么值并不重要,重要的是q里面的值。

相应的,如果我在里面输入wu qihao 便可以得到qihao qihao 

10.输入,并且输出

nclude
int main(){
	int a[4]={2,0,1,9};
	printf("%p ,%pn",a,&a);
	printf("%p ,%pn",a+1,&a+1);
}

这个得到的答案为

000000000062FE10 ,000000000062FE10
000000000062FE14 ,000000000062FE20

 这个答案在我的编辑器上不会发生改变。那么重要的就是解释问题了

在确定一个变量的时候系统会给它分配一段空间,在这个变量名为int 类型的情况下,相邻的应该加4,同时%p和&都有和地址有关系,那么便会得到printf("%p ,%pn",a,&a);得到的答案相同,但

在打印第二行时发生了改变,a+1的确是a的字节数加上int类型所拥有的字节数量,而这个为什么会是000000000062FE20呢,我认为这里是像&a+1=a[4+1]这样的变化

11.斐波那契数列

#include
int main(){
    int n;
    scanf("%d",&n);
    double a[n+1];
    a[0]=0;
    a[1]=1;
    a[2]=1;
    for(int i=3;i<=n;i++){
        a[i]=a[i-1]+a[i-2];
    }
    printf("%0.2f",a[n]);
}

 12

#include
int main(){
	int nums[6]={6,3,2,4,5,1};
	for(int i=0;i<6;i++){
		for(int j=i;j<6;j++){
			if(nums[i]>num[j]){
				int c=num[s];
				nums[i]=nums[j];
				nums[j]=c;
			}
		}
	}
}

这个是冒泡排序, 可以对其进行改进。

改进一:当某一次执行了一次排序之后所有成员都没有位置发生了改变,则设置a变量,使循环跳出
改进二:在每轮排序的最后,记录下最后一次元素交换的位置,下次走到这里就可以直接跳出了

当然也有其他的排序方法,比较特殊的是快速排序我认为,在快排的过程中,会有两个基准的变量和一个变化的数

 1、选出一个key,一般是最左边或是最右边的。
 2、定义一个a和一个b,a从左向右走,b从右向左走。(需要注意的是:若选择最左边的数据作为key,则需要b先走;若选择最右边的数据作为key,则需要a先走)。
 3、在走的过程中,若a遇到小于key的数,则停下,b开始走,直到L遇到一个大于key的数时,将b和a的内容交换,a再次开始走,如此进行下去,直到b和a最终相遇,此时将相遇点的内容与key交换即可。(选取最左边的值作为key)

 经过一次单趟排序,最终使得key左边的数据全部都小于key,key右边的数据全部都大于key。

 然后我们在将key的左序列和右序列再次进行这种单趟排序,如此反复操作下去,直到左右序列只有一个数据,或是左右序列不存在时,便停止操作.

阐述(大端和小端)并且对字节电脑使用的进行验证。

大端模式:

字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。


小端模式:

与大端存储模式相反,在小端存储模式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。

int main()
{
short int x;
char x0,x1;
x=0x1122;

x0=*((char*)&x);
x1=*((char*)&x + 1); 

printf("x0=%xnx1=%xn",x0,x1);
}

如果x0=0x11则是大端,如果是x0=0x22则为小端 


 

  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/603987.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号