下面我会给大家分享下各公司的面试笔试当中的真题,我挑出来的算是相对比较简单基础的一些题目,也适合基础水平的在学编程小白进行练习,大家现在,也动动脑,动动手,把下面我给出来的这些题目,大家自己动手做做,我也会在下面进行代码块的关键点给大家,简单的解释解释。
下面我们来看看真题吧,看看你符不符合这些公司的招聘要求水平呢🤭🤭
1.创建一个整型数组,完成对数组的操作
(1)实现print()打印数组的每个元素。
(2)实现resever()函数完成数组元素的逆置。
(3)实现函数Init()初始化数组为全0。
#include <stdio.h>
void Init(int arr[],int sz)
{
int i=0;
for(i=0;i<sz;i++)
{
arr[i]=0;
}
}
void print(int arr[],int sz)
{
int i=0;
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void resever(int arr[],int sz)
{
int left=0;
int right=sz-1;
int tmp=0;
int i=0;
while(left<=right)
{
int tmp=arr[left];
arr[left]=arr[right];
arr[right]=tmp;
left++;
right--;
}
}
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int sz=sizeof(arr)/sizeof(arr[0]);
print(arr,sz);
resever(arr,sz);
print(arr,sz);
Init(arr,sz);
print(arr,sz);
return 0;
}
这道题比较中规中矩,就是通过for循环遍历我的数组然后把它打印出来,然后第二问就是通过在函数中加如中间变量tmp,借助这个中间量对数组中的元素进行逆序,第三问也是通过简单的for循环对数组进行初始化。通过这三问可以看出,使用循环遍历数组的操作是我们必须掌握的点。
2.将数组A中的内容和数组B中的内容进行交换。(数组一样大)
#include<stdio.h>
void print(int arr[],int sz)
{
int i=0;
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void swap_arr(int arr1[],int arr2[],int sz)
{
int left=0;
int right=0;
int tmp=0;
int i=0;
while(left<sz)
{
tmp=arr1[left];
arr1[left]=arr2[left];
arr2[left]=tmp;
left++;
}
for(i=0;i<sz;i++)
{
printf("%d ",arr1[i]);
}
printf("\n");
for(i=0;i<sz;i++)
{
printf("%d ",arr2[i]);
}
}
int main()
{
int arr1[10]={1,2,3,4,5,6,7,8,9,0};
int arr2[10]={0,9,8,7,6,5,4,3,2,1};
int sz=sizeof(arr1)/sizeof(arr1[0]);
swap_arr(arr1,arr2,sz);
print(arr1,sz);
print(arr2,sz);
return 0;
}
这题也比较基础,上面的代码块给出了两种打印方式,一种是通过调用打印函数的方式,一直是在目标函数中直接对交换后的数组进行打印,大家可以看看更倾向于哪一种方式,我客人觉得调用函数的方式更加便捷(在大量的代码中)。
4.有关操作符的计算题
#include <stdio.h>
int main()
{
int a,b,c;
a=5;
c=++a;
b=++c,c++,++a,a++;
b+=a++ +c;
printf("a=%d b=%d c=%d \n",a,b,c);
return 0;
}
这道题就比较有意思了,所欲即便不是编程题,我也把它放了进来🤭🤭
相信大家可能看到了答案脑袋里就产生了??????我来给大家一步一步讲解,因为这道题还是比较考验同学对操作符的逻辑顺序的基本功的。
首先 a=5
c=++a--->c=6,a=6;
(逗号操作符优先级<赋值操作符)b=++c--->b=7,c=7--->b=c++--->b=7,c=8--->b=++a--->b=7,a=7--->b=a++--->b=7,a=8;
b+=a++ +c--->b=b+a++ +c--->b=15+8=23,a=9;
所以输出a=9,b=23,c=8。
5.乘法口诀表
实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定
如:输入9,输出9*9口诀表,输入12,输出12*12的乘法口诀表
#include <stdio.h>
void mult(int m)
{
int i=0;
int p=0;
for(i=1;i<=m;i++)
{
int j=0;
for(j=1;j<=i;j++)
{
p=j*i;
printf("%d*%d=%-2d ",j,i,p);
}
printf("\n");
}
}
int main()
{
int i=0;
scanf("%d",&i);
mult(i);
return 0;
}
这道打印乘法口诀表题,比较基础,可能大家有疑惑的是为什么是以%-2d的形式打印,这样打印的目的是为了让我们的结果在总共两位的基础上向左对齐,以便于我们的观看,用于美化我们的乘法口诀表。其他的也是用到的是我们基本的循环语句。
6.strlen函数的实现
#include<stdio.h>
int my_strlen(char* str)
{
char* i=str;
char* j=str;
while(*j !='\0')
{
j++;
}
return j-i;
}
int main()
{
char arr[]="yang";
int len =my_strlen(arr);
printf("%d",len);
return 0;
}
这道题就是模仿我们的strlen函数的工作机制,用来求我们的字符串长度,因为有些题目会要求在不使用库函数的情况下完成求字符串长度的操作,这时候我们就可以调用我们自己编写的函数完成相应的操作。
代码原理:就是通过传参给函数,然后在函数里用指针进行接收,因为传数组的名字给函数,传过去的是数组首元素的地址,所以我们就应该用指针对他进行接收和解引用操作,然后通过解引用获取到数组的首元素,然后就是简单的循环语句进行判断,返回值打印。
7.写了个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如:调用DigitSum(1729),则返回1+7+2+9,它的和是19
输入1729,输出19
#include<stdio.h>
int DigitSum(unsigned int num)
{
if(num>9)
{
return DigitSum(num/10) + num%10;
}
else
{
return num;
}
}
int main()
{
unsigned int num=0;
scanf("%d",&num);
int ret=DigitSum(num);
printf("ret=%d",ret);
return 0;
}
这道题的关键点就是分别对数进行%10和/10操作,用%10操作获得余数(也就是最后的一位数,如1729%10=9),用/10操作获得整数部分(也就是商,如1729/10=172)这样如此反复递归,就可以获得1,7,2,9这些数,然后我们对其相加就可以完成要求输出结果。
8.递归实现n的k次方
#include<stdio.h>
int Square(int n,int k)
{
if(k>0)
{
return n*Square(n,k-1);
}
else if(k==0)
{
return 1;
}
else if(k<0)
{
return (1.0/(Square(n,-k)));
}
}
int main()
{
int n=0;
int k=0;
scanf("%d%d",&n,&k);
int count=Square(n,k);
printf("count=%d",count);
return 0;
}
看我们的代码成功的实现了我们的功能,我们的同学肯定有很多第一次下笔写这道题时都会像我写的这种一样,然后通过编译也成功运行了,出来的答案也是对的,但我们的代码真的没有问题吗?🤭🤭
但是,当我们用负数进行测试的时候,结果却出错了,不管你输入的负数是多少,输出的结果始终是0,这是为什么呢? 我相信也有的同学比较敏感,已经发现了,我们的常量类型是有问题的。确实,当我们输入k为负数时,我们的数据类型确实是有问题的,当k为负数时,我们的结果就是小于1的小数了,可我们却用的是int类型对它进行储存,因为只要k是负数结果就是小于1的数,所以不管你输入多少,答案一直是0,所以我们应该用double类型对我们数据进行储存,这样我们的代码才是真正的正确。
#include<stdio.h>
double Square(int n,int k)
{
if(k>0)
{
return n*Square(n,k-1);
}
else if(k==0)
{
return 1;
}
else if(k<0)
{
return (1.0/(Square(n,-k)));
}
}
int main()
{
int n=0;
int k=0;
scanf("%d%d",&n,&k);
double count=Square(n,k);
printf("count=%lf",count);
return 0;
}
这样我们的结果就正确了。
这些题都是我们在各公司面试笔试中一些基础题常规题,我们通过观察也可以看出,这些题都多次用到了我们的循环思想,所以学好并掌握熟练运用循环语句是我们学好c语言的基础,也是我们迈向大公司的第一步!!!
(大学软工在读小白)用来整理我记录我自己的学习日志和收获,如有不对的地方,望各位大佬指出!!!