zoukankan      html  css  js  c++  java
  • 大一下第2次作业(markdown改)

    一、作业

    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语句判断下一个字符的ASCII码是否大于前一个字符的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)本题调试过程碰到问题及解决办法

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

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

    C高级第二次作业(1)PTA作业提交列表:

    7-2 计算职工工资

    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后答案正确。

    3.流程图

    7-3 计算平均成绩

    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]即可。

    C高级第二次作业(2)PTA作业提交列表:

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

    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.流程图

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

    1.设计思路

    (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指针所指的结构体数组的学生数据的“空瓶子”,定义类型要与结构体数组一样。

    C高级第二次作业(3)PTA作业提交列表:

    总结

    1、总结两周里所学的知识点有哪些学会了?

    1.本周新学习了结构的概念和定义、结构数组和结构指针,学会了两种结构体变量的定义方法

    (1) 先声明结构体类型再定义结构体变量名 例如

    #include<stdio.h>
    struct Student//声明结构体类型Student
    {
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char addr[30];
    }
    int main()
    {
    struct Student student1;//定义变量名
    }
    

    (2)在声明结构体类型的同时定义结构体变量名 例如

    #include<stdio.h>
    struct Student//声明结构体类型Student
    {
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char addr[30];
    }student1;//定义变量名
    

    (3)学会了如何使用结构指针 (p=Student)

    1. (*p).num
    2. p->num

    第2种在*p上加上小括号的原因是因为在默认情况下 . 运算符的优先级是比 *运算符的优先级要高的,要提升 *p 的运算优先级。

    (4)学会了如何使用指针指向结构体数组 要先使p=Student

    1.(p+i)->num p+i表示结构体数组Student第i个元素的地址
    2.若指针p指向数组的某一个元素,则p++就指向其后面元素。
    3.指针p指向数组Student,p[i]表示结构体数组Student的第i个元素 Student[i]等同于p[i] 可这样使用p[i].num

    2、没有学会的 动态内存分配

    一开始不明白为什么要使用动态内存分配(像7-1 输出学生成绩中要使用)但是我没有使用然后在编译器中运行,程序就奔溃。在网上搜索看了这篇博客 不光解释了为什么需要动态内存分配,也解释了讨论组二班陈天胤同学对我在讨论组给出的回答的疑问。

    2、Git地址

    3、点评3个同学的本周作业:

    董欣
    董雅洁
    李晓静

    学习进度表格和折线图


  • 相关阅读:
    3.Appium运行时出现:Original error: Android devices must be of API level 17 or higher. Please change your device to Selendroid or upgrade Android on your device
    3.Python连接数据库PyMySQL
    2.Python输入pip命令出现Unknown or unsupported command 'install'问题解决
    2.Linux下安装Jenkins
    5.JMeter测试mysql数据库
    Android 4学习(7):用户界面
    Android 4学习(6):概述
    Android 4学习(5):概述
    Android 4学习(4):概述
    Android 4学习(3):概述
  • 原文地址:https://www.cnblogs.com/fengzx/p/8735254.html
Copyright © 2011-2022 走看看