第二次作业
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.表格.