免费智能真题库 > 历年试卷 > 嵌入式系统设计师 > 2017年下半年 嵌入式系统设计师 下午试卷 案例
  第5题      
  知识点:   数组   基本概念

 
下面是关于C语言的基本概念和编程方面的叙述,回答问题1至问题3,埒答案填入答题纸的对应栏内。

【说明】
企业根据利润提成发放奖金。利润低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成15%;利润在20万到40万之间时,高于20万元的部分,可提成20%;40万到60万之间时高于40万元的部分,可提成25%;60万到100万之间时,高于60万元的部分,可提成30%;高于100万元时,高于100万元的部分可提成35%o已知企业本年度12个月的月利润存储在数组profit中,程序要求根据月利润计算月奖金并存储到数组bonus中,然后计算并返回该企业的年度总利润total_profito该程序的实现如下:
【程序】
int calculate_bonus(const int profit[ ], int bonus[ ])
{
int n=12;
int i=0;
int sum_profit=0;
int bonus1,bonus2,bonus4,bonus6,bonuslO;
bonus1=100000*0.1;
bonus2=bonus1+100000*0.15;
bonus4=bonus2+200000*0.2;
bonus6=bonus4+200000*0.25; bonusl0=bonus6+400000*0.3;
for (i=0;i<n; i++)
{
if (profit[i]<=100000)
(1);
else if(profit[i]<=200000)
(2);
else if(profit[i]<=400000)
(3);
else if(profit[i]<=600000)
(4);
else if(profit[i]<=1000000)
(5) ;
else
(6) ;
}
/*以下代码计算年度总利润*/
i=0;
while(i<n)
sum_profit += profit[++i];
return sum_profit;
}
 
问题:5.1   在程序中,使用关键字const修饰输入参数profit,请将这样修饰的作用写到答题纸(1)处。
如果程序中bonus数组也使用const修饰,是否正确,并给出解释,请将答案写到答题纸(2)处。
 
问题:5.2   分析程序中的计算年度总利润的代码,指出错误的一行代码,将错误代码写到答题纸(1)处;然后用一条语句实现正确代码,将正确代码写到答题纸(2)处。
 
