C++笔试题目(不错的!!
1.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;
答:
//假设线性表的双向链表存储结构
typedef struct DulNode{
    struct DulNode *prior;  //前驱指针
    ElemType data;    //数据
    struct DulNode *next;  //后继指针
}DulNode,*DuLinkList;
//删除操作
Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e)
{
  if(!(p=GetElemP_DuL(L,i))) //此处得到i位置的节点指针,如果有需要也得写出具体函数实现
    return ERROR;
  e=p->data;
  p->prior->next=p->next;
  p->next->prior=p->pror;
  free(p);
  return OK;
}
//插入操作
Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e)
{
  if(!(p=GetElemP_DuL(L,i)))
    return ERROR;
  if(!(s=(DuLinkList)malloc(sizeof(DuLNode))))
    return ERROR;
  s->data=e;
  s->prior=p->prior;
  p->prior->next=s;
  s->next=p;
  p->prior=s;
  return OK;
}
2.写一个函数,将其中的\t都转换成4个空格。
答:
该函数命名为convert,参数的意义为:
*strDest目的字符串,*strSrc源字符串,length源字符串的长度
函数实现为:
char* convert(char *strDest, const char *strSrc,int length)
{
  char * cp = strDest;
  int i=0;
  while(*strSrc && i<length)  // 跳出条件
  {
    if (*strSrc==\t)  //\t转换成4个空格
    {
      for(int j=0;j<4;j++)
        *cp++= ;
    }
    else      //否则直接拷贝
      *cp++=*strSrc;
    strSrc++;
    i++;
  }
  return strDest;
}
3.Windows程序的入口是哪里?写出Windows消息机制的流程。
答:
Windows程序的入口是WinMain函数
消息机制:系统将会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统。
4.如何定义和实现一个类的成员函数为回调函数?
答:
所谓的回调函数,就是预先在系统的对函数进行注册,让系统知道这个函数的存在,以后,当某个事件发生时,再调用这个函数对事件进行响应。
定义一个类的成员函数时在该函数前加CALLBACK即将其定义为回调函数,函数的实现和普通成员函数没有区别  5.C++里面是不是所有的动作都是main()引起的?如果不是,请举例。
答:不是,比如中断引起的中断处理不是直接由main()引起的,而是由外部事件引起的。
6.C++里面如何声明const void f(void)函数为C程序中的库函数?
答:在该函数前添加extern “C”声明
7.下列哪两个是等同的
int b;
A const int* a = &b;
B const* int a = &b;
C const int* const a = &b;
D int const* const a = &b;
答:
各式表示的意思分别为:
A const int* a = &b; //*aconst,但指针a可变
B const* int a = &b; //aconst,但*a可变
C const int* const a = &b; //a*a都是const,常量和指针的值都不能改变
D int const* const a = &b; //a*a都是const,常量和指针的值都不能改变
因此CD两者是相同的。
  总结个技巧:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
8. 内联函数在编译时是否做参数类型检查?
答:做类型检查,因为内联函数就是在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来代替。
普天 微软 华为笔试cc++笔试题
公司笔试cc++试题
    现在的公司招聘,都要笔试面试.如果你不是那种编程功底非常深厚的人,又不好好准备一番,在笔试面试中往往会处于被动局面.虽然有些笔试题是故意为难我们,有点钻牛角尖.但是很多笔试题面试题确实能够很好地看出我们的基础.
    在这里,我就略去那些钻牛角尖的题.我近半年的收集中选出10道有代表性的题目,难度基本上是逐渐加大.对数组,指针,数据结构,算法,字符串,文件操作等问题都有覆盖.主要以c语言的实现为主,也有c++的题.大家可以先做做这10道题,测试一下自己的水平.
