当前位置:首页 » 《随便一记》 » 正文

PTA 浙大版《C语言程序设计(第4版)》题目集 参考答案(函数题)

23 人参与  2024年03月28日 16:20  分类 : 《随便一记》  评论

点击全文阅读


目录

PTA 浙大版《C语言程序设计(第4版)》题目集 参考答案(函数题)本答案配套详解教程专栏练习 5-1 求m到n之和 (10 分)练习5-2 找两个数中最大者 (10 分)练习5-3 字符金字塔 (15 分)习题5-1 符号函数 (10 分)习题5-2 使用函数求奇数和 (15 分)习题5-3 使用函数计算两点间的距离 (10 分)习题5-4 使用函数求素数和 (20 分)习题5-5 使用函数统计指定数字的个数 (15 分)习题5-6 使用函数输出水仙花数 (20 分)习题5-7 使用函数求余弦函数的近似值 (15 分)习题5-8 空心的数字金字塔 (15 分)习题6-1 分类统计字符个数 (15 分)习题6-2 使用函数求特殊a串数列和 (20 分)习题6-3 使用函数输出指定范围内的完数 (20 分)习题6-4 使用函数输出指定范围内的Fibonacci数 (20 分)习题6-5 使用函数验证哥德巴赫猜想 (20 分)习题6-6 使用函数输出一个整数的逆序数 (20 分)练习8-2 计算两数的和与差 (10 分)练习8-8 移动字母 (10 分)习题8-1 拆分实数的整数与小数部分 (15 分)习题8-2 在数组中查找指定元素 (15 分)习题8-3 数组循环右移 (20 分)习题8-4 报数 (20 分)习题8-5 使用函数实现字符串部分复制 (20 分)习题8-6 删除字符 (20 分)习题8-8 判断回文字符串 (20 分)习题8-9 分类统计各类字符个数 (15 分)习题9-2 计算两个复数之积 (15 分)习题9-6 按等级统计学生成绩 (20 分)练习10-1 使用递归函数计算1到n之和 (10 分)习题10-1 判断满足条件的三位数 (15 分)习题10-2 递归求阶乘和 (15 分)习题10-3 递归实现指数函数 (15 分)习题10-4 递归求简单交错幂级数的部分和 (15 分)习题10-5 递归计算Ackermenn函数 (15 分)习题10-6 递归求Fabonacci数列 (10 分)习题10-7 十进制转换二进制 (15 分)习题10-8 递归实现顺序输出整数 (15 分)习题10-11 有序表的增删改查操作 (20 分)练习11-4 字符定位(最后一次找到的字符) (15 分)习题11-1 输出月份英文名 (15 分)习题11-2 查找星期 (15 分)习题11-3 计算最长的字符串长度 (15 分)习题11-4 字符串的连接 (15 分)习题11-5 指定位置输出字符串 (20 分)习题11-6 查找子串 (20 分)习题11-7 奇数值结点链表 (20 分)习题11-8 单链表结点删除 (20 分)

PTA 浙大版《C语言程序设计(第4版)》题目集 参考答案(函数题)

本文是函数题答案,编程题答案链接
PTA 浙大版《C语言程序设计(第4版)》题目集 参考答案(编程题)

本答案配套详解教程专栏

?? 欢 迎 订 阅??

PTA浙大版《C语言程序设计(第4版)》题目集 详解教程

练习 5-1 求m到n之和 (10 分)

int sum( int m, int n ){    int sum;    sum=(m+n)*(n-m+1)/2;    return sum;}

练习5-2 找两个数中最大者 (10 分)

int max( int a, int b ){    return (a>b)? a:b;}

练习5-3 字符金字塔 (15 分)

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

习题5-1 符号函数 (10 分)

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

习题5-2 使用函数求奇数和 (15 分)

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

习题5-3 使用函数计算两点间的距离 (10 分)

double dist (double x1, double y1 , double x2 , double y2){double distant;distant=sqrt(pow((x1-x2),2)+pow((y1-y2),2));return distant;}

习题5-4 使用函数求素数和 (20 分)

int prime( int p ){    int prime;    if(p<=1)prime=0;    else if(p==2)prime=1;    else{        int i;        prime=1;        for(i=2; i<=sqrt(p);i++)            if(p % i ==0){                prime=0;                break;            }    }    return prime;}int PrimeSum( int m, int n ){int Sum = 0;for (int i = m; i <= n; i++)if (prime(i))Sum = Sum + i;return Sum;}

习题5-5 使用函数统计指定数字的个数 (15 分)

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

