第一次的 面试题目

1.用预处理指令交换两个参数的值。
 

#define SWAP(a,b) {int i=a; a=b; b=i;}

2.写出float x与“零值”比较的if语句

//当时只知道不能直接用float类型的值与0进行“==”或“!=”比较,但不知道该具体怎么写这个if语句。看过答案才知道,应该设法转化成“>=”或“<=”,即:

const float EPSINON= 0.00001;

if((x >= -EPSINON) && (x <= EPSINON))
/*

 

浮点数表示形如V=x * 2^y 的有理数进行编码,IEEE标准754仔细制定了浮点数及其运算的标准。

 

十进制的12.34可以这样表示:1*10^1 + 2*10^0 + 3*10^-1 + 4*10^-2。同样地,二进制的101.11可以这样表示:1*2^2 + 1*2^0 + 1*2^-1 +1*2^-2 。注意而今之中形如0.111…1正好是小于1的数。假定只用有限长度的编码,那么十进制是不能准确表示想1/3、5/7这样的数的,类似的,小数的二进制表示法只能表示那些能够被写成x * 2^y的数,其他的只能用近似数来表示。

 

IEEE浮点标准用V=(-1)^s * M * 2^E的形式来表示一个数:

(1)符号(sign)s决定数是负数(s=1)还是正数(s=0),而对0的符号位作为特殊情况处理。

(2)有效数(significant)M是一个二进制小数。

(3)指数(exponent)E是2的幂(可能是负数),他的作用是对浮点数的加权。

一个浮点数的位表示按上述情形划分为3个域。

 

标准C语言中,单精度float浮点格式的符号位=1,有效位=23,指数未=8,产生一个32位的表示。双精度double浮点格式的符号位=1,有效位=52,指数位=11,产生一个64位的表示。

 

根据指数位的值,被编码的值可以分为三种不同的情况,即,规格化值、非规格化值、特殊数值。当指数的为不全为0且不全为1时,属于规格化值;当指数位全为0时,属于非规格化值;当指数位全为1时,属于特殊数值。下面主要了解一下后两者情况。

 

非规格化值有两个目的。首先提供了一种表示数值0的方法当小数位也全为0时,可以根据符号位的不同表示+0.0和-0.0。另外一个功能是用来表示那些非常接近0.0的数,使用逐渐下溢出(gradual underflow)的方法实现这个属性。特殊数值当指数位全为1,而小数位全为0时,可以表示正无穷大和负无穷大。当小数位为非零时,结果值被称为NaN。

 

因为表示方法限制了浮点数的范围和精度,所以浮点运算只能近似地表示实数运算。系统需要使用“最接近”匹配值的值保存浮点值,这就是舍入(rounding)运算的任务。IEEE规定了四种舍入方式,默认的方式是向偶数舍入,也叫向最接近的值舍入。

 

浮点数的表示是不精确的,不能直接比较两个数是否完全相等,一般都是在允许的某个范围内认为像个浮点数相等,如有两个浮点数a,b,允许的误差范围为1e-6,则abs(a-b)<=1e-6,即可认为a和b相等。还有一种方法就是扩大再取整,比如a=5.23,b=5.23,直接比较 a==b一般为false,但是a和b都扩大一百倍,然后强制转换为int类型,再用==比较就可以了

 

float型变量和“零值”比较的方法:

const float EPSINON = 0.000001;

if ((x >= - EPSINON) && (x <=EPSINON))

浮点型变量并不精确,其中EPSINON是允许的误差(即精度),所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。如果写成if (x == 0.0),则是错误的。

因为1.0在计算机中可能存为0.999999或1.00001等,很难恰好是1.0


*/

3.为什么说if(0==x)比if(x==0)好?

1.首先这是一个编程的习惯!

2.原因: 在我们写代码的时候,假如少写了 一个符号   =

这个后,第一个语句就会报错。

                第二个语句不会报错!直接运行,这时后我们就很难找到错误!


4.将地址Ox8000中存放的整形变量a,清除bit1。

a &=~(0x1<<1);

&=  按位与且赋值运算符
~  取反

<<  左移

0x1<<1    ==   0x10    这时候 1 就是 bit 1位

