第二次作业

第二次作业

提交列表

第一题

设计思路

1.因为要删除所有数字,那么在输出字符时,当数组内的元素等于数字时,数组输出零
2.用循环,把输出出来的新数组整合,就能得到想要的结果

流程图

代码

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

调试

对或跟且运用不是很熟悉

第二题

设计思路

1.设计个循环控制数组输出
2.当数组连续三次都相等时让num+1,最后输出num,即为出现的次数

代码

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

调试


改正方法:‘'忘记加,字符串是以为结束标志,找不到会越界访问。

第三题

设计思路

1.设计两个循环形成循环嵌套,然后控制字符串排序
2.借用冒泡排序法的思路,完成代码

代码

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;
	}
    }
	}
}

调试

无错误

第四题

设计思路

1.输入学生人数,动态分配,用for循环相加成绩
2.令max,min,等于数组第一个元素,比较大小,并用for循环交换

代码

#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
max = %.2f
min = %.2f",average,max,min);
    
}

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);
}

调试

原因:缺少函数定义 float *p=(float *)malloc(n);
方法:通过与同学交流并查询书籍得知

第五题

设计思路

1.定义结构体。
2.用for循环输入n个员工的姓名 基本工资 浮动工资 支出。
3.计算并输出。

流程图

代码

#include<stdio.h>
struct person{
    char name[100];
    float w;
    float w1;
    float account;
}person1;
int main()
{

    int n,i;
    float pay;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%s %f %f %f",&person1.name,&person1.w,&person1.w1,&person1.account);
        pay=person1.w+person1.w1-person1.account;
        printf("%s %.2f
",person1.name,pay);
    }
    return 0;
}

调试


问题:在编译器运行时结果跟输出样例一样,但是PTA判断我答案错误。
原因:在我仔细的审过题目后,我发现我漏掉了这一点 把定义的变量类型改为float后答案正确。

第六题

设计思路

1.使用结构体类型进行结构体变量的引用,且根据题意后面应为s1[10]。
2.输入N的值,遍历数组,输入s1[i].number,s1[i].name,s1[i].score并将它们储存起来,计算出sum的值。
3.在for循环中,判断s1[i].score与avg的大小,最后按要求输出元素

流程图

代码

#include <stdio.h>
struct score {
    char number[6];
    char name[10];
    int score;
} s1[10];
int main ()
{
    
    int N,i,sum=0;
    float avg;
    scanf("%d",&N);
    for(i=0;i<N;i++) {
        scanf("%s %s %d",s1[i].number,s1[i].name,&s1[i].score);
        sum = sum + s1[i].score;
    }
    avg = sum/N;
    printf("%.2f
",avg);
    for(i=0;i<N;i++) {
        if(s1[i].score<avg) {
            printf("%s %s
",s1[i].name,s1[i].number);
        }
    }
    return 0;
}


问题:输出时将s1[i].number的%s写成%d。
解决:在单步调试后知道错误的代码行,重新观察后找出问题所在

第七题

设计思路

1.定义一个结构体,并在其中定义学号num,姓名name,分数score,成绩等级grade。
2.主函数中:引用结构体,并输入学生个数n,用一个for语句进行数据录入,引用函数进行计算,最后进行输出。
3.函数中:用for语句进行遍历,并用if语句进行等级的区分,其中如果在D等级则不及格人数count加一。最后返回count值

代码

#include <stdio.h>
#define MAXN 10
int set_grade( struct student *p, int n )
{
	int j=0,result=0;
	for(j=0;j<n;j++)
	{
		if(p[j].score<60)
		{
			result++;
		}
	}
	for(j=0;j<n;j++)
	{
		if(((p+j)->score)>=85&&((p+j)->score)<=100)
		{
			((p+j)->grade)='A';
		}else if(((p+j)->score)>=70&&((p+j)->score)<=84)
		{
			((p+j)->grade)='B';
		}else if(((p+j)->score)>=60&&((p+j)->score)<=69)
		{
			((p+j)->grade)='C';
		}else if(((p+j)->score)>=0&&((p+j)->score)<=59)
		{
			((p+j)->grade)='D';
		}
	}
	return result;
 } 

调试

问题:最开始没有看到返回不及格人数的条件,导致前两个点出现错误

第八题

设计思路

1.先定义函数,引入变量
2.在for循环中通过if语句进行多层判断,将学生成绩分出等级,然后使小于60分的单独计算出其数目,最后返回其值(count)即可

代码

#include <stdio.h>
void calc(struct student *p,int n)
{
	int k=0;
	for(k=0;k<n;k++)
	{
		(p+k)->sum=(p+k)->score[0]+(p+k)->score[1]+(p+k)->score[2];
	}	
}
void sort(struct student *p,int n)
{
	int k=0,l=0;
	struct student swap;
	for(k=0;k<n;k++)
	{
		for(l=k+1;l<n;l++)
		{
			if(p[k].sum<p[l].sum)
			{
				swap=p[k];p[k]=p[l];p[l]=swap;
			}
		}
	}
	
}

点评

黄国戎
金海宽
金海东

学习总结和进度

1.本周学习的结构,但是运用还不是很纯熟,需要多加练习

学习曲线

原文地址:https://www.cnblogs.com/jinjian155/p/8746877.html