第二次作业

作业要求二

第一次PTA

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

1.设计思路

(1).描述算法:

      第一步:阅读题目,明确题意要求。
      第二步:找到对应函数中的实参和形参并写出函数接口。
      第三步:重新定义一个指针变量*a,对*s中的字符进行遍历。
      第四步:若s[]中的字符不在‘0’到‘9’中,则将字符储存在a[]中。

(2).流程图:

2.实验代码:

void delnum(char *s)
{   int i,j;
    char *a=s;
    for(i=0,j=0;s[i]!='\0';i++)
    {
	     if(s[i]<'0'||s[i]>'9')
	     {
	 	    a[j]=s[i];
	 	    j++;
	     } 
    }
    a[j]='\0' ;
} 

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

     错误信息:答案错误。
     错误原因:在储存字符串结束后,没有加结束标志'\0';没有将指针*a指向s最后输出的还是原来的字符串。
     改正方法:在循环结束后,加一个a[j]='\0';定义指针字符串时,让其指向s。

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

1.设计思路

(1).描述算法:

      第一步:阅读题目,明确题意要求。
      第二步:找到对应函数中的实参和形参并写出函数接口。
      第三步:遍历一次母串,并且母串的遍历的每一个字符都要和字串的第一个字符比较,如果相等的话,这时候母串和字串开始同时遍历。
      第四步:当满足一次子串能够遍历到结束符的时候,说明子串出现,num++;

2.实验代码:

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

3.本题调试过程碰到的问题和解决办法(无)

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

1.设计思路

(1).描述算法:

      第一步:阅读题目,明确题意要求。
      第二步:找到对应函数中的实参和形参并写出函数接口。
      第三步:从s中的第二个字符元素开始经行遍历,直到倒数第二个字符元素(也就是第一个和最后一个字符元素不进行判断)。
      第三步:然后再让相邻的两个字符元素进行比较,若是s[i]>s[i-1],重新定义一个字符串,进行交换,否则i++,继续判断。

2.实验代码

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

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

错误信息:

错误原因:

改正方法:

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

1.设计思路:

(1)描述算法:

              第一步:输入人数n;
              第二步:分别输入n个人的分数,并求和;
              第三步:用一次循环,比较出n个人分数的最大值,最小值;
              第四步:按题意输出。

2.实验代码:

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

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

第二次PTA

题目7-1 计算职工工资

1.设计思路:

(1).描述算法:

       第一步:定义结构类型。
       第二步:输入人数n,再用一个for循环输入n个职员的信息。
       第三步:for循环分别输出每位职员的实发工资。

2.实验代码:

#include <stdio.h>
  struct staff
{
	char name[1000];
	float  fixation;
	float  floating;
	float  outlay;
	float  salary;
}a[1000];
int main()
{

	int i,n;
	scanf("%d",&n);

	for(i=0;i<n;i++)
	{
		scanf("%s%f%f%f",a[i].name,&a[i].fixation,&a[i].floating,&a[i].outlay);
		a[i].salary=a[i].fixation+a[i].floating-a[i].outlay;
	 	 
  }
  for(i=0;i<n;i++)
  {
    printf("%s %.2f\n",a[i].name,a[i].salary); 
  }
 return 0;
}

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

   错误信息:部分错误
   错误原因:定义的数组过小
   改正方法:将name[10],a[10]改为name[1000],a[1000].

题目7-2 计算平均成绩

1.设计思路:

(1).描述算法:

      第一步:定义结构类型
      第二步:输入人数n,再用一个for循环输入每个人的信息,并求出总的分数和。
      第三步:在for循环中判断是否每个人的分数小于平均数,若小于则输出名字和学号。

(2).流程图:

2.实验代码:

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

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

 (1)错误信息:编译错误。
          错误原因:sum定义成了结构类型。
          改正原因:因为sum是所有人的分数和,所以不能定义成结构类型,应该定义成整型。
 (2)错误信息:格式错误
          错误原因:在输出后没有加‘\n’。

第三次PTA

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

1.设计思路

(1).描述算法:

       第一步:阅读题目,明确题意要求。
       第二步:找到对应函数中的实参和形参并写出函数接口。
       第三步:在for循环中,遍历每个学生的成绩,然后做判断。
       第四步:根据判断,确定成绩等级。

(2).流程图:

2.实验代码:

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

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

   错误信息:答案错误
   错误原因:if做判断时,没有考虑到1-100内的所有数字。
   改正方法:认真检查哪里需要加“=”号,哪里不需要。

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

1.设计思路

(1).描述算法:

       第一步:阅读题目,明确题意要求。
       第二步:找到对应函数中的实参和形参并写出函数接口。
       第三步:函数calc:使用一个for循环遍历每个学生的成绩,计算出每名学生的总分。
       第四步:函数sort:使用冒泡排序法对学生总成绩按降序排序。

2.实验代码:

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

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

错误信息:编译错误
错误原因:

改正方法:

进行交换的是(p+i)和(p+i+1)的值,而不是地址。

作业要求三

1.总结。

 (1).这两周主要学会了结构体:结构体的定义,结构体类型的定义,结构体变量的定义,结构体初始化以及结构体的引用。
 (2).上两周学的指针在这几次作业中有应用,也比刚学的时候熟悉很多。

2.git托管平台。

https://github.com/Vinecy666/C-/tree/master

3.点评。

王文博
李伍壹
马钰娟

4.统计.

posted @ 2018-03-27 20:57  申怡苗  阅读(448)  评论(13编辑  收藏  举报