《C程序设计》课程期末上机考试试题及答案(亲测都能运行)

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

考试时间:40分钟
考试方式:从下面的20题中随机抽取一题,再附加一题,共需完成2道题。
分值分配:第一题60分,第二题40分,共100分
考试时间:第十八周

1. 请编写函数long fun(long int x),功能是:将长整型数x中每一位上为奇数的数依次取出,并逆序构成一个新数返回。例如:程序运行时输入123456789,输出:b=97531。

#include<stdio.h>
long fun(long int x)
{
long b = 0;
while(x>0)
{
if( (x%10)%2 )
b = b*10 + x%10;
x/=10;
}
return b;
}
int main()
{
long a,b;
while(1)
{
printf("Please input a long int num:");
scanf("%ld",&a);
b=fun(a);
printf("b=%ld\n",b);
}
}

2. 编写函数void fun(char *s,char *t,char *p)将未在字符串s中出现、而在字符串t中出现的字符, 形成一个新的字符串放在p中,p中字符按原字符串中字符顺序排列,但去掉重复字符。
例如: 当s为"12345", t为"8624677"时, p中的字符为: “867”;
当s为”good luck”,t为”thank you very much”时,输出:”thanyverm”
#include<stdio.h>
#include<math.h>
void fun(char *s,char *t,char *p)
{
int flag[256] = {0};
int i,j;
for(i = 0; s[i]; i ++)
flag[s[i]] = 1;
for(i = j = 0; t[i]; i ++)
if(flag[t[i]] == 0)
{
p[j++]=t[i];
flag[t[i]] = 2;
}
p[j] = 0;
}
int main()
{
char s1[50],s2[50],s3[50];
gets(s1);gets(s2);
fun(s1,s2,s3);
puts(s3);
}
3. 编写函数int fun(int m),计算并返回满足表达式:1+(1+2)+(1+2+3)+(1+2+3+4)+……+(1+2+3+……+n)<=m最大的n。例如,当m=10000时,程序输出:n=38。

#include<stdio.h>
int fun(int m)
{
int a, i, s;
for (a = 1, s = 0; s <= m; a++)
{
for (i = 1;i <= a; i++)
s += i;
}

return a - 2;
}
int main()
{
int x=0;
scanf("%d", &x);
printf("n=%d\n", fun(x));
}

4. 编写函数void fun(int *x,int n),它的功能是:求出数组x中的最小数和次最小数,并把最小数和a[0]中的数对调、次最小数和a[1]中的数对调,其余的数保持不变。如程序运行时若输入:2 4 6 11 3 9 7 0 5 8,则输出:0 2 6 11 3 9 7 4 5 8。

