[计算机软件及应用]南开二级C语言上机题库.doc

上传人:sccc 文档编号:4561795 上传时间:2023-04-27 格式:DOC 页数:47 大小:470KB
返回 下载 相关 举报
[计算机软件及应用]南开二级C语言上机题库.doc_第1页
第1页 / 共47页
[计算机软件及应用]南开二级C语言上机题库.doc_第2页
第2页 / 共47页
[计算机软件及应用]南开二级C语言上机题库.doc_第3页
第3页 / 共47页
[计算机软件及应用]南开二级C语言上机题库.doc_第4页
第4页 / 共47页
[计算机软件及应用]南开二级C语言上机题库.doc_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《[计算机软件及应用]南开二级C语言上机题库.doc》由会员分享,可在线阅读,更多相关《[计算机软件及应用]南开二级C语言上机题库.doc(47页珍藏版)》请在三一办公上搜索。

1、1分析: 由题意已知m个人的成绩存放在score数组中,题目要求编写fun函数返回低于平均分的人数,并将低于平均分的分数放在below所指的数组中。 例如,当score数组中的数据为10、20、30、40、50、60、70、80、90时,函数返回的人数应该是4,below中的数据应为10、20、30、40。 为了实现题目要求,fun函数必须首先计算平均分数。计算平均分的方法只要使用循环累加score数组中的所有成绩,然后将累加得到的合计值除以人数m就得到平均分。 得到平均分之后,可以再次使用循环逐个地判断score数组中的每一个成绩是否低于平均分,如果的确低于平均分,则将该分数放入below数

2、组最后位置,同时将记录低于平均分的人数的变量增加一。当循环结束的时候,就能完成题目的要求。 官方答案注解如下: #include #include #include int fun(int score,int m, int below) /* aver变量用于累加score数组中所有的分数,所以初始化为0 */ int i,k=0,aver=0; /* 累加score数组中所有的成绩,aver存放最新的合计值 */ for(i=0;im;i+) aver+=scorei; /* 将成绩合计值除以人数m,得到平均分,将其放入aver中 */ aver/=m; /* 再次使用循环统计score数组

3、中低于平均分的人数 */ /* 并将低于平均分的分数放在below所指的数组中 */ for(i=0;im;i+) /* 判断当前检查的分数是否低于平均分 */ if(scoreiaver) /* 将低于平均分的分数放在below所指的数组中 */ belowk=scorei; /* k变量的值指示分数放入below数组中的下标 */ /* 所以放入一分数后需将k加一,否则下一分数放入将覆盖已有分数 */ k+; /* 返回低于平均分的人数k */ return k; main() int i,n,below9; int score9=10,20,30,40,50,60,70,80,90; /

4、* clrscr函数定义在conio.h,所以存在#include */ /* clrscr函数作用是清除输出窗口中已经存在的所有信息 */ clrscr(); n=fun(score,9,below); printf(people=%dn,n); printf(nBelow the average score are :); for(i=0;in;i+) printf(%d ,belowi); printf(n); 2分析: 题目要求编写fun函数求出1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数并将它们放在a所指的数组中,通过n返回这些数的个数。 要实现以上要求,只要

5、使用循环从1至1000逐个地检查在这个范围之内的所有整数是否能被7或11整除、但不能同时被7和11整除。如果符合能被7或11整除、但不能同时被7和11整除的要求,则将这个符合条件的整数放入a数组中。 另外能被7或11整除、但不能同时被7和11整除的条件可以分为两大条件: (1)能被7或11整除 (2)但不能同时被7和11整除 以上两个条件的关系是并且的关系,在C语言中可以使用&连接这两个条件。 第一个条件能被7或11整除可以使用(i%7=0 | i%11=0)来表示,其中i表示要检查的整数。 第二个条件但不能同时被7和11整除可以使用(i%7!=0 & i%11!=0)来表示。下面给出的答案使

6、用了i%77!=0来表示这个条件,这也是可以的。因为不能整除77的整数当然也不能同时整除7和11。 官方答案注解如下: #include #include void fun(int * a, int * n) int i,j=0; /* 从2至999检查在这个范围之内的整数是否符合条件 */ for(i=2;i1000;i+) /* 判断当前检查的整数i能否被7或11整除、但不能同时被7和11整除 */ if (i%7=0|i%11=0)&i%77!=0) /* 将符合条件的整数i放入a所指数组中,j增一以便放下一个数 */ /* aj+=i;相当于aj=i;j+; */ aj+=i; /*

