第二学期第二次作业

一.PTA作业

C高级第一次PTA作业(1)

 1-1.删除字符串中数字字符

1.设计思路

(1)

第一步:设a为原数组的角标,b为所删除数字字符数组角标,令b=0;遍历数组a,当字符数组在‘0’~‘9’时不做运算,超过时,将所要删除的数字字符赋值给数                组b;

第二步:当a为结束字符时停止,添加结束字符;

第三步:返回主函数

(2)流程图

2.实验代码

   部分代码:

 1 void delnum(char *s)
 2 {
 3         int a,b=0;
 4         for(a=0;*(s+a)!='\0';a++)
 5         {
 6             if(*(s+a)>='0'&&*(s+a)<='9')
 7             {}else
 8             {
 9                 *(s+b)=*(s+a);
10                 b++;
11             }
12         }
13         *(s+b)='\0';
14 }

全部代码:

 1 #include "stdio.h"
 2 void delnum(char *s);
 3 int main ()
 4 { char item[80];
 5 gets(item);
 6  delnum(item);
 7  printf("%s\n",item);
 8  return 0;
 9 }
10 void delnum(char *s)
11 {
12         int a,b=0;
13         for(a=0;*(s+a)!='\0';a++)
14         {
15             if(*(s+a)>='0'&&*(s+a)<='9')
16             {}else
17             {
18                 *(s+b)=*(s+a);
19                 b++;
20             }
21         }
22         *(s+b)='\0';
23 }

  3.本题调试中遇到的问题

 错误信息1:

在进行遍历数组过程中,由于马虎,把‘\0’写成了‘0’;

解决办法:把‘0’改成‘0’即可;

 1-2统计子串在母串出现的次数

 1.设计思路

第一步:根据主函数中输入的母串str,子串substr,遍历母串数组,找出子串中的字母,并且计算数目。

第二步:被调函数中设c为子串在母串中出现的数目,利用if条件句求出str中出现的substr。

第三步:返回主函数,输出n;

 2.实验代码

部分代码:

 1 int fun(char *str,char *substr)
 2 {
 3         int a,c=0;
 4         for(a=0;*(str+a)!='\0';a++)
 5         {
 6             if(*(str+a)==*(substr))
 7             {
 8                 if(*(str+a+1)==*(substr+1))
 9                 {
10                     if(*(str+a+2)==*(substr+2))
11                     {
12                         c++;
13                     }
14                 }
15             }
16         }
17         return c;
18     }
19     

 全部代码:

 1 #include<stdio.h>
 2 int fun(char *str,char *substr);
 3 int main()
 4 { char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd";
 5  int n;
 6  n=fun(str,substr);
 7  printf("n=%d\n",n);
 8  return 0;
 9 }
10 int fun(char *str,char *substr)
11 {
12         int a,c=0;
13         for(a=0;*(str+a)!='\0';a++)
14         {
15             if(*(str+a)==*(substr))
16             {
17                 if(*(str+a+1)==*(substr+1))
18                 {
19                     if(*(str+a+2)==*(substr+2))
20                     {
21                         c++;
22                     }
23                 }
24             }
25         }
26         return c;
27     }
28     

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

错误信息1:

本题调试中,与上一题出现的问题相同,‘\0’写成了‘0’;忘记了返回值c;

解决方法:将‘0’改成‘、‘\0’即可,后面加上return c;

1-3字符串中除首尾字符外的其余字符按降序排列

 1.设计思路

第一步:根据主函数设出被调用函数fun;输入s;运行被调函数;

第二步:利用for循环,if条件句,根据字符大小进行排序;

第三步:若*(s+c)< *(s+b),则把b的值赋给c,若c不等于a,则进行交换。

第四步:返回主函数。

 2.实验代码 

