浙大版《C语言程序设计(第4版)》题目集(函数题)已完结

1.练习5-1 求m到n之和

int sum(int m, int n)
{
    int summary;
    for(summary=0;m<=n;m++)
    {
        summary+=m;
    }
    return(summary);
}

2.练习5-2找两个数中最大者

int max(int a,int b)
{
    int bigger;
    if(a>=b)
        bigger=a;
    else
        bigger=b;
    return(bigger);
}

3.练习5-3 字符金字塔

void CharPyramid( int n, char ch)
{
	int i, j;
	for(i=1; i<=n; i++)
	{
		for(j=1; j<=(n-i); j++)
		{
			printf(" ");
		}
		for(j=1; j<=i; j++)
		{
			printf("%c ", ch);
		}
		printf("\n");
	}
}

4.习题5-1 符号函数

int sign( int x )
{
    if(x>0)
        return 1;
    else if(x==0)
        return 0;
    else
        return -1;
}

5.习题5-2 使用函数求奇数和

int even( int n )
{
    if(n%2==0)
        return 1;
    else
        return 0;
}
int OddSum( int List[], int N )
{
    int sum=0;
    int i;
    for(i=0;i<N;i++)
    {
        if (even(List[i])==0)
           sum=sum+List[i];
    }
    return sum;
}

6.习题5-3 使用函数计算两点间的距离

double sqrt(double x);
double dist( double x1, double y1, double x2, double y2 )
{
    double distance;
    double power;
    power=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
    distance=sqrt(power);
    return distance;
}

7.习题5-4 使用函数求素数和

int prime( int p )// judge if it is a prime
{
    int i;
    if(p>1)
    {
        for(i=2;i<p;i++)
       {
          if(p%i==0)
              break;
       }
       if(i<p)
           return 0;
       else
           return 1;
    }
    else
        return 0;
}
int PrimeSum( int m, int n )
{
    int sum=0;
    int p;
    for(p=m;p<=n;p++)
    {
        if( prime(p)!= 0 )
            sum=sum+p;
    }
    return sum;
}

8.习题5-5 使用函数统计指定数字的个数

int CountDigit( int number, int digit )
{
	int count=0;
	if(number==0&&digit==0) count=1;
		if(number<0){
			number=-number;
		}
		while(number>0){
			if(number%10==digit) count++;
			number/=10;
		}

	
	return count;	
	
 }

9.习题5-6 使用函数输出水仙花数

int narcissistic( int number ){
	int res = 0, t;
	if (number <= 999){
		int g = 0,s = 0,b = 0;
		g = number % 10;
		s = number % 100 / 10;
		b = number / 100;
		t = g * g * g + s * s * s + b * b * b;
		if (t == number){
			res = 1;
		}
	}else if (number <= 9999){
		int g = 0,s = 0,b = 0,q = 0;
		g = number % 10;
		s = number / 10 % 10;
		b = number / 100 % 10;
		q = number / 1000;
		t = g * g * g * g + s * s * s * s + b * b * b * b + q * q * q * q;
		if (t == number){
			res = 1;
		}
	}
	return res;
}
void PrintN( int m, int n ){
	for (int i = m + 1; i < n;i++){
		if (narcissistic(i)){
			printf("%d\n", i);
		}
	}
}

10.习题5-7 使用函数求余弦函数的近似值

double funcos( double e, double x ){
	int flag = 1,n = 0;
	double fact = 1,temp = 0.0,res = 0.0;
	while (1){
		if (n == 0){
			fact = 1;
		}else {
			fact *= n * (n - 1);
		}
		temp = flag *pow(x,n) / fact;
		res += temp;
		if (fabs(temp) < e){
			break;
		} 
		n += 2;
		flag = -flag;
	}
	return res;
}

11.习题5-8 空心的数字金字塔

