面试题1

Sony 笔试题
1.完成下列程序
*
*.*.
*..*..*.. 
*...*...*...*... 
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
 *......*......*......*......*......*......*......
*.......*.......*.......*.......*.......*.......*.......*.......
#include <stdio.h>
#define N 8
int main() {
int i;
int j;
int k;
 ---------------------------------------------------------
| | | | | |
 ---------------------------------------------------------
return 0;
}


me:

#include<stdio.h>
#define N 8 //flexible
int main()
{
int i;
int j;
int k;
    for(i=1;i<=N;i++) //i-->*..*..*..
{
for(j=1;j<=i;j++)//j-->*.. 
{
printf("*");
 for(k=0;k<i-1;k++)//k-->.. 
   printf("."); 
}
        printf("\n");
}
return 0;
}


ps:有提示的i ,j,k 分析知这三个变量来控制三个循环 (i-->*..*..*..  j-->*..    k-->..   ) 控制好格式就好
       那个宏(N)也不错大笑

2.完成程序,实现对数组的降序排序
#include <stdio.h> 
void sort( );
int main() 
{
int array[]={45,56,76,234,1,34,23,2,3}; //数字任//意给出
sort( );
 return 0;
}
void sort( )
{
____________________________________
| |
------------------------------------

 }
me:

#include<stdio.h>
void sort();

int array[]={45,56,76,234,1,34,23,2,3};//数字任意给出
int N= sizeof(array) /sizeof(int);
int main()
{
sort();
    return 0;
}
void sort()
{
int i,j;
int tem;
  for(i=0;i<N;i++)
       
for(j=i+1;j<N;j++)
{
if(array[j]>array[i])
{
tem=array[i];
array[i]=array[j];
array[j]=tem;
}
       /* printf("  %d ",array[i]);*/
}
for(j=0;j<N;j++)
      printf("  %d ",array[j]);


}


void sort(int *array,int num)
{
int temp;
for(int i=0;i<num-1;i++)
for(int j=i+1;j<num;j++)
if (array<array[j])
{
temp=array;
array=array[j];
array[j]=temp;
}
}






ps:我搜了下原题就是这样的,sort();函数对array()数组排序,题目的数组又不是全局变量,而且sort();也没有参数传递给它  哥哥呀 怎么排序?
对数组的递增,递减排序,一般都拿冒泡了
3.波那其数列,1,1,2,3,5……编写程序求第十项。可以用递归,也可以用其他
方法,但要说明你选择的理由。
#include <stdio.h>
int Pheponatch(int);
int main()
{
printf("The 10th is %d",Pheponatch(10));
return 0;
}
int Pheponatch(int N)
{
--------------------------------
| |
| |
--------------------------------
}

me
#include <stdio.h>
int Pheponatch(int);
int main()
{
printf("The 10th is %d\n",Pheponatch(10));
return 0;
}
int Pheponatch(int N)
if(N==1||N==2) return 1;
else
return (Pheponatch(N-1)+Pheponatch(N-2));

}
    理由 递归调用优点 思路清晰 便于理解 缺点 多层递归调用 系统栈消耗大
        使用递归,理由是递归编程简单,代码容易理解,但缺点是效率不高,而且有深度限制,如果深度太深,则堆栈会溢             出
         

 

该题考查同学们对递归算法的认识程度,在这里我们采用迭代算法,优点是程序运行效率高,而且不用担心堆栈溢出,在运算值大的情况下比递归算法可以提高上万倍的速度,比如同样计算30,递归算法用时

 

  0.019s,而迭代算法则只用了0.003s,可见是递归算法的八分之一,值更大时这种越明显。缺点是程序比较不容易懂。有兴趣的可以参见《C和指针》127页,具体程序如下:

 

  递归法:

 

  #include

 

  int Pheponatch(int);

 

  int main()

 

  {

 

  printf("The 10th is %d",Pheponatch(30));

 

  return 0;

 

  }

 

  int Pheponatch(int N)

 

  {

 

  if(N<=2)

 

  return 1;

 

  return Pheponatch(N-1)+Pheponatch(N-2);

 

  }

 

  迭代法:

 

  #include

 

  int Pheponatch(int);

 

  int main()

 

  {

 

  printf("The 10th is %d",Pheponatch(30));

 

  return 0;

 

  }

 

  int Pheponatch(int n)

 

  {

 

  long result;

 

  long previous_result;

 

  long next_older_result;

 

  result=previous_result=1;

 

  while(n>2)

 

  {

 

  n-=1;

 

  next_older_result=previous_result+result;

 

  previous_result=result;

 

  result=next_older_result;

 

  }

 

  return result;

 

  }

 

 

 

 

 

 

 



ps:这个没得说 这个数列很出名的,跟老毛差不多吧微笑