部分代码:

 1 int fun(char *s,int num)
 2 {
 3          int a,b,c,temp;
 4          for(a=1;a<num-2;a++)
 5          {
 6              c=a;
 7              for(b=a+1;b<num-1;b++)
 8              {
 9                  if((int)(*(s+c))<(int)(*(s+b)))
10                  {
11                      c=b;
12                  }
13              }
14             if(c!=a)
15             {
16              temp=*(s+a);
17              *(s+a)=*(s+c);
18              *(s+c)=temp;
19              }
20          }
21 }

全部代码:

 1 #include <stdio.h>
 2 int fun(char *s,int num);
 3 int main()
 4 {
 5  char s[10];
 6  gets(s);
 7  fun(s,7);
 8  printf("%s",s);
 9  return 0;
10  }
11 int fun(char *s,int num)
12 {
13          int a,b,c,temp;
14          for(a=1;a<num-2;a++)
15          {
16              c=a;
17              for(b=a+1;b<num-1;b++)
18              {
19                  if((int)(*(s+c))<(int)(*(s+b)))
20                  {
21                      c=b;
22                  }
23              }
24             if(c!=a)
25             {
26              temp=*(s+a);
27              *(s+a)=*(s+c);
28              *(s+c)=temp;
29              }
30          }
31 }

 

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

错误信息1;

进行大小比较的时候,忘记对*(s+c)和*(s+b)的值进行强制转换成int类型;

解决方法:将*(s+c)和*(s+b)强制成int型。

1-4输出学生成绩

 1.设计思路

第一步:设需要用到的数据,输入学生的数量;设sum,average,max,min为float型;

第二步:对p的数据进行动态分配内存的操作;

第三步:使用for循环,指针型p接受数据,计算sum的值。

第四步:再使用for循环,min,max均为p+0;与其他数据进行比较,最后输出结果。

 2.实验代码

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int i,n;
 5     float sum=0;
 6     float average,max,min;
 7     scanf("%d",&n);
 8     float *p=(float *)malloc(n);
 9     for(i=0;i<n;i++)
10     {
11         scanf("%f",(p+i));
12       sum=sum+*(p+i);
13     }
14     min=*(p+0);max=*(p+0);
15     for(i=0;i<n;i++)
16     {
17         if(min>*(p+i))
18         {
19             min=*(p+i);
20          }
21         if(max<*(p+i))
22         {
23             max=*(p+i);
24          }
25     }
26     printf("average = %.2f\n",sum/n*1.0);
27     printf("max = %.2f\n",max);
28     printf("min = %.2f\n",min);
29 }

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

错误信息1;

 在定义数据类型的时候,sum的类型与average,max,min不同;

解决办法:把sum,average,max,min的类型都定义成double或者float。

 C高级第一次PTA作业(2)

2-1计算职工工资

 1.设计思路

(1)

第一步:构建一个数据结构,并在主函数中引用;

第二步:运用for循环输入结构的内容,并且计算所求值;

第三步:对所求值进行输出,结束;

(2)流程图

 

  2.实验代码

 1 #include <stdio.h>
 2 struct clerk
 3 {
 4   char name[10];
 5   float b,r,f;
 6   float s;
 7 };
 8 
 9 int main()
10 {
11 
12     int i,N;
13     struct clerk s1;
14     scanf("%d",&N);
15     for(i=1;i<=N;i++)
16     {
17      scanf("%s %f %f %f\n",s1.name,&s1.b,&s1.r,&s1.f);
18      s1.s =(s1.b + s1.r - s1.f);
19       printf("%s %.2lf\n",s1.name,s1.s);
20     }
21     
22   return 0;
23 }

 3.调试中遇到的问题及解决方法;

错误信息1:

 问题,在解题中,忽略了b,r,f,s的类型,以至于答案错误,

解决方法:把b,r,f,s都定义为float即可。

1-2 计算平均成绩

 1.设计思路

第一步:构建数据结构,并在主函数中引用;

