2009春江苏省计算机二级C语言上机(编程)

2024-06-06

2009春江苏省计算机二级C语言上机(编程)(通用4篇)

篇1:2009春江苏省计算机二级C语言上机(编程)

2009春上机试题1(编程)

程序功能:找出7个默森尼数。法国数学家默森尼曾提出下列公式:Mp=2^p-1。当p是素数并且Mp也是素数时,称Mp为默森尼数,例如,p=5, Mp=2^5-1=31,5和31都是素数,因此31是默森尼数;而Mp=2^11-1=2047,11是素数,2047不是素数,因此2047不是默森尼数.【编程要求】

1.编写函数void Mersenne(long a[ ],int m),其功能是求出前m个默森尼数并以此将它们保存到a指向的数组中,2.编写main函数,调用Mersenne函数并保存前7个默森尼数,将运行结果输出到屏幕及结果文件myf2.out中,最后将考生的考号也保存到结果文件myf2.out中

【测试数据与运行结果】

37311278191***7

2009春上机试题2(编程)

用一组整数验证命题,任意一个百位数字与个位数字不同的三位正整数n1在经过以下操作后一定会变换到1089:将n1的百位数与个位数字交换得到n2,求n1和n2差的绝对值得到n3,将n3的百位数字与个位数字交换得到n4;求n3与n4的和得到n5,n5一定是1089,若n1、n3是一位数或两位数,则在高位补0使其成为三位数

例如:n1:123,n2:321,n3:198(321,-123),n4:891,n5:1089(198+891)

【编程要求】

1.编写函数int fun(int a[ ],int b[ ], int n),其功能是用n指向数组的前n个整数验证上述命题,将所有符合命题的整数所在数组元素的下标依次保存到b指向的数组中,函数返回b数组中数据的个数

2.编写main函数,声明a数组并用测试数据初始化,用a数组作为实参调用fun函数,将a数组中所有符合命题的整数输出到屏幕及结果文件myf2.out中,最后将考生本人的准考证号字符串也保存到结果文件myf2.out中

【测试数据与运行结果】

测试数据:123765***31676963589

运行结果:12376514567

篇2:2009春江苏省计算机二级C语言上机(编程)

(一)关于“******”问题

1、将字符串中的前导*号全部删除,中间和后面的*号不删除。void fun(char *a){ char *p=a;while(*p= =’*’)p++;for(;*p!=’’;p++,a++)*a=*p;*a=’’;}