void hollowPyramid(int n)
{
	int i, row=1; //row记录行数
	for( ; row<=n; row++ ){
		for( i=1; i<=n-row; i++ ){
			printf(" ");
		} //输出数字前空格,共n-row个
		if(row==1)
			printf("1"); //第一行只有1个数字,单独输出
		else if(row>1&&row<n){
			printf("%d", row); //输出中间某行第一个数字
			for(i=1; i<=2*row-3; i++){
				printf(" ");
			} //输出两数字之间空格,共2row-3项
			printf("%d", row); //输出中间某行第二个数字
		}else if(row==n){
			for(i=1; i<=2*row-1; i++){
				printf("%d", row);
			} //输出第n行数字
		}
		printf("\n");
	}
}

12.习题6-1 分类统计字符个数

void StringCount( char s[] )
{
    int letter=0,blank=0,digit=0,other=0;
    for(int i=0;s[i]!='\0';i++)
    {
        if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
           letter++;
        else if(s[i]==' '||s[i]=='\n')
           blank++;
        else if(s[i]>='0'&&s[i]<='9')
           digit++;
        else
           other++;
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
}

13.习题6-2 使用函数求特殊a串数列和

int fn( int a, int n )
{
    int b=a;
    for(int i=1;i<n;i++)
        a=10*a+b;
    return a;
}
int SumA( int a, int n )
{
    int s=0;
    for(int i=1;i<=n;i++)
        s=s+fn(a,i);
    return s;
}

14.习题6-3 使用函数输出指定范围内的完数

int factorsum( int number )
{
    int s=1,a=number/2;
    if(number==1)
        return 0;
    for(int i=2;i<=a;i++)
    {
        if(number%i==0)
        {
            s=s+i;
        }
    }
    return s;
}

void PrintPN( int m, int n )
{
    int s=1,k=0;
    for(m;m<=n;m++)
    {
        int a=m/2;
        if(factorsum(m)==m)
        {
            k=1;
            printf("%d = 1",m);
            for(int i = 2;i<=a;i++)
            {
                if(m%i==0)
                    printf(" + %d",i);
            }
            printf("\n");
        }
    }
    if(k==0)
        printf("No perfect number");
}

15.习题6-4 使用函数输出指定范围内的Fibonacci数

int fib( int n )
{
    int a=1,b=1,c=0;
    if(n==1||n==2)
        return 1;
    else
    {
        for(int i=0;i<n-2;i++)
        {
            c=a+b;
            a=b;
            b=c;
        }
        return c;
    }
}

void PrintFN( int m, int n )
{
    int i=1,k=0,a=0;
    while(fib(i)<m)
        i++;
    while(fib(i)<=n)
    {
        k=1;
        if(a==0)
        {
            printf("%d",fib(i));
            a=1;
        }
        else
            printf(" %d",fib(i));
        i++;
    }
    if(k==0)
        printf("No Fibonacci number");
}

16.习题6-5 使用函数验证哥德巴赫猜想

int prime( int p )
{
    if(p<=1)
        return 0;
    else if(p==2)
        return 1;
    else
    {
        for(int i=2;i<=p/2;i++)
        {
            if(p%i==0)
                return 0;
        }
        return 1;
    }
}
void Goldbach( int n )
{
    for(int i=1;i<n;i++)
    {
        if(prime(i)==1&&prime(n-i)==1)
        {
            printf("%d=%d+%d",n,i,n-i);
            break;
        }
    }
}

17.习题6-6 使用函数输出一个整数的逆序数

int reverse( int number )
{
    int a=1,s=0,b,c=1;
    if(number<0)
    {
        number=-number;
        c=-1;
    }
        while(number>0)
    {
        b=number%10;
        s=s*10+b;
        number=number/10;
    }
    return s*c;
}

18.练习8-2 计算两数的和与差

void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
    *psum=op1+op2;
    *pdiff=op1-op2;
}

19.练习8-8 移动字母 

void Shift( char s[] )
{
    int i,j;
    for(i=0;i<3;i++)
    {
        char b=s[0];
        for(j=0;s[j+1]!='\0';j++)
            s[j]=s[j+1];
        s[j]=b;
    }
}

20.习题8-1 拆分实数的整数与小数部分

void splitfloat( float x, int *intpart, float *fracpart )
{
    *intpart=(int)x;
    *fracpart=x-*intpart;
}