7、将n指针指向符合条件的整数个数,以便作为参数值返回 */ *n=j; main() int aa1000,n,k; /* clrscr函数定义在conio.h,所以存在#include */ /* clrscr函数作用是清除输出窗口中已经存在的所有信息 */ clrscr(); fun(aa,&n); /* 按照每一行10个数据的格式输出aa数组中的元素 */ for(k=0;kn;k+) if(k+1)%10=0) /* 到达10的倍数则输出换行符,后面的元素都在下一行输出 */ printf(n); /* 不是10的倍数则输出aa数组元素 */ else printf(%5d,aak);

8、printf(n); 3分析: 题目要求编写fun函数求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。 例如,若x中的值为30,则有4个数符合要求,它们是1,3,5,15。 能整除x的各整数的起止范围是多少呢?所谓k能够整除x,就是x%k=0。而x能被k整除,即k%x=0。x是除数,k是被除数。澄清了以上认识,我们就可以认为能整除x的各整数都是不大于x的整数,所以能整除x的各整数的起止范围是0至x。 了解了以上内容,我们可以使用循环从0至x逐个地检查在这个范围的所有整数是否是偶数,并且能整除x。如果符合这两个条件就可以将其放入pp所指的数组

9、中了。 南开100题给出的官方答案才使用for循环逐个检查0至x范围之间所有的整数是否不是偶数,如果满足取模2不等于0则可判断不是偶数。如果不是偶数则将该整数放入t所指的原pp数组。然后再次使用for循环在t所指数组中逐个地检查每一个整数是否能整除x,符合条件的将放入pp所指数组的前面部分,不符合条件的整数将被丢弃。 官方答案注解如下: #include #include void fun(int x, int pp, int *n) int i=1,j=0,k=0,*t=pp; /* 逐个检查0至x范围之内的整数,将非偶数放入t所指数组中 */ for(i=0;i=x;i+) /* i%2!

10、=0表达式成立说明i除以2得到的余数不等于0,所以i不是偶数 */ if(i%2!=0) /* 将非偶数i放入t所指数组中 */ tj=i; /* j加一以便指示下一个非偶数放入t数组的下标位置 */ j+; /* 将放入t所指数组中的j个所有非偶数逐个检查是否能整除x */ for(i=0;ij;i+) /* 检查ti是否能整除x */ if(x%ti=0) /* 符合条件的放入pp所指数组中 */ ppk=ti; /* k加一以便指示下一个放入pp数组的下标位置 */ k+; /* 个数k通过形参n返回 */ *n=k; main() int x, aa1000, n, i; /* clr

11、scr函数定义在conio.h,所以存在#include */ /* clrscr函数作用是清除输出窗口中已经存在的所有信息 */ clrscr(); printf(nPlease enter an integer number:n); /* 使用scanf函数输入x的值 */ scanf(%d,&x); fun(x,aa,&n); /* 输出aa数组中的元素 */ for(i=0;in;i+) printf(%d , aai); printf(n); 4分析: 题目要求编写fun函数统计在tt字符串中a到z26个字母各自出现的次数,并依次放在pp所指数组中。 例如,当输入字符串abcdefg

12、abcdeabc后,程序的输出结果应该是:33322110000000000000000000。 为了实现题目要求,首先定义一个26个元素的一维数组pp,这个数组的每一个元素都用于存放在字符串中26个字母各自出现的次数。例如pp0存放a字母出现的次数, pp1存放b字母出现的次数,pp2存放c字母出现的次数, pp3存放d字母出现的次数,剩下的依次类推。 然后可以使用循环将指向字符串的tt指针从字符串第一个字符不断往后移动,直至指向最后一个字符。在tt指针往后移动的过程中,程序判断tt指针当前指向的字符是26个字母中哪一个字母,并将对应的pp数组中的元素加一。当字符串所有的字符都检查结束之后,

13、就可以将pp数组每一个元素输出,即可实现题目要求。 官方答案注解如下: #include #include void fun(char *tt, int pp) int i; /* 将pp数组的各个元素初始化为0 */ /* pp0存放a字母出现的次数, pp1存放b字母出现的次数 */ /* pp2存放c字母出现的次数, pp3存放d字母出现的次数 */ /* 剩下的依次类推 */ for(i=0;i26;i+) ppi=0; /* while(*tt)是while(*tt!=0)的简写方式 */ /* 该while循环将tt指针从字符串第一个字符移动到最后一个字符 */ /* 在tt指针移