习题5-6 使用函数输出水仙花数 (20 分)

int power(int a,int b){    int pow=1,i;    for(i=0;i<b;i++)        pow*=a;    return pow;}int narcissistic( int number ){    int a[5],i=0,N,sum=0,k;    k=number;    while(number){        a[i]=number%10;        number/=10;        i++;    }    N=i;    while(i>0){        sum+=power(a[i-1],N);        i--;    }    if(sum==k)return 1;    else return 0;}void PrintN(int m,int n){    int i;    for(i=m+1;i<n;i++)        if(narcissistic(i))            printf("%d\n",i);}

习题5-7 使用函数求余弦函数的近似值 (15 分)

double funcos(double e,double x){int flag=-1;double item=1,i=2,funcos=1;double denominator=1,numerator=1;while(item>e){denominator*=(i-1)*i;numerator*=x*x;item=numerator/denominator;funcos+=flag*item;i=i+2;flag=-flag;}return funcos;}

习题5-8 空心的数字金字塔 (15 分)

void hollowPyramid ( int n ){int i,j;for(i=1;i<n;i++){for(j=n;j>i;j--)            printf(" ");printf("%d",i);if(i!=1){    for(j=1;j<=1+2*(i-2);j++)                printf(" ");    printf("%d",i);        }printf("\n");}for(i=1;i<2*n;i++)printf("%d",n);}

习题6-1 分类统计字符个数 (15 分)

void StringCount( char s[] ){    int i,letter=0,blank=0,digit=0,other=0;    for(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);}

习题6-2 使用函数求特殊a串数列和 (20 分)

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

习题6-3 使用函数输出指定范围内的完数 (20 分)

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

习题6-4 使用函数输出指定范围内的Fibonacci数 (20 分)

int fib( int n ){    int A1=1,A2=1,An,i;    if(n<3)An=1;    else{        for(i=3;i<=n;i++){            An=A1+A2;            A1=A2;            A2=An;        }    }    return An;}void PrintFN( int m, int n ){    int i=0,f=0,count=0;    while(f<=n){        i++;        f=fib(i);        if(f>=m&&f<=n){            if(count==0){                printf("%d",f);                count++;            }else{                printf(" %d",f);                count++;              }        }    }    if(count==0)printf("No Fibonacci number");}

习题6-5 使用函数验证哥德巴赫猜想 (20 分)

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

习题6-6 使用函数输出一个整数的逆序数 (20 分)

int reverse( int number ){    int i, j, flag = 0, reverse = 0;    if(number<0){        flag = 1;        number = -number;    }    while(number>0){        i = number%10;        reverse = reverse*10+i;        number = number/10;    }    if(flag)reverse=-reverse;    return reverse;}

练习8-2 计算两数的和与差 (10 分)

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

练习8-8 移动字母 (10 分)

void Shift( char s[] ){    char a[3];    int i,n;    for(i=0;i<3;i++)a[i]=s[i];    n=strlen(s);    for(i=3;i<n;i++)s[i-3]=s[i];    s[n-3]=a[0];    s[n-2]=a[1];    s[n-1]=a[2];}

习题8-1 拆分实数的整数与小数部分 (15 分)

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

习题8-2 在数组中查找指定元素 (15 分)

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

习题8-3 数组循环右移 (20 分)

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

习题8-4 报数 (20 分)

void CountOff(int n,int m,int out[]){    int count=0,cnt=1,i;    for (i=0;i<n;i++)out[i]=0;    while (cnt<=n){        for (i=0;i<n;i++){            if (!out[i])count++;            if (count==m){                out[i]=cnt;                cnt++;                count = 0;            }        }    }}

习题8-5 使用函数实现字符串部分复制 (20 分)

void strmcpy( char *t, int m, char *s ){    int i, j;    for (i=0; t[i]!='\0'; i++);    if (m>i) s[0] = '\0';    else {        i = 0; j = m-1;        while (t[j]!='\0')            s[i++] = t[j++];        s[i] = '\0';    }}

习题8-6 删除字符 (20 分)

void delchar( char *str, char c ){    int i=0,j=0;    while(str[i]!='\0'){        if(str[i]!=c){            str[j]=str[i];            j++;        }        i++;    }    str[j]='\0';}

习题8-8 判断回文字符串 (20 分)

bool palindrome( char *s ){    int len = strlen(s);    for(int i = 0;i <=len/2;i++)        if(s[i] != s[len-i-1]) return false;    return true;}

习题8-9 分类统计各类字符个数 (15 分)

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