21.习题8-2 在数组中查找指定元素

int search( int list[], int n, int x )
{
    for(int i=0;i<n;i++)
    {
        if(list[i]==x)
            return i;
    }
    return -1;
}

22.习题8-3 数组循环右移 

int ArrayShift( int a[], int n, int m )
{
    m=m%n;
    int b[n];
    for(int i=0;i<n;i++)
        b[i]=a[i];
    for(int i=0;i<n;i++)
    {
        if(i>=n-m)
            a[i+m-n]=b[i];
        else
            a[i+m]=b[i];
    }
}

23.习题8-4 报数

void CountOff( int n, int m, int out[] )
{
    int a[MAXN],b=0,c=1,d=n;
    for(int  i=0;i<n;i++)
        a[i]=1;
    while(d!=0)
    {
        for(int i=0;i<n;i++)
        {
            if(a[i]!=0)
            {
                b++;
                while(b==m)
                {
                    a[i]=0;
                    out[i]=c;
                    c++;
                    d--;
                    b=0;
                }
            }
        }
    }
}

24.习题8-5 使用函数实现字符串部分复制

#include<string.h> 
void strmcpy( char *t, int m, char *s )
 {
    int n=strlen(t);
    if(n<m)
        return;
    else 
    {
        for(int i=m-1;i<n;i++)
        {
            *s=*(t+i);
            s++;
        }
        *s='\0';
        return s;
    }
 }

25.习题8-6 删除字符 

#include<string.h>
void delchar( char *str, char c )
{
    int n=strlen(str),j;
    for(int i=n;i>=0;i--)
    {
        if(str[i]==c)
        {
            for( j=i;j<n-1;j++)
                str[j]=str[j+1];
            str[j]='\0';
        }
    }
}

26.习题8-8 判断回文字符串

#include<string.h>
bool palindrome( char *s )
{
    int n=strlen(s);
    for(int i=0;i<n/2;i++)
    {
        while(s[i]!=s[n-1-i])
            return false;
    }
    return true;
}

27.习题8-9 分类统计各类字符个数

#include<string.h>
void StringCount( char *s )
{
    int a=0,b=0,c=0,d=0,e=0;
    int n=strlen(s);
    for(int i=0;i<n;i++)
    {
        if(s[i]>='A'&&s[i]<='Z')
            a++;
        else if(s[i]>='a'&&s[i]<='z')
            b++;
        else if(s[i]==' ')
            c++;
        else if(s[i]>='0'&&s[i]<='9')
            d++;
        else
            e++;
    }
    printf("%d %d %d %d %d",a,b,c,d,e);
}

28.习题9-2 计算两个复数之积

struct complex multiply(struct complex x, struct complex y)
{
    struct complex protect;
    protect.real=x.real*y.real-x.imag*y.imag;
    protect.imag=x.imag*y.real+x.real*y.imag;
    return protect;
}

29.习题9-6 按等级统计学生成绩

int set_grade( struct student *p, int n )
{
     int a=0;
    for(int i=0;i<n;i++)
    {
        if((*p).score>=85)
            (*p).grade='A';
        if((*p).score<=84&&(*p).score>=70)
            (*p).grade='B';
        if((*p).score<=69&&(*p).score>=60)
            (*p).grade='C';
        if((*p).score<=59)
        {
            (*p).grade='D';
            a++;
        }
            p++;
    }
    return a;
}

30.练习10-1 使用递归函数计算1到n之和

int sum(int n)
{
    int i=0,s=0;
    if(n<=0)
    return 0;
    else
    {
    while(i<n)
    {
    i++;
    s=s+i;
    }
    return s;
    }
   
}

31.习题10-1 判断满足条件的三位数

int search( int n )
{
    int count=0,i=11,a,b,c,s;
    while(i*i<=n)
    {
        s=i*i;
        a=s%10;
        b=((s-a)/10)%10;
        c=s/100;
        if(a==b||a==c||b==c)
            count++;
        i++;
    }
    return count;
}

32.习题10-2 递归求阶乘和

