第二次作业
一
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). 算法
第一步:输入数据并计算平均值
第二步:再求最大值和最小值
第三步:输出数据
(2). 流程图
无
- 实验代码
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);
}
- 本题调试过程碰到问题及解决办法
无
五
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)、流程图