非正式纳新题解(C语言)1

简介: 非正式纳新题解(C语言)1

非正式纳新题目(C语言)

注意本文不是正式的面试题

正式的面试题:ACAT2021纳新题目(C语言)

说明

本试题一共分为12道题,考核点全部以C语言为主,难度有层次划分,希望你尽最大努力完成,我
们不需要你每道题都能得到正确答案,但希望你能有良好的学习态度。我们期待在面试那天与你相
遇!
(编程题只用写出核心代码或者想出解题思路,你也可以在面试时电脑写出完整代码运行,直接展示
你的结果!)

题目

非正式纳新题目(C语言)

参考

一、写出下面函数的运行结果。

#include <stdio.h>
#define PI 3 
#define S(r) PI*r*r 
int main(){
  float x,y,area;
  x=2;
  y=1;
  area=S(x+y);
  printf("r=%f\narea=%f\n",x+y,area);//9 
  //area=PI*x+y*x+y
}

二、选做题

1分析以下代码

#include<stdio.h>
int main(){
  int i=0,s=0;
  for(;;){
    i++;
    if(i==3||i==5)continue;
    if(i==6)break;
    s+=i;
  }
  printf("%d",s);//7
  return 0;
}

执行上述程序后的输出结果是(C)

A.5

B. 6

C. 7

D. 死循环

2分析以下代码

//本题考查的是if-else嵌套、if-else语句的执行过程。  
//主要考查对多分支if-else语句执行过程的理解
//注:else总是与它之前最近的f匹配
//注:if-else语句有且只有一个会得到执行
//1、有以下程序
#include <stdio.h>
int main(){ 
  int a=5,b=4,c=3,d=2;
  if(a>b>c)//表达(a>b>c,计算为a>b=1,1>c,但1<c,表达式值为否,不执行  
  printf("%d\n",d);
  else if((c-1>=d)==1)//表达(c-1>=d,计象为,1==1,执行
  printf("%d\n",d+1);//结果3 
  else//不执行
  printf("%d\n",d+2);
} 

执行上述程序后的输出结果是(B)

A.2

B.3

C.4

D.编译时有错,无结果

三、下列表达式中,不满足“当x的值为偶数时值为真,为奇数时值为假”要求的是( )

A: x%20

B: !x%2!=0

C: (x/2*2-x)0

D: !(x%2)

//正确答案:B
//解析:
//B:当X为2(偶)时,非2为0,0%20为假;当X为1(奇)时,非1也为0,0%2 0也为假,故B不能满足题目要求。
//C:当X为2(偶)时,为真;当X为1(奇)时,结果为-1!=0为假,所以C满足题目要求。

四、若有以下定义和赋值语句,

int b[2][3]={0}, (*p)[3];

p=b;

则对b数组的第i行第j列(假设i,j已正确说明并赋值)元素的非法引用为()。
A: *(*(p+i)+j)

B:*(p[i]+j)

C: *(p+i)+j

D:(*(p+i))[j]

#include<stdio.h>
int main(){
  int b[2][3]={0}, (*p)[3];
  p=b;
  int i=1,j=2; 
  printf("%d\n",&b[i][j]);//6487556
  printf("%d\n", *(*(p+i)+j));  //0
  printf("%d\n", *(p[i]+j));  //0
  printf("%d\n", *(p+i)+j);   //6487556
  printf("%d\n", (*(p+i))[j]);  //0
} 
//标准答案:C 解析:
//C:取的是地址,如果需要取值则要像A选项一样再套个星号。
//D:(*(p+i))取的是第i行的元素,后面的[j]取的是第j列的元素,因此这种写法完全是合法的。

五、给出部分语句填写一行语句实现找出三个整数中的最大值

#include <stdio.h>
int main(){
  int x=1;
  int y=2;
  int z=3;
  int max;
  //一行语句
  max=(x>y)?((x>z)?x:z):((y>z)?y:z);//答案 
  printf("%d",max);
}

六、二-十进制代码(BCD代码)