#include<stdio.h>
#define N 10
void fun(int *x,int n)
{
int i,j,k,temp;
for(i = 0 ; i < 2 ; i ++) //利用选择排序进行两du次比较就行了,因为我们只需zhi改变前边两个数a[0],a[1]的值dao
{
k = i;
for(j = i + 1 ; j < n ; j ++)
if(*(x + k) < *(x + j)) //这句代码等同于 if(a[k] < a[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;
}

5. 编写函数long fun(int high,int n),功能是:计算并返回high以内(不包含high)最大的n个素数之和。若不足n个,则到最小素数2为止。例如:若high=100,n=10,则函数的返回值为:732;若high=11,n=10,则函数返回:17。

#include <stdio.h>
#include <string.h>
long fun(int high,int n)
{
    int i,j,count=0,sum=0;
    int q=sqrt(high);
    for (i=high-1;i>=2;i--)
    {
        for (j=q;j>1;j--)
        {
            if (i%j==0 && i>j)//注意,&&后面的条件,负责会把素因子漏掉
             break;
        }
        if (j<=1)
        {
            sum+=i;
            count++;
        }
        
        if (count==n)
         break;

    }

    return sum;

}

int main()
{
    int high,n;
    scanf("%d %d",&high,&n);
    printf("%d\n",fun(high,n));
}

6. 请编写函数int fun(int *a,int n),它的功能是:把形参a所指数组中的偶数按原顺序依次存放到a[0]、a[1]、a[2]、……中,把奇数从数组中删除,偶数个数通过函数值返回,以-1作为有效数据的结束标志。例:若输入:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15,输出:2 4 6 8 10 12 14 n=7

#include<stdio.h>
#define N 9
int fun (int a[], int n)
{ 
    int i, j;
    j=0;
    for (i=0; i<n; i++)
    /**********found**********/
    if (a[i]%2== 1)
    {
        /**********found**********/
        a[j]=a[i];   
        j++;
    }
    /**********found**********/
    return j;
}
main( )
{ 
    int b[N]={9,1,4,2,3,6,5,8,7}, i, n;
    printf("\nThe original data:\n");
    for(i=0; i<N; i++)
        printf("% 4d", b[i]);
    printf("\n");
    n=fun(b, N);
    printf("\nThe number of odd:% d\n", n);
    printf("\nThe odd number: \n");
    for(i=0; i<n; i++)
        printf("%4d",b[i]);
    printf("\n");
}

7.给定程序中,函数fun的功能是:有N×N矩阵,以主对角线为对称线,对称元素相加并将结果存放在左下三角元素中,右上三角元素置为0。例如,若N=5,有下列矩阵:
1 2 3 4 5 计算结果为:1 0 0 0 0
2 3 4 5 6 4 3 0 0 0
3 4 5 6 7 6 8 5 0 0
4 5 6 7 8 8 10 12 7 0
5 6 7 8 9 10 12 14 16 9

#include <stdio.h>

#define N 4

void fun(int   t[N][N]   )

{  int i, j;

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

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

      {
		 t[i][j] =t[i][j]+t[j][i];
			t[j][i] =0;
      }

   }

}

main()

{  int t[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42, 21,33,10}, i, j;

   printf("\nThe original array:\n");

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

   {for(j=0; j<N; j++) printf("%2d ",t[i][j]);

      printf("\n");

   }

   fun(t);

   printf("\nThe result is:\n");

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

   {for(j=0; j<N; j++) printf("%2d ",t[i][j]);

      printf("\n");

   }
   }
  1. 函数void fun(int x,char * p)实现十进制整数x到二进制的转换。转换后的二进制数以字符串的方式放置于p所指向的数组中。如输入13,输出1101,输入-13,输出-1101。
#include<stdio.h>

void fun(int x,char *p)

{

    int i=0,j,t=x;

    char q[18]={0};

    for(i=0;t!=0;i++)

    {

        if(t%2==1)

            q[i]='1';

        else

            q[i]='0';

        t=t/2;

    }

//输出到p

    for(j=0;i>0;j++)

    {

        i--;

        p[j]=q[i]; //

    }

    p[j]='\0';

}

 main()

{

    int a;

    char c[18]={0};

    scanf("%d",&a);

    fun(a,c);

    printf("%d'S BINARY IS: %s\n",a,c);


}
  1. 编写函数int fun(char (*ss)[N],int m,char *s),功能是:形参ss指向一个m行N列的二维字符数组,每行存放一个字符串。求出最大的字符串,复制到s所指的字符数组中,然后返回此最大字符串的长度。
#include <stdio.h>
#include <string.h>
#define N 50
int fun(char (*ss)[N],int m,char *s)
{
    int i;
    //char p[N];
    strcpy(s,*ss);
    for (i=1;i<m;i++)
    {
        if (strcmp(s,*(ss+i))<0)
        {
            strcpy(s,*(ss+i));
        }
    }
    int len=strlen(s);
    return len;
}
  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);
	}

10. 给定程序中,函数void fun(char s)的功能是:在形参s所指字符串中的每个数字字符之后插入一个号。例如,形参s所指的字符串为:def35adh3kjsdf7。执行结果为:def35adh3kjsdf7

#include<stdio.h>
void fun(char *s)
{ int i,j,n;
for(i=0;s[i]!='\0';i++)//当i已经指向字符串末尾'\0'时退出FOR循环
if(s[i]>='0'&&s[i]<=9){
n=0;
while(s[i+1+n]!='\0') n++;//统计i之后的字符串长度并放入N
for(j=i+n+1;j>i;j--)//根据长度N来进行i后的字符串的移位(都向右移一位)
s[j+1]= s[j];
s[j+1]='*'; i=i+1; //移位完毕后将I后面的字符设为'*',然后将I加一继续上述过程
}
}

