目录
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;}