相关概念:有权BCD代码是指在表示0-9十个十进制数码的4位二进制代码中,每位二进制数码都有确定的位权值。例如,表1-3-2中的8421码、2421码等。对于有权BCD代码,可以根据位权展开求得所代表的十进制数。例如:

(0111)8421 BCD=0x8+1x4+1x2+1x1=(7)10

(1101)2421 BCD=1x2+1x4+0x2+1x1=(7)10

最常用的有权码是8421 BCD码,由于其位权值是按基数2的幂增加的,这和二

进制数的位权值一致,所以有时也称8421 BCD码为自然数权码。


十进制数码 8421码 2421码

0 0000 0000

1 0001 0001

2 0010 0010

3 0011 0011

4 0100 0100

5 0101 1011

6 0110 1100

7 0111 1101

8 1000 1110

9 1001 1111


用BCD码表示十进制数

在BCD代码中,4位二进制代码仅表示1位十进制数,对一个多位的十进制数进行编码,需要有与十进制位数相同的几组BCD代码来表示,每组代码之间按十进制进位。

例如,用8421BCD码来表示十进制数863,则

(863)10=(1000 0110 0011)8421 BCD

如果用2421 BCD码来表示十进制数863,则

(863)10=(1110 1100 0011)2421 BCD

程序设计:输入任意一个十进制数,将其用2421 BCD码表示
(提示:类似于念数字)

#include<stdio.h> 
void DtoBCD(int n){
  switch(n){
    case 0:printf("0000");break;
    case 1:printf("0001");break;
    case 2:printf("0010");break;
    case 3:printf("0011");break;
    case 4:printf("0100");break;
    case 5:printf("1011");break;
    case 6:printf("1100");break;
    case 7:printf("1101");break;
    case 8:printf("1110");break;
    case 9:printf("1111");break;
  }
}
int main(){
  int num;
  scanf("%d",&num); 
  if(num==0){
    DtoBCD(num);
  }
  int a[100];
  int len=0;
  while(num){
    int n;
    n=num%10;
    a[len++]=n;
    num/=10;  
  }
  int i=len-1;
  for(i;i>-1;i--){
    DtoBCD(a[i]);
  }
} 

七、写出输出内容

#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
void OutPut(int data){
  printf("%d",data);
} 
void change1(int data){
  data=1;
  printf("11---");
  OutPut(data);//1
  printf("\n");
}
void change2(int *data){
  *data=1;
}
int change3(){  
  int data=1;
  return data;
}
int main(){
  int data;
  data=0;
  printf("0---");
  OutPut(data);//0
  printf("\n");
  change1(data);
  printf("1---");
  OutPut(data);//0
  printf("\n");
  change2(&data);
  printf("2---");
  OutPut(data);//1
  printf("\n");
  int data1;
  data1=change3();
  printf("3---"); 
  OutPut(data1);//1
  printf("\n");
}

八、遍历数组:用不同的方法遍历数组(至少三种)

//不同方法输出数组元素 
#define N 10
#include <stdio.h>
int main(){
  int a[N];
  int i;
  int *p;
  p=a;
  for(i=0;i<N;i++){
    a[i]=i;
  }
  printf("\n");
  for(i=0;i<N;i++){
    printf("%d ",a[i]);//下标法 
  }
  printf("\n");
  for(i=0;i<N;i++){
    printf("%d ",p[i]);//下标法
  }
  printf("\n");
  for(i=0;i<N;i++){
    printf("%d ",*(a+i));//指针法 
  }
  printf("\n");
  for(i=0;i<N;i++){
    printf("%d ",*(p+i));//
  }
  printf("\n");
  for(p=a/*数组的首地址*/;p<(a+N);p++/*加的是类型单元int: 4*/){// 指针法 
    printf("%d ",*p);//
  }
  printf("\n");
}

九、输出选做题

1.回形数

