C笔试题

时间:2020-11-23 14:25:52 笔试题目 我要投稿

C笔试题

  1) 读文件file1.txt的内容(例如):

C笔试题

  12

  34

  56

  输出到file2.txt:

  56

  34

  12

  (逆序)

  2)输出和为一个给定整数的所有组合

  例如n=5

  5=1+4;5=2+3(相加的数不能重复)

  则输出

  1,4;2,3。

  第一题,注意可增长数组的应用.

  #include

  #include

  int main(void)

  { int MAX = 10;

  int *a = (int *)malloc(MAX * sizeof(int));

  int *b;

  FILE *fp1;

  FILE *fp2;

  fp1 = fopen(“a.txt”,”r”);

  if(fp1 == NULL)

  {printf(“error1″);

  exit(-1);

  }

  fp2 = fopen(“b.txt”,”w”);

  if(fp2 == NULL)

  {printf(“error2″);

  exit(-1);

  }

  int i = 0;

  int j = 0;

  while(fscanf(fp1,”%d”,&a[i]) != EOF)

  {i++;

  j++;

  if(i >= MAX)

  {

  MAX = 2 * MAX;

  b = (int*)realloc(a,MAX * sizeof(int));

  if(b == NULL)

  {printf(“error3″);

  exit(-1);

  }a = b;

  }}

  for(;–j >= 0;)

  fprintf(fp2,”%d\n”,a[j]);

  fclose(fp1);

  fclose(fp2);

  return 0;

  }

  第二题.

  #include

  int main(void)

  {unsigned long int i,j,k;

  printf(“please input the number\n”);

  scanf(“%d”,&i);

  if( i % 2 == 0)

  j = i / 2;

  else

  j = i / 2 + 1;

  printf(“The result is \n”);

  for(k = 0; k < j; k++)

  printf(“%d = %d + %d\n”,i,k,i – k);

  return 0;

  }

  #include

  void main()

  {unsigned long int a,i=1;

  scanf(“%d”,&a);

  if(a%2==0)

  { for(i=1;i printf(“%d”,a,a-i);

  }

  else

  for(i=1;i<=a/2;i++)

  printf(” %d, %d”,i,a-i);

  }

  兄弟,这样的题目若是做不出来实在是有些不应该, 给你一个递规反向输出字符串的例子,可谓是反序的经典例程.

  void inverse(char *p)

  { if( *p = = ‘\0′ )

  return;

  inverse( p+1 );

  printf( “%c”, *p );

  }

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

  {

  inverse(“abc\0″);

  return 0;

  }

  借签了楼上的“递规反向输出”

  #include

  void test(FILE *fread, FILE *fwrite)

  { char buf[1024] = {0};

  if (!fgets(buf, sizeof(buf), fread))

  return;

  test( fread, fwrite );

  fputs(buf, fwrite);

  }

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

  { FILE *fr = NULL;

  FILE *fw = NULL;

  fr = fopen(“data”, “rb”);

  fw = fopen(“dataout”, “wb”);

  test(fr, fw);

  fclose(fr);

  fclose(fw);

  return 0;

  }

  在对齐为4的情况下

  struct BBB

  { long num;

  char *name;

  short int data;

  char ha;

  short ba[5];

  }*p;

  p=0×1000000;

  p+0×200=____;

  (Ulong)p+0×200=____;

  (char*)p+0×200=____;

  解答:假设在32位CPU上,

  sizeof(long) = 4 bytes

  sizeof(char *) = 4 bytes

  sizeof(short int) = sizeof(short) = 2 bytes

  sizeof(char) = 1 bytes

  由于是4字节对齐,

  sizeof(struct BBB) = sizeof(*p)

  = 4 + 4 + 2 + 1 + 1/*补齐*/ + 2*5 + 2/*补齐*/ = 24 bytes (经Dev-C++验证)

  p=0×1000000;

  p+0×200=____;

  = 0×1000000 + 0×200*24

  (Ulong)p+0×200=____;

  = 0×1000000 + 0×200

  (char*)p+0×200=____;

  = 0×1000000 + 0×200*4

  你可以参考一下指针运算的细节

  写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在 1、3随便输出哪一个均可。函数接口为:int find_orderk(const int* narry,const int n,const int k)

  要求算法复杂度不能是O(n^2)

  谢谢!

  可以先用快速排序进行排序,其中用另外一个进行地址查找

  代码如下,在VC++6.0运行通过。给分吧^-^

  //快速排序

  #include

  usingnamespacestd;

  intPartition (int*L,intlow,int high)

  {inttemp = L[low];

  intpt = L[low];

  while (low < high)

  {while (low < high && L[high] >= pt)

  –high;

  L[low] = L[high];

  while (low < high && L[low] <= pt)

  ++low;

  L[low] = temp;

  }

  L[low] = temp;

  returnlow;

  }

  voidQSort (int*L,intlow,int high)

  {if (low < high)

  {

  intpl = Partition (L,low,high);

  QSort (L,low,pl – 1);

  QSort (L,pl + 1,high);

  }}

  intmain ()

  {intnarry[100],addr[100];

  intsum = 1,t;

  cout << “Input number:” << endl;

  cin >> t;

  while (t != -1)

  {narry[sum] = t;

  addr[sum - 1] = t;

  sum++;

  cin >> t;

  }

  sum -= 1;

  QSort (narry,1,sum);

  for (int i = 1; i <= sum;i++)

  cout << narry[i] << ‘\t’;

  cout << endl;

  intk;

  cout << “Please input place you want:” << endl;

  cin >> k;

  intaa = 1;

  intkk = 0;

  for (;;)

  {if (aa == k)

  break;

  if (narry[kk] != narry[kk + 1])

  {aa += 1;

  kk++;

  }

  }

  cout << “The NO.” << k << “number is:” << narry[sum - kk] << endl;

  cout << “And it’s place is:” ;

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

  {if (addr[i] == narry[sum - kk])

  cout << i << ‘\t’;

  }return0;

  }

  1、找错

  Void test1()

  {

  char string[10];

  char* str1=”0123456789″;

  strcpy(string, str1);// 溢出,应该包括一个存放’\0′的字符string[11]

  }

  Void test2()

  {

  char string[10], str1[10];

  for(I=0; I<10;I++)

  {str1[i] =’a';

  }

  strcpy(string, str1);// I,i没有声明。

  }

  Void test3(char* str1)

  {char string[10];

  if(strlen(str1)<=10)// 改成<10,字符溢出,将strlen改为sizeof也可以

  {strcpy(string, str1);

  }}

  2. void g(int**);

  int main()

  {int line[10],i;

  int *p=line; //p是地址的地址

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

  {*p=i;

  g(&p);//数组对应的值加1

  }

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

  printf(“%d\n”,line[i]);

  return 0;

  }

  void g(int**p)

  { (**p)++;

  (*p)++;// 无效

  }

  输出:

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  3. 写出程序运行结果

  int sum(int a)

  {auto int c=0;

  static int b=3;

  c+=1;

  b+=2;

  return(a+b+c);

  }

  void main()

  {int I;

  int a=2;

  for(I=0;I<5;I++)

  {printf(“%d,”, sum(a));

  }

  }

  // static会保存上次结果,记住这一点,剩下的自己写

  输出:8,10,12,14,16,

  4.

  int func(int a)

  {int b;

  switch(a)

  {case 1: 30;

  case 2: 20;

  case 3: 16;

  default: 0

  }

  return b;

  }

  则func(1)=?

  // b定义后就没有赋值。

  5:

  int a[3];

  a[0]=0; a[1]=1; a[2]=2;

  int *p, *q;

  p=a;

  q=&a[2];

  则a[q-p]=a[2]

  解释:指针一次移动一个int但计数为1

  今天早上的面试题9道,比较难,向牛人请教,国内的一牛公司,坐落在北京北四环某大厦:

  1、线形表a、b为两个有序升序的线形表,编写一程序,使两个有序线形表合并成一个有序升序线形表h;

  答案在 请化大学 严锐敏《数据结构第二版》第二章例题,数据结构当中,这个叫做:两路归并排序

  Linklist *unio(Linklist *p,Linklist *q){

  linklist *R,*pa,*qa,*ra;

  pa=p;

  qa=q;

  R=ra=p;

  while(pa->next!=NULL&&qa->next!=NULL){

  if(pa->data>qa->data){

  ra->next=qa;

  qa=qa->next;

  }

  else{ra->next=pa;

  pa=pa->next;

  }}

  if(pa->next!=NULL)

  ra->next=pa;

  if(qa->next!=NULL)

  ra->next==qa;

  return R;

  }

  2、运用四色定理,为N个局域举行配色,颜色为1、2、3、4四种,另有数组adj[][N],如adj[i][j]=1则表示i区域与j区域相邻,数组color[N],如color[i]=1,表示i区域的颜色为1号颜色。

  四色填充

  3、用递归算法判断数组a[N]是否为一个递增数组。

  递归的方法,记录当前最大的,并且判断当前的`是否比这个还大,大则继续,否则返回false结束:

  bool fun( int a[], int n )

  {

  if( n= =1 )

  return true;

  if( n= =2 )

  return a[n-1] >= a[n-2];

  return fun( a,n-1) && ( a[n-1] >= a[n-2] );

  }

  4、编写算法,从10亿个浮点数当中,选出其中最大的10000个。

  1.给两个数组和他们的大小,还有一动态开辟的内存,求交集,把交集放到动态内存dongtai,并且返回交集个数

  long jiaoji(long* a[],long b[],long* alength,long blength,long* dongtai[])

  2.单连表的建立,把’a'–’z’26个字母插入到连表中,并且倒叙,还要打印!

  方法1:

  typedef struct val

  { int date_1;

  struct val *next;

  }*p;

  void main(void)

  { char c;

  for(c=122;c>=97;c–)

  { p.date=c;

  p=p->next;

  }

  p.next=NULL;

  } }

  方法2:

  node *p = NULL;

  node *q = NULL;

  node *head = (node*)malloc(sizeof(node));

  head->data = ‘ ‘;head->next=NULL;

  node *first = (node*)malloc(sizeof(node));

  first->data = ‘a’;first->next=NULL;head->next = first;

  p = first;

  int longth = ‘z’ – ‘b’;

  int i=0;

  while ( i<=longth )

  {

  node *temp = (node*)malloc(sizeof(node));

  temp->data = ‘b’+i;temp->next=NULL;q=temp;

  head->next = temp; temp->next=p;p=q;

  i++;

  }

  print(head);

  3.可怕的题目终于来了

  象搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前十条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G,

  请描述思想,写出算发(c语言),空间和时间复杂度,

  4.国内的一些帖吧,如baidu,有几十万个主题,假设每一个主题都有上亿的跟帖子,怎么样设计这个系统速度最好,请描述思想,写出算发(c语言),空间和时间复杂度,

  #include string.h

  main(void)

  { char *src=”hello,world”;

  char *dest=NULL;

  dest=(char *)malloc(strlen(src));

  int len=strlen(str);

  char *d=dest;

  char *s=src[len];

  while(len–!=0)

  d++=s–;

  printf(“%s”,dest);

  }

  找出错误!!

  #include “string.h”

  #include “stdio.h”

  #include “malloc.h”

  main(void)

  {

  char *src=”hello,world”;

  char *dest=NULL;

  dest=(char *)malloc(sizeof(char)*(strlen(src)+1));

  int len=strlen(src);

  char *d=dest;

  char *s=src+len-1;

  while(len–!=0)

  *d++=*s–;

  *d=’\0′;

  printf(“%s”,dest);

  }

  1. 简述一个Linux驱动程序的主要流程与功能。

  2. 请列举一个软件中时间换空间或者空间换时间的例子。

  void swap(int a,int b)

  {

  int c; c=a;a=b;b=a;

  }

  —>空优

  void swap(int a,int b)

  {

  a=a+b;b=a-b;a=a-b;

  }

  6. 请问一下程序将输出什么结果?

  char *RetMenory(void)

  { char p[] = “hellow world”;

  return p;

  }

  void Test(void)

  { char *str = NULL;

  str = RetMemory();

  printf(str);

  }

  RetMenory执行完毕,p资源被回收,指向未知地址。返回地址,str的内容应是不可预测的, 打印的应该是str的地址

  写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)

  功能:

  在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:”abcd12345ed125ss123456789″的首地址传给intputstr后,函数将返回

  9,outputstr所指的值为123456789

  int continumax(char *outputstr, char *inputstr)

  {char *in = inputstr, *out = outputstr, *temp, *final;

  int count = 0, maxlen = 0;

  while( *in != ‘\0′ )

  {if( *in > 47 && *in < 58 )

  {for(temp = in; *in > 47 && *in < 58 ; in++ )

  count++;

  }

  else

  in++;

  if( maxlen < count )

  {maxlen = count;

  count = 0;

  final = temp;

  }}

  for(int i = 0; i < maxlen; i++)

  {*out = *final;

  out++;

  final++;

  }

  *out = ‘\0′;

  return maxlen;

  }

【C笔试题】相关文章:

华为c/c++笔试题11-22

C/C++面试题目11-21

华为2017笔试题08-16

360笔试题目10-20

C,C++的几个面试题小集11-24

C/C++有关内存的笔试题11-24

Kingsoft金山公司C/C++笔试题11-22

C C++面试笔试题目集锦11-15

C语言基础笔试题11-24