每日一练9月份总结
1.2020年物联网大事件有哪些?
2020年2月,华为安防官宣,华为智能安防正式更名为“华为HoloSens机器视觉“。这一句简单发声,却是无声惊雷,激起行业千层浪。2020年,在加速进入“5G+AI”的时代背景下,以“视频+AI”为核心的华为智能安防也不再局限于“安”与“防”,而是用“机器视觉”,助力千行百业数字化转型。
2020年3月,海康威视向外首次推出了自家的智能安检系统,希望通过智能安检分析仪、安检机、安检门以及各类辅助产品,打造出一个集安检联网、智能识别、信息融合为一体的智能安检生态系统。胡扬忠曾透露,目前海康威视的案件团队有150人左右,未来还将会增加到200多人,这也在预示着不久将来海康威视将一举进军智能安检市场。近年来,随着国际会议频繁召开与全球反恐的需求之下,全球安检市场迅猛发展,预测在2020年市场规模突破10亿美元
在2019年—2020年期间,全国多地政府出台相关支持政策,通过支持5G网络建设,促进智慧灯杆产业迎来新的落地潮。目前,华为、中兴等企业纷纷布局智慧路灯赛道,智慧灯杆项目成功落地。预测未来在5G网络全面搭建商用后,将催生千亿级智慧灯杆市场。
2.找一份2020年物联网前沿技术,从技术角度谈谈你的看法?
5G每天都在创造着新的历史,在其发展之路上,无论是高光时刻或者是艰难时刻,我们都在一同亲历——新一代通信技术的萌芽、崛起,并期待着未来将会发生的巨大变革。伴随今年新基建的风口,5G行业应用出现井喷式发展,有力拉动中国以5G为龙头的大基建经济的投资、布局,在可预期的不久将来,新基建必然在各个方面都将持续发挥支柱性作用。总的来说,5G技术正在日益成熟,而一个互联网万物互联、融入人工智能、大数据等多项技术的5G新时代正在悄然开启,让我们坐看各大巨头竞相抢滩布局5G市场,百花争鸣可谓好不热闹!
3.请问以下循环体中哪个效率更高,为什么?
for(i=0;i<10000000,i++)
{
for(j=0;j<5,j++)
{
Action();
}
}
--------------------------------------------------------------
for(i=0;i<100,i++)
{
for(j=0;j<10000000,j++)
{
Action();
}
}
究竟是小套打比较快还是大套小比较快?实践检验真理,
上机测试一下就一目了然了。
#include <stdio.h>
#include <time.h>
int k=0;
int Action()
{
return 0;
}
int main()
{
clock_t start, finish;
int i, j;
start = clock();
for (i = 0; i < 10000000; i++)
{
for (j = 0; j < 5; j++)
{
Action();
}
}
finish = clock();
printf("b2s:%ld\n",finish - start);
}
b2s:91
#include <stdio.h>
#include <time.h>
int k=0;
int Action()
{
return 0;
}
int main()
{
clock_t start, finish;
int i, j;
start = clock();
for (i = 0; i < 5; i++)
{
for (j = 0; j < 10000000; j++)
{
Action();
}
}
finish = clock();
printf("b2s:%ld\n",finish - start);
}
b2s:78
结果很明显啦,小套大效率更高
4.请设计一段程序,输入某年某月某天,输出是这一年的第几天?
#include <stdio.h>
int main(int argc,char *argv[])
{
int label1;
int y,m,d,days,February;
printf("请输入年份:");
scanf("%d",&y);
printf("请输入月份:");
scanf("%d",&m);
printf("请输入日期:");
scanf("%d",&d);
if (y<1||m>12||m<1||d>31||d<1)
{
printf("输入错误\n");
return label1;
}
else
if (y%400==0||(y%4==0&&y%100!=0)) //解决办法首先判断是平年还是闰年,确定二月份的天数
February=29;//闰年二月29天
else
February=28;//平年二月28天
switch (m)
{
case 1:
days=0;
printf("%d年%d月%d日是一年中的第%d天!",y,m,d,days+d);
break;
case 2:
days=February;
printf("%d年%d月%d日是一年中的第%d天!",y,m,d,days+d);
break;
case 3:
days=31+February;
printf("%d年%d月%d日是一年中的第%d天!",y,m,d,days+d);
break;
case 4:
days=62+February;
printf("%d年%d月%d日是一年中的第%d天!",y,m,d,days+d);
break;
case 5:
days=92+February;
printf("%d年%d月%d日是一年中的第%d天!",y,m,d,days+d);
break;
case 6:
days=122+February;
printf("%d年%d月%d日是一年中的第%d天!",y,m,d,days+d);
break;
case 7:
days=153+February;
printf("%d年%d月%d日是一年中的第%d天!",y,m,d,days+d);
break;
case 8:
days=183+February;
printf("%d年%d月%d日是一年中的第%d天!",y,m,d,days+d);
break;
case 9:
days=214+February;
printf("%d年%d月%d日是一年中的第%d天!",y,m,d,days+d);
break;
case 10:
days=244+February;
printf("%d年%d月%d日是一年中的第%d天!",y,m,d,days+d);
break;
case 11:
days=275+February;
printf("%d年%d月%d日是一年中的第%d天!",y,m,d,days+d);
break;
case 12:
days=305+February;
printf("%d年%d月%d日是一年中的第%d天!",y,m,d,days+d);
break;
}
system("PAUSE");
return 0;
}
5.请设计一款加减乘除计算器,要求能输入小数,并对非数字的输入进行报警,同时编写代码规范整洁。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a=0;
int b=0;
int ret;
char m;
int result=0;
printf("请输入数字:");
ret=scanf("%d",&a);
getchar();
if(0 == ret)
{
printf("输入错误\n");
system("pause");
return 0;
}
printf("请输入运算符:+ - * / \n");
scanf("%c",&m);
getchar();
printf("请输入数字:");
ret=scanf("%d",&b);
getchar();
if(0 == ret)
{
printf("输入错误\n");
system("pause");
return 0;
} getchar();
switch (m)
{
case '+':{
result=a+b;
}break;
case '-':{
result= a-b;
}break;
case '*':{
result=a*b;
}break;
case '/':{
result=a/b;
}break;
default:
result=-1;//异常情况
break;
}
printf("运算结果:%d",result);
printf("\r\n");
system("pause");
}
6.简述下变量的作用范围,以及你们对变量的理解。
C语言中所有变量都有自己的作用域,变量的类型不同,其作用域也不同,按照作用域的范围可分为两种, 即局部变量和全局变量。
(1)、局部变量:主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。
(2)、全局变量:在函数外部定义的变量,它不属于哪一个函数,它属于一个源程序文件;其作用域是整个源程序,在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。
7.if 语句和三目运算符的的比较,简述各自的优缺点
If语句优点:
(1)、更加灵活(三目运算符的两个结果类型必须一致)
(2)、可以使用多重if-else语句
三目运算符优点:
(1)、写法简洁,可用于宏定义
(2)、可以将条件表达式的值直接赋予某个变量
8.写出 float A 和“零值”比较的 if语句
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
/*不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float还是double类型的变量
都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,
应该设法转化成“>=”或“<=”形式。*/
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较转化为
if ((x>=-EPSINON) && (x<=EPSINON))
//其中EPSINON是允许的误差(即精度)。
9.以下代码有什么问题?该怎么改?
int main(){
char a;
char *str = &a;
strcpy(str,"how are you");
printf(str);
return 0;
}
头文件缺失
没有为str分配内存空间
#include <stdio.h>
#include <string.h>
int main()
{
char a[10];
char *str = a;
strcpy(str,"how are you");
printf(str);
return 0;
}
10.main函数的参数和返回值有什么意义?
必须存在一个main函数,该函数可以在任意一个cpp里定义
main函数是程序的入口,即第一个被执行的函数,不能有两个main函数
main函数有3种形式
int main()
int main(int argc)
int main(int argc,char * argv[])
或int main(int argc,char ** argv)
argc表示命令行参数的个数
argv表示命令行参数的值
#include <stdio.h>
int main(int argc,char * argv[])
{
for(int i=0;i<argc;i++)
{
printf("%s\n",argv);
}
}
在命令行方式下运行程序,各个参数以空间分开
注:当参数本身含有空间时,需要用双引号括起来
main函数的返回值int
一般来说,当程序返回0表示该任务成功完成。非0表示遇到错误或异常情况
问题:
返回给谁了?
谁调用了它,就返回给了谁。
使用system函数来测试
int ret=system(“D:\Cpp\Test\Debug\t.exe 12 8”);
printf(“ret=%d\n”,ret);
11.调用main函数之前发生了什么?
(1)先通过编译链接生成.exe文件(.exe文件在磁盘中存储,且.exe文件中是机器语言)
(2).exe文件通过mmap函数映射到虚拟内存上
(3)再通过分段分页机制把需要的指令和数据加载到内存
编译链接的过程
预处理:将所有的”#define”删除,并且展开所有的宏定义.处理所有的条件编译指令,比如:”#if”处理”#include”预编译指令,将包含的文件插入到该预编译指令的位置(拷贝一份),该过程是递归的可能会重复包含.删除所有的注释,添加行号和文件名标识,保留所有的#pragma编译器指令,编译:生成.s文件(汇编代码文件)。
12. 谈谈结构体和数组的相似点和区别
数组是相同数据类型的元素按一定顺序排列而成的集合,是一种顺序表结构体。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。
数组又可分为数值数组、字符数组、指针数组、结构体数组等各种类别。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。结构体在函数中的作用最主要的就是封装。
数组和结构体相似的地方是都不再是单一的原子类型,而是一个集合。区别在于数组是相同类型元素(元素可以是原子类型的整型、浮点型、字符型或者结构体体、数组等)的集合,而结构体是不同类型元素(元素可以是原子类型的整型、浮点型、字符型或者结构体体、数组等)的集合。
在取地址方面两者也有不同,数组的数组名就代表首地址,依次+1,+2……就可以表示其他元素的地址,不需要使用取地址运算符&;而结构体本身只是一系列不同类型元素的集合,本质上只是把很多类型的元素放在一起,以适应具体问题中数据(例如一个学生的成绩信息、商家的顾客信息等)的存储方式,所以取地址依然需要采用取地址运算。
两者的访问方式也不同,数组可以直接利用下标访问,而结构体必须使用结构体中成员的变量名。
结构体的定义一般放在主函数外面,这样其他函数就可以使用这种类型的结构体定义具体的结构体;而数组则由于定义和使用都较为简单,可以直接在需要使用的函数中定义即可。
13.执行下面代码后,数组里存放的值是什么
int m[5] = {1,2,3,4,5};
int i = 2;
int y = 10;
m[i++] += y;
思考这个题目时我也遇到了想复杂了的一个小问题,就是我一开始认为m[i++]+=y是m[i++] = m[i++]+y;那么优先计算右边的m[i++]为m[2],值为3,所以=右侧为13,但是经过了i++,=左侧的i的初值就变成了3,所以变成了m[3] = m[2]+y;原数组中4被替换成了13。但我编译验证之后发现并不像我一开始想的那样,所以我就又去了解了一下+=这个运算符的作用,发现他和拆开的表达式还是有区别的,简单来说就是他直接就是m[2]=m[2]+y;一个加数和=左边的变量一定是一样的。
14.对于多维数组,是否能用单循环遍历所有的数据?
例:arr[5][5];
#include <stdio.h>
#include <stdlib.h>
int main(int argv, char *argc[])
{
int arr[5][5] = {0};
//单循环便利二维数组“赋值”
int i = 0;
do
{
*(arr[0] + i) += 1 + i;
i++;
} while (i < sizeof(arr) / sizeof(int));
//单循环便利二维数组“输出”
int j = 0;
do
{
printf("%d ", *(arr[0] + j));
if ((j + 1) % 5 == 0)
{
printf("\n");
}
j++;
} while (j < sizeof(arr) / sizeof(int));
system("PAUSE");
}