问题:5.3   根据题意分析程序,完成程序中的(1)~(6),每个空行只能写一行代码,即用一条语句来描述,将答案写到答题纸相应的位置。
 
 
 

   知识点讲解    
   · 数组    · 基本概念
 
       数组
        数组是一种集合数据类型,它由多个元素组成,每个元素都有相同的数据类型,占有相同大小的存储单元,且在内存中连续存放。每个数组有一个名字,数组中的每个元素有一个序号(称为下标),表示元素在数组中的位序(位置),数组的维数和大小在定义数组时确定,程序运行时不能改变。
        一维数组的定义形式为:
        
        其中,“类型说明符”指定数组元素的类型;“数组名”的命名规则与变量相同;“常量表达式”的值表示数组元素的个数,必须是一个正整数。例如:
        
        在C程序中,数组元素的下标总是从0开始的,如果一个数组有n个元素,则第一个元素的下标是0,最后一个元素的下标是n-1。例如,在上面定义的temp数组中,第一个元素是temp[0],第二个元素是temp[1],以此类推,最后一个元素是temp[99]。访问数组元素的方法是通过数组名及数组名后的方括号中的下标。例如:
        
        程序员需确保访问数组元素时下标的有效性,访问一个不存在的数组元素(例如temp[100]),可能会导致严重的错误。
        定义数组时就给出数组元素的初值,称之为初始化,数组的初始化与简单变量的初始化类似。初值放在一对花括号中,各初值之间用逗号隔开,称为初始化表。例如:
        
        对于没有给出数组元素个数而给出了初始化表的数组定义,编译器会根据初值的个数和类型,为数组分配相应大小的内存空间。初始化表中值的个数必须小于或等于数组元素的个数。
        对于“int primes[10]={1,2,3,5,7};”,前5个数组元素的初值分别为1,2,3,5,7,后5个元素的初值都为0。
        二维数组可视为是一个矩阵,定义形式为:
        
        其中,“类型说明符”指定数组元素的类型,“常量表达式1”指定行数,“常量表达式2”指定列数。例如,可以定义一个二维数组:
        
        这个数组在内存中占用能存放12个double型数据且地址连续的存储单元。
        C语言中二维数组在内存中按行顺序存放。
        可以用sizeof计算数组空间的大小,即字节数。例如,
        
        二维数组可以看作元素是一维数组的一维数组,三维数组可看作元素是二维数组的一维数组,以此类推。
 
       基本概念
               程序与进程
                      程序顺序执行的特征
                      前趋图是一个有向无循环图,由结点和有向边组成,结点代表各程序段的操作,而结点间的有向边表示两个程序段操作之间存在的前趋关系(→)。程序段Pi和Pj的前趋关系表示成Pi→Pj,其中,Pi是Pj的前趋,Pj是Pi的后继,其含义是Pi执行结束后Pj才能执行。例如,下图为3个程序段,其中输入是计算的前驱(计算是输入的后继),输入结束才能进行计算;计算是输出的前驱,计算结束才能进行输出。
                      
                      3个结点的前驱图
                      程序顺序执行时的主要特征包括顺序性、封闭性和可再现性。
                      程序并发执行的特征
                      若在计算机系统中采用多道程序设计技术,则主存中的多道程序可处于并发执行状态。对于上述有3个程序段的作业类,虽然每个作业有前趋关系的各程序段不能在CPU和输入/输出各部件并行执行,但是同一个作业内没有前趋关系的程序段或不同作业的程序段可以分别在CPU和各输入/输出部件上并行执行。例如,某系统中有一个CPU、一台输入设备和一台输出设备,每个作业具有3个程序段,输入I、计算Ci和输出Pii=l,2,3)。下图为3个作业的各程序段并发执行的前驱图,图中的前驱关系可记为:
                      →={I1→C1,I1→I2,I2→C2,I2→I3,I3→C3,C1→P1,C1→C2,C2→P2,C2→C3,C3→P3,P1→P2,P2→P3
                      
                      程序并发执行的前驱图
                      从上图中可以看出,I2与C1并行执行;I3、C2与P1并行执行;C3与P2并行执行。其中,I2、I3受到I1的间接制约,C2、C3受到C1的间接制约,P2、P3受到P1的间接制约,而C1、P1受到I1的直接制约,等等。
                      程序并发执行时的特征如下:
                      (1)失去了程序的封闭性。
                      (2)程序和机器的执行程序的活动不再一一对应。
                      (3)并发程序间的相互制约性。
                      例如,两个并发执行的程序段完成交通流量的统计,其中,“观察者”P1识别通过的车辆数,“报告者”P2定时将观察者的计数值清0。程序实现如下:
                      
                      对于上例,由于程序可并发执行,所以可能有以下3种执行序列:
                      ①COUNT:=COUNT+1;PRINT COUNT;COUNT:=0
                      ②PRINT COUNT;COUNT:=0;COUNT:=COUNT+1
                      ③PRINT COUNT;COUNT:=COUNT+1;COUNT:=0
                      假定COUNT的某个循环的初值为n,那么这3种执行序列得到的COUNT结果不同,如下表所示。
                      
                      程序并发执行的结果
                      这种不正确结果的发生是因为两个程序P1和P2共享变量COUNT引起的,即程序并发执行破坏了程序的封闭性和可再现性,使得程序和执行程序的活动不再一一对应。为了解决这一问题,需要研究进程间的同步与互斥问题。
               进程的组成
               进程是程序的一次执行,该程序可以和其他程序并发执行。进程通常是由程序、数据和进程控制块(Process Control Block,PCB)组成的。
               (1)PCB。PCB是进程存在的唯一标志,其主要内容如下表所示。
               
               PCB的内容
               (2)程序。程序部分描述了进程需要完成的功能。假如一个程序能被多个进程同时共享执行,那么这一部分就应该以可再入(纯)码的形式编制,它是程序执行时不可修改的部分。
               (3)数据。数据部分包括程序执行时所需的数据及工作区。该部分只能为一个进程所专用,是进程的可修改部分。
               进程的状态及其状态间的切换
                      三态模型
                      在多道程序系统中,进程在处理器上交替运行,状态也不断地发生变化,因此进程一般有3种基本状态:运行、就绪和阻塞。下图显示了进程基本状态及其转换,也称三态模型。
                      
                      进程的三态模型
                      (1)运行。当一个进程在处理机上运行时,则称该进程处于运行状态。显然,对于单处理机系统,处于运行状态的进程只有一个。
                      (2)就绪。一个进程获得了除处理机外的一切所需资源,一旦得到处理机即可运行,则称此进程处于就绪状态。
                      (3)阻塞。阻塞也称等待或睡眠状态,一个进程正在等待某一事件发生(例如请求I/O,等待I/O完成等)而暂时停止运行,这时即使把处理机分配给进程也无法运行,故称该进程处于阻塞状态。
                      五态模型
                      事实上,对于一个实际的系统,进程的状态及其转换更复杂。例如,引入新建态和终止态构成了进程的五态模型,如下图所示。
                      
                      进程的五态模型
                      其中,新建态对应于进程刚刚被创建时没有被提交的状态,并等待系统完成创建进程的所有必要信息。因为创建进程时分为两个阶段,第一个阶段为一个新进程创建必要的管理信息,第二个阶段让该进程进入就绪状态。由于有了新建态操作系统,往往可以根据系统的性能和主存容量的限制推迟新建态进程的提交。类似地,进程的终止也可分为两个阶段,第一个阶段等待操作系统进行善后处理,第二个阶段释放主存。
                      具有挂起状态的进程状态及其转换
                      由于进程的不断创建,系统资源特别是主存资源已不能满足进程运行的要求。这时,就必须将某些进程挂起,放到磁盘对换区,暂时不参加调度,以平衡系统负载。或者是系统出现故障,或者是用户调试程序,也可能需要将进程挂起检查问题。下图是具有挂起状态的进程状态及其转换。
                      
                      细分进程状态及其转换
                      (1)活跃就绪。活跃就绪是指进程在主存并且可被调度的状态。
                      (2)静止就绪。静止就绪是指就绪进程被对换到辅存时的状态,它是不能被直接调度的状态,只有当主存中没有活跃就绪态进程,或者是挂起态进程具有更高的优先级时,系统将把挂起就绪态进程调回主存并转换为活跃就绪。
                      (3)活跃阻塞。活跃阻塞是指进程在主存,一旦等待的事件产生便进入活跃就绪状态。
                      (4)静止阻塞。静止阻塞是指阻塞进程对换到辅存时的状态,一旦等待的事件产生便进入静止就绪状态。
   题号导航      2017年下半年 嵌入式系统设计师 下午试卷 案例   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
 
第5题    在手机中做本题