第二次作业

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

1、设计思路:

(1)算法描述:
第一步:定义一个新数组,把原来的数组复制到新数组里;
第二步:判断新的数组里的元素是不是数字,若不是数字,就用原来的数组存储这个元素;
(3)实验代码:

#include <string.h>
void delnum(char *s)
{
    int i,x,j=0;
    char a[100];
    x=strlen(s);
    strcpy(a,s);
    for(i=0;i<x;i++)
    {
        if(a[i]<='9'&&a[i]>='0')
        {;
        }else
        {
          s[j]=a[i];
            j++;

        }
        
    }
     s[j]='\0';
}

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

(1)、算法描述:

第一步:先遍历母数组;
第二步:从母数组的第一个元素开始判断,与子数组进行比较,直到母数组中的元素与子数组不相等;
第三步:若不相等,判断是否为子数组的最后一个元素;
(2)、实验代码:

int fun(char *str,char *substr)
{
    int i,j,k,cnt=0;
    for(i=0;str[i]!='\0';i++)
    {
        for(j=i,k=0;str[j]==substr[k];k++,j++)
        {
            if(substr[k+1]=='\0')
            {
            cnt++;
            break;
            }

        }

    }
    return cnt;
}

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

(1)、算法描述:
第一步:先测出数组长度;
第二步:从第二个数开始直到倒数第二个数,将这些字符的ascii进行冒泡排序;

int fun(char *s,int num)
{
    int x,i,j,t;

    x=strlen(s);

    for(j=1;j<num-1;j++)
    {
        for(i=1;i<num-1-j;i++)
        {
            if(s[i]<s[i+1])
            {
                t=s[i];
                s[i]=s[i+1];
                s[i+1]=t;
            }
        }
    }


}

7-1 输出学生成绩

1、设计思路:

(1)算法描述:
第一步:定义一个指向数组的指针变量,将数组的第一个元素赋值给最大值和最小值;
第二步:并依次求出最大值和最小值和平均值;
(2)流程图:

(3)实验代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
    int n,i;
    double *p;
    double a[100],sum=0;
    double max,min;
    scanf("%d",&n);
    if((p=(double*)malloc(n*sizeof(double)))==NULL)
    {
        exit(1);
    }

        for(i=0;i<n;i++)
        {
            scanf("%lf",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);
            }
            sum=sum+*(p+i);
        }
    printf("average = %.2lf\n",sum/n);
    printf("max = %.2lf\n",max);
    printf("min = %.2lf\n",min);
    free(p);
    return 0;
}

7-1 计算职工工资

(1)、算法描述:
第一步:定义一个结构变量;
第二步:用for循环计算职工工资;
(2)实验代码:

#include <stdio.h>
int main()
{
  struct salary
{
	char name[1000];
	float  a;
	float  b;
	float  c;
	float  d;
}a[1000];
	int i,n;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%s%f%f%f",a[i].name,&a[i].a,&a[i].b,&a[i].c);
		a[i].d=a[i].a+a[i].b-a[i].c;
        printf("%s %.2f\n",a[i].name,a[i].d);
  }

 return 0;
}

(3)流程图

(4)错误原因:
当数组长度较小时,答案显示段错误

7-2 计算平均成绩

(1)、算法描述:

第一步:定义一个结构变量;
第二步:对结构变量中的成员中的分数进行求和,再求平均值,再比较结构中的成员和平均值的大小,输出成绩在平均值以下的学生姓名和学号;
(2)、实验代码:

#include <stdio.h>
int main()
{
    int n,i;
    struct student
    {
        char a[1000];
        char b[1000];
        int num;
    }s[1000];
    float ave;
    int sum=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {

        scanf("%s %s %d",s[i].a,s[i].b,&s[i].num);
        sum=sum+s[i].num;
    }
    ave=sum/n*1.0;
    printf("%.2f\n",ave);
    for(i=0;i<n;i++)
    {
        if(s[i].num<ave)
        {
            printf("%s %s\n",s[i].b,s[i].a);
        }
    }
    return 0;
}

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

(1)、算法描述:

第一步:用for循环遍历整个数组,用指针变量指向结构中的分数;
第二步:判断等级,用指针变量指向等级,若等级为D,不及格人数加一;
(2)、实验代码:

int set_grade( struct student *p, int n )
{
    int cnt=0,i;
    for(i=0;i<n;i++,p++)
    {

        if((p->score)>=85)
        {
            p->grade='A';
        }
        if((p->score)<85&&(p->score)>=70)
        {
            p->grade='B';
        }
        if((p->score)<=69&&(p->score)>=60)
        {
            p->grade='C';

        }
        if((p->score)<60)
        {
            p->grade='D';
            cnt++;
        }
    }

    return cnt;
}

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

(1)算法描述:

第一步:用指针变量指向结构中的sum,sum为每个同学每门成绩的和;
第二步:用选择排序法将sum进行排序;
(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(j=0;j<n-1;j++)
    {
        for(i=0;i<n-1-j;i++)
        {
            if(p[i].sum<p[i+1].sum)
             {
                t=p[i].sum;
                p[i].sum=p[i+1].sum;
                p[i+1].sum=t;
            }
        }
    }
}

(3)错误原因:

换的只是sum而姓名学号并没有改变
改正:

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(j=0;j<n-1;j++)
    {
        for(i=0;i<n-1-j;i++)
        {
            if(p[i].sum<p[i+1].sum)
             {
                t=p[i];
                p[i]=p[i+1];
                p[i+1]=t;
            }
        }
    }
}

(4)、流程图

点评:
申怡苗:http://www.cnblogs.com/Vinecy/
张琪:www.cnblogs.com/zhang03/p/8735481.html
邓欣茹:http://www.cnblogs.com/dxfish/p/8747579.html
代码托管:https://gitee.com/myj98/The-homework-of-C/upload/master

posted on 2018-04-07 16:35  可乐汽水1  阅读(205)  评论(7编辑  收藏  举报