C语言——第二次作业

题目6-7 删除字符串中数字字符##

1.设计思路
(1)主要描述题目算法
第一步:本题要求设计一个删除数字字符的调用函数,我的思路是在用户输入元素后额外定义一个数组,将非数字字符存到额外数组里,再将这些字符覆盖到输入的指定数组。
第二步:定义数组temp以及变量i、j。利用while循环将非数字字符与数字字符分离。再利用一次while循环将非数字字符覆盖到所需数组内,最后根据temp的长度结束s。
2.实验代码

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

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

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

1.设计思路
(1)主要描述题目算法
第一步:本题要求设计计算子串在母串中出现的次数的函数。
第二步:从母字符串中的第一个字符开始寻找与子字符串第一个字符相同的子串,然后从第二个字符开始,直到母字符串结束。
(2)流程图
主函数:

调用函数:

2.实验代码

int fun(char *str,char *substr)
{
  int num=0;
  char *a;
  char *b;
  while(*str!='\0')
  {
    a=str;
    b=substr;
    while((*a==*b)&&(*a!='\0')&&(*b!='\0'))
    {
        a++;
        b++;
    }
    if(*b=='\0')
    {
      num++;
    }
    str++;
  }
  return num;
}

3.本题调试过程碰到问题及解决办法
开始时直接用str与substr在程序中运算导致运算超时,通过上网查询使用字符串辅助指针a、b后答案正确。

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

1.设计思路
(1)主要描述题目算法
第一步:本题要求设计函数将字符串中除首尾元素外的元素按降序排序。
第二步:利用双循环结构,第一次循环表示循环的趟数,第二次的循环将较小值向前移动。最后得到目标字符串。
2.实验代码

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

3.本题调试过程碰到问题及解决办法
本题因标点问题编译错误,已改正。

题目7-1 输出学生成绩##

1.设计思路
(1)主要描述题目算法
第一步:定义题目需要的变量,输入N。
第二步:申请N个双精度长度的空间,将首地址赋值给p。
第三步:利用循环输入成绩并算出成绩的总和。
第四步:将首地址的元素赋给最大/最小值,利用循环找出最大/最小值,将其赋给max,min。
第五步:成绩总和除以个数N得到平均值,按格式输出。
第六步:释放改动态内存。
2.实验代码

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int N;
    double sum=0,max,min,avg,*p;
    int i;
    scanf("%d",&N);
    if((p=(double *)calloc(N,sizeof(double)))==NULL)
    {
        printf("Not able to allocate memory.\n");
        exit(1);
    }
    for(i=0;i<N;i++)
    {
        scanf("%lf",p+i);
        sum=sum+*(p+i);
    }
    max=*p,min=*p;
    for(i=0;i<N;i++)
    {
        if(*(p+i)>max)
        {
          max=*(p+i);
        }
        if(*(p+i)<min)
        {
          min=*(p+i);
        }
    }
    avg=sum*1.0/N;
    printf("average = %.2lf\n",avg);
    printf("max = %.2lf\n",max);
    printf("min = %.2lf\n",min);
    free(p);
}

3.本题调试过程碰到问题及解决办法
本题上学期做过,但此次新增了动态内存的运用,这部分不是很了解,通过询问同学得到了运用方法,但有照搬照抄的成分,以后会多了解其用法。

题目7-1 计算职工工资##

1.设计思路
(1)主要描述题目算法
第一步:定义结构体,给定N个职员的信息,包括姓名、基本工资、浮动工资和支出。
第二步:定义相关变量i,n,定义结构变量。输入n。
第三步:本题没有计算过程,按格式输入与输出即可。通过for循环实现多名员工信息的输入,输出。
(2)流程图
结构体:

主函数:

2.实验代码

#include<stdio.h>
struct pay
{
  char name[20];
  float ji,fu,out;
};
int main()
{
  int i=0,n; 
  struct pay pay[1000];
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    scanf("%s %f %f %f",pay[i].name,&pay[i].ji,&pay[i].fu,&pay[i].out);
  }
  for(i=0;i<n;i++)
  {
    printf("%s %.2f\n",pay[i].name,pay[i].ji+pay[i].fu-pay[i].out);
  }
}

3.本题调试过程碰到问题及解决办法
刚编译时定义结构变量只定义了容量为一的变量导致只能输入和输出一名职工的信息,导致错误,后来学习到定义结构数组,正确。

题目7-2 计算平均成绩##

1.设计思路
(1)主要描述题目算法
第一步:定义结构体,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数)
第二步:定义相关整形变量n,i,sum与浮点型变量aver,定义结构数组。输入n。
第三步:通过for循环输入所需的信息,计算出成绩和sum。
第四步:求出平均值。
第五步:按格式输出。
2.实验代码

#include<stdio.h>
struct student
{
  char num[6];
  char name[11];
  int score;
};
int main()
{
  int n,i=0;
  int sum=0;
  double aver;
  struct student students[10];
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    scanf("%s %s %d",&students[i].num,students[i].name,&students[i].score);
    sum+=students[i].score;
  }
  aver=sum/n*1.0;
  printf("%.2lf\n",aver);
  for(i=0;i<n;i++)
  {
    if(students[i].score<aver)
    {
      printf("%s %s\n",students[i].name,students[i].num);
    }
  }
}

3.本题调试过程碰到问题及解决办法
定义结构信息的时候最后的“}”后面忘记加分号导致编译错误,以后注意。

题目6-1 按等级统计学生成绩##

1.设计思路
(1)主要描述题目算法
第一步:本题要求设计函数,根据学生成绩设置其等级,并统计不及格人数。
第二步:定义变量i,fail(不及格数)。利用if条件语句把各段成绩分开,将各分段对应的字母赋给grade,并在计算不及格分段时计算不及格人数(fail++)。
(2)流程图
结构体:

主函数:

调用函数:

2.实验代码

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

3.本题调试过程碰到问题及解决办法
取值范围弄串导致答案错误,已改正。

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

1.设计思路
(1)主要描述题目算法
第一步:本题要求设计两个函数,第一个calc函数要求计算每名学生的总分,第二个sort函数要求按每名学生的总分从高到低对总分进行排序。
第二步:calc函数:定义变量i=0.利用for循环将结构体数组中每名学生的三门成绩求和。
第三步:sort函数:定义变量i=0,j=0,定义结构变量swap作为交换变量。利用双循环将n名学生的总分按降序排序。
2.实验代码

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

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

提交列表##






1.学习总结和进度
对指针的运用有了更多的了解。主要是学习了结构体这个全新的知识点。带有结构体的函数中,定义结构体数组再运用较为频繁,需要强加练习。
此外上课时还讲解了动态内存的分配,不过没有听明白,只能根据PPT中的内容和请教同学来使用,后续应该自己去查找具体的内容学习。
2.git地址: https://git.coding.net/ZJY15/ZJY15.git

3.点评
点评同学
丰大为: http://www.cnblogs.com/DavidPark/p/8664273.html
高立彬: http://www.cnblogs.com/gao628526/p/8665187.html
董雅洁: http://www.cnblogs.com/exo123/p/8663311.html

4.图表

posted @ 2018-04-08 19:45  张金禹  阅读(442)  评论(8编辑  收藏  举报