2018上C语言程序设计(高级)作业- 第2次作业

作业要求一 :

提交列表:

 

作业要求二:

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

1.设计思路

(1)主要描述算法:

第一步:根据函数接口定义和要求可知本题要起实现删除一个字符串中的所有数字字符

第二步:首先定义一个数组,i和m。在for循环语句中判断,如果*(s+i)在0和9之间输出,否则继续执行。 

第三步:直到*(s+m)='\0'结束

(2)流程图:

主函数:

调用函数 delnum:

 

2.实验代码:

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

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

 

遇到的问题1:if语句出现了错误,没有将数字用单引号表示。

改正方法:加上引号之后错误就没有了。

遇到的问题2:for语句的判断条件中,等于和不等于条件弄反了。

改正方法:应该是*(s+i)!='\0'

 

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

1.设计思路

主要描述算法:

第一步:根据函数接口定义和要求可知本题要编写一个函数,该函数可以统计一个长度为3的字符串在另一个字符串中出现的次数。

第二步:首先定义两个char类型的数组,分别是输入的字符串和要求统计的字符串。

第三步:通过指针传递,调用fun函数,利用for循环和if语句判断,如果*(str+i)!='\0'成立,且if中各项成立,则count++,否则不执行。

第四步:返回主函数,输出出现次数。

2.实验代码:

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

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

遇到的问题1:将for语句中的*(str+i)!='\0'的情况判断成*(str+i)='\0',导致编译答案错误

改正方法:加上一个“!”符号,运行成功。

 遇到的问题2:没有将调用函数返回主函数。

改正方法:将return count写入程序,编译成功。

 

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

1.设计思路:

主要描述算法:

第一步:根据函数接口定义和要求可知本题要编写函数fun,对字符串中除首、尾字符外的其余字符按降序排列。

第二步:首先定义一个char类型的数组,储存输入的字符串。

第三步:通过指针传递,调用fun函数,对字符指针所指的字符串中除首、尾字符外的其余字符按降序排列。

第四步:返回主函数,输出s.

2.实验代码;

int fun(char *s,int num)
{
         int i,m,n,temp;
         for(i=1;i<num-2;i++)
         {
             n=i;
             for(m=i+1;m<num-1;m++)
             {
                 if((*(s+n))<(int)(*(s+m)))
                 {
                     n=m;
                 }
             }
            if(n!=i)
            {
             temp=*(s+i);*(s+i)=*(s+n);*(s+n)=temp;
             }
        }
         return 0;
     }

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

遇到的问题:不明白为什么要在for循环里用i<num-2

改正方法:翻看上学期的讲的内容,又问了同学,解决了这个问题。

 

7-1 输出学生成绩:

1.设计思路:

主要描述算法

第一步:根据函数接口定义和要求可知本题要根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。

第二步:首先定义学生个数,平均数,最大值,最小值。对n赋值,将指针变量p定义为浮点型,通过malloc函数申请连续内存空间n

第三步:输入n个数据赋值给*(p+i),求出sum,通过for循环找出成绩最大值赋给max,成绩最小值赋给min,最后输出平均数 最高成绩和最低成绩。

2.实验代码:

#include <stdio.h>
int main()
{
    int i,n;
    float sum=0,average,max,min;
    scanf("%d",&n);
    float *p=(float *)malloc(n);
    for(i=0;i<n;i++)
    {
        scanf("%f",(p+i));
        sum=sum+*(p+i);
    }
    min=*(p+0);
    max=*(p+0);
    for(i=0;i<n;i++)
    {
        if(min>*(p+i))
        {
            min=*(p+i);
        }
        if(max<*(p+i))
        {
            max=*(p+i);
        }
    }
    printf("average = %.2f\n",sum/n*1.0);
    printf("max = %.2f\n",max);
    printf("min = %.2f\n",min);
    return 0;
}

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

遇到的问题:由于之前没有用average,而在输出的时候却用了,导致答案错误。

改正方法:应将average改成用sum表示的平均数。

 

7-1 计算职工工资:

1.设计思路;

(1)主要描述算法:

第一步:本题是要求用结构的方式,来计算工资。就要用到结构体 struct...

第二步:首先在主函数前面定义结构struct staff,其中包含姓名及工资信息。

