上机考试题2014春季学期答案
- 格式:doc
- 大小:77.00 KB
- 文档页数:12
aa《C程序设计》课程期末上机考试考试时间:50分钟考试方式:从下面的20题中随机抽取一题,再附加一题,共需完成2道题。
附加题不事先给定分值分配:第一题60分,第二题40分,共100分考试时间:第十七周周二与周三,2014年6月24、25号1. 编写函数long fun(long x),它的功能是:将长整型参数x中每一位上为偶数的数依次取出,构成一个新数返回。
高位仍在高位,低位仍在低位。
例如:下面程序运行时输入:124578902,程序输出:24802.#include<stdio.h>long fun(long x){int n=10,m=0;while (x){int t=x%10;if(t%2==0){m+=t*n/10;n*=10;}x/=10;}return m;}void main(){long a,b;printf("Enter a number:");scanf("%ld",&a);b=fun(a);printf("b=%ld\n",b);}2. 编写函数void fun(int k,int *p),功能是:将参数k(2≤k≤32767)所有的不相同质因子升序写入p所指的一维数组中,以-1作为所有质因子的结束标志。
例如:下面程序运行时若输入200,输出:2 5;若输入27720,输出:2 3 5 7 11;若输入101,输出101。
#include<stdio.h>void fun(int k,int *p){ int j=2,n=0;do{ if (k%j==0){ p[n]=j;n++; }while(k%j==0){ k=k/j; }j++; }while (j<=k);p[n]=-1; }int main(){ int x,a[17],i;do{ printf("Enter a number(2-32767):");scanf ("%d",&x); }while(x<2);fun(x,a);for(i=0;a[i]!=-1;i++)printf("%d ",a[i]);printf("\n"); }3. 编写函数void fun(int *x,int n),功能是:求出长度为n的数组x中的最大数与次最大数,并把最大数和a[0]对调,次最大数与a[1]对调,其余的数保持不变。
下面程序运行时若输入:2 4 61 3 9 7 0 5 8,则输出:9 8 6 1 32 7 0 5 4。
#define N 10void fun(int *x,int n){int i,j,k,temp;for(i=0;i<2;i++){k=i;for(j=i+1;j<n ; j ++)if(*(x+k)<*(x+j))k=j;if(k!=i){temp=*(x+k);*(x+k)=*(x+i);*(x+i)=temp;}}}int main(){int a[N],i;for(i=0;i<N;i++)scanf("%d",a+i);fun(a,N);for(i=0;i<N;i++)printf("%d ",a[i]);printf("\n");return 0;}4. 数组x中保存有n个整数,编写函数int fun(int *x,int n,float *w),对数组x进行如下操作:从第0个元素起对每5个元素求一个平均埴,并将这些均值依次存放在w所指的数组中。
函数返回平均值的个数。
例如:若输入n为14,14个数据为:11 21 35 24 55 16 27 58 18 0 11 12 13 14,则只为前10个求均值,输出结果为:29.20 23.80#include<stdio.h>int fun(int *x,int n,float *w){ int i,j,s;for(i=0;i<(n/5);i++){s=0;for(j=i*5;j<(i*5+5);j++)s=s+*(x+j);*(w+i)=s/5.0;}return (n/5);}void main(){int a[30],i,n,m;float b[6];printf("Input a number: ");scanf("%d ",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);m=fun(a,n,b);for(i=0;i<m;i++)printf("%0.2f ",b[i]);printf("\n");}5. 编写函数int fun(int x,long int y),功能:计算满足表达式x0+x1+x2+...+x n<y的最大的n并作为函数返回值带回。
例如,当x=2,y=1000时,程序输出8。
#include<stdio.h>#include<math.h>int fun(int x,long int y){int i;long s=0;for(i=0;;i++){if(s<y) s=s+pow(x,i);else break;}return(i-2);}void main(){int x;long y;scanf("%d%ld",&x,&y);printf("n=%d\n",fun(x,y));}6. 编写函数int fun(char (*ss)[N],int m,char *s),功能是:形参ss指向一个m行N列的二维字符数组,每行存放一个字符串。
求出最长的字符串,复制到s所指的字符数组中,然后返回此最长字符串的长度。
#include<stdio.h>#include<string.h>#define N 30int fun(char (*ss)[N],int m,char *s){int i,j,k;s=ss[0];for(i=0;i<m;i++){if(strlen(s)<strlen(ss[i])){s=ss[i];}}j=strlen(s);printf("str=%s ",s);return j;}void main(){char a[8][N],b[N];int i,len;for(i=0;i<8;i++)gets(a[i]);len=fun(a,8,b);printf("len=%d",len);}7. 编写函数int countw(char *str),统计字符串str中单词的个数。
单词之间以空格,逗号,句号作分隔,数字也看做单词。
单词之间可能不止一个分隔符。
如输入:It's 10:10 o'clock ,I am late.屏幕上输出"There are 6 words."#include<stdio.h>int countw(char *str){char c;int i=0,num=0,word=0;while((c=str[i])!='\0'){if(c==' '){word=0;}else if(word==0){word=1;num++;}i++;}return num;}void main(){char s[200];gets(s);printf("There are %d words.\n",countw(s));}8. 编写函数void fun(char *str),功能:字符串str中单词以空格作分隔,如果单词之间不止一个空格,则删除多余的空格,使单词之间只保留一个空格。
字符串开始的空格也只保留一个。
例如,程序运行时若输入: It's 10:10 o'clock , I am late.输出: It's 10:10 o'clock , I am late.#include<stdio.h>void fun(char *str){ int i,t;for(i=0;str[i]!='\0';i++)if(str[i]==' '&&str[i+1]==' '){for(t=i+1;str[t]!='\0';t++)str[t]=str[t+1];str[t+1]='\0';i--; }}void main(){char s[100];puts("Enter a string:");gets(s);fun(s);puts(s);}9. 函数void fun(int x,int k,int *p)的功能是:求出比x大的最初k(k<1000)个素数,放入p所指数组中。
例如:程序运行时输入:10 10,输出:11 13 17 19 23 29 31 37 41 43#include<stdio.h>#include<math.h>void fun(int x,int k,int *p){int i,m=0,n;x=x+1;n=sqrt(x);while(m<k){for(i=2;i<=n;i++){if(x%i==0)break;if(i>=n){p[m]=x;m++;}}x++;n=sqrt(x);}}void main(){int a,b,n[1000]={0},i;scanf("%d%d",&a,&b);fun(a,b,n);for(i=0;i<b;i++)printf("%d ",n[i]);puts(" ");}10. 编写函数int fun(int a,int b),在[a,b]范围内统计满足下面条件的数的个数。
条件:该数是素数,且该数逆序后形成的数也是素数。
例如,在[100,150]范围内101 107 113 131 149 满足条件,则下面程序运行时输入100 150,输出:num=5。
#include<stdio.h>#include<math.h>int fun(int a,int b){ int c[100]={0},i,t,j=0,l,m,d=0,x,s;long int k;for(m=a;m<=b;m++){ k=sqrt(m);for(i=2;i<=k;i++){ if(m%i==0) break;}if(i>=k+1) {c[j++]=m;}}putchar('\n');for(i=0;i<j;i++){ m=c[i];for(k=0;;){m=m/10;if(m==0) break;k++;}t=k;l=k;for(s=0,k=0;k<=t;k++){ x=c[i]%10; c[i]=c[i]/10;s=s+x*pow(10,l--);}c[i]=s;}for(i=0;c[i]!=0;i++){ k=sqrt(c[i]);for(j=2;j<=k;j++){if(c[i]%j==0) break;}if(j>=k+1) d++;}return(d);} int main(){int num,a,b;scanf("%d%d",&a,&b);num=fun(a,b);printf("num=%d\n",num);return 0;}11. 编写函数void fun(char *s),功能:在s所指字符串中每两个字母之间加一个*,其余字符保持不变。