14、动过程中判断tt指向的字符是何字符 */ while (*tt) /* 判断tt当前指向的字符是何字符 */ switch(*tt) /* 如果是a字符,则将pp0加一 */ case a: pp0+;break; /* 如果是b字符,则将pp1加一 */ case b: pp1+;break; /* 如果是c字符,则将pp2加一 */ case c: pp2+;break; /* 如果是d字符,则将pp3加一 */ case d: pp3+;break; /* 如果是e字符,则将pp4加一 */ case e: pp4+;break; /* 如果是f字符,则将pp5加一 */ case f:

15、 pp5+;break; case g: pp6+;break; case h: pp7+;break; case i: pp8+;break; case j: pp9+;break; case k: pp10+;break; case l: pp11+;break; case m: pp12+;break; case n: pp13+;break; case o: pp14+;break; case p: pp15+;break; case q: pp16+;break; case r: pp17+;break; case s: pp18+;break; case t: pp19+;brea

16、k; case u: pp20+;break; case v: pp21+;break; case w: pp22+;break; case x: pp23+;break; case y: pp24+;break; case z: pp25+;break; /* 判断tt当前指向的字符结束之后,将tt往后移动,指向后一个字符 */ tt+; main() char aa1000; int bb26, k, n; /* clrscr函数定义在conio.h,所以存在#include */ /* clrscr函数作用是清除输出窗口中已经存在的所有信息 */ clrscr() ; printf(nP

17、lease enter a char string:); /* 使用scanf函数输入aa字符串 */ scanf(%s,aa); fun(aa,bb); /* 输出存放在bb数组中各个字母出现的个数 */ for(k=0;k26 ; k+) printf(%d,bbk); printf(n); 5分析: 题目要求编写fun函数将大于整数m且紧靠m的k个素数存入xx所指的数组中。 例如,若输入:m=17,k=5,则应输出:19,23,29,31,37。 所谓素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,153*5,所以15不是素数;又如,12=6

18、*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。 为了实现题目要求,我们可以从m+1开始使用循环逐个检查后续的整数是否为素数,同时要设置一个计数器变量,这个变量初始化为0,作用是记录已经找到的素数个数。如果找到一个素数,则将该计数器变量加一,直到等于k。 了解素数的概念之后, 我们可以有以下思路用于判断某一个整数是否为素数 给定一个整数n,我们可以从2开始至n-1逐一检查在这范围之内的整数是否可以被n整除。如果可以,那说明整数n除了能表示为它自己和1的乘积以外,还能表示为其他两个整数的乘积,所以整数n不是素数。如果从2

19、开始至n-1范围之内的所有整数都不可以被n整除,那说明整数n符合素数的定义,所以整数n是一个素数。 那从2开始至n-1逐一检查在这范围之内的整数是否可以被n整除呢?一方面我们可以循环进行,另外判断两个整数是否可以被整除可以使用取模(%)运算。例如10%5等于0,那么10可以整除5。11%5等于6,不等于0,那么11不可以整除5。 官方答案注解如下: #include #include void fun(int m, int k, int xx) int g=0,i,j,flag=1; /* 从m+1开始逐个检查后续的整数是否为素数 */ /* for(i=m+1;im*m;i+)中的循环终止条

