10月21号moto的笔试是在我们学校举行的,120分钟的笔试时间,试题内容大致涵盖了c/c++,数据库,数字通信,IQ等方面。我自我感觉做的很顺利,至少两道编程题我都搞定了。一个多小时就把试题做完了,于是,我就把一些试题偷偷抄到了草稿纸上,回去和大家一齐分享。下面就是我抄回来的试题:
1。打印如下图案,共19行,只能有一个for循环(程序已经提供)
         *         
        ***        
       *****       
      *******      
     *********     
    ***********
   *************   
  ***************  
  *****************
*******************
  *****************
  ***************  
   *************   
    ***********    
     *********     
      *******      
       *****       
        ***        
         *         
for(i=0;i<19;i++)
{
}
在网上搜寻了些解答,如下:
1.
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
int main()
{
 int a[2]={-1,1};
 string str="*******************";
 int i=0,j=9,t=1;
 for(i=0;i<19;++i)
 {
  j+=a[i<10];
  if(i!=0)t=t+a[i<10]*2;
  cout<<setw(j)<<right<<str.substr(0,t)<<endl;
 }
 return 0;
}

2.
#include<stdio.h>
#include<string.h>
int main()
{
 char * tempStr = "*******************";
 char * blank = " ";
 int i = 0;
 char * dataStr [20];
 char blankstr[10];

 for ( i=0; i<19; i++)
 {
  memset(dataStr, 0, 20);
  memset(blankstr,0,10);
  if (i<10)
  {
   memcpy(blankstr,blank,9-i);
   memcpy(dataStr, tempStr, (i+1)*2-1);
  }
  else
  {
   memcpy(blankstr,blank,i-9);
   memcpy(dataStr, tempStr, (19-i)*2-1);
  }
  printf("%s",blankstr);
  printf("%s\n", dataStr);
 }
 return 0;
}
3。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 19
void main()
{
    int i,k;
   char ch;
   char format[30],stars[30],tmp[3];
   ch = '*';
   strcpy(stars,"");
   for(i=0; i<MAXSIZE; i++)
  {
      if(i <= MAXSIZE/2)
     {
         k = (MAXSIZE + 1)/2 - i;
         strcpy(format,"%");
         itoa(k,tmp,10);
        strcat(format,tmp);
        strcat(format,"c");
        if(i>0)
           {
                strcat(stars,"**");
                strcat(format,stars);
            }
         printf(format,ch);
         printf("\n");
      }
     else
     {
         k = i + 2 - (MAXSIZE + 1)/2;
         strcpy(format,"%");
         itoa(k,tmp,10);
        strcat(format,tmp);
        strcat(format,"c");
        stars[MAXSIZE -1 -(2*(i+1) - MAXSIZE -1)] = 0;
         strcat(format,stars);
        printf(format,ch);
        printf("\n");
     }
 }
 //getchar();
 //getchar();
}
 
注:printf格式%mc表示输入字符宽度为m位,左边补空格.

4。
有高人发的回帖:
#include<iostream.h>
int main(int argv,int * argc[])
{
 for(int i=0;i<19;i++)
 {
  static char cc[19] = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '};
        //19个空格
  static const int j = 19 / 2;   //j值为9
        static int count = 0;          //count为离中间元素的距离
        if( i < ( 19 / 2 + 1))
  {
          cc[j - count] = '*';
          cc[j + count] = '*';
          cout << cc << endl;
          count++;
  }
  else
  {
          count--;
          cc[j - count] = ' ';
          cc[j + count] = ' ';
          cout << cc << endl;
  }
 }
 return 0;
}
 
一看就知差距,我的晦涩难懂
我想用两个数组,一个存放空格数量,一个存放'*'
但是下面这个程序只用了一个数组,把每一行输出的形状存到数组中,妙!我咋就没想到?!

2.
void fun(int x)
{
 if(x/2>0)fun(x/2);
 printf("%d",x);
}
求fun(10)的输出结果     //12510,一个递归,很简单的
3。
#define f1(n) (n)*(n)
         int i=5;
 int k=0;
 k=f1(i++);
 printf("%d %d",i,k);
输出结果:  :// 7 25,++放后面是后算的
4。下面那个for循环是无限循环
for(int i=010;i==10;i+=0)       //这个明显不是,010等于8,8 != 10,一判断就出去了
for(int i=10;(i++^--i)==0;i+=0)   //无限循环
还有几个忘了
5.Email relay 和Email access分别用了什么协议?(其他还有很多,略)
SMTP,POP3
注: SMTP:Simple MAIL Transfer Protocol,简单邮件传输协议,互联网上的电子邮件发送就是使用这个协议。SMTP open relay host:开放的SMTP中继主机——它很可能被恶意的人利用,来产生大量垃圾邮件.
POP3协议允许客户机通过(临时的或永久的)TCP/IP连接或其他网络协议的连接,从一个服务器(这时就称为POP3服务器)上获取电子邮件(E-MAIL),POP3不负责发送邮件.

6。in a mobile phone,软件运行期,stack data 存在于
a.rom,b.flash c.eeprom d.ram e.none of the above
答:D.ram。这题稍微涉及到一点硬件知识,ROM的全称是Read Only Memory,即只读存储器,flash ,eeprom都是ROM家族的一员,RAM是Random Access Memory的简称,意为随机存取存储器,也就是内存了。不管是堆还是栈都是放在内存里的。
7.
int i;
 int x=0x12345678;
 unsigned char *p=(unsigned char *)&x;
 for(i=0;i<sizeof(x);i++)
  printf("%2x",*(p+i));
 在80x86pc机器上运行结果
 Sun Sparc Unix上运行结果
80x86系列机的堆栈的伸展方向是从高地址向低地址.堆栈操作都是字操作.数据入栈16位,高字节在前,低字节在后(即先压入高字节).出栈时,低字节在前,高字节在后(即低字节先出).低字节占低地址,高字节占高地址.  
Intel x86全部为little-endian字节顺序,即低字节的寄存器占用低内存地址线.
Sun Sparc Unix为big-endian字节顺序,即低字节寄存器占用高内存地址线.
 
x在PC机上的内存存放顺序为78 56 34 12,高字节在前,低字节在后,因此输出78563412
Sun Sparc Unix上输出12345678
8.
 char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} };
 for(int i=0;i<12;i++)
 printf("%d ",_______);   //a[i/6][((i>=6 ? (i-6):i)+2)/5][i%3]);  或者:*(*(*(a+i/6)+(i/3%2))+i%3)    *((char *)a + i)
 //*(**a + i)
空格处填上合适的语句,顺序打印出a中的数字
9。void fun(char *a,char *b)
{
 a=b;
 (*a)++;
}
void main()
{
 char s1='A',s2='b';
 char *p1=&s1;
 char *p2=&s2;
 fun(p1,p2);
 printf("%c%c",s1,s2);
输出结果:  // Ac吧,这个比较简单
10。写一个strstr()函数
考完出来,我是很有信心能进入面试的,等了几天,陆续有人收到通知,我却没有。我的信心大受打击,怎么可能呢!?后来了解到,moto的笔试25道选择题做对19道才能参加面试,后面的题目基本不看。回想下,我后面填空和大题做的不错可是选择题确实做的不咋的( 郁闷啊,给宿舍的同学鄙视了:你的水平也不行啊~~~)
    这个时候我开始感觉有点压力了,有点危机感了