第二次作业

一、题目6-7 删除字符串中数字字符##

1.实验代码###

`void delnum(char *s)
    {
  int i;
	char *p = s;
	for(i=0;*(s+i) != '\0';i++)
   {
         if ( *(s+i) >'9' || *(s+i) < '0' )
               *p++=*(s + i) ;
   }
   *p='\0';
	 
}`

2.设计思路###

第一步:主函数,定义一个数组,写入数组,引用函数,输出。
第二步:定义一个指针p并将s赋给p,用一个for循环遍历字符串,并在其中用一个if语句判断是否是数字,如果是 p++=*s ,循环过后将最后一个赋上‘\0’。

3.流程图###

4.问题###

本题未遇到问题

二、题目6-8 统计子串在母串出现的次数##

1.实验代码###

`int fun(char *str,char *substr)
    {
	int n=0,i;
	for(i = 0;*(str + i) != '\0';i++){
		if(*(str + i) == 'a'&&*(str+i+1) == 's' && *(str + i + 2) == 'd'){
			n++;
	}
	}
return n;

}`

2.设计思路###

第一步:调用定义的函数。
第二步:定义i、j、n,使用双重循环结构,外层循环用来遍历数组元素,内层循环判断字符数组元素是否相等,完全相等时,可遍历子串,则次数加一。
第三步:返回主函数。

3.问题###

三、题目6-9 字符串中除首尾字符外的其余字符按降序排列##

1.实验代码###

`int fun(char *s,int num)
{
int i,j;
char t;
for(j=0;j<num-3;j++)
   for(i=1;i<num-j-2;i++)
    if(*(s+ i)<*(s+i+1))
   {t=*(s+ i); *(s+ i)=*(s+i+1); *(s+i+1)=t;}
}`

2.设计思路###

第一步:主函数,定义字符数组s,写入字符串,引用函数,输出排序后所得的字符串。
第二步:函数,用一个for循环表示循环的趟数,由于只需要排出排除首尾的顺序所以只需要循环num-3次,在此循环下再用一次循环进行排序,并且只需要排出从第二个到num-j-2个数的顺序。

3.问题###

在for语句中循环次数出现错误,后来发现是运用冒泡排序法的时候for循环次数过多导致的。最后是通过修改for循环次数改正错误的。

四、题目7-1 输出学生成绩##

1.实验代码###

`#include<stdio.h>

int main()
{
int *p,i,sum = 0,max,min,n;
double avg;
scanf("%d",&n);

if((p=(int*)calloc(n,sizeof(int)))==NULL){
	 exit(1);
}

for(i=0;i<n;i++){
    scanf("%d",&*(p+i));
	sum = sum + *(p+i);}

avg = (double)sum /(double) n;
max = *p;
min = *p;
for(i=1;i<n;i++){
	if(*(p + i) > max){
		max = *(p+i);
	}
	
	if(*(p + i) < min){
		min = *(p+i);
	}
}
    
printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf",avg,(double)max,(double)min);

}`

2.设计思路###

第一步:输入数字个数n,动态存储分配。
第二步:用for语句进行输入数据,并计算和,for语句结束后计算出平均值。
第三步:令最大,最小值等于第0个数,遍历所有数据,并在其中用两个if语句判断出最大值和最小值并记录,输出最大最小值和平均数。

3.问题###

第一次提交未使用动态内存分配,不过提交通过了,之后经提醒添加使用了动态内存分配语句。

五、题目7-1 计算职工工资##

1.实验代码###

#include<stdio.h> struct clerk { char name[10]; float wages, floating, pay, wage; }c1; int main() { int n, i; scanf("%d",&n); struct clerk c[n]; for(i = 0; i < n; i++) { scanf("%s %f %f %f",c[i].name, &c[i].wages, &c[i].floating, &c[i].pay); c[i].wage = c[i].wages + c[i].floating - c[i].pay; printf("%s %.2f\n",c[i].name, c[i].wage); } }

2.设计思路###

