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小白
原文地址:https://www.cnblogs.com/jsjyys/p/8672972.html