C++笔试和面试题

12.请完成以下题目。注意,请勿直接调用 ANSI C 函数库中的函数实现。

 a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请给出该题的至少一个不同解法。

第一种unsigned   int   TestAsOne0(char   log)   
  {   
          int   i;   
          unsigned   int   num=0,   val;   
          for(i=0;   i<8;   i++)   
          {   
                  val   =   log   >>   i;     //移位
                  val   &=   0x01;     //1相与
                  if(val)   
                          num++;   
          }   
          return   num;   
  }  

第二种unsigned   int   TestAsOne1(char   log)   
  {   
          int   i;   
          unsigned   int   num=0,   val;   
          for(i=0;   i<8;   i++)   
          {   
                  val   =   (~log)   >>   i;   //反码? 
                  val   &=   0x00;           //0相与
                  if(!val)   
                          num++;   
          }   
          return   num;   
  }  

   b)请编写一个 函数,该函数将给定的一个字符串转换成整数。

int Invert(char *str) 

int num=0; 

while(*str!='\0') 

int digital=*str-48; 

num=num*10+digital; 

str=str+1; 

return num; 

   c)请编写一个 函数,该函数将给定的一个整数转换成字符串。

void   IntToCharChange(int   num,   char*   pval)   
  {   
        char   strval[100];   
          int   i,   j;   
          int   val0   =   0;   
          int   val1   =   0;   
            
          val0   =   num;           
          for(i=0;   i<100;   i++)   
          {   
          val1   =   val0   %   10;   //取余
          val0   =   val0   /   10;   //取整
          strval[i]   =   val1   +   48;  //数字字符 
          if(val0   <   10)   
          {   
          i++;   
          strval[i]   =   val0   +   48;   
          break;   
          }   
          }   
          for(j=0;   j<=i;   j++)     //倒置
          {   
          pval[j]   =   strval[i-j];   
          }   
          pval[j]   =   '\0';   
  }

   d)请编写一个 函数,该函数将一个字符串逆序。

void   AntitoneValue(char*   father,   char*   child)   
  {   
  int   i;   
          char   source[100];   
  int   j   =   0;   
    
  while(father[j])     //放入source[j]为长度
  {   
  source[j]   =   father[j];   
  j++;   
  if(j   >   99)   
  {   
  return;   
  }   
  }   
  source[j]   =   '\0';   
    
  for(i=0;   i<j;   i++)   
  {   
  child[i]   =   source[j-i-1];     //反序
  }   
  child[i]   =   '\0';   
  }  

e)请编写一个 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。

int search(char *cpSource, int n, char ch)  //起始地址,搜索长度,目标字符
{
int i;
for(i=0; i<n && *(cpSource+i) != ch; ++i);
return i;
}

   f)请编写一个 函数,该函数在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的。

int  ChildString(char*p)     //自己写

  {   

  Char *q=p;

int  stringlen=0, i=0,j=1,len=0,maxlen=1;   

while(*q!=’\0’)          //不能用strlen,求得长度stringlen

{

  Stringlen++;

q++;

}

  while( i< Stringlen )   

  {   

  if(*(p+i)==*(p+j)&&j< Stringlen)   

  {   

  len++;                    //统计子串长度

  i++;

  j++;   

  }   

  else   

  {   

  if(len>maxlen)           //统计最大子串长度

  {   

  maxlen=len+1;   

  len=0;

  }  

  else {

  len=0;

       }   

       i++;

   j++;

                   

  }   

  }  

  return   maxlen;   

}   

给出演示上述函数功能的一个简单程序,并请编写对应的 Makefile 文件

13.我们需要编写一个图形相关的应用程序,需要处理大量图形(Shape)信息,图形有矩形(Rectangle),正方形(Square),圆形 (Circle)等种类,应用需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标准输出上打印信息的方式做为示意)

    a)请用面向对象的方法对以上应用进行设计,编写可能需要的类

    b)请给出实现以上应用功能的示例性代码,从某处获取图形信息,

      并且进行计算和绘制

    c)如果你的Square继承自Rectangle,请给出理由,如果不是,

      请给出理由,并且请比较两种方式的优劣

    d)请问你所编写的类,在如下代码中会有何表现,请解释

    void test_rectangle_area(Rectangle& r)

    {

        r.set_width(10);

        r.set_height(15);

        assert(r.area() == 150);

}