第三步:在主函数内定义结构变量struct staff s1,在for循环里输入并打印工资信息,如s1.num。通过计算,输出职工工资。

(2)流程图:

 

2.实验代码;

#include <stdio.h>
//#include <stdlib.h>
 struct staff
 {
     char name[10];
     float b,f,out;
     float reality;
 };
 int main()
 {
     int i,n;
     struct staff s1,reality;
     scanf("%d",&n);
     for(i=1;i<=n;i++)
     {
        scanf("%s %f %f %f",s1.name,&s1.b,&s1.f,&s1.out);
        s1.reality=(s1.b+s1.f-s1.out);
        printf("%s %.2f\n",s1.name,s1.reality);
    }
    
     return 0;
 }

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

 

遇到的问题1:将printf("%s %.2f\n",s1.name,s1.reality)写在for循环外面,结果是边输入边输出,答案不符合要求

改正方法:将printf("%s %.2f\n",s1.name,s1.reality)写在for循环外面,编译成功。

遇到的问题2:公式中的符号用错了。

改正方法:仔细看了遍公式,编译成功。

 

7-2 计算平均成绩;

1.设计思路:

主要描述算法:

第一步:本题是要求用结构的方式,来计算学生成绩。用到结构体 struct...

第二步:首先在主函数前面定义结构struct student,其中包含姓名及学生基本信息。

第三步:在主函数内定义数组结构变量struct student s1[N],在for循环里输入并打印学生基本信息。计算总和。计算平均值。在另一个for循环里,将每个人的成绩与平均值进行比较,输出小于平均值的学生信息。

2.实验代码:

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

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

遇到的问题:在定义数组的时候,出现段错误。

改正方法:再看了讨论小组的讨论后明白如果定义的数组长度不够就会出现段错误的情况。

 

6-1 按等级统计学生成绩:

1.设计思路:

(1)主要描述算法

第一步:本题是要求用结构数组指针的方式实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。

第二步:定义结构体类型变量,结构体名为student,结构体中的成员包括整型num,字符数组name[20],整型score和字符型grade。定义结构体变量名为stu[10],*ptr。

第三步:调用set_grade函数,将函数返回count。在set_grade函数中,通过for循环判断p->score是否<60,成立m++,否则不执行。再判断等级,返回m的值。输出个数,每个人的学号、姓名、等级。

(2)流程图:

2.实验代码:

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

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

遇到的问题1:在执行else时,没有给出另一种情况的语句。

改正方法:要在for后给出else if 的判断语句。

 

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

1.设计思路:

主要描述算法

第一步:本题是要求用结构数组指针的方式实现按成绩总和从高到低对数据进行排序。

第二步:本题有两个调用函数,1.调用calc函数,在calc函数中通过两个for循环求出各自分数总和(p+i)->sum的值;2.调用sort函数,在sort函数中定义整型i,j,m,定义结构体变量,变量名为temp,通过选择排序法对这组数据进行排序

第三步:输出成员的学号,姓名,各科的分数和总分。

2.实验代码:

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

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

遇到的问题:在求分数和的时候,把数组score写成了单个数组

改正方法:应改为score[j].

 

学习总结和进度:

1、总结两周里所学的知识点有哪些学会了?(可记录每道作业题目所用的知识点)哪些还没有学会?

这两周主要学习了结构以及有关结构的应用。首先学习的就是对结构体的概念和定义,学到了结构要定义在主函数外面,而且在运用时要定义结构变量。之后学习到结构数组,还有结构与指针的结合,学到了一个重要的结构指针引用格式p->结构成员名。

在做前两次的pta时觉得还可以理解,但是第三次的时候就感觉有些困难了,证明还是掌握的不熟练,要多加练习。

git的地址:https://git.coding.net/Aspirer1/C2.git

 

点评同学:

孙铭婧:http://www.cnblogs.com/sun031915/p/8687824.html

张心悦:http://www.cnblogs.com/zxy980612/p/8696690.html

吴晓明:http://www.cnblogs.com/gu-an-cheng-wxm/p/8697025.html

学习进度表:

 

 

posted @ 2018-04-07 20:25  Suzy.F  阅读(1565)  评论(8编辑  收藏  举报