第二次作业


1.解题思路
1.检测当前字符是否为数字,是则跳转下一步;
2.将后面所有字符前移一位,跳转到上一步

2.流程图

3.代码
‘‘‘‘
void delnum(char s){
int i=0,j=0;
for(;
(s+i)!='\0';i++)
if('0'<=(s+i)&&(s+i)<='9'){
for(j=0;*(s+i+j)!='\0';j++)
(s+i+j)=(s+i+j+1);
i--;
}
}
‘‘‘‘

4.出现的错误
•错误提示:结果错误
•错误原因:循环时i的赋值错误
•解决方法:将i--放在if判断后


第二题:
统计子串在母串出现的次数

设计思路:

描述方法:
第一步:遍历数组
第二步:将子串的每一个跟母串进行比较
第三步:当一次比较结束后,次数加一并从后面的字符串中继续进行比较

流程图:

实验代码:
int fun(char *str,char *substr)
{
int i;
int n=0;
for(i=0;str[i]!='\0';i++){
if(str[i]substr[0]&&str[i+1]substr[1]&&str[i+2]==substr[2])
n++;
}
return n;
}

遇到的问题:


1.设计思路

(1)描述算法
第一步:阅读题目,明确目的。

  第二步:找到调用函数。

  第三步:遍历数组中从第二个至倒数第二个元素。

  第四步:将后一个元素与前一个元素比较,如果后一个大于前一个,则交换这两个元素。

2.实验代码
int fun(char *s,int num)
{

int i,n,j;

for(i=1;i<num-1;i++)
{
for(n=1;n<i;n++)
{
if((s+i)>(s+n))
{
j=(s+i);(s+i)=(s+n);(s+n)=j;
}
}
}
}

3.本题调试过程中碰到的问题及解决办法

错误原因:

改正方法:将n<num-1改为n<i, 将i=0改为i=1。


题目4 输出学生成绩

  1. 设计思路

(1). 算法

第一步:输入数据并计算平均值

第二步:再求最大值和最小值

第三步:输出数据

(2). 流程图

  1. 实验代码

include<stdio.h>

int main()
{
int n,i;
int p;
float max,min,average=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);
average=average+
(p+i);
}
average=average/n;
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",average);
printf("max = %.2f\n",max);
printf("min = %.2f\n",min);
}

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


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)、流程图

posted @ 2018-04-08 22:20  2班—段策  阅读(215)  评论(3编辑  收藏  举报