double fact( int n )
{
    int s;
    if(n==0||n==1)
        return 1;
    else
    {
        s=n*fact(n-1);
        return s;
    }
}

double factsum( int n )
{
    int s;
    if(n==0)
        return 0;
    else
    {
        s=fact(n)+factsum(n-1);
        return s;
    }
}

33.习题10-3 递归实现指数函数

double calc_pow( double x, int n )
{
    double s;
    if(n==1)
        return x;
    else
        s=x*calc_pow(x,n-1);
    return s;
}

34.习题10-4 递归求简单交错幂级数的部分和

double fn( double x, int n )
{
    double s;
    if(n==1)
        s=x;
    else
        s=pow(-1,n-1)*pow(x,n)+fn(x,n-1);
    return s;
}

35.习题10-5 递归计算Ackermenn函数

int Ack( int m, int n )
{
    if(m==0)
        return  n+1;
    else if(n==0&&m>0)
        return Ack(m-1,1);
    else if(m>0&&n>0)
        return Ack(m-1,Ack(m,n-1));
}

36.习题10-6 递归求Fabonacci数列

int f( int n )
{
    if(n==0)
        return 0;
    else if(n==1)
        return 1;
    else
        return f(n-2)+f(n-1);
}

37.习题10-7 十进制转换二进制

void dectobin( int n )
{
    if(n==0)
        printf("0");
    else if(n==1)
        printf("1");
    else
    {
        dectobin(n/2);
        printf("%d",n%2);
    }
}

38.习题10-8 递归实现顺序输出整数

void printdigits( int n )
{
    if(n<10)
        printf("%d\n",n);
    else
    {
        printdigits(n/10);
        printf("%d\n",n%10);
    }
}

 39.习题10-11 有序表的增删改查操作

int insert(int a[], int value)
{
    int i;
    for (i = 0; i < Count; i++)
    {
        if (value < a[i])
            break;
        if (value == a[i])
            return -1;
    }
 
    for (int j = Count; j > i; j--)
        a[j] = a[j - 1];
 
    a[i] = value;
    Count++;
 
    return 0;
}
 
int del(int a[], int value)
{
    int i;
    for (i = 0; i < Count; i++)
    {
        if (value == a[i])
            break;
    }
    if (i == Count)
        return -1;
 
    for (int j = i; j < Count - 1; j++)
        a[j] = a[j + 1];
    Count--;
 
    return 0;
}
 
int modify(int a[], int value1, int value2)
{
    if (del(a, value1) == -1)
        return -1;
    if (insert(a, value2) == -1)
        return -1;
    return 0;
}
 
int query(int a[], int value)
{
    int mid, left = 0, right = Count - 1;
    while (left <= right)
    {
        mid = (left + right) / 2;
        if (a[mid] < value)
            left = mid + 1;
        else if (a[mid] > value)
            right = mid - 1;
        else
            return mid;
    }
    return -1;
}

 40.练习11-4 字符定位(最后一次找到的字符)

char *match(char *s, char ch)
{
	char *ps = NULL;
	
	while(*s!='\0')
	{
		if(*s==ch)
		{
			ps = s;
		}
		s++;
	}
	
	return ps;
}

41.习题11-1 输出月份英文名

char *getmonth( int n )
{
    switch(n) 
    {
		case 1:return "January" ;break;
		case 2:return "February" ;break;
		case 3:return "March" ;break;
		case 4:return "April" ;break;
		case 5:return "May" ;break;
		case 6:return "June" ;break;
		case 7:return "July" ;break;
		case 8:return "August" ;break;
		case 9:return "September" ;break;
		case 10:return "October" ;break;
		case 11:return "November" ;break;
		case 12:return "December" ;break;
	}
    return 0 ;
 }

42.习题11-2 查找星期 

