第二次作业

pta第二次作业(1)题目6-7 删除字符串中数字字符

1.设计思路

(1)主要描述题目算法

第一步:通读题意,仔细理解
第二步:定义 i,j,指针变量b;
第三步:利用for循环遍历数组,直到出现空格为止
第四步:判断如果
(s+i)是满足条件的就将该值赋给(b+j),直到(b+j)='\0'结束

(2)流程图

2.实验代码

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

3.错误及解决办法

错误信息:没有char b=s,因为题目最中返回的还是(s+i)
改正方法:初始将*b指向s

题目pta第二次作业(1)6-8 统计子串在母串出现的次数

1.设计思路

(1)主要描述题目算法

第一步:通读题目,理解题意
第二步:定义i,j=0,count;
第三步:利用for循环遍历数组,直到出现回车换行为止,如果str[i]substr[j]&&str[i+1]substr[j+1]&&str[i+2]==substr[j+2],则计数+1
第四步:返回count

(2)流程图

2.实验代码

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

3.错误信息及改正方法

错误1:多加了一个关于j的for循环
改正:去掉这个for循环 ,因为j是有范围的
错误2:没有返回count
改正:返回

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

1.设计思路

(1)主要描述题目算法

第一步:通读题目,理解题意
第二步:调用函数,定义整型i,j,t
第三步:利用for循环遍历数组,除去第一个和最后一个数

2.实验代码

int fun(char *s,int num)
{
    int i,j,t;
    for(i=1;i<num-1;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).主要描述基本算法

第一步:通读题目,理解题意
第二步:定义整型i,n,p,float型 average,max,min,sum,读入n
第三步:动态分配数组
第四步:将
p分别赋给最大值,最小值
第五步:利用for循环遍历数组,读入p+i,进行判断,找到数组中的最大值与最小值
第六步:输出平均值和最值,释放

2.实验代码

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

3.错误信息及改正方法

错误信息:没有错误

pta第二次作业(2)7-1 计算职工工资

1.设计思路

(1)主要描述题目算法

第一步:通读题目,理解题意
第二步:定义一个结构体变量student ,里面定义char name[11],double c1,double c2,double c3
第三步:引用这个结构体,定义一个较大的数据1000,定义整型i,n,double 型p来表表示最终的工资,读入一个整数n
第四步:利用for循环遍历数组,读入姓名和c1,c2,c3,用p表示出最终基本工资的计算结果,输出这个结果,并使p重新归零

(2)流程图

2.实验代码

#include <stdio.h>
struct student {
  char name[11];
 double c1;
double c2;
 double c3;
};
int main()
{
 struct student s[1000];
 int n,i;
 double  p;
 scanf("%d\n",&n);
 for(i=0;i<n;i++){
  scanf("%s %lf %lf %lf",s[i].name,&s[i].c1,&s[i].c2,&s[i].c3);
  p=s[i].c1+s[i].c2-s[i].c3;
  printf ("%s %.2lf\n",s[i].name,p); 
  p=0;
 }

 return 0;
}

3.错误及解决办法

错误信息:没有错误

pta第二次作业(2)7-2 计算平均成绩

1.设计思路

(1)主要描述题目算法

第一步:通读全文,理解题意
第二步:定义一个结构体student里面包括的定义char num[6],char name[11],float grade
第三步:定义整型i,n,利用for循环遍历数组,输入结构体里的学号,姓名,成绩,并计算平均值并输出
第四步:利用for循环进行对比将小于平均值的信息输出

2.实验代码

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

 }

3.错误信息及改正

错误信息:

改正方法:num是字符数组,用char定义,s[i].name即表示首地址吗,不用加&,注意字符数组里要包括一个\0结束符,多定义一个

pta第二次作业(3)6-1 按等级统计学生成绩

1.设计思路

(1).主要描述题目算法

第一步:通读题目,找到需要定义的变量,因为需要记录不及格人数故需要定义变量count,需要通过for循环找到不及格的人,所以定义变量i来遍历数组
第二步:利用if语句判断等级,进行划分
第三步:返回所求的变量

(2).流程图

2.实验代码

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

3.错误及改正方法

错误一:
改正方法:指针没有下移需要下移指针

pta第二次作业(3)6-2 结构体数组按总分排序

1.设计思路

(1).主要描述题目算法

第一步:通读题意,先调用一个计算总分函数,需要利用for循环来遍历数组,求出每个人的总分,所以定义变量i
第二步:调用第二个函数来排序,排序思路冒泡排序法

2.实验代码

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

3.错误信息及改正方法

错误信息1:
改正方法:定义t为int型,它是不能和结构体类型进行交换的,应该定义为结构体类型
错误信息2:又定义了sum[]数组
改正方法:取消定义,根据指针的移动,变量也会移动,不需要通过再次定义数组来遍历

1.总结知识点

1>字符串的使用,指针与排序法的组合
2>结构体变量的应用
3>通过指针下移变量,函数与指针的组合,交换结构体里的变量要定义t为结构体变量

2.代码托管

托管界面

3.点评作业

马钰娟
李伍壹
申怡苗
杨金坤
4.本周学习情况

posted @ 2018-03-29 20:37  李新华  阅读(394)  评论(10编辑  收藏  举报