第一步:定义结构体变量,成员包括——姓名、基本工资、浮动工资、支出和实发工资。
第二步:输入人数n,引用结构体变量,使用循环结构,输入姓名、基本工资、浮动工资、支出,计算实发工资,并输出姓名和实发工资。

3.流程图###

4.问题###

六、题目7-2 计算平均成绩##

1.实验代码###

`#include <stdio.h>

struct student{
    
    char num[10],name[10];
    double score;
};

int main ()
{
double avg,sum = 0;
int i, n;
scanf("%d", &n);
struct student s[n] ;
for(i = 0;i < n;i ++)
{
    scanf("%s %s %lf",&s[i].num,s[i].name,&s[i].score);
    sum = sum + s[i].score;
}
 
 avg = sum / n;
 printf("%.2lf\n",avg);
 
for(i = 0; i < n; i++)
{
    if(s[i].score < avg)
    printf ("%s %s\n", s[i].name,s[i].num);
}
}`

2.设计思路###

第一步:定义一个结构体,并在其中定义学号num,姓名name,分数score,主函数中先输入整数n,引用结构体,用一个for循环输入学号,姓名,分数并计算出分数的和。
第二步:计算出平均数,用一个for循环遍历数据,并用if语句判断当前分数是否低于平均数,如果是输出相应的姓名和学号。

3.问题###

七、题目6-1 按等级统计学生成绩##

1.实验代码###

` int set_grade( struct student *p, int n ){

    int count = 0, i;

    for(i = 0;i<n;i++,p++){

        if(p->score<60){

            p->grade = 'D';

            count++;

        }

        else if((p->score<70)&&(p->score>=60)){

            p->grade = 'C';

        }

        else if((p->score<85)&&(p->score>=70)){

            p->grade = 'B';

        }

        else{

            p->grade = 'A';

        }

    }

    return count;

}`

2.设计思路###

第一步:先定义函数,引入变量,在for循环中通过if语句进行多层判断,将学生成绩分出等级。
第二步:使小于60分的单独计算出其数目,最后返回其值(count)即可。

3.问题###

八、题目6-2 结构体数组按总分排序##

1.实验代码###

`void calc(struct student *p,int n)
{
int i;
for(i = 0;i < n;i ++,p++){
p->sum = p->score[0] + p->score[1] + p->score[2];

}
}

void sort(struct student *p,int n)
{
int j,i;
struct student t;
    for(j=1;j<=n-1;j++)
   for(i=0;i<=n-j-1;i++){
        if((p + i)->sum < (p + i + 1)->sum){
            t = *(p + i);
            *(p + i)= *(p+ i + 1);
            *(p+ i + 1)= t;
           }
   }
}`

2.设计思路###

第一步:定义一个结构体,并在其中定义学号num,姓名name,分数score,分数和sum,主函数中:先引用结构体,用一个for语句进行数据输入,引用函数calc求出每名学生的总分,函数sort按每名学生的总分从高到低对这组数据进行排序,用一个for语句进行输出。
第二步:函数calc:仅需一个for语句进行遍历,并在遍历过程中算出sum值,函数sort:定义一个结构体t为之后交换做准备,之后用冒泡排序法进行排序即可。

3.流程图###

函数calc

函数sort

4.问题###

最初在第二个函数中将t定义为int型,发现编译的时候出现问题,最后改为引用结构体定义t。

九、学习总结和进度##

1.总结###

首先是对指针进行了深入的复习,并对pta中出现的问题进行讲评。之后,这两周主要学习了结构。首先学习的就是对结构体的概念和定义,并且在所需结构调用时需要在函数中调用一下结构体再去使用。再之后学习到结构数组,其中引用格式为结构数组名[下标].结构成员名。最后,学到了结构指针引用格式可以为p->结构成员名。总体来讲,这段时间学的还是比较充分的。

2.图表###

3.同学互评###

刘富垚;
[董欣](http://www.cnblogs.com/dx2017/);
[丰大为](http://www.cnblogs.com/DavidPark/);

posted @ 2018-04-08 22:02  张国庆  阅读(149)  评论(0编辑  收藏  举报