~ 取反以后  除了bit 1 位 是0  外 都是1 

按位且 之后 bit1 位就直接变为 0 了。


5.inux下用shell命令在当前目录下创建myfolder目录,并将此目录的权限设为拥有者可读写,群组和其他成员均可读不可写,且拥有者,群组和其他成员全都不可执行。

mkdir  myfolder

chomd 644 myfolder


6.在32位机器上如下变量类型所占的内存分别是多少。

short
char*

long long

double


 7.简述map表里面的内容?

map简介

map是STL的一个关联容器,它提供一对一的hash。

第一个可以称为关键字(key),每个关键字只能在map中出现一次;
第二个可能称为该关键字的值(value);

map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的,后边我们会见识到有序的好处。比如一个班级中,每个学生的学号跟他的姓名就存在著一对一映射的关系。


8.在数据通信过程中,设置某普通串口的波特率为115200,则此串口每秒能传输多少KB数据。写出推导过程。

波特率和字节的关系
1GB=1024MB

1MB=1024KB

1KB=1024B(字节)

我们需要串口接收的数据数每秒512字节,串口的波特率是115200位/秒

波特率115200=115200(位/秒)

如果没有校验位,就应该除以10,得到的是每秒字节数:波特率115200=115200(位/秒)=11520(字节/秒)

再除以1024,就是每秒KB数:
波特率115200=115200(位/秒)=11.25(KB/秒)

//
115200 bit/10=11520 Byte
所以115200波特率一秒可以传11520字节(Byte),即11.52KB/s

9.如下代码的输出是什么?int x, y,Z;
x =y = 10;=++x| ++y;
printf("x=%d, y=%d,z=%d", x, y, z);
 

x=11,y=10,z=1

