第二次作业
题目6-7 删除字符串中数字字符。
1.设计思路。
(1)主要描述题目算法。
第一步:仔细阅读题目与主函数,读懂题意,得知函数中参数的意义。
第二步:输入调用函数函数接口。
第三步:定义两个变量,定义一个for循环直至到'\0'结束;在for循环内定义if判断。
第四步:利用if判断使不是0至9之间的元素重新赋值给是s[j]。
第五步:结束循环后要把最后的s[j]赋值上’0‘。
(2)流程图。
2.实验代码。
void delnum(char *s)
{
int i,j;
j=0;
for(i=0;s[i]!= '\0';i++)
{
if(s[i]<'0'||s[i]>'9'){
s[j]=s[i];
j++;
}
}
s[j]='\0';
}
3.本题调试过程碰到问题及解决办法。
错误信息1:无错误,但是第一次用的是重新创建一个数组的方法。后来改用现在的方法。
错误原因:因现在的方法更加简便。
改正方法:把想要的元素重新赋值到原数组,相当与直接删除不想要的元素。
题目6-8 统计子串在母串出现的次数。
1.设计思路。
(1)主要描述题目算法。
第一步:仔细阅读题目与主函数,读懂题意,得知函数中参数的意义。
第二步:输入调用函数函数接口。
第三步:利用两个for循环分别控制两个数组直至数组str[i]结束(str[i]='\0')和判断不想等。
第四步:for循环中包括一层if判断,来判断str[i]与substr[j]是否相等。
第五步:如果内层for循环完美循环结束则利用n记录组数。
(2)流程图。
2.实验代码。
int fun(char *str,char *substr)
{
int i,j,n=0;
for(i=0;str[i]!='\0';i++){
for(j=0;j<=2;j++){
if(str[i]==substr[j]){
i++;
}else{
i--;
break;}
}
n++;
}
return n;
}
3.本题调试过程碰到问题及解决办法。
错误信息1:i多加1。(之前的不具有普遍性重新更改完)
错误原因:if判断和for循环都有i++。
改正方法:用了else{i- -}的方法来解决i多加1的问题。
题目6-9 字符串中除首尾字符外的其余字符按降序排列。
1.设计思路。
(1)主要描述题目算法。
第一步:仔细阅读题目与主函数,读懂题意,得知函数中参数的意义。
第二步:输入调用函数函数接口。
第三步:定义三个变量,定义两个for循环。
第四步:在内层for循环内定义if判断如果数组s[i]中前一元素小于后一元素利用t将两元素互换位置。
(2)流程图。
2.实验代码。
int fun(char *s,int num)
{
int i,j,t;
for(j=1;j<num-2;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;
}
}
3.本题调试过程碰到问题及解决办法。
错误信息1:无。
错误原因:无。
改正方法:无。
题目7-1 输出学生成绩。
1.设计思路。
(1)主要描述题目算法。
第一步:仔细阅读题目与主函数,读懂题意,得知函数中参数的意义。
第二步:利用上节课所学的借用空间代码借用储存空间。
第三步:利用循环输入数组;再利用一个循环计算总和与平均值并输出平均值。
第四步:把p[0]分别赋值给最大值和最小值;再利用两个循环分别比较出最大值与最小值并输出;释放存储空间。
(2)流程图。
2.实验代码。
#include <stdio.h>
int main()
{
int n,i;
int *p;
float min,max,average=0.0,sum=0.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);
sum = 0;
for(i=0;i<n;i++)
sum = sum + *(p+i);
average = sum/(n*1.0);
printf("average = %.2f\n",average);
max=p[0];
min=p[0];
for(i=0;i<n;i++){
if(max<*(p+i)){
max=*(p+i);
}
} printf("max = %.2f\n",max);
for(i=0;i<n;i++){
if(min>*(p+i)){
min=*(p+i);
}
}printf("min = %.2f\n",min);
free(p);
return 0;
}
3.本题调试过程碰到问题及解决办法。
错误信息1:结果错误。
错误原因:小数点后两位没保留。
改正方法:输出结果改为%.2f。
=============================================================================================
题目7-1 计算职工工资。
1.设计思路。
(1)主要描述题目算法。
第一步:仔细阅读题目与主函数,读懂题意,得知函数中参数的意义。
第二步:定义一个结构变量并在结构变量中定义题干需要的元素。
第三步:定义一个for循环输入结构变量中的元素;并且计算出实发工资。
第四步:再定义一个for循环输出对应的名字与实发工资。
(2)流程图。
2.实验代码。
#include <stdio.h>
int main()
{
struct zhigong{
char name[10];
float basic_salary;
float float_salary;
float zhichu;
float shifa;
};
int N,i;
scanf("%d",&N);
struct zhigong s[N];
for(i=0;i<N;i++)
{
scanf("%s %f %f %f",&s[i].name,&s[i].basic_salary,&s[i].float_salary,&s[i].zhichu);
s[i].shifa=s[i].basic_salary + s[i].float_salary - s[i].zhichu;
}
for(i=0;i<N;i++){
printf("%s %.2f\n",s[i].name,s[i].shifa);
}
return 0;
}
3.本题调试过程碰到问题及解决办法。
错误信息1:无。
错误原因:无。
改正方法:无。
题目7-2 计算平均成绩。
1.设计思路。
(1)主要描述题目算法。
第一步:仔细阅读题目与主函数,读懂题意,得知函数中参数的意义。
第二步:定义一个结构变量与三个实数一个浮点数;利用for循环输入结构变量并计算出总成绩sum。
第三步:计算出平均成绩并输出。
第四步:再次创建一个for循环来找出低于平均成绩的同学并输出同学的名和学号。
(2)流程图。
2.实验代码。
#include <stdio.h>
int main()
{
struct student{
char name[11];
char xuehao[6];
int chengji;
};
int N,i;
float pj_chengji=0;
int sum=0;
scanf("%d",&N);
struct student s[N];
for(i=0;i<N;i++)
{
scanf("%s %s %d",&s[i].xuehao,&s[i].name,&s[i].chengji);
sum=sum+s[i].chengji;
}
pj_chengji=sum*1.00/N;
printf("%.2f\n",pj_chengji);
for(i=0;i<N;i++){
if(pj_chengji>s[i].chengji){
printf("%s %s\n",s[i].name,s[i].xuehao);
}
}
return 0;
}
3.本题调试过程碰到问题及解决办法。
错误信息1:无。
错误原因:无。
改正方法:无。
=============================================================================================
题目6-1 按等级统计学生成绩。
1.设计思路。
(1)主要描述题目算法。
第一步:仔细阅读题目与主函数,读懂题意,得知函数中参数的意义。
第二步:输入调用函数函数接口。
第三步:定义两个实数用三条if语句把学生成绩分四档并记录小于60分的学生人数。
(2)流程图。
2.实验代码。
int set_grade( struct student *p, int n )
{
int i,count=0;
for(i=0;i<n;i++)
{
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 if(p->score>=0 && p->score<=59) {
p->grade='D';
count++;
}
p++;
}
return count;
}
3.本题调试过程碰到问题及解决办法。
错误信息1:
(后来利用p++来代替p+i使代码更简便)。
错误原因:for循环写错。
改正方法:把i赋值为0且小于n。
题目6-8 统计子串在母串出现的次数。
1.设计思路。
(1)主要描述题目算法。
第一步:仔细阅读题目与主函数,读懂题意,得知函数中参数的意义。
第二步:输入调用函数函数接口。
第三步:利用一个for循环求出每个学生的三门成绩的总和。
第四步:输入调用函数函数接口。
第五步:利用冒泡排序法给学生名次排序。
(2)流程图。
2.实验代码。
void calc(struct student *p,int n)
{
int i;
for(i=0; i<n; i++)
{
p->sum = p->score[0] + p->score[1] + p->score[2];
p++;
}
}
void sort(struct student *p,int n)
{
struct student t;
int r,j;
for(r=0; r<n-1; r++){
for(j=0; j<n-r-1; j++){
if((p+j) -> sum < (p+j+1) -> sum){
t = *(p+j);
*(p+j) = *(p+j+1);
*(p+j+1) = t;
}
}
}
}
3.本题调试过程碰到问题及解决办法。
错误信息1:无。
错误原因:无。