• 大一下第二次作业


    一、作业

    6-7 删除字符串中数字字符

    1 设计思路

    (1)主要描述题目算法

    第一步:用for循环和if语句,一个一个字符判断,找到数字字符就跳过去判断下一个,否则使指针指向不是(已判断过的)数字字符的字符(替换它)。

    第二步:添加结束字符。

    2.实验代码

    void delnum(char *s)
    {
        int i=0,j=0;    
        for(i=0;*(s+i)!='';i++)
        {
            if(*(s+i)>='0'&&*(s+i)<='9')
            {
               continue;
            }
            else 
            {
                *(s+j)=*(s+i);
                j++;
            }
        }
        *(s+j)='';
    }

    (2) 本题调试过程碰到问题及解决办法

    错误: 

    原因:未加*(s+j)='',字符串是以为结束标志,找不到会越界访问,结果未知。

    6-8 统计子串在母串出现的次数

    1 设计思路

    (1)主要描述题目算法

    第一步:用外循环控制趟数,再用for循环,令j=i,k=0,退出内循环的条件为子串中的字符不为母串中的字符。

    第二步:在内循环中,用if语句判断子串下一个是否为结束符,如果是,说明已经判断完一次,次数加1,跳出内循环。

    第三步:从母串的下一个字符重新判断。

    2.实验代码

    int fun(char *str,char *substr)
    {
        int i=0,j=0,k=0,count=0;
        for(i=0;*(str+i)!='';i++)
        {
            for(j=i,k=0;*(str+j)==*(substr+k);j++,k++)
            {
            
                if(*(substr+k+1)=='')
                {
                    count++;
                    break;
                }
            }
        }
            return count;
    }

    (2) 本题调试过程碰到问题及解决办法

     无。

    3.流程图

     

    6-9 字符串中除首尾字符外的其余字符按降序排列

    1 设计思路

    (1)主要描述题目算法

    第一步:用外循环控制趟数,num个数组字符选num-1趟(首尾字符不比较)。

    第二步:再用for循环和if语句判断下一个字符的ASCI码I是否大于前一个字符的ASCII码,如果是就交换。

    2.实验代码

    int fun(char *s,int num)
    {
        int i,j;
        char t;
        for(i=1;i<num-1;i++)
        {
            for(j=1;j<num-2;j++)
            {
              if(*(s+i)>*(s+j))
              {
                  t=*(s+j);
                  *(s+j)=*(s+i);
                  *(s+i)=t;
              }
            }
         } 
    }

    (2) 本题调试过程碰到问题及解决办法

     无。

    7-1 输出学生成绩

    1 设计思路

    (1)主要描述题目算法

    第一步:输入学生人数,使用动态分配。

    第二步:用for循环输入学生成绩,并把它们相加。

    第三步:令max、min等于数组的第一个元素。

    第四步:用for循环,如果下一个数组元素大于max,就交换max。如果小于min,就交换min。

    2.实验代码

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        int *a,n,i;
        double max,min,sum=0;
        scanf("%d",&n);
        if((a=(int *)malloc(n*sizeof(int)))==NULL)
        exit(1);
        for(i=0;i<n;i++)
        {
            scanf("%d",a+i);
            sum=sum+*(a+i);
        }
        max=*a;min=*a;
        for(i=0;i<n;i++)
        {
            if(*(a+i)<min)
            min=*(a+i);
            if(*(a+i)>max)
            max=*(a+i);
        }
        printf("average = %.2f
    max = %.2f
    min = %.2f",sum/n,max,min);
        free(a);
        return 0;
    }

    (2) 本题调试过程碰到问题及解决办法

     错误:输入样例按回车程序崩溃。

    原因:未使用动态内存分配语句。

       本周第一次PTA作业提交列表:

    7-1 计算职工工资

    1 设计思路

    (1)主要描述题目算法

    第一步:定义结构体。

    第二步:用for循环输入n个员工的姓名 基本工资 浮动工资 支出。

    第三步:计算并输出。

    2.实验代码

    #include<stdio.h>
    struct person{
        char name[100];
        float w;
        float w1;
        float account;
    }person1;
    int main()
    {
    
        int n,i;
        float pay;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%s %f %f %f",&person1.name,&person1.w,&person1.w1,&person1.account);
            pay=person1.w+person1.w1-person1.account;
            printf("%s %.2f
    ",person1.name,pay);
        }
        return 0;
    }

    (2) 本题调试过程碰到问题及解决办法

     错误:

    在编译器运行时结果跟输出样例一样,但是PTA判断我答案错误。

    原因:在我仔细的审过题目后,我发现我漏掉了这一点 把定义的变量类型改为float后答案正确。

    7-2 计算平均成绩

    1 设计思路

    (1)主要描述题目算法

    第一步:定义结构体。

    第二步:用for循环输入学号 姓名 成绩,并将成绩相加。

    第三步:计算平均值,并输出。

    第四步:用for循环和if语句判断每个人的成绩是否小于平均值,是就输出学生的姓名和学号。

    2.实验代码

    #include<stdio.h>
    struct student{
        char num[6];
        char name[10];
        int grade;
    }student1[10];
    int main()
    {
        int n,i;
        double aver=0,sum=0;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            
            scanf("%s %s %d",student1[i].num,student1[i].name,&student1[i].grade);
            sum=sum+student1[i].grade;
               
        }aver=sum/n;
        printf("%.2f
    ",aver);
         for(i=0;i<n;i++)
        {
            if(student1[i].grade<aver)
            printf("%s %s
    ",student1[i].name,student1[i].num);
        }
        return 0;
    }

    (2) 本题调试过程碰到问题及解决办法

    错误:

    原因:定义char类型的学号数组(由5个数字组成的字符串)的字符个数大于数组长度,没有结束字符,找不到会越界访问,结果未知。

    char num[5]改为char num[6]。

    3.流程图

    本周第二次PTA作业提交列表:

    8-1 按等级统计学生成绩

     设计思路

    (1)主要描述题目算法

    第一步:用for循环再用if语句判断学生成绩的等级,如果学生成绩小于60分,count的值加1。

    第二步:返回count的值到主函数。

    2.实验代码

    int set_grade( struct student *p, int n )
    {
    	int k,count=0;
    	for(k=0;k<n;k++)
    	{
    			if(p[k].score>=85&&p[k].score<=100) p[k].grade='A';
    			else if(p[k].score>=70&&p[k].score<=84) p[k].grade='B';
    			else if(p[k].score>=60&&p[k].score<=69) p[k].grade='C';
    			else 
    			{
    				p[k].grade='D';
    				count++;
    			}	
    	} 
    	return count;
    } 
    

    (2) 本题调试过程碰到问题及解决办法

    错误:输出乱码。

    原因:将return count语句写进了for循环里,改正后答案正确。

    3.流程图

    6-2 结构体数组按总分排序

     设计思路

    (1)主要描述题目算法

    第一步:用两个for循环,外循环为第i个人的成绩总值,内循环为计算第i个人的成绩总值。

    第二步:用冒泡法排序,按总分从大到小交换。

    2.实验代码

    void calc(struct student *p,int n)
    {
        int i,j;
        p->sum=0;
        for(i=0;i<n;i++,p++)
        {
            for(j=0;j<3;j++)
            {
                p->sum=p->sum+p->score[j];
            }
        }
    }     
    void sort(struct student *p,int n)
    {
        int i,j;
        struct student t;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n-1-i;j++)
            {
            if((p+j)->sum<(p+j+1)->sum)
            {
                    t=*(p+j+1);
                    *(p+j+1)=*(p+j);
                    *(p+j)=t;    
            }        
            }
        }
    }

    (2) 本题调试过程碰到问题及解决办法

    错误:将t定义为int类型,编译器报错。

    原因:t是作为交换p指针所指的结构体数组的学生数据的“空瓶子”,定义类型要与结构体数组一样。

    本周第二次PTA作业提交列表:

  • 相关阅读:
    MySQL
    面向对象总结
    git指令
    DOS命令
    补充
    如何处理数据
    操作php数据库
    git安装方法
    git知识点/下一章是git的安装方法
    Css3属性
  • 原文地址:https://www.cnblogs.com/fengzx/p/8672569.html
Copyright © 2020-2023  润新知