王剑编程网

分享专业编程知识与实战技巧

几个比较经典的嵌入式C语言笔试题

1.题目一

求下面代码输出:

#include "stdio.h"
struct node
{
    int a;
    int b;
    int c;
};

int main()
{
    struct node  s= {5, 6, 7};
    struct node *pt = &s;
    printf("%d" ,  *(int*)pt);
}

2.题目二

给出数列 {1,1,2,3,5,8,13,21}; 求这个数列的第n项的多少?用C语言实现(使用递归)。

3.题目三

说明下面函数foo的功能。

#include "stdio.h"
int foo( int x , int  n) 
{
    int val = 1;
    if (n>0)
    {
        if (n%2 == 1)  val = val *x;/*如果是奇数,就要再乘一次*/
        val = val * foo(x*x , n/2);/*递归*/
    }
    return val;
}

int main()
{
    printf("%d" ,foo(2,2));
}

4.题目四

求两个大数相加,例如:

#include "stdio.h"
#include "string.h"

int main()
{
    char a1[100] =  "1111111333123412431234";
    char a2[100] =  "2222222194112312312341234123423";
			
  // ...以下是需要补充代码
}


参考答案:

题目一答案:5

题目一解析:

struct node s= {5, 6, 7}; 这句相当于给s里面的变量a,b,c进行了赋值,分别赋值为了5,6,7。

struct node *pt = &s; 这句是声明一个指针pt,并且指向了s这个结构体变量,指向的类型是结构体类型node。

printf("%d" , *(int*)pt); 这句相当于把原本指向的node的结构体类型的pt指针,强转成了变成指向int型,这时候通过*去取指针所指的变量的值的时候,取回来的是结构体s的前4个字节的数据作为int的值,所以输出的结果应该为5。


题目二解析:

这道题的数列便是大名鼎鼎的斐波那契数列,首先我们可以通过观察,找到这个数列的规律是 F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*),用普通递归的参考答案:

#include "stdio.h"
#include "string.h"

int input[] = {1,1,2,3,5,8,13,21};
int fib(int n)
{
    int sum = 0;
    if(n <= 2) return 1;
    sum = fib(n-1) + fib(n-2);
    return sum;
}

int main()
{
    printf("%d\n",fib(7));
    return 0;
}


题目三解析:

foo 是递归函数,这里只要n>0,就会一直递归下去 。如果n<0后递归就会出栈,我们输入 x = 2n = 3来看看执行一下函数运行过程:

  • 第一步,n = 3 ,由于是大于0的,n%2 = 1 执行 val = val 2 , 结果 val = 2。接着执行 val = 2 * foo( 22 , 1 ) 。
  • 第二步,x = 4,n =1,由于这个时候,n还是大于0,所以还是会去递归,还是n%2 = 1, val = val * x ,val = 4, val = 4 foo(4 4 ,0)。
  • 第三步,x = 16 , n = 0, 这个时候就退出递归函数,返回 val =1。

foo的返回值就是 241 = 8 也就是 2 的 3次方,所以这个函数是用来求x的n次方。


题目四参考代码如下:

#include "stdio.h"
#include "string.h"

int main()
{
    char a1[100] =  "1111111333123412431234";
    char a2[100] =  "2222222194112312312341234123423";
    char sum[100] = {0};
    int len1,len2,i,j=0;
    len1 = strlen(a1)-1;
    len2 = strlen(a2)-1;
    for( i = (len1>len2)?len1:len2;i>=0;i--)
    {
        if(len1 >= 0 && len2 >= 0){
            sum[i] = ( (a1[len1] -0x30) + (a2[len2] - 0x30) + j)%10 + 0x30;
            j   = ((a1[len1] -0x30) + (a2[len2] - 0x30))/10;
        }else if(len1 >= 0 && len2 < 0){
            sum[i] = ( (a1[len1] -0x30) + j)%10 + 0x30;
            j = 0;
        }else if(len2 >= 0 && len1 < 0){
            sum[i] = ( (a2[len2] -0x30) + j)%10 + 0x30;
            j = 0;
        }
        len1 --;len2 --;
    }

    printf("\n%s\n",sum);
    return 0;
}

代码输出:

2222222195223423645464646554657


我是小钱嵌入式,会不断的和大家分享嵌入式相关的内容,智能化时代的到来,促就了未来一定是个全民编程的时代 ,如果你觉得我的分享对你有些帮助,请不要吝惜你的点赞和关注原创写作不易,兄弟姐妹们的点赞和关注,就是我分享最大的动力,谢谢!,欢迎在评论区和我一起讨论。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言