习题9-2 计算两个复数之积 (15 分)

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

习题9-6 按等级统计学生成绩 (20 分)

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

练习10-1 使用递归函数计算1到n之和 (10 分)

int sum( int n ){    int Sum=0;    if(n<=0)return 0;    if(n==1)return 1;    else return Sum=n+sum(n-1);}

习题10-1 判断满足条件的三位数 (15 分)

int search(int n){    int i,j,cnt = 0,a,b,c;    for(i = 101;i<n;i++){        a=i%10;        b=i/10%10;        c=i/100;        if(sqrt(i)==(int)sqrt(i))            if(a==b||b==c||a==c)                cnt++;    }    return cnt;}

习题10-2 递归求阶乘和 (15 分)

double fact( int n ){    if(n==1||n==0)return 1;    else return n*fact(n-1);}double factsum( int n ){    int sum=0;    for(int i=1;i<=n;i++)        sum+=fact(i);    return sum;}

习题10-3 递归实现指数函数 (15 分)

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

习题10-4 递归求简单交错幂级数的部分和 (15 分)

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

习题10-5 递归计算Ackermenn函数 (15 分)

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

习题10-6 递归求Fabonacci数列 (10 分)

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

习题10-7 十进制转换二进制 (15 分)

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

习题10-8 递归实现顺序输出整数 (15 分)

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

习题10-11 有序表的增删改查操作 (20 分)

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

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

char * match(char *s, char ch){    char *a=NULL;    for(int i=0;*(s+i)!='\0';i++)        if(*(s+i)==ch)a=s+i;    return a;}

习题11-1 输出月份英文名 (15 分)

char *getmonth( int n ){    char *month[13] =     {"NULL","January", "February","March",     "April","May", "June","July","August",     "September","October","November","December"};    if (n <1 || n > 12) return NULL;    else return month[n];}

习题11-2 查找星期 (15 分)

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

习题11-3 计算最长的字符串长度 (15 分)

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

习题11-4 字符串的连接 (15 分)

char *str_cat( char *s, char *t ){    strcpy(s+strlen(s) , t);    return s;}

习题11-5 指定位置输出字符串 (20 分)

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

习题11-6 查找子串 (20 分)

char *search(char *s, char *t) {    int i, j;    for (i = 0; s[i] != '\0'; i++) {        for (j = 0; t[j] != '\0' && s[i + j] == t[j]; j++);        if (t[j] == '\0') return s + i;    }    return NULL;}

习题11-7 奇数值结点链表 (20 分)

struct ListNode *readlist() {struct ListNode *head = NULL;struct ListNode *last = head;struct ListNode *p;int number;do {scanf("%d", &number);if (number != -1) {p = (struct ListNode *)malloc(sizeof(struct ListNode));p->data = number;p->next = NULL;if (last) {last->next = p;                last = last->next;} else {head = p;last = p;}}} while (number != -1);return head;}struct ListNode *getodd( struct ListNode **L ){struct ListNode *p,*head1,*last1,*head2,*last2;    p=*L;    head1=NULL;    last1=NULL;    head2=NULL;    last2=NULL;    while(p!=NULL){        if(p->data%2==0){            if (last2) {last2->next = p;last2 = last2->next;} else {head2 = p;last2 = p;*L=p;}        }else{            if (last1) {last1->next = p;last1 = last1->next;} else {head1 = p;last1 = p;}        }        p=p->next;    }    if(last1)last1->next=NULL;    if(last2)last2->next=NULL;    else *L=NULL;    return head1;}

习题11-8 单链表结点删除 (20 分)

struct ListNode *readlist(){    struct ListNode *head=NULL;    struct ListNode *tail=NULL;    struct ListNode *p;    int number;    do{        scanf("%d",&number);        if(number!=-1){            p=(struct ListNode *)malloc(sizeof(struct ListNode));            p->data=number;            if(head==NULL)head=tail=p;            else {                tail->next=p;                tail=p;            }        }else break;    }while(1);    return head;}struct ListNode *deletem( struct ListNode *L, int m ){    struct ListNode *head=NULL;    struct ListNode *pre=NULL,*cur;    cur=L;    do{        if(cur->data!=m){            if(head==NULL)head=cur;            pre=cur;            cur=cur->next;        }else{            if(pre==NULL){                pre=cur;                cur=cur->next;                free(pre);            }else{                pre->next=cur->next;                free(cur);                cur=pre->next;            }        }    }while(cur!=NULL);    return head;}

点击全文阅读


本文链接:http://zhangshiyu.com/post/87269.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1