第二次作业

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

1.设计思路
第一步:定义一个j=0;建立一个for循环吧数组输入
第二步:判断数组中是否含有0到9的数字,如果有则把相应数放到j里,并且让j++,使其下标向后移一位.
第三步:将数组j里的最后一位定义为结束符.
流程图:

2.实验代码

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

错误信息:答案错误.
错误原因:将j++放在了if语句外.
改正方法:将j++放在了if内

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

1.设计思路
第一步:定义一个count=0,记录相同的字符串出现的次数,利用for循环遍历,
第二步:判断三次for循环判断substr中的元素是否在str中出现
第三步:如果出现了count就++,否则i++,继续判断是否含有相同字符串
流程图

2.实验代码

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

错误信息:答案错误
错误原因:定义了俩个for循环,结果是否相同的字符串弄混
改正方法:看完主函数是3个,所以用了三个if

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

1.设计思路
第一步:定义俩个for循环,第一个for循环从处了第一个前往后定义;第二个从倒数第二个后往前定义
第二步:判断数组中后一位是否比前一位大
第三步:如果大则定义一个t,使其交换位置
流程图

2.实验代码

int fun(char *s,int num)
{
    int i,j,k,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;
         }
        }
    }
}

错误信息:答案错误
错误原因:忘记了第一位和第二位不换
改正方法:将for循环第一位改成第二位和倒数第二位

7-1 输出学生成绩

1.设计思路
第一步:先定一个n,使其记录输入几个数组.
第二步:利用for循环,判断每个人的总成绩
第三步:利用for循环,找出最大最小值
第四步:运用公式求平均值,然后输出平均数,最大值,最小值.
流程图

2.实验代码

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

3
错误信息:答案错误
错误原因:if((p=(double *)calloc(N,sizeof(double)))==NULL),当中数据类型未匹配
改正方法:将int改成double

7-1 计算职工工资

1.设计思路
第一步:利用struct将基本成员定义
第二步:输入数组中有几人
第三步:利用for循环输入每个人的工资
第四步:利用公式将实发工资求出并输出
流程图

2.实验代码

#include<stdio.h>
struct woker{
	char name[10];
	float jb,fd,zc,sf;
}; 
int main()
{
	struct woker w1;
	int n,i;
	scanf("%d",&n); 
	for(i=0;i<n;i++)
	{
		scanf("%s %f %f %f",w1.name,&w1.jb,&w1.fd,&w1.zc);
		w1.sf=w1.jb+w1.fd-w1.zc;
		printf("%s %.2f\n",w1.name,w1.sf);
	}
}

错误信息:编译错误
错误原因:在运用公式时未使用变量名
改成方法:将基本变量前加上变量名

7-2 计算平均成绩

1.设计思路
第一步:利用struct定义基本变量
第二步:定义输入每个人的变量,并求出每个人的总成绩
第三步:求出平均值并保留俩位小数
第四步:利用for循环判断如果数组中的成绩有小于平均值的则输出个人基本信息
流程图

2.实验代码

#include<stdio.h>
struct students{
	char No[6];
	char name[10];
	int  ach;
}; 
int main()
{
	struct students s[10];
	int N,i,sum=0;
	double ave;
	scanf("%d",&N);
	for(i=0;i<N;i++)
	{
		scanf("%s %s %d",s[i].No,s[i].name,&s[i].ach);
		sum=sum+s[i].ach;
	}
	ave=sum*1.0/N;
	printf("%.2lf\n",ave);
	for(i=0;i<N;i++)
	{
		if(s[i].ach<ave)
		{
			printf("%s %s\n",s[i].name,s[i].No);
		}
	}
}

错误信息:部分正确
错误原因:再求平均值时未乘1.0变成分数
改正方法:在总和上*1.0

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

1.设计思路
第一步:定义一个变量q记录未及格人数,
第二步:利用for循环判断是否有小于60的人,如果有则q++
第三步:在for循环中将每个成绩换分为A,B,C,D档.
第四步:在for循环结束return q;
流程图

2.实验代码

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

错误信息:编译错误
错误原因:在for循环里变量增加是未将 p++使数组元素进行到下一个
改正方法:在变量增加时多加一个p++

6-2 结构体数组按总分排序

1.设计思路
第一步:利用函数求出每个元素的三科成绩的和
第二步:利用struct 定义一个定义t
第三步:利用选择排序判断相邻俩位数的大小,并利用t调换位置
流程图

2.实验代码

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

错误信息:编译错误
错误原因:在判断大小时用了指针箭头型
错误方法:将箭头sum型改成.sum型

作业要求

1.作业总结:学习了struct的构造,更能方便达到所用的效果.但在使用->和.的时候运用的不够灵活,有待提高
2.点评:
刘传海: http://www.cnblogs.com/l15846798381/p/8735259.html
白松涛: http://www.cnblogs.com/baisongtao/p/8734432.html
姜健: http://www.cnblogs.com/jj990519/p/8688931.html
3.托管
我的git地址: https://git.coding.net/dalaohu30/20180325.git

4.表格.

posted on 2018-04-08 21:31  曹佰强  阅读(115)  评论(0编辑  收藏  举报

导航