个人主页:个人主页
系列专栏:【软考】程序员
与软考有关的系列专栏:
MySQL数据库(这个注重实践)
操作系统
计算机网络
数据结构与算法
C语言
目录
1.软考介绍
⚙️软考-程序员考核内容⚙️
软考-程序员考核内容细分:
2.C语言专题
19年(上)下午题【C专题】
1.软考介绍
计算机技术与软件专业技术资格(水平)考试(以下简称计算机软件资格考试)。计算机软件资格考试是由国家人力资源和社会保障部、工业和信息化部领导下的国家级考试,其目的是科学、公正地对全国计算机与软件专业技术人员进行职业资格、专业技术资格认定和专业技术水平测试。 计算机软件资格考试设置了27个专业资格,涵盖5个专业领域, 3个级别层次(初级、中级、高级)。
通过考试获得证书的人员,表明其已具备从事相应专业岗位工作的水平和能力, 用人单位可根据工作 需要从获得证书的人员中择优聘任相应专业技术职务(技术员、助理工程师、工程师、高级工程师)。计算机软件资格考试全国统一实施后,不再进行计算机技术与软件相应专业和级别的专业技术职务任职资格评审工作。因此, 计算机软件资格考试既是职业资格考试,又是职称资格考试。同时,该考试还具有水平考试性质, 报考任何级别不需要学历、资历条件,只要达到相应的专业技术水平就可以报考相应的级别。考试合格者将颁发由中华人民共和国人力资源和社会保障部、工业和信息化部用印的计算机技术与软件专业技术资格(水平)证书。 该证书在全国范围内有效。
软考-程序员考核内容
- 掌握数制及其转换、数据的机内表示、算术和逻辑运算、应用数学基础知识;
- 了解计算机的组成以及各主要部件的性能指标;
- 掌握操作系统、程序设计语言的基础知识;
- 熟练掌握基本数据结构和常用算法;
- 熟练掌握C程序设计语言,以及C++、Java中的一种程序设计语言;
- 熟悉数据库、网络和多媒体的基础知识;
- 了解软件工程的基础知识、软件过程基本知识、软件开发项目管理的常识;
- 了解常用信息技术标准、安全性,以及有关法律、法规的基本知识;
- 了解信息化及计算机应用的基础知识;
- 正确阅读和理解计算机领域的简单英文资料。
本考试设置的科目包括:
- 计算机硬软件基础知识,考试时间为150分钟,笔试,选择题;
- 程序设计,考试时间为150分钟,笔试,问答题。
软考-程序员考核内容细分:
内容包括: 计算机基础、操作系统、数据库基础、 计算机网络、数据库系统、 程序设计语言基础(C,C++,java) ,软件工程,数据结构、算法分析与设计,多媒体技术。
2.C语言专题
下午总共4个大题(3个C语言+1个程序流程图)+2个选修题(java和C++)。
4个大题为必做,2个选修题中选1个做
所以总共5个大题,满分75分
19年(上)下午题【C专题】
2、阅读以下说明和C代码,回答问题
【说明】
函数bubbleSort(int arr[], int n, int (*compare)(int,int))的功能是根据调用时传递的比较 函数compare对数组arr的前n个元素进行排序。
【C代码】
#define swap(a, b) { a = a∧b; b = a∧b; a = a∧b;} //交换 a 与 b 的值
int less(int x,int y)
{
return ((x}
int larger(int x, int y)
{
return ((x>y) ? 1 : 0);
}
void bubbleSort(int arr[ ], int n, int (*compare)(int,int))
{ int i,j;
int swapped = 1;
for( i=0; swapped; i++) {
swapped = 0;
for(j=0; j<n-1-i; j++)
if ( compare( arr[j+1], arr[j])) {
swap( arr[j+1], arr[j]);
swapped =1;
}
}
}
问题内容:
【问题】
设有如下数组定义:
int data1[ ] = {4, 2, 6, 3, 1};
int data2[ ] = {4, 2, 6, 3, 1};
int data3[ ] = {4, 2, 6, 3, 1};
请分别给出下面的函数调用执行后,数组data1、data2和data3各自的元素序列。
(1)bubbleSort(data1, 5, less);
(2) bubbleSort(data2, 5, larger);
(3) bubbleSort(data3, 3, larger);
视频讲解:软考初级程序员(19年上半年下午题试题二)
答案解析: swap 函数是将两元素值进行相互交换。less 函数是判断 x 和 y 的关系,如果 xy,则函数值为真。在 bubbleSort 函数中,第二个参数表示进行比较元素的个数,第三个参数表示进行排序的方式,如果传入 less 函数,则是从小到大排序;如果传入 large 函数,则是从大到小排序。(1){1,2,3,4,6} (2){6,4,3,2,1} (3){6,4,2,3,1}
3、阅读以下说明和C代码,填写程序中的空缺,将解答写入答题纸的对应栏内。
【说明】
某市根据每天早上5点测得的雾霾指数(pm2.5值)决定是否对车辆进行限行。规则 如下:
(1)限行时间为周内.(即周一到周五),周六周日不限行;
(2)根据车牌号的尾号(最后1位数字)设置限行车辆(车牌号由英文字母和十进 制数字构成,长度为6位,至少包含1位数字);
(3)雾霾指数低于200时,不限行;
(4)雾霾指数在区间[200, 400)时,周内每天限行两个尾号的汽车:周一限行1和6, 周二限行2和7,周三限行3和8,周四限行4和9,周五限行5和0,即尾号除以5的 余数相同者在同一天限行;
(5)雾霾指数大于等于400时,周内每天限行五个尾号的汽车:周一、周三和周五限行1,3,5,7,9,周二和周四限行0,2,4,6,8,即尾号除以2的余数相同者在同一天限行;
下面程序运行时,输入雾霾指数、星期(数字1表示星期一,数字2表示星期二,…, 数字7表示星期日)和车牌号,输出该车牌号是否限行的信息。
问题内容:
【C代码】
#include
#define PM25_L1 200
#defme PM25_L2 400
typedef enum {YES,NO} MARKTAG;
int isDigit(char ch)
{//判断ch是否为十进制数字字符,是则返回1,否则返回0
return (ch>=’0′ && ch<='9');
}
void prt_msg(char *msg, MARKTAG flag)
{
if (flag == YES)
printf(“%s : traffic restrictions\n”, msg);
else
printf(“%s : free\n”, msg);
}
int isMatched(int weekday, int t, int d) //判断是否符合限行规则,是则返回1,否则返回0
{ return (weekday%d == t%d); }
void proc(int pm25, int weekday, char *licence)
{
int i,lastd;
if (weekday == 6 || weekday == 7 || (1))
prt_msg(licence, NO);
else {
for( i=5; i>=0; i– )
if (isDigit(licence[i])) {
lastd= (2) ; //获取车牌号的尾号
break;
}
if(pm25>= PM25_L2 ) { //限行5个尾号的汽车
if (isMatched((3)))
prt_msg(licence, YES);
else
prt_msg(licence, NO);
}
else { //限行2个尾号的汽车
if (isMatched( (4)))
prt_msg(licence, YES);
else
prt_msg(licence, NO);
}
}
}
int main()
{
int weekday=0, pm25=0;
char licence[7];
scanf(“%d %d %s’’,&pm25, &weekday, licence);
//输入数据的有效性检测略,下面假设输入数据有效、正确
proc((5) );
return 0;
}
视频讲解:软考初级程序员(19年上半年下午题试题三)
答案解析:(1)表示什么时候不限行,按照题意,周六周日不限行,雾霾指数低于 200 以下也不限行;所以这里填 pm25<200 或 pm<pm25_L1(2)该处获取车牌号的尾号,从后向前依次查找,只要找到一个数字字符就结束,并将这个数字字符转化为数字赋值给 lastd,所以填的是 licence[i]-‘0’,这里有同学可能会直接写 licence[i],注意字符‘0’的 ASCII 码对应的是 48(3)此处填的是当雾霾指数大于等于 400 时,周内每天限行五个尾号的汽车,算法是尾号除以 2 的余数相同者在同一天限行,这里是尾号 lastd 和 weekday 和 2 进行分别取余,得到值相同的时候就是要限行,使用函数 isMatched,填的是 weekday,lastd,2(4)此处填的是当雾霾指数小于 400 大于等于 200 时,周内每天限行两个个尾号的汽车,算法是尾号除以 5 的余数相同者在同一天限行,这里是尾号 lastd 和 weekday 和 5 进行分别取余,得到值相同的时候就是要限行,使用函数 isMatched,填的是 weekday,lastd,5(5)此处填调用 proc 函数的实参,查看 proc 的函数定义部分,实参应该填入 pm25,weekday,licence (1)pm25<200 或 pm<pm25_L1 (2)licence[i]-‘0’ (3)weekday,lastd,2 或 lastd,weekday,2 (4)weekday,lastd,5 或 lastd,weekday,5 (5)pm25,weekday,licence 或 pm25,weekday,&licence[0]
4、阅读以下说明和C代码,填写程序中的空(1) ~ (5),将解答写入答题纸的对应栏内。
【说明】
下面程序运行时,对输入的表达式进行计算并输出计算结果。设表达式由两个整数和一个运算符(+或-)构成,整数和运算符之间以空格分隔,运算符可以出现在两个整 数之前、之间或之后,整数不超过4位,输入的两个整数和运算符都用字符串表示。
例如,输入分别为“25+7”、“+25 7”、“25 7+”时,输出均为“25 + 7 = 32”。
问题内容:
【C代码】
#include
int str2int(char *s);//将数字字符串转换为整数
int isOperator(char *str); //判断字符串的开头字符是否为运算符
void cal(char op, char a[ ], charb[ ]);//将数字串转化为对应整数后进行op所要求的计算
void solve(char a[ ],char b[ ],char c[ ]);
int main ()
{
char a[10],b[10], c[10];
scanf(’’%s%s%s’’,a,b,c);
//输入数据的有效性检测略,下面假设输入数据有效、正确
Solve(a,b,c);
Return 0;
}
int str2int(char *s)
{
int val = 0;
while (*s) {
val =(1)+ (*s – ‘0’); //将数字字符串转换为十进制整数
(2) ;//令字符指针指向下一个数字字符
}
return val;
}
int isOperator(char *str)
{
return (*str ==‘+’|| *str ==‘-’);
}
void cal( char op, char a[ ], char b[])
{
switch(op) {
case ‘+’:
printf(” %s + %s = %d”,a,b,str2int(a)+str2int(b));
break;
case‘-’
printf(“%s – %s = %d ” ,a,b,str2int(a)-str2int(b));
break;
}
}
void solve(char a[ ],char b[ ],char c[ ])
{//解析输入的3个字符串,输出表达式及计算结果
if (isOperator(a)) { //运算符在两个整数之前
cal( (3));
}
else if(isOperator(b)) {//运算符在两个整数之间
cal((4) );
}
else {//运算符在两个整数之后
cal((5) )
}
}
视频讲解:软考初级程序员(19年上半年下午题试题四)
答案解析:
- 1、2 空将数字字符串进行全部转化为数字,例如“1234”转化为数字 1234,分别用指针 s 依次取字符,val 将数字保留,之前是’1’, val=1;然后 s=’2’,val=12,然后 s=’3’,val=123,然后 s=’4’, val=1234,因此 val=val*10+*s-‘0’。每次循环后 s 向后移动一个。
- 3、4、5 考查的都是函数调用的问题,首先判断运算符的位置,用isOperator 来进行判定,如果字符串 a 就是运算符,那么操作数就是b 和 c,调用 cal 函数进行计算。实参传递的时候,第一个参数要传递字符,后面两个参数传递字符数组或者字符指针,
- (3)填写的是*a, b,c,依次类推,
- (4) 答案是*b ,a,c,(5)的答案是 *c,a,b。
(1)val*10(2)s++(3) *a,b,c(4) *b ,a,c(5) *c,a,b