14.假设现有一个单向的链表,但是只知道只有一个指向该节点的指针p,并且假设这个节

点不是尾节点,试编程实现删除此节点

参考:将下一个节点的内容复制到本节点上,然后删除下一个节点;

15.写一个程序,把一个100以内的自然数分解因数。(自然数分解因数就是将一个自然数

分解为几个素数的乘积,提示,由于该数不是很大,所以可以将质数保存在数组中,以加快计

算速度)

16.编写一个Identify的分配、释放的函数,为110000之间的自然数。

17.分别实现itoaatoi.

#include<stdio.h>
int atoi(const char *str)
{
 int value=0;
 bool b_plus=true; //判断符号

 switch(*str) //过滤符号

 {
 case '+':
 str++;
 break;
 case '-':
 b_plus=false;
 str++;
 break;
 default:
 break;
 }

 while('\0' != *str)
 {
 value = (value*10)+(*str-'0');
 str++;
 }
 if(!b_plus)
 value=-value;
 return value;
}

void main()
{
 char str[]="-999";
 int value=atoi(str);
 printf("The result is:%d\n",value);
}

(2)itoa的实现:

#include<stdio.h>
void itoa(int value, char *str)
{
 if (value < 0) //如果是负数,str[0]='-',并把value取反(变成正整数)

 {
 str[0] = '-';
 value = 0-value;
 }
 int i,j;
 for(i=1; value > 0; i++,value/=10) //value[1]开始存放value的数字字符,不过是逆序,等下再反序过来

 str[i] = value%10+'0'; //将数字加上0ASCII('0')就得到该数字的ASCII

 for(j=i-1,i=1; j-i>=1; j--,i++) //将数字字符反序存放

 {
 str[i] = str[i]^str[j];
 str[j] = str[i]^str[j];
 str[i] = str[i]^str[j];
 }
 if(str[0] != '-') //如果不是负数,则需要把数字字符下标左移一位,即减1

 {
 for(i=0; str[i+1]!='\0'; i++)
 str[i] = str[i+1];
 str[i] = '\0';
 }
}

void main()
{
 int value = -1212345;
 char str[10] = {'\0'}; //记得把str全填充为'\0'

 itoa(value, str);
 printf("The result is:%s\n", str);
}

18.Consider the following code:

#include <stdio.h>

#include <string.h>

int main(int argc, char *argv[]) {

int i = 1;

char buf[4];

strcpy(buf, "AAAA");

printf("%d\n", i);

return 0;

}

a) When compiled and executed on x86, why does this program usually not output what the programmer intended?     x86上为什么不能得到预期结果

b) Name several ways in which the security problem that causes this program not to output what the programmer intended can be prevented WITHOUT changing the code.

参考:第一个问题:   
  32位情况:   
  x86,栈方向向上生长.main的栈中,先分配i空间(4byte),然后分配4个字节的buf(地址在i的上面,i).strcpy越界,0buf开始的第4(0开始)个字节覆盖掉了.x86LSB排列顺序,所以真好覆盖了i的内个数字1.所以显示出数字0.   
  16位情况同样分析即可.  

2问?

19.int w=1,x=2,y=3,z=4;

m=(w<x)?w:x;

m=(m<y)?m:y;

m=(m<2)?m:z;

printf("m=%d",m);        说出结果

答案:1

20.说出结果   ???

#include <stdio.h>

main()

{

    FILE *fp;

    int i,a[4]={1,2,3,4},b;

    fp=fopen("data.dat","wb");//这里帮忙解释一下

    for(i=0;i<4;i++)

    fwrite(&a[i],sizeof(int),1,fp);//这里也帮忙看一下

    fclose(fp);

    fp=fopen("data.dat","rb");

    fseek(fp,-2L*sizeof(int),SEEK_END);//还有这里

    fread(&b,sizeof(int),1,fp);//这里还有也看一下

    fclose(fp);

    printf("b=%d\n",b); 

}

21.有双向循环链表结点:(华为面试题)

typedef struct node

{

  int date;

  struct node *front,*next;

}_Node;

有两个双向循环链表AB,知道其头指针为:pHeadA,pHeadB,请写一函数将两上链表中date值相同的结点删除