int getindex(char *s)
{
    int week;
    char *day[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
    for(week=0;week<=6;week++)
    {
        if(strcmp(s,day[week])==0)
            break;
    }
    if(week==7)
        week=-1;
    return week;
}

43.习题11-3 计算最长的字符串长度

int max_len( char *s[], int n )
{
    int m,max=0;
    for(int i=0;i<n;i++)
    {
        m=strlen(s[i]);
        if(m>max)
            max=m;
    }
    return max;
}

44.习题11-4 字符串的连接 

char *str_cat( char *s, char *t )
{
    char *p=s;
    while(*p)
        p++;
    while(*t)
    {
        *p=*t;
        p++;
        t++;
    }
    return s;
}

45.习题11-5 指定位置输出字符串

char *match(char *s,char ch1,char ch2)
{
    char a[MAXS]="",*p;
    int i=0,j=0;
    while((*(s+i)!=ch1)&&(*(s+i)!='\0'))
    {
        i++;
    }
    p=s+i;
    a[j]=*(s+i);
    j++;
    i++;
    while((*(s+i)!='\0')&&(*(s+i)!=ch2))
    {
        a[j]=*(s+i);
        j++;
        i++;
    }
    a[j]=*(s+i);
    printf("%s\n",a);
    return p;
}

46.习题11-6 查找子串

char *search(char *s, char *t)
{
    char *p = NULL;
    int i,j=0,k=0,a,b;
    a=strlen(s);
    b=strlen(t);
    for(i=0;i<a;i++)
    {
        j=i;
        while(s[j]==t[k])
        {
            j++;
            k++;
        }
            while (k >= b)
        {
            p = &s[i];
            return p;
        }
        k=0;
    }
    return p;
}

47.习题11-7 奇数值结点链表

//新建链表,依次读取输入的数据,存放在链表的节点中
//尾插法建链表
struct ListNode *readlist()
{
    struct ListNode *head, *tail, *pnew; //头节点,尾节点,新节点
    head = NULL;
    tail = NULL;
    pnew = NULL;
    int num;
    while(scanf("%d", &num), num!=-1)
    {
        pnew = (struct ListNode*)calloc(1,sizeof(struct ListNode)); //calloc函数新建节点的同时可以实现初始化,建议使用calloc
        pnew->data = num;
        if(head == NULL)
        {
            head = pnew;
            tail = pnew;
        }
        else{
            tail->next = pnew;
            tail = pnew;
        }
    }
    return head;
}
 
//建立奇数链表
struct ListNode *getodd( struct ListNode **L )
{
    struct ListNode *head, *tail, *pnew, *pcur, *ppre, *pfree;
    head = NULL;
    tail = NULL;
    pnew = NULL;
    pcur = *L;
    ppre = *L;
    if(*L == NULL)
        return NULL;
    while(pcur)
    {
        if(pcur->data%2)
        {
            pfree = pcur;
            pnew = (struct ListNode*)calloc(1,sizeof(struct ListNode));
            pnew->data = pcur->data;
            if(head == NULL)
            {
                head = pnew;
                tail = pnew;
            }
            else{
                tail->next = pnew;
                tail = pnew;
            }
            if(((*L)->data)%2)    // 判断头节点是奇数的情况
            {
                *L=pcur->next;
                pcur = *L;
                ppre = *L;
            }
            else
            {
                ppre->next = pcur->next;
                pcur = ppre->next;
            }
            free(pfree);
        }
        else{
            ppre = pcur;
            pcur = pcur->next;
        }
    }
    return head;
}

48.习题11-8 单链表结点删除

struct ListNode *readlist()
{
    struct ListNode *p,*head=NULL;
    int data;
    while(scanf("%d",&data)&&data!=-1)
    {
        struct ListNode *q=(struct ListNode*)malloc(sizeof(struct ListNode));
        if(q!=NULL)
        {
            q->data = data;
            q->next = NULL;
        }
        else exit(1);
        if(head!=NULL)
        {
            p->next=q;
        }
        else
            head=q;
        p=q;
    }
    return head;
}

struct ListNode *deletem( struct ListNode *L, int m )
{
    struct ListNode *q,*p;
    p=L;
    while(p!=NULL)
    {
        if(p->data==m)
        {
            if(p==L)
                L = p->next;
            else
                q->next = p->next;
        }
        else
        {
            q=p;
        }
        p=p->next;
    }
    return L;
}