目录
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 for(j=0;j 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 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 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 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 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 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 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 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 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 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 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 } 习题8-4 报数 (20 分) void CountOff(int n,int m,int out[]){ int count=0,cnt=1,i; for (i=0;i while (cnt<=n){ for (i=0;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 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 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 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; } 精彩链接
发表评论