中国海洋大学上机考试题2016春季学期 答案2333

更新时间:2023-05-13 15:46:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《C程序设计》课程期末上机考试

考试时间:50分钟

考试方式:从下面的20题中随机抽取一题,再附加一题,共需完成2道题。附加题不事先给定

分值分配:第一题60分,第二题40分,共100分

考试时间:第十七周,2016年6月28-30号某天

1. 编写函数long fun(long x),它的功能是:将长整型参数x中每一位上为偶数的数依次取出,构成

一个新数返回。高位仍在高位,低位仍在低位。例如:下面程序运行时输入:124578902,程序输出:24802.

#include<stdio.h>

long fun(long x)

{int i=0,m,a[20];

long b=0;

do

{ m=x%10;

if(m%2==0)

{a[i]=m;

i=i+1;}

}

while((x/=10)!=0);

for(i=i-1;i>=0;i--)

{ b=b*10+a[i];}

return b;

}

int main()

{ long a,b;

printf("Enter a number:");

scanf("%ld",&a);

b=fun(a);

printf("b=%ld\n",b);

return 0;

}

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 i,j=0;

for(i=2;i<=k;i++)

{

while(k!=i)

{

if(k%i==0)

{

p[j]=i;

j=j+1;

k=k/i;

1

}

else break;

}

}

p[j]=k;

p[j+1]=-1; }

int main()

{ int x,a[17]={0},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");

return 0;

}

3. 编写函数void fun(int *x,int n),功能是:求出长度为n的数组x中的最大数与次最大数,并

把最大数和a[0]对调,次最大数与a[1]对调,其余的数保持不变。下面程序运行时若输入:2 4 6

1 3 9 7 0 5 8,则输出:9 8 6 1 3

2 7 0 5 4。

#include<stdio.h>

#define N 10

void fun(int *x,int n)

{int i,j,k,t;

for(i=0;i<=1;i++)

{ j=k=i;

for(;j<n;j++)

{ if(*(x+k)<*(x+j)) k=j; }

t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;

}

}

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)

2

{

return (n/5); 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;

}

}

}

int 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");

return 0;

}

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,n=0,m=0;

while(y-m>=0)

{

n++;

m=m+pow(x,n);

3

}

return n-1;

}

int main()

{int x;long y;

scanf("%d%ld",&x,&y);

printf("n=%d\n",fun(x,y));

return 0;

}

6. 编写函数int fun(char (*ss)[N],int m,char *s),功能是:形参ss指向一个m行N列的二维字

符数组,每行存放一个字符串。求出最长的字符串,复制到s所指的字符数组中,然后返回此最长字符串的长度。

#define N 30

#include<stdio.h>

#include<string.h>

int 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;

}

int 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,str=%s\n",len,b);

return 0;

}

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')

4

{

if(c==' ')

{

word=0;

}

else if(word==0)

{

word=1;

num++;

}

i++;

}

return num;

}

int main()

{char s[200];

gets(s);

printf("There are %d words.\n",countw(s));

return 0;

}

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)

{char c,b;

int i=0,j,m,n;

while((c=str[i])!='\0')

{

while(c=='0')

{

if(str[i+1]=='0')

{

j=i;

while((b=str[j])!='\0')

{

str[j]=str[j+1];

j++;

}

}

}

i++;

}

puts(str);

5

}

int main()

{char s[100];

puts("Enter a string:");

gets(s);

fun(s);

puts(s);

return 0;

}

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<math.h>

void fun(int x,int k,int *p)

{int m,i,j,n=0;

for(m=x;n<=k;m++)

{ j=sqrt(m);

for(i=2;i<=j;i++) {if(m%i==0) break;}

if(i>=j+1) {*p++=m;n++;}

}

}

int main()

{int a,b,n[1000],i;

scanf("%d%d",&a,&b);

fun(a,b,n);

for(i=0;i<b;i++)

printf("%d ",n[i]);

puts("");

return 0;

}

10. 编写函数int fun(int a,int b),在[a,b]范围内统计满足下面条件的数的个数。条件:该数是素

数,且该数逆序后形成的数也是素数。例如,在[100,150]范围内101 107 113 131 149 满足条件,则下面程序运行时输入100 150,输出:num=5。

#include<math.h>

#include<stdio.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;;)

6