参考算法:       
  1.取出A的一个元素d   
  2.收集B中有相同元素d的结点到垃圾箱,并从B里删除   
  3.收集A中有相同元素d的结点到垃圾箱,并从A里删除   
  4.删除垃圾箱中的所有元素   
  5.A链的指针指向下一个   
  6.重复1~5,直到A链循环到头了   
  注意的是第3步,在2步执行后垃圾箱不为空时才执行。  

上述算法还可以做一点点优化:   
  1.加入两个变量cA,   cB,分别记录当前A中和B中的元素个数   
  每次从较长者中取出一个元素来,先从较小者中找起   
  若没有,则不必在较长者中浪费时间了

#include<iostream.h>     
  struct   NODE   
  {   
      int   date;   
      NODE   *front,*next;   
  };  

void   redel(NODE   *&ahead,NODE   *&bhead)   
  {   
          int   boy=0;   
          NODE   *pa=ahead,*pb=bhead,*paa,*paaa,*paaaa,*pbb;   
          while(pa->next!=ahead)   
          {   
                  int   boys=pa->date;   //pa中一个值
                  paaaa=pa;   
                  paa=pa;   
                  pb=bhead;   
                  while(pb->next!=bhead)   
                  {   
                          if(boys==pb->date)   //如果pa,pb中有值相同
                          {         
                                  cout<<endl;   
                                  cout<<"delete   B:"<<paa->date<<"   ";   
                                  if(pb==bhead)   
                                  {   
                                          boy=1;   
                                          pb->front->next=pb->next;   
                                          pb->next->front=pb->front;   
                                          bhead=bhead->next;   
                                          pbb=pb;   
                                          pb=pb->next;   
                                          delete   pbb;   
                                  }           
                                  else   
                                  {   
                                          boy=1;   
                                          pb->front->next=pb->next;   
                                          pb->next->front=pb->front;   
                                          pbb=pb;   
                                          pb=pb->next;   
                                          delete   pbb;   
                                  }   
                          }   
                          else   
                                  pb=pb->next;                 
                  }   
                  while(paa->next!=ahead   &&   boy==1)   
                  {           
                          if(paa->date==boys)   
                          {         
                                  cout<<"delete   A:"<<paa->date<<"   ";   
                                  if(paa==pa)   
                                  {   
                                          pa=pa->next;   
                                          ahead=pa;   
                                          paa->front->next=paa->next;   
                                          paa->next->front=paa->front;   
                                          paaa=paa;   
                                          paa=paa->next;   
                                          delete   paaa;   
                                  }           
                                  else   
                                  {   
                                          paa->front->next=paa->next;   
                                          paa->next->front=paa->front;   
                                          paaa=paa;   
                                          paa=paa->next;   
                                          delete   paaa;   
                                  }           
                          }   
                          else   
                          {   
                                  paa=paa->next;   
                          }           
                  }   
                  boy=0;   
                  if(paaaa==pa)   
                          pa=pa->next;   
          }   
          cout<<endl;                       
  }

int   main()   
  {   
          NODE   *A,*pHeadA,*B,*pHeadB;   
          A=new   NODE;   
          B=new   NODE;   
          pHeadA=A;   
          pHeadB=B;   
          for(int   i=1;i<21;++i)             //生成链表A,并赋初值!   
          {   
                  A->date=i;   
                  A->next=new   NODE;   
                  A->next->front=A;   
                  A=A->next;   
          }   
          A=A->front;   
          delete   A->next;   
          A->next=pHeadA;   
          pHeadA->front=A;   
            
          for(int   i=1;i<33;i+=2)         //生成链表B,并赋初值!   
          {   
                  B->date=i;   
                  B->next=new   NODE;   
                  B->next->front=B;   
                  B=B->next;   
          }   
          B=B->front;   
          delete   B->next;   
          B->next=pHeadB;   
          pHeadB->front=B;   
            
          redel(pHeadA,pHeadB);         //调用函数删除相同结点!   
  }  

22.

char * GetStr()

{

char *tmp;

tmp = "123"

return tmp;

}

void main()

{

printf("%s", GetStr());

}

会输出123吗?123创建在堆上还是栈上呢?123的空间是什么时候释放的?