第二步:新设立双精度浮点数average;整数grade;利用for循环,输入数据,并计算所有人成绩的总和grade;求出avergage,并输出;

第三步:利用for循环输出要输出的数据,结束;

 2.实验代码 

 1 #include <stdio.h>
 2 struct student
 3 {
 4   char num[6];
 5   char name[10];
 6   int grade;
 7   double average;
 8 };
 9 int main()
10 {
11   int i,N,grade,j;
12   double average;
13   scanf("%d",&N);
14   struct student si[N];
15   grade = 0;
16   for(i=0;i<N;i++)
17   {
18     scanf("%s %s %d",si[i].num,si[i].name,&si[i].grade);
19     grade = grade +si[i].grade;
20   }
21   average = (double)(grade /N);
22   printf("%.2f\n", average);
23   for(i=0;i<N;i++)
24   {
25     if(si[i].grade<average)
26     {
27       printf("%s %s\n",si[i].name,si[i].num);
28     }
29   }
30   return 0;
31 }

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

 错误信息1;

问题:本题中忽略了数组的表示方法,和average是输出时是以两个小数点的形式输出的;

解决方法:把si→si[i]即可,%lf→%.2lf即可。

C高级第一次PTA作业(3)

1.按等级统计学生成绩

1.设计思路

第一步:读题;利用for循环写出条件,设j为整形,同时以j表示不及格同学的数量。

第二步:利用if,else if条件句评定等级;

第三步:返回主函数;

2.实验代码 

    部分代码:

 1 int set_grade( struct student *p, int n )
 2 {
 3   int i,j=0;
 4   for(i=0;i<n;i++,p++)
 5   {
 6     if(p->score <60)
 7     {
 8       j++;
 9     }
10     if((p->score >=85)&&(p->score <=100))
11     {
12       p->grade = 'A';
13     }
14     else if((p->score >=70)&&(p->score <=84))
15     {
16       p->grade = 'B';
17     }
18     else if((p->score >=60)&&(p->score <=69))
19     {
20       p->grade = 'C';
21     }else
22     {
23       p->grade = 'D';
24     }
25     }
26   return j;
27 }

     全部代码:

 1 #include <stdio.h>
 2 #define MAXN 10
 3 
 4 struct student{
 5     int num;
 6     char name[20];
 7     int score;
 8     char grade;
 9 };
10 
11 int set_grade( struct student *p, int n );
12 
13 int main()
14 {   struct student stu[MAXN], *ptr;
15     int n, i, count;
16 
17     ptr = stu;
18     scanf("%d\n", &n);
19     for(i = 0; i < n; i++){
20        scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
21     } 
22    count = set_grade(ptr, n);
23    printf("The count for failed (<60): %d\n", count);
24    printf("The grades:\n"); 
25    for(i = 0; i < n; i++)
26        printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
27     return 0;
28 }
29 int set_grade( struct student *p, int n )
30 {
31   int i,j=0;
32   for(i=0;i<n;i++,p++)
33   {
34     if(p->score <60)
35     {
36       j++;
37     }
38     if((p->score >=85)&&(p->score <=100))
39     {
40       p->grade = 'A';
41     }
42     else if((p->score >=70)&&(p->score <=84))
43     {
44       p->grade = 'B';
45     }
46     else if((p->score >=60)&&(p->score <=69))
47     {
48       p->grade = 'C';
49     }else
50     {
51       p->grade = 'D';
52     }
53     }
54   return j;
55 }

 

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

  错误信息1:

 

本题中,在对学生成绩进行评定的时候,对p所代表的学生没有进行逐一检查,只排查了一名学生;

解决办法:在i++后面加上p++即可。

2.结构体数组按总分排序

1.设计思路

(1)

第一步:本题有两个函数,第一个函数目的是计算学生的总成绩,设立新的结构sum表示学生的总成绩,利用for循环进行计算;