{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所指字符串中每两个字母之间加一个*,其余字符保持

不变。

例如,下面程序运行时,若输入:I had 123_book. 输出:I h*a*d 123_b*o*o*k.

#include<stdio.h>

void fun(char *s)

{int i,j,k,n=0;

char a,b;

for(i=0;*(s+i)!='\0';i++);

n=i;

for(i=0;*(s+i)!='\0';i++)

{ a=*(s+i);b=*(s+i+1);

if(((a<='z')&&(a>='a')||(a<='Z')&&(a>='A'))&&((b<='z')&&(b>='a')||(b>='A')&&(b<='Z'))) { for(j=0;j<=n-i;j++)

{ k=n;

*(s+k-j+1)=*(s+k-j); }

*(s+i+1)='*';

n++;

}

}

}

int main()

{char x[80];

7

gets(x);

fun(x);

puts(x);

return 0;

}

#include<stdio.h>

void fun(char *a,char *b)

{

int i,j;

for(i=0,j=0;a[i];)

{

b[j++] = a[i++];

if(!(i%3))

b[j++] = '#';

}

b[j] = '\0';

}

void main()

{

char x[80],y[120];

gets(x);

fun(x,y);

puts(y);

}

12. 编写函数int fun(int k),功能:从5个红球, 6个白球,7个黑球中任意取出k(2≤k≤18)个

球作为一组进行组合。在每组中,可以没有红球和白球,但必须要有黑球。不同组合的数目作为函数值返回。例如,若k为8时,正确的组合数是31;若k为2时,正确的组合数是3;或k为3时,正确的组合数是6 。

#include<stdio.h>

int fun(int k)

{int i,j,l,n=0;

for(i=1;i<=7;i++)

{ for(j=0;j<=6;j++)

{ for(l=0;l<=5;l++)

if(k==i+j+l) n++;

}

}

return(n);

}

int main()

{int x,n;

scanf("%d",&x);

n=fun(x);

printf("n=%d\n",n);

return 0;

8

}

13.编写函数void fun(char *str),功能:对形参str所指字符串中的字符按ASCII码升序排序。例

如,下面程序运行时输入:The C Programming Language<回车>

输出: CLPTaaaeegggghimmnnorru

#include<stdio.h>

#include<string.h>

void fun(char *str)

{ char m;

int i,j,p,q,x;

x=strlen(str);

for(i=1;i<x;i=i+2)

{ for(j=1;j<x-i;j=j+2)

{if(str[j]>str[j+2])

{ m=str[j];

str[j]=str[j+2];

str[j+2]=m;}

}

}

}

int main()

{char s[100];

gets(s);

fun(s);

puts(s);

return 0;

}

14. 请编写函数void fun(int *a, int n, int y),它的功能是:把y值插入到有n个数的a数组中,

a数组中的数已按由大到小的次序排好,y的值从键盘读入。插入后,数组中的数仍然有序。对照下面三种情况运行程序:

1) 插在最前2) 插在最后 3) 插在中间

若输入数11,输出 20 18 16 14 12 11 10 8 6 4 2

输入数1,输出 20 18 16 14 12 10 8 6 4 2 1

输入数33,输出 33 20 18 16 14 12 10 8 6 4 2

#include <stdio.h>

void fun(int *a,int n,int y)

{int i,j;

for(i=0;i<10;i++)

{

if(y>=a[i])

{

for(j=9;j>=i;j--)

{

a[j+1]=a[j];

}

a[i]=y;

break;

}

9

a[10]=y;

}

}

int main()

{int i,a[11]={20,18,16,14,12,10,8,6,4,2},x;

void fun(int *,int n,int y);

scanf("%d",&x);

fun(a,10,x);

for(i=0;i<11;i++)

printf("%d ",*(a+i));

return 0;

}

15. 编写函数int fun(char *s1,char *s2),在字符串s1中统计字符串s2出现的次数并返回。若s2

在s1中未出现,则返回0。例如:

若输入的字符串s1为:abaaAabcaabbabca,字符串s2为:ab ,则程序输出:n=4

若输入的字符串s1为:abaaAabcaabbabca,字符串s2为:abd,则程序输出:No find

#include<string.h>

#include<stdio.h>

int fun(char *s1,char *s2)

{

}

int main()

{ char a[80],b[80];

int n;

printf("Please input the first string:");

gets(a);

printf("Please input the second string:");

gets(b);

n=fun(a,b);

if(n==0)

printf("No find\n");

else printf("n=%d\n",n);

return 0;

}

#include<string.h>

#include<stdio.h>

int fun(char *str,char ch)

{

int i,j,m=0,p=0;

p=strlen(str);

m=strlen(str);

for(i=0;i<m;i++)

{

10

while(str[i]==ch)

{

for(j=i;j<m;j++)

{

str[j]=str[j+1];

str[j+1]='\0';

}

m=strlen(str);

}

}

if(m==p)

{

m=-1;

}

return m;

}

void main()

{

char a[80]={0},b;

int n;

printf("Please input a string:");

gets(a);

printf("Please input a delete character:");

b=getchar();

n=fun(a,b);

if(n==-1)

printf("No find %c\n",b);

else printf("%s,n=%d\n",a,n);

}