main()
{

char str[80]={0};
gets(str);
fun(str);
puts(str);  
}

11.给定程序中,函数void fun(char *s)的功能是:把形参s所指字符串中下标为偶数的字符右移到下一个偶数位置,最右边被移出字符串的字符绕回放到第一个偶数位置,下标为奇数的字符不动(注:字符串的长度大于等于2)。例:若输入:abcd123,输出:3badc21

#include<stdio.h>
void fun(char *s)
{
    int i;
    char c;
    for (i=1;s[i]!='\0';i++)
    {
        if (i%2==0)
        {
            c=s[0];
            s[0]=s[i];
            s[i]=c;
        }
    }

}
 main()
{char str[80];
 gets(str);
 fun(str);
 puts(str);
}

12.编写函数void fun(char *s1,char *s2),功能是:对形参s1所指字符串升序排序,并将排序后下标为偶数的字符取出,写入形参s2所指字符数组中,形成一个新串。例如,下面程序若输入:The C Programming Language,输出:□□LTaegghmnor。(□表空格)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void fun(char *s1,char *s2)

{

int i,j,l,t;


l=strlen(s1);

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

{

for(j=0;j<l-i-1;j++)
{
	if(s1[j]>s1[j+1]){
		t=s1[j];s1[j]=s1[j+1];s1[j+1]=t;
	}
}
}
for(i=0;s1[i]!='\0';i++){
	if(i%2==0){
		*s2=*(s1+i);
		s2++;
	}
}
*s2='\0';
}

main()
{

char a[80],b[80];

gets(a);

fun(a,b);

puts(b);

}

13.函数void fun(char s[])的功能是:将s所指字符串中ASCII值为奇数的字符删除。例如,若s所指字符串中的内容为:“ABCDEFG12345”,其中字符A的ASCII码值为奇数、…、字符1的ASCII码值也为奇数、…都应当删除,其它依此类推。最后s中内容是:“BDF24”。

#include<stdio.h>
void fun(char s[])
{ int i,j;

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

if(s[i]%2!=0)

{for(j=i;s[j]!='\0';j++)

s[j]=s[j+1];

i--;

}
}
int main()

{char a[80];

gets(a);

fun(a);

puts(a);

}

14.请编写一个函数int fun(long int x),它的功能是:判断整数x是否是同构数。若是同构数,函数返回1;否则返回0。所谓“同构数”是指这样的数,它出现在它的平方数的右边。例如:输入整数5,5的平方数是25,5是25中右侧的数,所以5是同构数,输出"Yes"。要求x的值不大于10000。

#include<stdio.h>
int fun(long int x)

{long m,a;

for(a=10; ;a*=10)

{m=x*x%a;

if(x==m) return(1);

if(x*x/a==0) return(0);

}

}

main()

{int x;

scanf("%d",&x);

if(fun(x)==1)

puts("Yse");

else puts("No");

}

15.编写取子字符串函数void fun(char s1[],char s2[],int m,int n),其作用是将字符数组s2中从第m个字符开始的共n个字符拷贝到数组s1中;若s2中剩余字符不足n个,则取到尾部。程序运行时,当输入"abcd123"、4,3时应输出"d12";当我们输入"abcd123"、4,6时应输出"d123"。注意,这里是将1作为起始计数。

#include<stdio.h>
#include<string.h>
void fun(char s1[],char s2[],int m,int n)

{int i,a,b;

a=strlen(s2);

b=(a<m+n-1?a:m+n-1);

for(i=m-1;i<b;i++)

{*s1=*(s2+i);s1++;}

*s1='\0';

}

main()

{static char a[100],b[100];

int s,len;

void fun(char s1[],char s2[],int m,int n);

puts("ENTER A STRING:");

gets(a);

puts("ENTER STARTING POSITION AND LENGTH:");

scanf("%d,%d",&s,&len);

fun(b,a,s,len);

printf("THE SRBSTING IS:%s\n",b);

}
  1. 编写函数void fun(char *str),将参数字符串中各单词首字母变大写,其余字母变小写。输入输出在main中实现。如输入"you HAVE 10 books,don’t you? " 输出"You Have 10 Books,Don’t You?"。单词以空格、逗号、句号分隔。