回形数格式方阵的实现
从键盘输入一个整数(1~20) 
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如: 输入数字2,则程序输出: 
1 2 
4 3 
输入数字3,则程序输出:
1 2 3 
8 9 4 
7 6 5 
输入数字4, 则程序输出: 
1   2   3   4 
12  13  14  5 
11  16  15  6 
10   9  8   7
#include<stdio.h>
  void main() {
    printf("输入"); 
    int num;
    scanf("%d",&num);
    int a[num][num];//声明一个 num行 num列的数组
    int i=0,j=0,n=1;//i:行 j:列
    int maxi=num-1,maxj=num-1,mini=0,minj=0;//maxi:行最大值 maxj:列最大值 mini:列最小值 minj:行最小值
    int k=1;//决定向哪个方向走
    while(n<=num*num) {
      //向右
      if(k==1) {
        if(j<=maxj && a[i][j]==0)
          a[i][j++] = n++;
        else {
          k=2;
          j--;
          i++;
          maxj--;
        }
      }
      //向下
      if(k==2) {
        if(i<=maxi && a[i][j]==0)
          a[i++][j] = n++;
        else {
          k=3;
          i--;
          j--;
          maxi--;
        }
      }
      //向左
      if(k==3) {
        if(j>=minj && a[i][j]==0)
          a[i][j--] = n++;
        else {
          k=4;
          j++;
          i--;
          minj++;
        }
      }
      //向下
      if(k==4) {
        if(i>=mini && a[i][j]==0)
          a[i--][j] = n++;
        else {
          k=1;
          i++;
          j++;
          mini++;
        }
      }
    }
    //遍历数组并输出
    for(i=0;i<num;i++) {
      for(j=0;j<num;j++) {
        printf("%d\t",a[i][j]);
      }
      printf("\n");//换行
    }
  }

2.完成输出下列字符

输入n,输出以下字符

*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......
*第n行*
#include<stdio.h>
#include<stdlib.h>
/*
*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......
*/
static a = 0;
void print2(int n)
{
  if (n == 0)
    return;
  else
  {
    printf(".");
    print2(n - 1);
  }
}
void print1(int n)
{
  if (n == 0)
    return;
  else
  {
    printf("*");
    print2(a - 1);
    print1(n - 1);
  }
}
void run(int n)
{
  if (n == 0)
    return;
  else
  {
    run(n - 1);
    a = n;
    print1(n);
    printf("\n");
  }
}
int main()
{
  run(7);
  printf("\n");
}

十、C语言编写一个程序,去掉给定字符串中重复的字符。例如将google转化为gole。

#include <stdio.h>
#include <string.h>
int main()
{
  char buf[1024]={0};
  printf("请输入一个字符串!\n");
  scanf("%s",buf);  //scanf不能输入带空格的字符串
  int len = strlen(buf); //计算字符串长度
  int i,j;
  for(i=0;i<len;i++)
  {
    for(j=i+1;j<len;j++)
    {
      if(buf[j] == buf[i])  //找到一个重复的字符
      {
        int tmp;
        for(tmp=j;tmp<len;tmp++)//数组移动,让下一个字符覆盖当前的重复字符
        {
          buf[tmp] = buf[tmp+1];
        }
        j--;  //之后要让下一次重新判断当前的新字符是否还是重复的
        len--;  //由于删除了一个重复的字符,导致字符串长度减少一个
      }
    }
  }
  printf("去重后:%s\n",buf);
  return 0;
}
相关文章
|
搜索推荐 C语言
非正式纳新题解(C语言)2
非正式纳新题解(C语言)2
81 0
|
搜索推荐 C语言
ACAT2021纳新题解(C语言)2
ACAT2021纳新题解(C语言)2
50 0
|
C语言
非正式纳新题目(C语言)1
非正式纳新题目(C语言)1
92 0
|
搜索推荐 C语言 索引
ACAT2021纳新题目(C语言)
ACAT2021纳新题目(C语言)
56 0
|
C语言 索引
ACAT2021纳新题解(C语言)1
ACAT2021纳新题解(C语言)1
60 0
|
搜索推荐 C语言
非正式纳新题目(C语言)2
非正式纳新题目(C语言)2
84 0
|
18天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
21天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
21天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
27天前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。