16. 编写函数int fun(char *str),功能是:统计字符串str中不同字符的个数并做为函数值返回。

例如,下面程序运行时若输入:One world,One dream! 输出:n=13

#include<stdio.h>

int fun(char *str)

{ int i,j,m=1,p,x,q;

p=strlen(str);

for(i=0;i<p;i++)

{ for(j=0;j<i;j++)

{ x=str[i];

q=str[j];

if(x==q)

{break;}

if(j+1>=i)

{ m++;}

11

}

}

return m;

}

int main()

{char s[80];

int n;

gets(s);

n=fun(s);

printf("n=%d\n",n);

return 0;

}

17. 编写函数int fun(int m,int n,int *p),要求将范围[m,n]之间所有的fibonacci数写入p所指

的一维数组中,fibonacci数的个数通过函数返回值带回。例如,[0,30]之间的fibonacci数有7个,它们是:1 2 3 5 8 13 21 ;[1000,32767]之间有7个,它们是:1597 2584 6765 10946 17711 28657 。

#include<stdio.h>

int fun(int m,int n,int *p)

{int i=0,num=0;

int f1=1,f2=1;

while(f1<=n)

{

if((f1>=m && f1<=n) )

{

p[i++] = f1;

num++;

}

if((f2>=m && f2<=n) && f2 != p[i-1] )

{

p[i++] = f2;

num++;

}

f1=f1+f2;

f2=f2+f1;

}

return num;

}

int main()

{int a,b,n,c[22],i;

scanf("%d%d",&a,&b);

n=fun(a,b,c);

for(i=0;i<n;i++)

printf("%6d",c[i]);

printf("\nn=%d\n",n);

return 0;

}

18.编写函数char *fun(char *s1,char *s2,int n),将字符串s1中后面的n个字符复制到s2所指

12

数组中,若s1不足n个字符,则用*在前端补齐至n个字符,写入s2中。函数返回字符串s2的指针。例如,下面程序运行时,

若输入:“abcd1234”和6,则输出“cd1234”

若输入:“abcd1234”和10,则输出“**abcd1234”

#include<stdio.h>

#include<string.h>

char *fun(char *s1,char *s2,int n)

{int i,m=0,p=0,x=0;

m=strlen(s1);

if(m<n)

{ for(p=m-1,x=n-1;p>=0,x>=n-m;p--,x--)

{ s2[x]=s1[p];}

for(i=0;i<n-m;i++)

{ s2[i]='*';}

}

if(m>n)

{for(p=m-1,x=n-1;p>=m-n,x>=0;p--,x--)

{ s2[x]=s1[p];}

}

if(m==n)

{ strcpy(s2,s1);}

}

int main()

{char c1[80],c2[80];

gets(c1);

fun(c1,c2,6);

puts(c2);

puts(fun(c1,c2,30));

return 0;

}

19. 编写函数void fun(char *a,char *b,char *c),逐个比较a、b两个字符串对应位置中的字符,

把ASCII值大或相等的字符依次存放到c数组中,形成一个新的字符串。例如,若a中的字符串为aBCDeFgH,b中的字符串为:ABcd,则c中的字符串应为:aBcdeFgH。

#include<stdio.h>

char *fun(char *s,char *b,char *c)

{int i,j;

for(i=0,j=0;i<strlen(a)&&j<strlen(b);i++,j++) {

if(a[i]>b[i]) c[i]=a[i]; else

c[i]=b[i]; }

if(i==strlen(a)) {

for(;j<strlen(b);j++) c[j]=b[j]; c[j]='\0'; } else {

13

for(;i<strlen(a);i++) c[i]=a[i]; c[i]='\0'; }

}

void main() {char s[80]; gets(s);

puts(fun(s)); }

}

int main()

{char s1[80],s2[80],s3[80];

gets(s1);

gets(s2);

fun(s1,s2,s3);

puts(s3);

return 0;

}

20. 编写函数void fun(char *s),将s所指字符串中的所有数字字符移到所有非数字字符之后,并保

持数字字符和非数字字符原有的前后次序。

例如,若输入:num is 0532-66ouc78,OK. 执行结果为:num is -ouc,OK.05326678

#include<stdio.h>

#include<string.h>

void fun(char *s)

{

char p;

int i,j,m;

m=strlen(s);

if(m%2==0)

{

p=s[m-1];

for(i=m-1;i>1;i=i-2)

{

s[i]=s[i-2];

}

s[1]=p;

}

if(m%2!=0)

{

p=s[m-2];

for(i=m-2;i>1;i=i-2)

{

s[i]=s[i-2];

}

s[1]=p;

} }

int main()

{char a[80];

14

gets(a);

fun(a);

puts(a);

return 0;

}

15

本文来源:https://www.bwwdw.com/article/adge.html

Top