参考:"123"  是常量字符串,存储在全局变量区,和静态变量一起。即不在堆,也不在栈   在程序结束时自动释放    

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: aibee c 笔试题是一道计算机科学的题目。在这道题,我们需要编写一个C程序来解决一个问题。 首先,我们需要定义题目所给的问题。然后,我们按照一定的逻辑步骤编写C代码来解决这个问题。最后,我们通过对代码的测试来验证我们的解答是否正确。 在编写代码之前,我们需要先理解题目的要求。对于aibee c 笔试题,可能一个与机器学习或数据分析相关的问题。我们需要使用C语言编写一个算法来对数据进行处理和分析。 首先,我们需要确定问题的输入和输出。根据题目要求,我们需要从用户那里获取输入数据,并对其进行分析处理后输出结果。 接下来,我们可以进行算法的设计和代码的编写。在C语言,我们可以使用函数和循环结构来完成这个任务。我们可以编写一个函数来接收输入数据,并使用循环结构对数据进行处理和分析。然后,我们可以编写一个函数来输出结果。 在编写代码时,我们需要注意输入数据的合法性和边界情况。我们可以使用条件语句来处理异常情况,并给出相应的提示。 编写完成代码后,我们需要进行测试。我们可以使用不同的测试数据来验证代码的正确性。例如,我们可以使用给定的样例数据来检查输出结果是否与预期相符。如果结果正确,我们可以认为我们的代码是正确的。如果结果不正确,我们需要检查代码的错误,并对其进行修正。 综上所述,通过理解题目、设计算法、编写代码和进行测试,我们可以高效地解答aibee c笔试题。在这个过程,我们可以提高自己的编程能力,并且加深对计算机科学原理的理解。 ### 回答2: aibee c是一个笔试题,我将用300个字的篇幅来解答。 aibee c是一个技术人员招聘平台。它提供了一系列的笔试题,以帮助企业筛选和选拔合适的人才。 aibee c首先关注的是技术能力。笔试题的内容通常包括编程、数据结构和算法等相关知识。这些题目旨在评估应聘者在技术领域的熟练程度,以及解决问题的能力。 aibee c还注重对应聘者的实际操作能力的评估。除了理论知识外,笔试可能还包括一些实际案例分析、项目经验和技术实践等内容。这些题目可以帮助企业了解应聘者的解决问题的方法和思路。 通过参加aibee c的笔试,应聘者有机会展示自己的综合能力。不仅仅是技术能力,还包括沟通能力、团队合作和自我管理等方面的能力。这些都是企业在招聘技术人员时所看重的品质。 对于企业来说,aibee c提供了一个简便、高效的方式来筛选和选拔人才。通过笔试题的分数和表现,企业可以更加客观地评估应聘者的能力与潜力。 总之,aibee c是一个专注于技术人员招聘的平台,通过提供一系列的笔试题,帮助企业筛选和选拔合适的人才。它不仅关注技术能力,还注重实际操作能力和综合能力的评估。对于企业来说,aibee c是一个便捷、高效的招聘工具。 ### 回答3: aibee c的笔试题主要包括以下内容: 1. 编程能力测试:会考察编程语言的基本知识和算法能力,例如编写简单的程序,完成数据结构或算法的实现等。 2. 数据分析题目:会给出一些数据集或情景,要求借助统计学和数据分析的知识,对数据进行分析和解读,提供相应的结论或建议。 3. 技术思维题目:会给出一些技术问题,要求发挥自己的技术思维,提出解决方案或对问题进行思考和分析。 4. 面试题目:会提问一些与个人经验、能力和行为特征相关的问题,旨在了解应聘者的能力、沟通能力、团队合作能力等。 在回答这些题目时,可以注意以下几点: 1. 仔细阅读题目要求和要点,理解清楚题目的意思。 2. 在回答编程题目时,要注意代码的清晰和逻辑性,保证代码的正确性。 3. 在回答数据分析题目时,要注重数据的可视化和解释,结合具体情境给出合理的分析和建议。 4. 在回答技术思维题目时,要注重先提出问题,再给出解决方案,同时要注重合理性和可行性。 5. 在回答面试题目时,要真实、简洁地表达自己的观点和经验,注重沟通和表达能力。 总之,在回答aibee c的笔试题时,要准确理解题目,保持思维的清晰和合理性,积极思考并给出恰当的解答。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值