第二次作业

题目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:无。

错误原因:无。

改正方法:无。

posted @ 2018-04-09 00:52  好听的名字*  阅读(132)  评论(0编辑  收藏  举报