10.如下代码会有什么问题?typedef enum
{
eData0 = 0,eData1,eData2,
eTestData_t;
#ifdef eData1
void doSomething(void){

}#endif

#include<stdio.h>
typedef enum
{
eData0 = 0,
eData1,
eData2,
}eTestData_t;

#ifdef eData1

void doSomething(void)
{
	printf("1111");
}
#endif

int main() 
{
	doSomething();
	return 0;
}


结果是:这个函数doSomething 未定义!!


11.列举出10个C语言标住库函数。(这么多随便选十个)

C语言的常用的标准头文件有 :

<ctype.h>   <time.h>   <stdio.h>

<stdlib.h>   <math.h>   <string.h>

一. <ctype.h>
序号	函数原型	功能
1	int iscntrl(int c)	判断字符c是否为控制字符。
2	int isalnum(int c)	判断字符c是否为字母或数字
3	int isalpha(int c)	判断字符c是否为英文字母
4	int isascii(int c)	判断字符c是否为ascii码
5	int isblank(int c)	判断字符c是否为TAB或空格
6	int isdigit(int c)	判断字符c是否为数字
7	int isgraph(int c)	判断字符c是否为除空格外的可打印字符
8	int islower(int c)	判断字符c是否为小写英文字母
9	int isprint(int c)	判断字符c是否为可打印字符(含空格)
10	int ispunct(int c)	判断字符c是否为标点符号
11	int isspace(int c)	判断字符c是否为空白符
12	int isupper(int c)	判断字符c是否为大写英文字母
13	int isxdigit(int c)	判断字符c是否为十六进制数字
14	int toascii(int c)	将字符c转换为ascii码
15	int tolower(int c)	将字符c转换为小写英文字母
16	int toupper(int c);	将字符c转换为大写英文字母


二. <math.h>
序号	函数原型	功能
1	float fabs(float x)	求浮点数x的绝对值
2	int abs(int x)	求整数x的绝对值
3	float acos(float x)	求x(弧度表示)的反余弦值
4	float asin(float x)	求x(弧度表示)的反正弦值
5	float atan(float x)	求x(弧度表示)的反正切值
6	float atan2(float y, float x)	求y/x(弧度表示)的反正切值
7	float ceil(float x)	求不小于x的最小整数
8	float cos(float x)	求x(弧度表示)的余弦值
9	float cosh(float x)	求x的双曲余弦值
10	float exp(float x)	求e的x次幂
11	float floor(float x)	求不大于x的最大整数
12	float fmod(float x, float y)	计算x/y的余数
13	float frexp(float x, int *exp)	把浮点数x分解成尾数和指数
14	float ldexp(float x, int exp)	返回x*2^exp的值
15	float modf(float num, float *i)	将浮点数num分解成整数部分和小数部分
16	float hypot(float x, float y)	对于给定的直角三角形的两个直角边,求其斜边的长度
17	float log(float x)	计算x的自然对数
18	float log10(float x)	计算x的常用对数
19	float pow(float x, float y)	计算x的y次幂
20	float pow10(float x)	计算10的x次幂
21	float sin(float x)	计算x(弧度表示)的正弦值
22	float sinh(float x)	计算x(弧度表示)的双曲正弦值
23	float sqrt(float x)	计算x的平方根
24	float tan(float x);	计算x(弧度表示)的正切值
25	float tanh(float x)	求x的双曲正切值


三. <stdio.h>
序号	函数原型	功能
1	int printf(char *format...)	产生格式化输出的函数
2	int getchar(void)	从键盘上读取一个键,并返回该键的键值
3	int putchar(char c)	在屏幕上显示字符c
4	FILE *fopen(char *filename, char *type)	打开一个文件
5	FILE *freopen(char *filename, char *type,FILE *fp)	打开一个文件,并将该文件关联到fp指定的流
6	int fflush(FILE *stream)	清除一个流
7	int fclose(FILE *stream)	关闭一个文件
8	int remove(char *filename)	删除一个文件
9	int rename(char *oldname, char *newname)	重命名文件
10	FILE *tmpfile(void)	以二进制方式打开暂存文件
11	char *tmpnam(char *sptr)	创建一个唯一的文件名
12	int setvbuf(FILE *stream, char *buf, int type, unsigned size)	把缓冲区与流相关
13	int fprintf(FILE *stream, char *format[, argument,...])	传送格式化输出到一个流中
14	int scanf(char *format[,argument,...])	执行格式化输入
15	int fscanf(FILE *stream, char *format[,argument...])	从一个流中执行格式化输入
16	int fgetc(FILE *stream)	从流中读取字符
17	char *fgets(char *string, int n, FILE *stream)	从流中读取一字符串
18	int fputc(int ch, FILE *stream)	送一个字符到一个流中
19	int fputs(char *string, FILE *stream)	送一个字符到一个流中
20	int getc(FILE *stream)	从流中取字符
21	int getchar(void)	从 stdin 流中读字符
22	char *gets(char *string)	从流中取一字符串
23	int putchar(int ch)	在 stdout 上输出字符
24	int puts(char *string)	送一字符串到流中
25	int ungetc(char c, FILE *stream)	把一个字符退回到输入流中
26	int fread(void *ptr, int size, int nitems, FILE *stream)	从一个流中读数据
27	int fwrite(void *ptr, int size, int nitems, FILE *stream)	写内容到流中 int fseek
28	(FILE *stream, long offset, int fromwhere)	重定位流上的文件指针
29	long ftell(FILE *stream)	返回当前文件指针
30	int rewind(FILE *stream)	将文件指针重新指向一个流的开头
31	int fgetpos(FILE *stream)	取得当前文件的句柄
32	int fsetpos(FILE *stream, const fpos_t *pos)	定位流上的文件指针
33	void clearerr(FILE *stream)	复位错误标志
34	int feof(FILE *stream)	检测流上的文件结束符
35	int ferror(FILE *stream)	检测流上的错误
36	void perror(char *string)	系统错误信息


四. <stdlib.h>
序号	函数原型	功能
1	char *itoa(int i)	把整数i转换成字符串
2	void exit(int retval)	结束程序
3	double atof(const char *s)	将字符串s转换为double类型
4	int atoi(const char *s)	将字符串s转换为int类型
5	long atol(const char *s)	将字符串s转换为long类型
6	double strtod (const char*s,char **endp)	将字符串s前缀转换为double型
7	long strtol(const char*s,char **endp,int base)	将字符串s前缀转换为long型
8	unsinged long strtol(const char*s,char **endp,int base)	将字符串s前缀转换为 unsinged long型
9	int rand(void)	产生一个0~RAND_MAX之间的伪随机数
10	void srand(unsigned int seed)	初始化随机数发生器
11	void *calloc(size_t nelem, size_t elsize)	分配主存储器
12	void *malloc(unsigned size)	内存分配函数
13	void *realloc(void *ptr, unsigned newsize)	重新分配主存
14	void free(void *ptr)	释放已分配的块
15	void abort(void)	异常终止一个进程
16	void exit(int status)	终止应用程序
17	int atexit(atexit_t func)	注册终止函数
18	char *getenv(char *envvar)	从环境中取字符串
19	void *bsearch(const void *key, const void *base, size_t *nelem, size_t width, int(*fcmp)(const void *, const *))	二分法搜索函数
20	void qsort(void *base, int nelem, int width, int (*fcmp)())	使用快速排序例程进行排序
21	int abs(int i)	求整数的绝对值
22	long labs(long n)	取长整型绝对值
23	div_t div(int number, int denom)	将两个整数相除 , 返回商和余数
24	ldiv_t ldiv(long lnumer, long ldenom)	两个长整型数相除 , 返回商和余数


五. <time.h>
序号	函数原型	功能
1	clock_t clock(void)	确定处理器时间函数
2	time_t time(time_t *tp)	返回当前日历时间
3	double difftime(time_t time2, time_t time1)	计算两个时刻之间的时间差
4	time_t mktime(struct tm *tp)	将分段时间值转换为日历时间值
5	char *asctime(const struct tm *tblock)	转换日期和时间为ASCII码
6	char *ctime(const time_t *time)	把日期和时间转换为字符串
7	struct tm *gmtime(const time_t *timer)	把日期和时间转换为格林尼治标准时间
8	struct tm *localtime(const time_t *timer)	把日期和时间转变为结构
9	size_t strftime(char *s,size_t smax,const char *fmt, const struct tm *tp)	根据 fmt 的格式 要求将 *tp中的日期与时间转换为指定格式


六. <string.h>
序号	函数原型	功能
1	int bcmp(const void *s1, const void *s2, int n)	比较字符串s1和s2的前n个字节是否相等
2	void bcopy(const void *src, void *dest, int n)	将字符串src的前n个字节复制到dest中
3	void bzero(void *s, int n)	置字节字符串s的前n个字节为零
4	void *memccpy(void *dest, void *src, unsigned char ch, unsigned int count)	由src所指内存区域复制不多于count个字节到dest所指内存区域,如果遇到字符ch则停止复制
5	void *memcpy(void *dest, void *src, unsigned int count)	由src所指内存区域复制count个字节到dest所指内存区域
6	void *memchr(void *buf, char ch, unsigned count)	从buf所指内存区域的前count个字节查找字符ch
7	int memcmp(void *buf1, void *buf2, unsigned int count)	比较内存区域buf1和buf2的前count个字节
8	int memicmp(void *buf1, void *buf2, unsigned int count)	比较内存区域buf1和buf2的前count个字节但不区分字母的大小写
9	void *memmove(void *dest, const void *src, unsigned int count)	由src所指内存区域复制count个字节到dest所指内存区域
10	void *memset(void *buffer, int c, int count)	把buffer所指内存区域的前count个字节设置成字符c
11	void setmem(void *buf, unsigned int count, char ch)	把buf所指内存区域前count个字节设置成字符ch
12	void movmem(void *src, void *dest, unsigned int count)	由src所指内存区域复制count个字节到dest所指内存区域
13	char *stpcpy(char *dest,char *src)	把src所指由NULL结束的字符串复制到dest所指的数组中
14	char *strcpy(char *dest,char *src)	把src所指由NULL结束的字符串复制到dest所指的数组中
15	char *strcat(char *dest,char *src)	把src所指字符串添加到dest结尾处(覆盖dest结尾处的’\0’)并添加’\0’
16	char *strchr(char *s,char c)	查找字符串s中首次出现字符c的位置
17	int strcmp(char *s1,char * s2)	比较字符串s1和s2
18	int stricmp(char *s1,char * s2)	比较字符串s1和s2,但不区分字母的大小写
19	int stricmp(char *s1,char * s2)	比较字符串s1和s2,但不区分字母的大小写
20	int strcspn(char *s1,char *s2)	在字符串s1中搜寻s2中所出现的字符
21	char *strdup(char *s)	复制字符串s
22	int strlen(char *s)	计算字符串s的长度
23	char *strlwr(char *s)	将字符串s转换为小写形式
24	char *strupr(char *s)	将字符串s转换为大写形式
25	char *strncat(char *dest,char *src,int n)	把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的’\0’)并添加’\0’
26	int strcmp(char *s1,char * s2,int n)	比较字符串s1和s2的前n个字符
27	int strnicmp(char *s1,char * s2,int n)	比较字符串s1和s2的前n个字符但不区分大小写
28	char *strncpy(char *dest, char *src, int n)	把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中
29	char *strpbrk(char *s1, char *s2)	在字符串s1中寻找字符串s2中任何一个字符相匹配的第一个字符的位置,空字符NULL不包括在内
30	char *strrev(char *s)	把字符串s的所有字符的顺序颠倒过来(不包括空字符NULL)
31	char *strset(char *s, char c)	把字符串s中的所有字符都设置成字符c
32	char *strstr(char *haystack, char *needle)	从字符串haystack中寻找needle第一次出现的位置(不比较结束符NULL)
33	char *strtok(char *s, char *delim)	分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串
34	int strnicmp(char *s1,char * s2,int n)	比较字符串s1和s2的前n个字符但不区分大小写