2、只删中间* int i;for(i=0;a[i]= =’*’;i++)for(;h

3、只删尾* while(*a!=’’)a++;a--;while(*a= =’*’)a--;*(a+1)=’’;

4、只留前* int i , j=0;for(i=0;a=’*’;i++);j=i;for(;a;i++)if(a!=’*’)a[j++]=a[i];a[j]=’’;

5、只留中间* int i,j=0;for(i=h;i

6、只留尾* char *t=a;for(;t<=p;t++)if(*t!=’*’)*(a++)=*t;for(;t!=’’;t++)*(a++)=*t;*a=’’;

7、*个数>n个,删多余的*;*个数<=n个,不做任何处理。int i=0, k=0;char *p,*t;p=t=a;while(*t= =’*’){ k++;t++;} if(k>n){ while(*p){a[i]=*(p+k-n);i++;p++} a[i]=’’;}

(二)移动问题

1、若一维数组中有n个整数,要求把下标从p到n-1(p<=n-1)的元素平移到数组前面。int i,j,t;for(i=p;i<=n-1;i++){ t=w[n-1];for(j=n-2;j>=0;j--)w[j+1]=w[j];w[0]=t;}

2、把下标从0到p(p<=n-1)的元素平移到数组最后。int i,j,t;for(i=0;i<=p;i++){ t=w[0];for(j=1;j

3、把字符串str中的字符向前移动,原来第1个字符放串尾,结果仍保存在原串中。ch=str[0];for(i=0;str[i+1];i++)str[i]=str[i+1];str[i]=ch;

4、移动字符串中的内容,把第1到第m个字符平移到串后,把第m+1到后移到前。void fun(char *w, int m){ int i, j;char t;for(i=1,i<=m;i++){ t=w[0];for(j=1;w[j]!=’’;j++)w[j-1]=w[j];w[j-1]=t;} }

(三)排序法

1、冒泡法 for(i=1;ia[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=a[j];}

2、选择法

for(i=0;ia[j])p=j;if(p!=i)t=a[i];a[i]=a[p];a[p]=t;}

3、插入法 for(i=1;it&&j>=0;j--)a[j+1]=a[j];a[j+1]=t;}

(四)Fibonacci问题

1、求Fibonacci数列中小于t的最大的一个数,结果由函数返回。int fun(int t){ int a=1,b=1,c=0,i;do { c=a+b;a=b;b=c;}while(c

2、用递归算法计算数列中第n项的值。long fun(int g){ swich(g){ case 0:return 0;switch(g)case1:case2:return 1;} return(fun(g-1)+fun(g-2));}(五)素数问题

1、将大于整数m且紧靠m的k个非素数存入所指的数组中。void fun(int m,int k,int xx[]){ int i,j,n;for(i=m+1,n=0;n

2、小于或等于lim的所有素数放在aa数组中,该函数返回所求出的素数个数。int fun(int lim, int aa[MAX]){ int i,j,k=0;for(i=2;i<=lim;i++){ for(j=2;j=i)aa[k++]=i;} return k;}

3、将所有大于1小于整数m的非素数存入xx数组中,个数通过k传回。void fun(int m,int *k,int xx[]){ int i,j,n=0;for(i=4;i

{int i, j,t,n=0;for(i=2;i

(六)删除相同数 int fun(int a[],int n){ int i, j=1;for(i=1;i

{ int i,t,j=0;t=a[0];for(i=1;i

(七)统计字符个数,单词个数。

1、按‘0’到‘9’统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中。

void fun(char *tt, int num[]){ int i, j;int bb[10];char *p=tt;for(i=0;i<10;i++){ num[i]=0;bb[i]=0;} while(*p){ if(*p>=’0’&&*p<=’9’)bb[*p-‘0’]++;p++;} for(i=1,j=0;i<10;i=i+2,j++)num[j]==bb[i];}

2、str全部由小写字母和空格字符组成的字符串,num传入字符串长度。统计单词个数。void fun(char *s, int *num){ int I, n=0;for(i=0;i<*num;i++){ if(s[i]>=’a’&&ss[i]<=’z’&&(s[i+1]= =’’|| s[i+1]==’0’))n++;} *num=n;}

3、从’a’到’z’统计一个字符串中所有字母字符各自出现的次数,结果存在数组alf中。void fun(char *tt, int alf[]){ int i;char *p=tt;for(i=0;i<26;i++)alf[i]=0;while(*p){ if(*p>=’A’&&*p<=’Z’)*p+=32;if(*p>=’a’&&*p<=’z’)alf[*p-‘a’]++;p++;} }

4、str字符序列由字符0和1组成。查找0字符连续出现的最长长度,若有几个0字符长度相同,只记录最后1个0字符串相关信息,通过m和k返回最长0字符长度和其下标。void fun(char *str, int *m, int *k){ int i, j=0;int bb[N];char *p=str;*m=0;*k=0;for(i=0;i

5、统计在tt字符串中”a”到”z”26个字母各自出现的次数,并依次放在pp所指数组中。void fun(char *tt,int pp[]){ int i;for(i=0;i<26;i++)pp[i]=0;for(;*tt!=’’;tt++)if(;*tt>=’a’&&*tt<=’z’)pp[*tt-’a’]++;}

6、统计一个长度为n的字符串在另一个字符串中出现的次数。int fun(char *str, char *substr){ int n;char *p,*r;n=0;while(*str){ p=str;r=substr;while(*r)if(*r==*p){r++;p++;} else break;if(*r==’’)n++;str++;} return n;}

7、求出ss所指字符串中指定字符的个数,并返回此值。int fun(char *ss, char c){ int i=0;for(;*ss!=’’;ss++)if(*ss==c)i++;return i;}

8、统计一个长度为2的字符串在另一个字符串中出现的次数。int fun(char *str, char *substr){ int i,j=0;for(i=0;str[i+1]!=’’;i++)if(str[i]==substr[0]&&str[i+1]==substr[1])j++;return j;}

(八)进制转换

1、把str字符串转换成任意进制的数。int fun(char *str, int x, int y){ int sum;int i=0;char *p=str;for(i=0;i

:原进制;y:要转换成的进制。x while(sum!=0){ xx[i]=sum%y;sum=sum/y;i++;} return i;} 注:

(1)将x转换成10进制:sum=sum*x+*p-‘0’;(2)将10进制转换成y: sum%y 得到y进制数的最低位。sum/y 得到y进制数的次低位。

2、str字符串由‘0’和‘1’组成。转换成十进制数。int fun(char *str){ int n;char *p=str;n=*p-‘0’;p++;while(*p){ n=n*2+*p-‘0’;p++;} return n;}

(九)比较字符串长度

1、比较两个字符串的长度,函数返回较短的字符串。char *fun(char *s, char *t){int i,j;for(i=0;s[i]!=’’;i++);for(j=0;t[j]!=’’;j++);if(i<=j)return s;else return t;}

2、从传入的num个字符中找出最长的一个字符串,通过形参指针max传回该串地址。fun(char(*a)[81], int num,char *max){ int i=0;max=a[0];for(i=0;i

(十)最大公约数,最小公倍数

1、int fun(int a, int b){ int r,t;if(a

2、输入两整数m和n,求最大公约数,最小公倍数。while(b!=0){t=a%b;a=b;b=t;} printf(“%d”,”%d”,a, n*m/a);注:

篇3:2009春江苏省计算机二级C语言上机(编程)

二级C语言考试由笔试和上机两部分。笔试考察的是应试者对基础知识和基本理论的掌握情况,而上机考试主要测试的是应试者的逻辑思维能力和运用C语言的能力,一般包括3种题型:填空题、改错题、编程题。该文对考试题库中编程题作出归纳,总结,希望对应试者有所帮助。

1 上机编程题的知识点

上机考试的知识点大概可以有5个,分别是:基本运算、循环、数组、字符串、结构体。以下对这5个知识点分别举例说明。

1.1 基本运算

例如有以下编程题:

编写函数fun,它的功能是:将两个两位正整数a, b中个位数和十位数合并成一个新的整数放在c中。合并的方式是:将a中的十位和个位依次放在变量c的百位和个位上,b中的十位和个位依次放在变量c的十位和千位上。

例如:当a=45, b=12。调用函数后c=2415。

注意:部分源程序存在文件PROG1.C中,数据文件IN.DAT中的数据不得修改。请勿改动主函数main () 和其他函数中的任何内容,仅在函数fun的花括号中填写编写的如干语句。

程序如下:

分析:这类基础题主要是考察应试者对基本运算的掌握。针对这个题关键是把这两个数的个位和十位求出来,然后再重新组合成一个新数。表示两位数a的个位数的方法是:a对10取余,即a%10;表示两位数a的十位数的方法是:a先除10后在对10取余,即a/10%10。

本题的答案为:c=b%10*1000+a/10*100+b/10*10+a%10;

1.2 循环

循环中最主要的应用就是迭代和遍历。迭代一般是用来解决累加、累乘的问题,可用for语句来实现。

例如有以下编程题:

编写函数fun,它的功能是计算并输出以下多项式的值:

例如:当在主函数中从键盘给n输入5,则输出为:s=-0.28333。

注意:要求n的值大于1但不大于100。部分源程序存在文件PROG1.C中,数据文件IN.DAT中的数据不得修改。请勿改动主函数main () 和其他函数中的任何内容,仅在函数fun的花括号中填写编写的如干语句。

程序如下:

分析:这类题主要是考察应试者对迭代的掌握。关键是找出迭代公式、变量的起始值和最大值。本题中表达式的每一项是都是一个分数,分子都是1,分母初始值是2,最大值是n, 而且每项增1,所以可设一整型变量i, 用for语句实现:for (i=2;i<=n;i++) 。表达式的值用变量s表示,s的初始值为1,每一项之间用减号连接,所以迭代公式,也就是循环语句可表示为s=s-1/i。除此以外,还应注意两点1。变量s的类型,因为表达式的值是实数,所以变量s应定义为double。2.注意基本算术运算中,两整数相除结果为整数,而题目中每一项要得到的结果为实数,所以应用算术运算中数据类型的转换将s=s-1/i改为s=s-1.0/i。

本题的答案为:

1.3 数组

数组可以分为一维数组和二维数组。

1.3.1 一维数组

编写函数fun, 它的功能是:找出一位整型数组中元素的最大值和它所在的下标,最大值和下标通过形参传回。数组元素中的值已在主函数中赋予。

主函数中的x是数组名,n是x中的数据个数,max存放最大值,index存放最大值的下标。

程序如下:

分析:这类题是遍历在数组中的应用。要找出数组中的最大值,必须对数组中每一个元素查找一遍,同时要进行比较。编程思想:可设一变量max, 假设数组中的第一个元素a[0]是最大的,然后后面的元素依次和max进行比较,只要比当前max的值大,就把它放在max中。

本题的答案为:

1.3.2 二维数组

编写程序,实现矩阵的转置。

例如:输入下面的矩阵:

分析:这类题是关键是解决两个问题:1.怎样对二维数组元素的遍历。2.怎样完成矩阵的转置法。因为二维数组元素表示要用到两个下标即行标和列标,所以遍历数组元素用到两层循环。矩阵的转置就是对应行和变成对应列,换句话说就是关于主对角线的对应元素交换。

本题的答案为:

1.4 字符串

例如有以下编程题:

规定函数中只包含字母和*。请编写函数fun, 它的功能是:删除字符串中的所有*。在编写函数时,不得使用字符串函数。

例如:字符串中的内容为:****A*BC*DEF*G*****,删除后,字符串中的内容为:ABCDEFG。

分析:这类题要对字符串中所有字符遍历,把不是*的字符保留下来。本题要解决两个问题:1.怎样判断字符串结束。2.怎样把不是*的字符放在原来的字符串中。字符串都是以’�’作为结束标志,可以把字符串中元素是不是’�’作为判断字符串结束的依据。可设一变量j作为字符串的新下标,初始值为0,只要原字符串中的元素不是’�’, j就加1,特别注意要在最后加上’�’最为字符串结束标志。

本题的答案为:

1.5 结构体

例如有以下编程题:

学生的记录是有学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun, 它的功能是:把分数最低的学生数据放在数组b中,注意:分数最低的学生可能不止一个,函数返回分数最低的学生的人数。

程序如下:

分析:这类问题其实编程思想和前面的没有太大的差别,主要考察的是对结构体成员的引用,其引用形式为:结构体变量名.成员名。

本题的答案为:

2 结论

本文只是对计算机等级考试二级C语言的上机题作了简单的分析和总结,仅过分析可以看出,考察的知识点总共有5个,但是基本上都是循环的两方面的应用:迭代、遍历。

参考文献

[1]未来教育与教学研究中心.全国计算机等级考试二级C语言上机考试题库[M].北京:金版电子出版社, 2007.

篇4:C语言二级上机考试要点总结

2007年9月,教育部考试中心对现有的全国计算机等级考试大纲进行了改革,二级C语言上机考试时间由60分钟增加到了90分钟,编程环境由以前的TC2.0改为VC++6.0。[2]本文根据对近几年来二级C语言上机考试中的程序设计题进行归类总结,提出相应的策略,并对考生应对2007新大纲以后的C语言上机环境给出一些建议。2 对以往考试的分析

历年的全国计算机等级考试中二级C语言上机考试程序设计题目全部出自于由南开大学出版社编写南开100题,每次考试教育部考试中心会对题库做相应的改动,增加一些新的题型或题目,考试中,考生随机抽取一套进行测试。笔者对2005年4月至2007年9月2004版新大纲以后的6次考试中的程序设计题目进行了总结,将这些题目一共分成了6大类,对每种类型的题目进行了分析。2.1 对一维数组和字符串的操作

该类型的题目在以往的机试中所占比例最大,为40%,考生应对该知识点做全面的复习和掌握。一维数组可以分为数值型和字符型,其中数值型数组的数据类型为整型和实型,字符型数组的数据类型为字符型,我们通常会把字符型数组叫做字符串,但是应该注意字符型数组与字符串之间是存在区别的,也就是’’结束标志问题。在复习该部分的时候,考生应该掌握以下两个问题:(1)对一维数组的操作

对一维数组进行操作的时候,不可避免的要访问相关的数组元素,在C语言中访问数组元素一般采取单层循环的方法进行遍历,假设数组长度为n,数组下标是在0到(n-1)之间的,考生应该牢固掌握在一维数组中求最大值、最小值,移动元素,查找特定值,存储数组元素的方法。

(2)对字符串的操作

该类问题是每次考试的重点和难点,特别是将字符串同指针结合起来以后,难度就更大了。考生在解决此类问题是应特别注意字符串的结束标志’’,它不仅仅用来作为字符串的结束标志,而且在对字符串进行操作的时候,它也是循环的结束标志。考生在复习该部分的时候,应该注意这样的几个基本问题:大小字母转换、奇偶数判别、删除或添加指定的字符和字符的移动。此外,考生应该牢固掌握指针的特性及字符串操作函数的使用和实现方法,特别是字符串连接函数与求子串函数,在以往的考试中多次要求考生自己编写,考生应对该知识点做重点掌握。2.2 数值计算

该类型的题目在历年的机试中占22%,考查的机率也非常高。该类题目一般给定一个数列计算公式,然后要求考生编写一个函数类实现求数列的前n项的值、累加和或者积。在解决该类的问题,首先要找到给定数列的变化规律,然后根据其变化规律来编写一个单层或者双层的循环来求其相应的值。在编写程序的过程中,往往还会用到一些数学函数,如:sqrt()、fabs()、pow()等,考生应该牢固掌握math.h中的一些常用数学函数的功能和使用方法。另外,还应该注意数据类型之间的区别,特别是float和int类型,不同的数据类型产生的运算结果也是不一样的。2.3 对结构体的操作

该部分对非计算机专业的学生来说是一个难点,因为结构体在《数据结构》这门课程中应用最为广泛,但考生忽视对该知识点的复习,但在以往的机试中,有17%的题目是属于该类型。考生在复习这部分的时候,首先应注意结构体成员的两种不同的引用方法:结构体变量和指向结构体的指针,也就是结构体成员运算符’.’和指向运算符’->’,在编程的过程中,往往会涉及到结构体数组,其实这类数组除了数据类型是结构体以外,其它的特性和普通数组是一样的,结构体除了定义、赋值和初始化以外,它的其它操作和普通变量也是一样的,包括在结构体数组(记录)中进行查找、删除、求最大最小值等操作,我们应该用对待普通变量的方法来解决结构体的问题,这样的话,难度就可以大幅度的降低。2.4 对二维数组的操作

该类问题在历年的机试中占16%,考生应对二维数组的数组元素的遍历方法、存储方式、矩阵转换等问题做重点掌握。在C语言中,访问二维数组的数组元素一般采用双层循环的方法实现,因为二维数组具有两个下标:行下标与列下标;二维数组可以按行或者按列转化成一维数组进行存储;对二维数组进行行列转换的时候,要将行下标和列下标进行互换。考生还应该掌握上三角矩阵、下三角矩阵的特性,在考试中,该知识点也有所涉及。2.5 数制转换

该部分在以往的机试中占11%,包括两类问题:一是整数合并,二是类型转换。在复习该部分时,考生应该注意C语言中int型、long型、float型和double型数据所占的存储空间的大小和精度,注意’%’(模)运算和’/’(除法)运算的特点,特别应该灵活的使用模运算与除法运算求数据相应位数上的数值。掌握强制类型转换的方法以及按规定的位数保留小数的方法。2.6 素数

该部分在历年的机试中占6%,考生应该牢固掌握素数的基本概念和判断素数的方法。特别需要考生注意的是整数1不是素数,所以在判断素数的时候,应该从2开始,到(n-1)结束,能够除尽的不是素数,不能除尽的是素数。判断素数问题是C语言中的一个基本算法,不仅会在程序设计中会考到,而且往往在程序填空和程序改错中也会有所涉及,因此,考生应对该知识点认真复习。3 程序设计中应注意的问题 3.1 熟悉编程环境

根据2007年9月教育部考试中心颁布的新大纲,二级C语言的编程环境由TC2.0改为VC++6.0,考生应该熟练掌握VC++6.0的使用方法,虽然VC支持鼠标操作,但是考生还是应该掌握几个常用快捷方式来提高编程效率。特别要注意在对程序进行改动以后要保存,要进行编译连接生成可执行(.exe)文件。3.2 养成良好的程序设计风格

二级C语言机试中的程序设计题,一般来说程序都比较简短,源代码一般不超过5行,在题目指定的函数内编写程序。考生在答题的时候尽量采用易于理解而且比较简单的代码来解决问题,注意不要改动函数的参数,语句的界符“{}”也应该具有层次性的缩进,必要时,使用一定的注释来帮助自己理解程序。3.3 谨慎使用指针

指针是C语言的精华,也是机试考查的重点内容,指针的使用非常灵活,在使用的指针的时候一定要注意对其进行初始化,所谓初始化也就是给指针一个初值,没有初值的指针是很危险的,除了一定得不到正确答案外,如果指针越界,容易引起死机。如果死循环带来的死机是“假死”,大部分可以用“Ctrl+Break”来恢复,但指针越界引起的死机却是真死,请考生一定要牢记。[3] 3.4 熟练掌握循环结构

循环结构的程序是程序设计中涉及最多的知识点,根据以上的分析,我们可以看出几乎每一类题目都会涉及到使用循环来解决问题,因此考生应该掌握循环结构的特征和使用方法,以达到能够熟练使用的目标。应该引起注意的是,在编制循环结构程序的时候考生应该尽量使用“for”循环和“while”循环,避免使用“do……while”循环和“goto”语句,因为“for”循环和“while”编写出来的循环程序易于理解,不容易出错。3.5 沉着应战,认真细心

二级C语言上机考试时间有限,虽然从以前的60分钟改为了90分钟,但是相对于其它语种的上机考试来说,二级C语言的上机时间还是非常紧迫的。考生在答题的过程中应该保持一个良好的心态和平静的心情,遇到问题的时候不能慌乱,最好能够在机试时带一张草稿纸和一支笔,在编程之前先画出程序的流程图来明确解题思路。在遇到程序错误时一定要根据错误代码检查相应位置,检查的过程中应该认真仔细,确保能够解决问题。4 结束语

上一篇:宽容,我的企盼下一篇:少年英雄故事