zoukankan      html  css  js  c++  java
  • 2018上第二次作业

    要求一:完成PTA作业

    答:作业已经完成!

    要求二:pta作业编程题目的解题思路和调试过程记录

    C高级第二次作业(1)

    完成情况如图:

    第一题:删除字符串中数字字符

    1.设计思路:

    (1)算法:
    第一步:把i,j设置为整形变量,i=0;
    第二步:当s[i]不是的时候(若是,则返回主函数),判断s[i]是否是数字,如果不是,则i++,再重新循环;
    第三步:如果s[i]是数字,把i赋值给j,再当s[j]不是的时候,把s[j+1]赋值给s[j],再j++,然后返回主函数,如果s[j]是的时候,则直接返回主函数,(因此用continue)。
    (2)流程图:
    略。

    2.实验代码:

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

    3.本题调试过程碰到问题及解决的办法:

    问题:本题最开始忘写了i++
    解决办法:后来补充上,正确。

    第二题:统计子串在母串出现的次数

    1.设计思路:

    (1)算法:
    第一步:定义i,j,k,num为整形变量,num=0;
    第二步:写第一个for循环遍历母串,第二个for循环是找到母串与子串相等的加一;
    第三步:在第二个for循环里判断substr[k+1]是否为,若是,则num++,跳出循环;
    第四步:返回num的值。
    注意:本题当遇到substr[k]==str[j]时不能加一,因为此时只是一个元素相等,需要等到字串轮玩一遍都相等时才可以加一。
    (2)流程图:
    略。

    2.实验代码:

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

    3.本题调试过程碰到问题及解决的办法:

    问题:本题一开始写的当substr[k]==str[j]时我就计数了。
    解决办法:后来读题分析,懂得只有字串全轮一遍都相等才能计数,改正即可。

    第三题:字符串中除首尾字符外的其余字符按降序排列

    1.设计思路:

    (1)算法:
    第一步:设a=0, b=0, k=0, n=0,且为整形变量,t为字符变量;
    第二步:第一个for循环,如果s[n]是'',则跳出循环,此步骤表明了n的大小;
    第三步:采用排序法降序;
    (2)流程图:
    略。

    2.实验代码:

    int fun(char *s,int num)
    {
        int a=0, b=0, k=0, n=0;
        char t;
        for(n=0;;n++)
        {
            if(*(s+n)=='')break;
        }
        n--;
            for(a=1;a<n-1;a++)
            {
                for(b=a;b<n;b++)
                {
                    if(*(s+a)<*(s+b))
                    {
                        t=*(s+a);
                        *(s+a)=*(s+b);
                        *(s+b)=t;
                    }
                }
            }
    }
    

    3.本题调试过程碰到问题及解决的办法:

    问题:对于排序法不太熟练,由于首尾不用排,造成了错误。
    解决办法:首尾不用排,因此a=1,从1开始,结尾到n,就是到s[n],而不是s[n+1]。

    第四题:输出学生成绩

    1.设计思路:

    (1)算法:
    ①由于提交前不会动态分配内存,因此本题用一般方法写的;
    ②本题是学生成绩,成绩最高是100分,所以设的min开始值为100。
    第一步:定义n,i为整形变量,max,min,sum,a为double型,且max,min,sum为0;
    第二步:输入n,n为学生人数,用for循环输入学生成绩再用if语句,当遇到比max大的数就赋值给max,比min小的数就赋值给min;
    第三步:在for中求和,出for循环用sum除以人数就是平均数,输出平均数,最大最小值。
    注意:最后输出的结果要保留两位小数。
    (2)流程图:

    2.实验代码:

    #include <stdio.h>
    int main()
    {
        int n,i;
        double max=0,min=100,sum=0,a;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%lf",&a);
            if(a>max){
            max=a;
    }
            if(a<min){
           min=a;
    }
            sum=sum+a;
        }
        printf("average = %.2lf
    ",sum/n);
        printf("max = %.2lf
    ",max);
        printf("min = %.2lf",min);
    
        return 0;
    }  
    

    3.本题调试过程碰到问题及解决的办法:

    问题:本题的for循环的括号未把求和括进在内。
    解决办法:把sum求和括进去,修改成功。

    C高级第二次作业(2)

    完成情况如图:

    第一题:计算职工工资

    1.设计思路:

    (1)算法:
    第一步:该题用到新学的知识结构。先创建一个结构,包含名字,基本工资,实发工资,浮动工资,支出;
    第二步:定义几个整形变量,n为人数。输入n,再用结构定义一个数组a[n],用for循环输入工作者的信息;
    第三步:求出实发工资写入循环里,再用一个for循环输出。
    (2)流程图

    2.实验代码:

    #include <stdio.h>
    struct people{                              
       char name[10];                 
       double sfgz,jbgz,fdgz,zc;               
    }; 
    int main()
    {
      int i,n,j;
      scanf ("%d", &n);
      struct people a[n];    
      for(i=0;i<n;i++){
    	scanf ("%s%lf%lf%lf",&a[i].name,&a[i].fdgz,&a[i].jbgz,&a[i].zc);
      a[i].sfgz=a[i].fdgz+a[i].jbgz-a[i].zc;
    }
    for(j=0;j<n;j++){
    printf("%s %.2lf
    ",a[j].name,a[j].sfgz);
    }
    return 0;
    }
    

    3.本题调试过程碰到问题及解决的办法:

    问题:
    解决办法:问题是由于我不明白数组有多少个,后来想到先在前面写输入员工个数n,那么数组元素个数就迎刃而解了。

    第二题:计算平均成绩

    1.设计思路:

    (1)算法:
    第一步:读题。通过题目可得,本题是计算学生的平均成绩,并写出平均线以下的学生的信息;
    第二步:先创建一个结构,定义a[n]为结构变量,i,j,n为整形变量,n为学生人数,sum,average为浮点型变量;
    第三步:通过for循环读入学生信息,并且求出学生成绩之和;
    第四步:求出平均值(总和除以人数),在通过for循环,使得每名学生的成绩与平均值比较,如果比平均值小则输出其学生的部分信息。
    (2)流程图:

    2.实验代码:

    #include <stdio.h>
    struct student{
      char name[10],num[5];
      double chengji;
    };
    int main()
    {
      int i,j,n;
      double sum=0,average;
      scanf("%d",&n);
      struct student a[n];
      for(i=0;i<n;i++){
        scanf("%s %s %lf",&a[i].num,&a[i].name,&a[i].chengji);
        sum=sum+a[i].chengji;
    }
      average=1.0f*sum/n;
      printf("%.2lf
    ",average);
    for(j=0;j<n;j++){
    if(average>a[j].chengji){
    	printf("%s %s
    ",a[j].name,a[j].num);
    }
    }
       return 0;
    }
    

    3.本题调试过程碰到问题及解决的办法:

    问题:
    解决办法:经过检查,就是最后少了一个},补充上即可。

    C高级第二次作业(3)

    完成情况如图:

    第一题:按等级统计学生成绩

    1.设计思路:

    (1)算法:
    第一步:读题目和子函数。题目是让写出子函数。而子函数起的作用就是统计低于60分以下的个数和给不同分数的学生划分层次;
    第二步:统计60分以下的人数的算法。统计此人数就是设一个整形变量为0,期待计数器的作用,然后通过for循环得到的所有学生信息,再用if语句遇到低于60分的成绩计数器就加1;
    第三步:划分等级也是用if语句。在for循环里,85-100为A,70-84为B,60-69为C,0-59为D,用if语句一一列出即可。
    ①本题用到了新学的知识,即->,本题p是指针,p->score就是指结构数组中score的地址所存储的值;
    ②注意本题的p++,表示每循环一次p加1,即表示此时结构数组到下一个元素。
    (2)流程图:
    略。

    2.实验代码:

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

    3.本题调试过程碰到问题及解决的办法:

    问题:
    解决办法:经过思考得到。由图中看出,我所写的是有很大问题的。在循环学生信息的时候,要想循环到下一个,i加1是没用的,关键是p要加1,这样才能循环到下一位同学信息,否则只能是一个同学的信息循环十次。想要实现p+1,可以在for循环中写上p++,也可以在每一个有p的代码中写p+i,这样都保证了每轮循环结束后p都加1。

    第二题:结构体数组按总分排序

    1.设计思路:

    (1)算法:
    第一步:读题目。本题有两个调用函数,一个是要求每名同学的成绩总和;一个是把学生总分按照从大到小排序;
    第二步:看主函数。主函数主要就是输入学生的信息,再通过调用函数对信息进行处理后输出;
    第三步:写的调用函数。求总和。为了不再有局限性,用for循环求学科总和,不能学科一多就一直写个没完;排序用的选择排序法。
    注意:在用循环学科求总和的时候,p->sum是没赋值的,要让每位同学最开始的和为0,做一个赋值。我在书写中习惯在最开始的循环写p++,这样省着以后麻烦(和在循环里面写p+i效果一样),因此在我的代码中 for(i=0;i<n;i++,p++){p->sum=0;}有这样一个赋值。再一个要注意的点就是排序的是根据总分排,而且是整体排,不能只排分数。
    (2)流程图:

    主函数:

    被调函数calc:

    被调函数sort:

    2.实验代码:

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

    3.本题调试过程碰到问题及解决的办法:


    问题:都画在图中了,都是通过dev-c++找到的。
    解决办法:思考。赋值是错的,这么写就相当于定义一个新的变量赋值为0,而不是每位同学在累加成绩前的总和为0,应该改为 p->sum=0,这么写的前提是for循环里存在i++,p++;在一个就是if语句那里多写了个符号,删掉即可。

    要求三:学习总结和进度

    1、总结两周来所有PTA作业中每个题目所使用的知识点。(我学到了什么,未学会什么?)

    这两周复习指针 学习了结构以及结构数组和结构概念,还学习了动态分配内存。作业1主要是指针,动态分配内存,作业2是结构数组,作业三是结构指针。这两周我学到了结构这一概念,懂得用结构数组和结构指针进行做题,未学到的是对于这些知识点不熟练,希望熟能生巧,另外不会动态分配内存。

    2、将PTA作业的源代码使用git提交到托管平台上。

    (1)提交证明:

    (2)Git地址:https://git.coding.net/jsjyuyaosong/usth--work.c.git

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

    1.徐铭博:http://www.cnblogs.com/xmb1547828350/p/8657376.html
    2.高立彬:http://www.cnblogs.com/gao628526/p/8665187.html
    3.史泽文:http://www.cnblogs.com/shilcz/p/8696341.html

    4、学习进度表


    IT小白
  • 相关阅读:
    实验楼挑战赛(1)-实现不可修改字典
    python django前端界面实现数据库数据excel导出
    python2中range和xrange的异同
    python的json模块的dumps,loads,dump,load方法介绍
    ajax500错误
    伪元素小tips
    使用css3制作蚂蚁线
    chardet坑——比蜗牛还慢
    Flask的socket.error:10053
    chrome插件开发-消息机制中的bug与解决方案
  • 原文地址:https://www.cnblogs.com/jsjyys/p/8672972.html
Copyright © 2011-2022 走看看