12.写出你熟悉的一个嵌入式芯片的型号、性能指标及资源分布情况。

单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

主要特性

编辑 播报

·与MCS-51 兼容

·4K字节可编程FLASH存储器

·寿命:1000写/擦循环

·数据保留时间:10年

·全静态工作:0Hz-24MHz

·三级程序存储器锁定

·128×8位内部RAM

·32可编程I/O线

·两个16位定时器/计数器

·5个中断源

·可编程串行通道

·低功耗的闲置和掉电模式

·片内振荡器和时钟电路

特性

编辑 播报

AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,256字节片内数据存储器(00H -7FH为片内RAM,80H-FFH为特殊功能寄存器SFR),32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。


 13.画出你最熟悉的——个实践项目的系统框图注:此题目,在纸上作答然后拍照上传

这个自己写


14.写出三种排序算法函数(数字从大到小排序),并标出他们的时间复杂度和空间复杂度。注:此题目,在纸上作答然后拍照上传  (自己写,很容易)

void input_array(int *W,int n)//输出数组的元素
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d ",W[i]);
	}
	printf("\n");
 
}



 
void insert_sort_fall(int *W,int n)   //插入式的排序 降序
{
 
	int i,j,k,m;
	printf("插入式排序  降序!\n");
	printf("开始:");
	input_array(W,n);
	for(i=n-1;i>0;--i)
	{
		k=i;
		m=W[k];
		for(j=i-1;j<n-1;++j)
		{
			if(W[k]<=W[j])
			{
				break;
			}
			else
			{
				W[k]=W[j];
				W[j]=m;
				k++;
				m=W[k];
			}
		}
		printf("第%d次:",n-i);
		input_array(W,n);
	}
}
 

15.写一段程序,输入正整数n (n<100),输出n的阶乘。提示:注意数值溢出。注:此题目,在纸上作答然后拍照上传

#include<bits/stdc++.h>
using namespace std;

int W[9999];
void fac(const int c)
{
	int i=0;
	for(i=0;i<10000;i++)
	{
		W[i]=W[i]*c;
	}
	for(i=0;i<10000;i++)
	{
		if(W[i]>10)
		{
			int a=W[i]/10;
			W[i+1]+=a;
			W[i]-=a*10;
		}
	}
}

void print()
{
	int i,j;
	for(i=10000;i>=0;i--)
	{
		if(W[i]!=0)
		{
			break;
		}
	}
	for(j=i;j>=0;j--)
	{
		printf("%d",W[j]);
	}
	printf("\n");
}



int  main()
{
	long long a=1;
	int i=1,n;
	scanf("%d",&n);
	if(n==0||n==1)
	{
		printf("1");
		return 0;
	}
	W[0]=1;
	for(i=1;i<=n;i++)
	{
		fac(i);
	}
	print();
	return 0;
}


 


 

  • 15
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值