4.下列程序运行时会崩溃,请找出错误并改正,并且说明原因。
#include <stdio.h>
#include <malloc.h>
typedef struct{
    TNode* left;
    TNode* right;
    int value;
} TNode;
TNode* root=NULL;
void append(int N);
int main()
{
    append(63);
    append(45);
    append(32);
    append(77);
    append(96);
    append(21);
    append(17); // Again, 数字任意给出
}
void append(int N)
{
    TNode* NewNode=(TNode *)malloc(sizeof(TNode));
    NewNode->value=N;
    if(root==NULL)
    {
    root=NewNode;
    return;
    }
else
    {
    TNode* temp;
    temp=root;
    while((N>=temp.value && temp.left!=NULL) || (N<temp. value && temp.right!=NULL))
{
    while(N>=temp.value && temp.left!=NULL)
    temp=temp.left;
    while(N<temp.value && temp.right!=NULL)
    temp=temp.right;
}
    if(N>=temp.value)
        temp.left=NewNode;
    else
        temp.right=NewNode;
    return;
}
}
me:

#include <stdio.h>
#include <malloc.h>
 typedef struct Node{
    int value;
    struct Node * left;
    struct  Node * right;
    }TNode;
 TNode* root=NULL;
void append(int N);
int main()
{
    append(63);
    append(45);
    append(32);
    append(77);
    append(96);
    append(21);
    append(17); // Again, 数字任意给出
}
void append(int N)
{
    TNode* NewNode =(TNode *)malloc(sizeof(TNode));
    NewNode->value=N;
     NewNode->left=NULL;
    NewNode->right=NULL;
    if(root==NULL)
{
root=NewNode;
return;
}
else
    {
 TNode* temp;
 temp=root;
 while((N>=temp->value && temp->left!=NULL) || (N<temp->value && temp->right!=NULL))
{
while(N>=temp->value && temp->left!=NULL)
temp=temp->left;
while(N<temp->value && temp->right!=NULL)
temp=temp->right;
 }
    if(N>=temp->value)
        temp->left=NewNode;
    else
        temp->right=NewNode;
    return;
}
}
ps;
      刚看到这个题我也疑问,研究了下(百度了下),发现这道题的用意:1 原题的结构题能否定义了指向自己的指       针,若能咋用?2 定义了一个结构体的指针,怎么引用这个结构体的实例?temp.value 这样吗?
因为新节点的左右指针没有赋 NULL 值,至使下面的 while循环不能正确结束而导致内


  存越界,最后崩溃(注意结束条件是 temp->left!= NULL 或 temp->right!=NULL)。


更多 

      ps;     结 构体可以 包含指向自己的指针吗?结构标签(struct tag)与类型定义(typedef)


   
     

问题1:两种声明有什么不同?
     struct x1 {...};
     typedef struct {...} x2;
    答:第一种形式声明了一个结构标签,第二种声明了一个“类型定义”。主要区别在于第二种声明更抽象一些,    用户不必知道它是一个结构,且在声明它的实例时也不需要使用struct关键字。例如:
   x2 b;//是OK的
   但是使用结构标签声明的结构就必须用这样的形式定义:
  struct x1 a;
 也可以同时使用
typedef struct x1 {...} a;
尽管有些晦涩,但为标签和类型定义使用同样的名称是合法的,因为它们处于独立的命名空间中。

#include<stdio.h>

struct a

{ int i;

};

typedef struct{int i;} a;

int main()

struct a b;

a c;



return 0;

}

问题2:结构体可以包含自己的指针吗?

此时结构体的定义体还没有结束呀,就像


struct LinkWindow {

Screen window;

LinkWindow * next;

LinkWindow * prev;

};

但如果定义一个结构体像下面的就错了

struct LinkWindow {

Screen window;

LinkWindow next;

LinkWindow prev;

};

因为在结构体定义体完之前是不能具有自身类型的数据成员的,可是第一个例子之所以通过了是因为

定义的结构体名一出现就可以认为该结构体已声明,声明后就可以定义指向该类型的指针及引用,所以可以

定义指向自身的指针

当然可以,但是如果要使用typedef,则有可能产生问题。
例如:
typedef struct{
char *item;
NODEPTR next;//错误,不能在定义typedef类型之前使用它
}*NODEPTR;


版本1:
typedef struct node {
char *item;
struct node *next;
}*NODEPTR;


版本2:
struct node {
char *item;
struct node *next;
};
typedef struct node *NODEPTR;


运行环境:VC6.0
例子程序:tets.c
*************************************************************************************************
#include <stdio.h>

struct x1 //x1为结构标签
{
int a;
int b;
};
typedef struct
{
int c;
int d;
}tx; //tx为类型定义

typedef struct node
{
char item;
struct node *next; //结构体中定义指向自己的指针
}NODEPTR;

/*
typedef struct node
{
char *item;
NODEPTR next; //不可以,不能在typedef类型之前使用它
}*NODEPTR;
*/
void main(void)
{
struct x1 s1; //不能用结构标签自动生成类型定义名: x1 s1
tx s2;
NODEPTR node1;
NODEPTR node2;
node1.next = &node2;

s1.a = 1;
s1.b = 2;
s2.c = 3;
s2.d = 4;
node1.item = 'x';
node2.item = 'y';
printf("s1.a:%d, s1.b:%d \n",s1.a,s1.b);
printf("s2.c:%d, s2.d:%d \n",s2.c,s2.d);
printf("%c, %c \n",node1.item, node2.item);

}



突然间发现这个文本编辑器可以粘贴图片了,大笑以前都是上传,插入,不过 再加上 撤销 ,插入word 等功能就更好了







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值