1. 下面这段代码的输出是多少(32位机上).
    char *p;
    char *q[20];
    char *m[20][20];
    int (*n)[10];
    struct MyStruct
{
char dda;
double dda1;
int type ;
}
MyStruct k;
printf("%d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));
2.
(1)
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中的数字
(2)
char **p, a[16][8];
问:p=a是否会导致程序在以后出现问题?为什么?
3.用递归方式,非递归方式写函数将一个字符串反转.
  函数原型如下:char *reverse(char *str);
4.strcpy函数和memcpy函数有什么区别?它们各自使用时应该注意什么问题?
5.写一个函数将一个链表逆序.
一个单链表,不知道长度,写一个函数快速到中间节点的位置.
写一个函数出一个单向链表的倒数第n个节点的指针.(把能想到的最好算法写出).
6.用递归算法判断数组a[N]是否为一个递增数组。
7.
有一个文件(名为a.txt)如下,每行有4,第一项是他们的名次,写一个c程序,将五个人的名字打印出来.并按名次排序后将5行数据仍然保存到a.txt.使文件按名次排列每行.
2,07010188,0711,李镇豪,
1,07010154,0421,陈亦良,
3,07010194,0312,凌瑞松,
4,07010209,0351,罗安祥,
5,07010237,0961,黄世传,
8.写一个函数,判断一个unsigned char 字符有几位是1.
  写一个函数判断计算机的字节存储顺序是升序(little-endian)还是降序(big-endian).
9.微软的笔试题.
Implement a string class in C++ with basic functionality like comparison, concatenation, input and output. Please also provide some test cases and using scenarios (sample code of using this class).
Please do not use MFC, STL and other libraries in your implementation.
10.有个数组a[100]存放了100个数,100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法出相同的那个数的值.(注意空间效率时间效率尽可能要低).
这十道题还是能够看出自己的水平如何的.如果你能不假思索地做出这10道题,估计去国外大公司是没有问题了,呵呵.
答案我在整理中,以后陆续发布.................
下面有些题也不错,可以参考.
1.下面的代码输出是什么,为什么?
      void foo(void)
      {
            unsigned int a = 6;
            int b = -20;
            (a+b>6)?puts(">6"):puts("<=6");//puts为打印函数
      }
输出 >6
就是考察隐式转换.int型变量转化成unsigned int, b成了正数.
2. b)运行下面的函数会有什么结果?为什么?
      void foo(void)
          {
              char string[10],str1[10];
              int i;
              for(i=0;i<10;i++)
              {
                    str1[i] = a;
              }
              strcpy(string, str1);
          printf("%s",string);
          }
