PTA 浙大版《C语言程序设计(第4版)》题目集 参考答案(函数题)
CSDN 2024-10-25 10:05:01 阅读 52
目录
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 分)
<code>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';code>
else if(p->score<85&&p->score>=70)p->grade='B';code>
else if(p->score<70&&p->score>=60)p->grade='C';code>
else { -- -->
p->grade='D';code>
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;
}
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。