20、件im*m可以省略 */ /* 所以for(i=m+1;i+)也是正确的*/ for(i=m+1;im*m;i+) /* 针对当前检查的整数i,检查i是否可以被2至i-1范围内的整数整除 */ for(j=2;j=i表达式成立说明以上for循环没有中途退出,没找到能整除i的数*/ /* 所以j=i表达式成立也说明i是一个素数*/ /* 所以flag=1&j=i从中取一个也对 */ if (flag=1&j=i) /* 只有在k还有名额的情况下才能将找到的素数i放入xx数组 */ if (k=0) /* xxg+=i;相当于xxg=i;g+; */ /* g必须加一,以便存放下一个素数 */ x

21、xg+=i; /* 将一个素数放入xx数组,用掉了一个名额,所以k减一 */ k-; else /* 按照题意只需找出k个素数,所以当k0时任务完成,退出循环 */ break; main() int m,n,zz1000; /* clrscr函数定义在conio.h,所以存在#include */ /* clrscr函数作用是清除输出窗口中已经存在的所有信息 */ clrscr(); printf(nPlease enter two integers:); /* 输入m与n的值,输入时必须按照输入格式在两个整数之间输入一个逗号 */ scanf(%d,%d,&m,&n); fun( m,n,

22、zz); /* 输出存放在zz数组中的大于整数m且紧靠m的k个素数 */ for(m=0; mn; m+) printf(%d , zzm); printf(n); 6分析: 题目要求编写fun函数删除一个字符串中指定下标的字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,n中存放指定的下标。 例如,输入一个字符串World,然后输入3,则调用该函数后的结果为World。 为了实现以上要求,我们可以使用循环将a字符串数组中的字符一个一个地拷贝到b字符串数组中,但是在a字符串数组中碰到下标是n的字符就放弃该字符,不将该字符拷贝到b数组中,从而达到删除该字符的目的。最后要在b数组中最

23、后一个字符的后面设置字符串结束标记0,从而形成新串b。 官方答案注解如下: #include #include # define LEN 20 void fun(char a, char b, int n) int i,j=0; /* 使用for循环将a字符串数组中下标不是n的字符全部拷贝到b数组中 */ for (i=0;iLEN;i+) /* 判断当前下标是不是n */ if(i!=n) /* 将a字符串数组中下标不是n的字符拷贝到b数组中 */ bj=ai; /* j加一以便存放下一个a字符串数组中下标不是n的字符 */ j+; /* b字符串数组最后一个字符的后面设置字符串结束标记0,

24、从而形成新串 */ bj=0; main() char str1LEN,str2LEN; int n; /* clrscr函数定义在conio.h,所以存在#include */ /* clrscr函数作用是清除输出窗口中已经存在的所有信息 */ clrscr() ; printf(Enter the string:n); /* 使用gets函数输入str1字符串 */ gets(str1); printf(Enter the position of the string deleted:); /* 使用scanf函数输入在str1字符串中要删除的字符的下标n */ scanf(%d,&n);

25、 /* 调用fun函数在str1字符串删除下标为n的字符,新字符串放入str2数组*/ fun(str1, str2, n); /* 输出删除之后的新字符串str2 */ printf(The new string is:%sn,str2); 7分析: 题目要求编写一个函数int fun(int*s,int t,int*k),用来求出数组的最大元素在数组中的下标并存放在k所指的存储单元中。 例如, 输入如下整数: 876 675 896 101 301 401 980 431 451 777 则输出结果为:6,980。 为了实现题目要求,可以预先假设s所指数组第一个元素为最大值,将它存入max

26、变量中。然后将max逐个地与s数组中每一个元素比较大小,只要发现有比max更大的数组元素,则将它覆盖max,同时该元素的下标放入k所指存储单元。当max与s数组中每一个元素都比较结束,max必然存放了s数组中最大的元素,相应的,k所指存储单元必然存放了max存放的s数组中最大的元素的下标。 官方答案注解如下: #include #include /* fun函数是在s所指数组中找出最大值的下标放入k所指的存储单元中 */ /* 从main函数可以看出t参数为s所指数组中元素的个数 */ void fun(int *s, int t , int *k) int i ,max; /* 假设数组第一

27、个元素s0为最大值 */ max=s0; /* 将max逐个地与s数组中每一个元素比较大小 */ for (i=0;imax) /* 如果比max更大,则将si覆盖max,同时下标放入k所指存储单元 */ /* 这样就能确保max为在s数组中目前发现的最大值 */ max=si; *k=i; main() int a10=876,675,896,101,301,401,980,431,451,777, k ; /* clrscr函数定义在conio.h,所以存在#include */ /* clrscr函数作用是清除输出窗口中已经存在的所有信息 */ clrscr( ) ; fun(a,10,

28、&k); /* 输出在a数组的最大元素在数组中的下标k以及最大元素ak的值 */ printf(%d, %dn, k, ak); 8分析: 题目要求编写函数fun,函数的功能是:根据以下公式计算s,计算结果作为函数值返回;n通过形参传入。 S = 1 + 1/(1+2) + 1/(1+2+3) + + 1/(1+2+3+n) 例如:若n的值为11时,函数的值为1.833333。 官方答案注解如下: #include #include #include float fun (int n) int i; /* s变量用于存放公式S中已经累加过的前几项的合计值 */ /* s变量初始化为公式S的第一

29、项的值1.0 */ /* t变量用于存放公式S中每一项的分母 */ /* 由于计算分母需要累加,所以t初始化为计算分母的第一项的值1.0 */ float s=1.0,t=1.0; /* 从公式S的第2项开始累加 */ for (i=2;i=n;i+) /* 计算公式S的第i项的分母t,t在前一项的基础上加上新增加的i的值 */ /* 因为公式S中相邻的两项的分母只相差大小为i的值 */ t=t+i; /* 计算公式S的前i项的合计值s */ s=s+1/t; /* 返回公式S的值s */ return s; main() int n; float s; /* clrscr函数定义在conio

30、.h,所以存在#include */ /* clrscr函数作用是清除输出窗口中已经存在的所有信息 */ clrscr(); printf(nPlease enter N:); /* 使用scanf函数输入n的值 */ scanf(%d,&n); s=fun(n); /* 输出计算得到的公式S的值s */ printf(The result is: %fn,s); 9分析: 题目要求编写函数fun,它的功能是:根据以下公式求P的值,结果由函数值带回。m与n为两个正整数且要求mn。 P=m!/(n!(m-n)!) 例如:m=12,n=8时,运行结果为495.000000。 公式中的m!、n!和(

31、m-n)!都是计算它们各自的阶乘,例如m!是计算整数m的阶乘。m!的计算公式是m*(m-1)*(m-2)*3*2*1。 要计算公式P的值,首先需要计算m、n和(m-n)的阶乘。计算某个整数的阶乘可以使用循环分别计算出m!、n!和(m-n)!,然后将计算得到的值代入公式P即可计算公式P的值。 官方答案注解如下: #include #include float fun( int m, int n) /* 为了不让计算结果的小数部分丢失,保持计算的精度,定义p和t为float */ float p,t=1.0; int i; /* 使用循环计算m! */ for (i=1;i=m;i+) t=t*i

32、; p=t; /* 使用循环计算n! */ for (t=1.0,i=1;i=n;i+) t=t*i; /* 计算m!/n!的值 */ p=p/t; /* 使用循环计算(m-n)! */ for(t=1.0,i=1;i=m-n;i+) t=t*i; /* 计算m!/n!/(m-n)!的值,即m!/(n!(m-n)!)的值 */ p=p/t; /* 返回公式P的计算得到的值 */ return p; main() /* clrscr函数定义在conio.h,所以存在#include */ /* clrscr函数作用是清除输出窗口中已经存在的所有信息 */ clrscr(); printf(P=%

33、fn, fun(12,8); 10分析: 编写函数fun,它的功能是:利用以下所示的简单迭代方法求方程cos(x)-x=0的一个实根。 X(n+1)=cos(X(n) 迭代步骤如下: (1)取x(1)初值为0.0; (2)x(0)=x(1),把x(1)的值赋给x(0); (3)x(1)=cos(x(0),求出一个新的x(1); (4)若x(0)-x(1)的绝对值小于0.000001,则执行步骤(5),否则执行步骤(2); (5)所求x(1)就是方程cos(x)-x=0的一个实根,作为函数值返回。 程序将输出结果Root=0.739085。 为了实现以上要求,只能按照迭代步骤一步一步地编写程序。

34、具体过程见官方答案注解。 官方答案注解如下: #include #include #include float fun() /* 第(1)步:取x(1)初值为0.0 */ float x1=0.0,x0; do /* 第(2)步:x(0)=x(1),把x(1)的值赋给x(0) */ x0=x1; /* 第(3)步:x(1)=cos(x(0),求出一个新的x(1) */ x1=cos(x0); /* 第(4)步:若x(0)-x(1)的绝对值小于0.000001,则执行步骤(5) */ /* 否则执行步骤(2),1e-6就是0.000001的另外一种表示方式 */ /* fabs函数定义在math

35、.h中,作用是取得参数的绝对值 */ while (fabs(x0-x1)=1e-6); /* 执行步骤(5): x(1)就是方程cos(x)-x=0的一个实根,作为函数值返回*/ return x1; main() /* clrscr函数定义在conio.h,所以存在#include */ /* clrscr函数作用是清除输出窗口中已经存在的所有信息 */ clrscr(); printf(Root=%fn,fun(); 11分析: 题目中的程序定义了N*N的二维数组,并在主函数中自动赋值。要求编写函数fun(int aN),该函数的功能是:使数组左下半三角元素的值会全部置成0。 此题关键的

36、地方就是如何表示数组左下半三角元素。我们可以使用双重循环逐个遍历二维数组中的元素,只是我们对遍历的范围作了限定,只遍历数组左下半三角元素。在遍历的同时将数组左下半三角元素全部设置为0。 官方答案注解如下: #include #include #include #define N 5 void fun(int aN) int i,j; /* 从第一行到最后一行 */ for(i=0;iN;i+) /* 从第一列到下标为i的列,以访问左下半三角元素 */ for(j=0;j=i;j+) /* 将访问的左下半三角元素设置为0 */ aij=0; main() int aNN,i,j; /* clrscr函数定义在conio.h,所以存在#

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号