#include<stdio.h>
void fun(char *str)

{int i,j;
for(i=0;str[i];i++)
if(str[i]>='A'&&str[i]<='Z')
str[i]+=32;
if(str[0]>='a'&&str[0]<='z')
str[0]-=32;

for(i=1;str[i];i++)
if(str[i]==' '||str[i]==','||str[i]=='.')
{
if(str[i+1]>='a'&&str[i+1]<='z')
str[i+1]-=32;
}
}
main()
{char a[100];
 gets(a);
fun(a);
puts(a);
}
  1. n个整数,前面各数循环顺序后移m个位置,最后m个数变成最前面m个数。写函数void fun(int *p,int n,int m),实现上述功能。在main()中输入与输出。如下面程序输出 7 8 9 10 1 2 3 4 5 6 。注意,m可能大于n。
#include<stdio.h>

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

{int i,j;

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

{for(j=n-1;j>=0;j--)

*(p+j+1)=*(p+j);

*(p+0)=*(p+n);

}

}

main()

{void fun(int *,int ,int );

int x[10]={1,2,3,4,5,6,7,8,9,10},i;

fun(x,10,14);

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

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

printf("\n");

}
  1. 编写函数void fun(char *s1,char *s2),实现字符串s1与s2的交叉连接,连接后得到的新字符串放在s1中。如输入abc12345,输出a1b2c345,若输入abcde123,则输出a1b2c3de。
#include<stdio.h>

#include<string.h>

void fun(char *s1,char *s2)

{int i,j,k;

for(j=0,i=1;s2[j]!='\0';)

{for(k=strlen(s1);k>=i;k--)

s1[k+1]=s1[k];

s1[i]=s2[j];

j++;i++;

if(s1[i]) i++;

}
}

main()

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

void fun(char *,char *);

gets(a);

gets(b);

fun(a,b);

puts(a);

}
  1. 传说可以根据两个人的生日来计算其缘分.方法:将两个人的生日各位相加,将得到的数再一次各位相加,直到其值为一个一位数,此数即代表两个人的缘分.例如,两个生日为:19820523,19841111,则各位相加:1+9+8+2+5+2+3+1+9+8+4+1+1+1+1得:56;再5+6得11;再 1+1得2,即为两人的缘分.编写计算缘分程序,两个生日由键盘输入.
#i nclude "stdio.h"
int fun(long x,long y)
{long sum=0,m;
for(m=x+y;m>0||sum>=10;)
{ sum+=m%10;
m/=10;
if(m==0&&sum>=10)
{m=sum;
sum=0;
}
}
return(sum);
}
main()
{long x,y;
int k;
scanf("%ld%ld",&x,&y);
k=fun(x,y);
printf("yuan fen is %d",k);
}
  1. m个人围成一圈,1,2,3循环报数,报到3的人退出,并将退出的序号依次存到数组p中,包括最后一个人的序号。到最后只余1人,输出最后留下的是第几号(最初的序号,以1起始)。若m=6,则输出n=1 3 6 4 2 5 1;若m=10,则输出n=4 3 6 9 2 7 1 8 5 10 4;若m=100,则输出n=91 3 6 9……100 58 91。函数int fun(int n ,int *p)实现上述功能,返回n个人中最后余的1人的起始序号,并将退出的序号顺序写入p指向的数组中。
#include<stdio.h>
int fun(int n ,int *p)
{ 
	int i,j,s[100],k=0,t=0;
	for(i=0;i<n;i++)
		s[i]=i+1;
	for(i=0;t<n;i++){
		for(j=0;j<n;j++)
			if(s[j]!=0){
			k++;
			if(k%3==0){
				p[t]=s[j];
				t++;
				s[j]=0;
			}
			}
			k=k%3;
		}
		return p[t-1];
	}

 main()
{int m,a[10000],i,num;
 scanf("%d",&m);
 num= fun(m,a);
 printf("n=%d\n",num);
 for(i=0;i<m;i++)
   printf("%8d ",a[i]);
 printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值