代码改变世界

第2次作业

2018-04-01 18:43  金海宽  阅读(246)  评论(4编辑  收藏  举报

PTA

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

1.实验代码

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

2.设计思路
第一步:设置循环,查看字符串中元素,判断字符是否为数字。
第二步:将不是数字的元素留下。
第三步:将'\0'赋给最后字符串的最后一项。
3.流程图

4.本题调试过程碰到问题及解决办法
错误信息:
错误原因:将'\0'写成'/0'。
改正方法:改了过来,写成'\0'。

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

1.实验代码

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

2.设计思路
第一步:设置一个循环体,查看字符串。
第二步:设置if语句,当遇到第一个字符匹配时,判断第二个字符和第三个字符是否相等。如果满足if条件,计数器num+1。
3.本题调试过程碰到问题及解决办法

错误原因:设置循环体的条件时出错,导致运行超时。
改正方法:将循环体条件改成str[i]!='\0'或*(str+i)!='\0'。

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

1.实验代码

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

2.设计思路
第一步:首尾字符要排外,所以下标要从1开始循环。
第二步:依次取得数组元素,如果后一个元素大于前一个元素,则进行交换。
3.本题调试过程碰到问题及解决办法
无问题。

7-1 输出学生成绩

1.实验代码

#include<stdio.h>
float max_a(float x,float y);
float min_a(float x,float y);
int main()
{
	int N,flag=1,D;
	float average,max,min,sum=0.0;
	scanf("%d",&N);
	int i=0;
	for(;i<N;i++){
		scanf("%d",&D);
		sum=sum+D;
	if (flag==1)
   { 
    max=D;
    min=D;
    flag--;
   }
    max=max_a(max,D);
    min=min_a(min,D);
   }
    average=sum/N;
    printf("average = %.2f\nmax = %.2f\nmin = %.2f",average,max,min);
    return 0;
}

float max_a(float x,float y)
{
 float z;
 if(x>y)
 z=x;
 else
 z=y;
 return(z);
}
float min_a(float x,float y)
{
 float z;
 if(x<y)
 z=x;
 else
 z=y;
 return(z);
}

2.设计思路
第一步:编写主函数,定义所需要的变量。
1.设flag=1;
2.把第一个输入的数赋给max和min,flag-1。只进行一次对max和min的初始化。
3.使用max_a函数,将max_a函数的返回值赋给max;使用min_a函数,将min_a函数的返回值赋给min。
4.计算平均值。
5.输出各值。
第二步:编写max_a函数。设置if-else语句,比较两个数的大小。将较大的数赋给变量z并返回。
第三步:和第二步相同,编写min_a函数,比较两个数的大小。将较小的数赋给变量z并返回。
3.本题调试过程碰到问题及解决办法
错误原因:定义类型错误。
改正方法:将每次输入的数字D改为整形。

7-1 计算职工工资

1.实验代码

#include<stdio.h>
struct{
	char name[10];
	double basic;
	double flow;
	double pay;
}p;
int main()
{
	int N,i=0;
	float fact;
	scanf("%d",&N);
	for(;i<N;i++){
		scanf("%s %lf %lf %lf",&p.name,&p.basic,&p.flow,&p.pay);
		fact=(p.basic+p.flow-p.pay)*1.00;
    printf ("%s %.2f\n", p.name, fact);
	}
	return 0;
}

2.设计思路
第一步:定义struct类型。
第二步:输入N;设置循环,输入职工的姓名、基本工资、浮动工资和支出.
第三步:定义实发工资。
第四步:输出各员工的姓名和实发工资。
3.流程图

4.本题调试过程碰到问题及解决办法
这道题pta上显示我的代码没有任何问题,但我总觉得不太好。

7-2 计算平均成绩

1.实验代码

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

2.设计思路
第一步:定义struct _student类型
第二步:设置循环,计算总分。
第三步:计算平均成绩。
第四步:输出平均线以下的学生的姓名和学号。
3.本题调试过程碰到问题及解决办法
错误原因:在第二次循环时没有对计数器i进行初始化,导致第二个循环没有进行。
改正方法:将i初始化。

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

1.实验代码

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

2.设计思路
第一步:根据题目要求,设置多个if,判断每名同学的等级。
第二步:当分数在0~59时,计数器count++。
第三步:返回不及格人数的计数器count。
3.流程图

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

学习总结和进度

学习总结:学习了定义结构,加深了对指针的理解。