第二步:第二个函数的目的是把学生数据按总分降序排序。新设立结构temp进行交换,利用for循环比较学生成绩的大小并且进行排序;

第三步:返回主函数;

(2)流程图

主函数:

被调函数calc

被调函数sort

 

2.实验代码

   部分代码:

 1 void calc(struct student *p,int n)
 2 {
 3     struct student sum;
 4   int i,j=0;
 5   for(i=0;i<n;i++)
 6   {
 7     for(j=0;j<3;j++)
 8     {
 9       (p+i)->sum =(p+i)->sum + (p+i)->score[j];
10     }
11   }
12 
13 }
14 
15 void sort(struct student *p,int n)
16 {
17     int i,j,a;
18     struct student temp;
19     for(i=0;i<n-1;i++)
20     {
21         a=i;
22         for(j=i;j<n;j++)
23         {
24             if(((p+a)->sum)<((p+j)->sum))
25             {
26                 a=j;
27             }
28         }
29         if(a!=i)
30         {
31             temp=*(p+i);
32             *(p+i)=*(p+a);
33             *(p+a)=temp;
34         }
35     }
36 }

    全部代码:

 1 #include <stdio.h>
 2 struct student                    
 3 {
 4 int num;
 5 char name[15];
 6 float score[3];
 7 float sum;
 8 };
 9 void calc(struct student *p,int n);     
10 void sort(struct student *p,int n);
11 int main()
12 {
13 struct student stu[5];
14 int i,j;
15 float f;
16 for(i=0;i<5;i++)
17 {
18     scanf("%d%s",&stu[i].num,stu[i].name);
19     for(j=0;j<3;j++)
20     { 
21         scanf("%f",&f);
22         stu[i].score[j]=f;
23     }
24 }
25 calc(stu,5);
26 sort(stu,5);
27 for(i=0;i<5;i++)
28 {
29     printf("%5d%15s",stu[i].num,stu[i].name);
30     printf("  %.1f  %.1f  %.1f  %.1f\n",stu[i].score[0],stu[i].score[1],stu[i].score[2], stu[i].sum);
31 }
32 return 0;
33 void calc(struct student *p,int n)
34 {
35     struct student sum;
36   int i,j=0;
37   for(i=0;i<n;i++)
38   {
39     for(j=0;j<3;j++)
40     {
41       (p+i)->sum =(p+i)->sum + (p+i)->score[j];
42     }
43   }
44 
45 }
46 
47 void sort(struct student *p,int n)
48 {
49     int i,j,a;
50     struct student temp;
51     for(i=0;i<n-1;i++)
52     {
53         a=i;
54         for(j=i;j<n;j++)
55         {
56             if(((p+a)->sum)<((p+j)->sum))
57             {
58                 a=j;
59             }
60         }
61         if(a!=i)
62         {
63             temp=*(p+i);
64             *(p+i)=*(p+a);
65             *(p+a)=temp;
66         }
67     }
68 }

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

  错误信息1:

在本题中,对学生成绩进行相加时,出现了错误。

解决办法:把p→p+i即可。

二.学习总结和进度

1.总结

这两周老师讲述了malloc,realloc,calloc及他们的应用;

学习了结构的构建和应用,用结构输入并按程序排序学生名词,利用指针进行被调用函数运算;

2.git

1.git地址:https://git.coding.net/smj031915/dexqdeczy.git

2.上传的截图:

 

3.点评的同学(点评我的同学)

王姝雯:http://www.cnblogs.com/phsudie/p/8661686.html

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

吴晓明:http://www.cnblogs.com/phsudie/p/8661686.html#3945506

点评我的同学:

王姝雯:http://www.cnblogs.com/phsudie/p/8661686.html

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

董雅洁:http://www.cnblogs.com/exo123/p/8663311.html

 

4.表格:

5.折线图:

 

posted @ 2018-04-01 19:29  莯菸  阅读(283)  评论(8编辑  收藏  举报