第二次作业
6-7 删除字符串中数字字符#
主要描述题目算法##
第一步:定义指针函数void delnum(char *s)
第二步:利用for循环判断指针元素是否'\0'
第三步:利用if判断袁术是否在是'0'到'9'间
第四步:按要求输出
流程图##
实验代码##
void delnum(char *s)
{
int i,k=0;
for(i=0;*(s+i)!='\0';i++)
{
if(*(s+i)>='0'&&*(s+i)<='9')
{ }else
{
*(s+k)=*(s+i);
k=k+1;
}
}
*(s+k)='\0';
}
错误信息##
错误原因:(s+i)=(s+k)导致的段错误
改正方法:将i与k调换
6-8 统计子串在母串出现的次数#
主要描述题目算法##
第一步:定义指针函数int fun(char *str,char *substr)
第二步:利用双层for循环判断字符串出现的次数
第三步:将最后的n值返回主函数
流程图##
实验代码##
int fun(char *str,char *substr)
{
int i,j,k,n;
for(i=0;str[i]!='\0';i++)
{
for(j=i,k=0;substr[k]==str[j];k++,j++)
{
if(substr[k+1]=='\0')
{
n++;
break;
}
}
}
return n;
}
错误信息##
错误原因:无法编译
改正方法:将k负初值0
错误原因:无法停止
改正方法:在n++后加brake
6-9 字符串中除首尾字符外的其余字符按降序排列#
主要描述题目算法##
第一步:定义指针函数un(char *s,int num)
第二步:利用双层for循环(冒泡排序法)找到字符串的首尾字符的位置
第三步:将除首尾外的字符降序排序
流程图##
实验代码##
int fun(char *s,int num){
int i,j,k,t;
for(i=1;i<num-2;i++){
k=i;
for(j=i+1;j<num-1;j++){
if((int)(*(s+k))<(int)(*(s+j))){
k=j;
}
}
if(k!=i){
t=*(s+i);*(s+i)=*(s+k);*(s+k)=t;
}
}
return 0;
}
错误信息##
错误原因:排序混乱 冒泡排序时超出范围
改正方法:规定范围
7-1 输出学生成绩#
主要描述题目算法##
第一步:定义个数变量n,以及各个变量sum=0,max,min,average,*p,i;
第二步:输入n
第三步:利用for循环计算n次sum的总和
第四步:利用for循环将最大和最小数负给max,min
第五步:计算平均值并输出
流程图##
实验代码##
#include<stdio.h>
int main()
{
int N;
double sum=0,max,min,average,*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);
}
average=sum*1.0/N;
printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf\n",average,max,min);
free(p);
}
错误信息##
错误原因:答案错误
改正方法:在计算平均值时用sum*1.0/n
错误原因:交换错误
改正方法:调换位置
7-1 计算职工工资#
主要描述题目算法##
第一步:定义结构数组
第二步:在主函数中引用此函数 输入N
第三步:利用for循环多次输入数据并计算实发工资
第四步:再循环中输出name和s
流程图##
实验代码##
#include<stdio.h>
struct work{
char name[10];
float a,b,c;/*基本工资,浮动工资,支出*/
float s;/*实发工资*/
};
int main()
{
struct work s;
int i,N;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%s %f %f %f",&s.name ,&s.a ,&s.b ,&s.c );
s.s =s.a +s.b -s.c ;
printf("%s %.2f\n",s.name ,s.s );
}
}
错误信息##
错误原因:编译错误
改正方法:将s.c对应的改为%s
7-2 计算平均成绩#
主要描述题目算法##
第一步:定义结构函数
第二步:定义结构数组长度[10] 并sum赋初值0 输入N
第三步:利用for循环输入数据并计算sum
第四步:计算平均值并输出
第五步:利用for循环判断并输出小于平均值的人的name和num
流程图##
实验代码##
#include<stdio.h>
struct student{
char name[10];
char num[10];
float grade;
};
int main()
{
int i,N;
double average;
struct student s[10];
scanf("%d",&N);
int sum=0;
for(i=0;i<N;i++)
{
scanf("%s %s %f",&s[i].num ,&s[i].name ,&s[i].grade );
sum=sum+s[i].grade ;
}
average=sum/(1.0*N);
printf("%.2f\n",average);
for(i=0;i<N;i++){
if(s[i].grade <average )
{
printf("%s %s\n",s[i].name ,s[i].num );
}
}
}
错误信息##
错误原因:答案错误
改正方法:sum负初值0
错误原因:答案错误
改正方法:计算平均值数加1.0
6-1 按等级统计学生成绩#
主要描述题目算法##
第一步:定义循环变量i和次数count
第二步:利用for循环判断元素中score的范围
第三步:在各个范围内输出grade的范围 凑那他加一
第四步:返回count
流程图##
实验代码##
if(((p+i)->score)>=85)
{
(p+i)->grade='A';
int set_grade( struct student *p, int n )
{
int i,coun(i=0;i<n;i++)
{ {
for
{ (p+i)->grade='C';
(p+i)->grade='B';
}else if(((p+i)->score)>=60)
}else
{
(p+i)->grade='D'; }else if(((p+i)->score)>=70)t=0;
count++;
}
}
return count;
}
错误信息##
错误原因:编译错误
改正方法:将结构函数中的'.'改为'->'
6-2 结构体数组按总分排序#
主要描述题目算法##
第一步:在第一个函数中,利用for循环计算所有sum的和
第二步:在第二个函数中引入结构函数
第三步:利用双层for循环将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 x;
for(j=0;j<n-1;j++)
{
for(i=0;i<n-1-j;i++)
{
if((p+i)->sum<(p+i+1)->sum)
{
x=*(p+i);*(p+i)=*(p+i+1);*(p+i+1)=x;
}
}
}
}
错误信息##
错误原因:交换中错误
改正方法:将(p+i+1)放在(p+i)后
学习总结和进度#
1、总结两周里所学的知识点有哪些学会了?(可记录每道作业题目所用的知识点)哪些还没有学会?##
学会了指针,结构函数,在这些知识点中,在结构函数中将指针和结构函数组合还有些不不太熟悉。
我的git代码##
[我的Git]https://coding.net/u/baisongtao/p/baisongtao/git/tree/master/?public=true
我点评的同学##
http://www.cnblogs.com/lh991014/p/8667145.html [林昊]
http://www.cnblogs.com/qw123/p/8665906.html [李春杨]
http://www.cnblogs.com/wwb986187/p/8727528.html [王文博]