首先搞清strcpy函数的实现方法,
char * strcpy(char * strDest,const char * strSrc)
{
 if ((strDest == NULL) || (strSrc == NULL))
  throw "Invalid argument(s)";
 char * strDestCopy = strDest;
 while ((*strDest++ = *strSrc++) != \0);
  return strDestCopy;
}
由于str1末尾没有\0’结束标志,所以strcpy不知道拷贝到何时结束.
printf函数,对于输出char* 类型,顺序打印字符串中的字符直到遇到空字符('\0')或
已打印了由精度指定的字符数为止.
下面是微软的两道笔试题....
3. Implement a string class in C++ with basic functionality like comparison, concatenation, input and output. Please also provide some test cases and using scenarios (sample code of using this class).
Please do not use MFC, STL and other libraries in your implementation.
我的实现方案如下,这道题真地对c++的主要特性都进行了较好地考察.
String.h:
#ifndef STRING_H
#define STRING_H
#include <iostream>
using namespace std;
class String{
  public:
    String();
      String(int n,char c);
    String(const char* source);
    String(const String& s);
    //String& operator=(char* s);
    String& operator=(const String& s);
    ~String();
    char& operator[](int i){return a[i];}
    const char& operator[](int i) const {return a[i];}//对常量的索引.
    String& operator+=(const String& s);
    int length();
  friend istream& operator>>(istream& is, String& s);//搞清为什么将>>设置为友元函数的原因.
  //friend bool operator< (const String& left,const String& right);
  friend bool operator> (const String& left, const String& right);//下面三个运算符都没必要设成友元函数,这里是为了简单.
  friend bool operator== (const String& left, const String& right);
  friend bool operator!= (const String& left, const String& right);
  private:
    char* a;
    int size;
};
#endif
String.cpp:
#include "String.h"
#include <cstring>
#include <cstdlib>
String::String(){
    a = new char[1];
    a[0] = \0;
    size = 0;
}
String::String(int n,char c){
a = new char[n + 1];
memset(a,c,n);
a[n] = \0;
size = n;
}
String::String(const char* source){
if(source == NULL){
  a = new char[1];
  a[0] = \0;
  size = 0;
}
else
{  size = strlen(source);
  a = new char[size + 1];
  strcpy(a,source);
}
}
String::String(const String& s){
size = strlen(s.a);//可以访问私有变量.
a = new char[size + 1];
//if(a == NULL)
strcpy(a,s.a);
}
String& String::operator=(const String& s){
if(this == &s)
  return *this;
else
{
  delete[] a;
        size = strlen(s.a);
  a = new char[size + 1];
  strcpy(a,s.a);
  return *this;
}
}
String::~String(){
delete[] a;//   
}
String& String::operator+=(const String& s){
  int j = strlen(a);
  int size = j + strlen(s.a);
  char* tmp = new char[size+1];
  strcpy(tmp,a);
  strcpy(tmp+j,s.a);
delete[] a;
a = tmp;
return *this;
}
int String::length(){
return strlen(a);
}
main.cpp:
#include <iostream>
#include "String.h"
using namespace std;
bool operator==(const String& left, const String& right)
{
int a = strcmp(left.a,right.a);
    if(a == 0)
  return true;
else
  return false;
}
bool operator!=(const String& left, const String& right)
{
return  !(left == right);
}
ostream& operator<<(ostream& os,String& s){
int length = s.length();
for(int i = 0;i < length;i++)
  //os << s.a[i];这么不行,私有变量.
  os << s[i];
return os;
}
String operator+(const String& a,const String& b){
String temp;
temp = a;
temp += b;
return temp;
}
bool operator<(const String& left,const String& right){
int j = 0;
while((left[j] != \0) && (right[j] != \0)){
  if(left[j] < right[j])
  return true;
  else
  {
  if(left[j] == right[j]){
    j++;
    continue;
  }
  else
    return false;
  }
}
if((left[j] == \0) && (right[j] != \0))
  return true;
else
  return false;
}
bool operator>(const String& left, const String& right)
{  int a = strcmp(left.a,right.a);
    if(a > 0)
  return true;
else
  return false;
}
istream& operator>>(istream& is, String& s){
delete[] s.a;
s.a = new char[20];
int m = 20;
    char c;
int i = 0;
while (is.get(c) && isspace(c));
    if (is) {
  do {s.a[i] = c;
      i++;
    /*if(i >= 20){
      cout << "Input too much characters!" << endl;
      exit(-1);
    }*/
    if(i == m - 1 ){
    s.a[i] = \0;
    char* b = new char[m];
    strcpy(b,s.a);
                m = m * 2;
        s.a = new char[m];
    strcpy(s.a,b);
    delete[] b;
    }
  }
  while (is.get(c) && !isspace(c));
        //如果读到空白,将其放回.
  if (is)
  is.unget();
}
s.size = i;
s.a[i] = \0;
return is;
}
int main(){
String a = "abcd";
String b = "www";
//String c(6,b);这么写不对.
    String c(6,l);
String d;
String e = a;//abcd
String f;
cin >> f;//需要输入...
String g;
g = a + b;//abcdwww
if(a < b)
  cout << "a < b" << endl;
else
  cout << "a >= b" << endl;
能够删除字符串中空格的函数是if(e == a)
  cout << "e == a" << endl;
else
  cout << "e != a" << endl;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。