草庐IT

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

少侠PSY 2023-07-05 原文

目录

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

有关PTA 浙大版《C语言程序设计(第4版)》题目集 参考答案(函数题)的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  4. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  5. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  6. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  9. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  10. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

随机推荐