非正式纳新题目(C语言)
注意本文不是正式的面试题
正式的面试题:ACAT2021纳新题目(C语言)
说明
本试题一共分为12道题,考核点全部以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; }