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;

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。