函数练习

一.填空

编写函数,实现在n个升序的整数中查找是否有key值的折半查找法。

#include <stdio.h>
int mid_find(int a[], int count, int key)
{                           //count个元素a[i]中查是否有key,若有,返回值为该元素的下标,若无,返回值-1
    int left,right,mid;
    left=_________;     right=_________;    
    while( _________ )
    {
        mid=(left+right)/2;
        if(a[mid]==key) return mid;
        else if(a[mid]>key)_________;
        else left=__________;               
    }
    return __________ ;         
}   
int main()
{   
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    printf("%d\n",mid_find(a,10,18));   
}   

正确答案为:

#include <stdio.h>
int mid_find(int a[], int count, int key)
{                           //count个元素a[i]中查是否有key,若有,返回值为该元素的下标,若无,返回值-1
    int left,right,mid;
    left=0;     right=count-1;  
    while(left<=right)
    {
        mid=(left+right)/2;
        if(a[mid]==key) return mid;
        else if(a[mid]>key) right=mid-1;
        else left=mid+1;                
    }
    return -1;          
}   
int main()
{   
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    printf("%d\n",mid_find(a,10,8));    
}   

二.编写函数

尝试自己编写一个判断是否素数的函数,返回值为1,表示是素数,为0,则不是素数。并在main函数中编写合适的代码来验证函数功能是否正确。

正确答案:

#include <stdio.h>
#include <math.h>
int find(int m)
{
    int i = 2;
    while(i<=sqrt((double)m))
    {
        if(m&i==0) return 0;
        if(m&i!=0) i++;
    }
    return 1;
}
int main()
{
    printf("%d",find(7));
}

三.选择

有以下程序:

#include<stdio.h>
#include<stdlib.h>
void fun(int *p1, int *p2, int *s)
{   
    s=(int*)malloc(sizeof(int));//问内存要了int大小的变量区空间,地址钥匙由s保存
    *s=*p1+*p2;
    free(s);//malloc方式要的存储空间,要记得自己释放掉,free就是办理check out的举动
}           //如果该函数里没有s=...和free两句,结果是?        41
main ( )
{   
    int a=1, b=40,*q=&a;
    fun( &a , &b, q);
    printf( "%d\n", *q) ;   
}

程序运行后的输出结果是? C

A) 42 B) 0 C) 1 D) 41

四.选择

有如下调用语句func(rec1,rec2+rec3,(rec4,rec5));则该函数调用语句中,含有的实参个数是? A

A 3 B 4 C 5 D 语法错误

分析:

(rec4,rec5)是逗号表达式,它的值是rec5的值。所以该函数调用语句含有的实参个数是3。

(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值。

五.简答

#include<stdio.h>
int f1(int x,int y)  {return x>y?x:y;} //返回较大的值
int f2(int x,int y)  {return x>y?y:x;} //返回较小的值
main()
{   
    int a=4,b=3,c=5,d=2,e,f,g;
    e=f2(f1(a,b),f1(c,d));  
    f=f1(f2(a,b),f2(c,d));      
    g=a+b+c+d-e-f;
    printf("%d,%d,%d\n",e,f,g);
}

则程序输出为?

答案:

4,3,7

六.简答

程序运行结果?

#include<stdio.h>
#define N 20
void fun(int a[],int n,int m)
{   
    int i,j;
    for(i=m;i>=n;i--)a[i+1]=a[i];     //将a[n]到a[m+1]的数右移一位,注意:a[n]赋值给a[n+1]后就结束了
}
main()
{   
    int i,a[N]={1,2,3,4,5,6,7,8,9,10};
    fun(a,2,9);
    for(i=0;i<5;i++) printf("%d",a[i]);  //输出a[]前五位
}

答案:

12334

七.简答

程序运行结果?

#include<stdio.h>
void fun(char *a, char *b)
{   
    a=b;  (*a)++;   //a指向一个地址,b指向一个地址,a=b后,就相当于a指向b指向的地址,*a自增,就是a指向的地址自增,而a最初指向的地址并不受影响。
}
main()
{   
    char c1='A',c2='a',*p1,*p2;
    p1=&c1;  p2=&c2; 
    fun(p1,p2);
    printf("%c%c\n",c1,c2);   
}

答案:

Ab

八.简答

程序运行输入:3,abcde<回车>,结果?

#include<string.h>
#include<stdio.h>
void move(char *str, int n)
{   
    char temp;  int i;
    temp=str[n-1];   //暂存str[]最后一位的值
    for(i=n-1;i>0;i--) str[i]=str[i-1];   //将str[]左移一位
    str[0]=temp;     //给上一步没有产生变化的第一位赋最初str[]最后一位的值
}
main()
{   
    char s[50]; int n,i,z;
    scanf("%d,%s",&n,s);  
    z=strlen(s);
    for(i=1;i<=n;i++) move(s,z);  //左移n=3位
    printf("%s\n",s);
}

答案:

cdeab

九.选择

函数fun定义为void fun(char ch,float x){ },则下列调用正确的是?(void是没有返回值) D

A fun(“abc”,3.0); B t=fun(‘D’,16.5); C fun(‘65’,2.8); D fun(32,32);

分析:

A,D项中,"abc",'65'均含有一个以上的字符,为字符串,而函数中定义的是一个字符,故错误。

B项中,fun函数返回的是一个void值,不可用于赋值。

十.简答

程序运行结果?

#include<stdio.h>
void sum(int a[])
{   
    a[0]=a[-1]+a[1];   //将前一位的值与后一位的值相加后得到的结果赋给引用值
}
main()
{   
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    sum(&a[2]);        //相当于a[2]=a[1]+a[3],即a[2]=2+4=6
    printf("%d\n",a[2]); 
}

答案:

6

十一.简答

程序运行输入:1234<回车>,结果?

#include<stdio.h>
int sub(int n)
{ 
    return(n/10+n%10);   //输出 n对10取余的值加上n被10整除得到的值
}
main()
{   
    int x,y; scanf("%d",&x);
    y=sub(sub(sub(x)));   //套娃运算,逐个代入计算可得结果,最后输出 1+9=10
    printf("%d\n",y); 
}

答案:

10

十二.简答

程序运行结果?

#include<stdio.h>
void sum(int *a) 
{ 
    a[0]=a[1]; 
}
main()
{   
    int aa[10]={1,2,3,4,5,6,7,8,9,10},i; 
    for(i=2;i>=0;i--) sum(&aa[i]); 
    printf("%d\n",aa[0]); 
}

答案:

4

十三.简答

程序运行结果?

#include<stdio.h>
int f(int b[][4]) 
{   
    int i,j,s=0;
    for(j=0;j<4;j++) 
    {   
        i=j;  
        if(i>2)i=3-j; 
        s+=b[i][j];    //注意这条语句和if语句独立
    }
    return s;
}
main()
{   
    int a[4][4]={1,2,3,4,0,2,4,6,3,6,9,12,3,2,1,0};   //最终实现结果是a[0][0]+a[1][1]+a[2][2]+a[0][3]
    printf("%d\n",f(a));
}

答案:

16

十四.简答

程序运行结果?

#include<string.h>
#include<stdio.h>
char *ss(char *s) 
{ 
    return s+strlen(s)/2; 
}
main()
{   
    char *p,*str="abcdefgh"; 
    p=ss(str);    //p=s+4,此时p指向的是字符串中'e'的地址
    printf("%s\n",p);   //输出p往后的字符,直到'\0'结束
}

答案:

efgh

最后修改:2020 年 02 月 06 日 11 : 46 AM
如果觉得我的文章对你有用,请随意赞赏