代码改变世界

第二次作业

2018-03-27 22:07  梁圣然  阅读(281)  评论(8编辑  收藏  举报

6-7 删除字符串中数字字符

一.设计思路

(1) 描述算法:

1.仔细阅读题目,了解题意。
2.查看主函数,并找出函数中的实参和形参。
3.定义一个字符串利用gets();函数输出字符串
4.调用函数delnum();删除字符串中的数字,输出结果。

(2)流程图:


二.实验代码:

void delnum(char *s){
  int i,k;
  k=0;
  for(i=0;*(s+i)!='\0';i++){
    if(!('0'<=*(s+i)&&*(s+i)<='9')){
      *(s+k)=*(s+i);
      k++;
    }
 }*(s+k)='\0';
}

三.调试过程中碰到的问题和解决办法

错误信息1:

 错误原因:做题的时候马虎语句后“;”是中文格式由于在编程的时候经常借助shift输入符号导致错误
 改正方法:在每句语句后注意加“;”注意,编程中符号英文

6-8 统计子串在母串出现的次数

一.设计思路

(1) 描述算法:

1.仔细阅读题目,了解题意。
2.查看主函数,并找出函数中的实参和形参。
3.利用while循环条件为遇到'\0'终止循环 在循环中char字符串组和 substr字符串组进行比较。
4.定义一个变量count 充当“计数器”最后return(count)。

(2) 流程图


二.实验代码

int fun(char *str,char *substr){
  int count = 0;
  while(*(str+3)!='\0')
  {
    if(*(str)==*(substr))
      if(*(str+1)==*(substr+1))
        if(*(str+2)==*(substr+2)){
          count++;
   }
    str++; 
  }return (count);
}

三.调试过程中碰到的问题和解决办法

错误信息1:

 错误原因:没有打出 str++导致while循环陷入死循环无法跳出
 改正方法:在循环中打str++

6-9 字符串中除首尾字符外的其余字符按降序排列

一.设计思路

(1)描述算法

1.仔细阅读题目,了解题意。
2.查看主函数,并找出函数中的实参和形参。
3.定义四个变量i,j,k,change选择排序法因为不对第一个和最后一个进行排序所以i=1; i<num 同理j=i+1;j<num-1
4.通过for的双重循环实现选择排序法就会实现前一个和后一个相比较第一个 for k=i 第二个for中加入if语句比较大小,如果前一个小于后一个将k=j
5.利用if语句判断k是否等于i,不等于利用change变量实现交换,跳出函数

(2)流程图


二.实验代码

int fun(char *s,int num){
 		int i,j,k,change;
 		for(i=1;i<num-2;i++){
 		  k=i;
 		  for(j=i+1;j<num-1;j++){
 		    if(*(s+k)<*(s+j)){
 		      k=j;
 		    }
 		 }if(k!=i){
 		   change=*(s+i);*(s+i)=*(s+k);*(s+k)=change;
 		 }
 	}
}

三.调试过程中碰到的问题和解决办法

错误信息1:

 错误原因:没有定义k直接利用i与j进行比较,这样改变了i值导致循环出错
 改正方法:定义一个k 将i值赋给k 与j进行比较实现循环

7-1 输出学生成绩

一.设计思路

(1)描述算法

1.仔细阅读题目,了解题意。
2.定义出i,max,min,average,num,n
3.for循环输入学生的成绩,将数组中第一个值赋给max min 利用for 循环比较找出最大值最小值赋给max min
4.在循环中加入num=num+*(p+i)实现学生成绩累加和
5.平均值为总和除与人数最后输出注意输出格式还有所有数据为float型

(2) 流程图


二.实验代码

#include<stdio.h>
#include<malloc.h>
int main()
{
  float average=0;
  int n,i;
  float num=0;
  float *p=(float *)malloc(n);
  scanf("%d",&n);
  for(i=0;i<n;i++){
    scanf("%f",&*(p+i));
  }
  i=0;
  float max=*(p+i);
  float min=*(p+i);
  for(i=0;i<n;i++){
    if(max<*(p+i)){
      max=*(p+i);
    }if(min>*(p+i)){
      min=*(p+i);
    }
    num=num+*(p+i);
  }average=num/n;
  printf("average = %.2f\nmax = %.2f\nmin = %.2f\n",average,max,min);
}

三.调试过程中碰到的问题和解决办法

错误信息1:

错误原因:定义错误将float型定义成了int型
改正方法:根据题意改正从新定义改为float型

错误信息2:

错误原因:1.输出里没有按照float类型输出 2.没有符合题意格式输出顺序不对,没有加‘\n’ 
改正方法:printf("average = %.2f\nmax = %.2f\nmin = %.2f\n",average,max,min)

7-1 计算职工工资(15 分)

一.设计思路

(1)描述算法

1.仔细阅读题目,了解题意
2.定义一个结构变量命名为money 在结构变量中定义char name[10]; float basic_salary;//基本工资 float floating_salary;//浮动工资 float expenditure;//支出 float real_wages;//实发工资
3.根据题意主函数中定义i n并输入n
4.声明结构体的变量名 struct money s[n]
5.给结构变量中的变变量赋值,并计算出实发工资
6.在用for循环输出姓名和实发工资注意格式

(2)流程图


二.实验代码

#include<stdio.h>
struct money{
  char name[10];
  float basic_salary;//基本工资
  float floating_salary;//浮动工资
  float expenditure;//支出
  float real_wages;//实发工资
};
int main()
{
  int n,i;
  scanf("%d",&n);
  struct money s[n];
  for(i=0;i<n;i++){
    scanf("%s %f %f %f",s[i].name,&s[i].basic_salary,&s[i].floating_salary,&s[i].expenditure);
    s[i].real_wages=s[i].basic_salary+s[i].floating_salary-s[i].expenditure;
  }
  for(i=0;i<n;i++){
    printf("%s %.2f\n",s[i].name,s[i].real_wages);
  }
  
}

三.调试过程中碰到的问题和解决办法

错误信息1

错误原因:输出结构变量中的姓名name不用加& 因为name就代表字符串首地址   有的语句结束每家;号
改正方法:将s[i].name前的&去掉,在结束语句后补上;

错误信息2

错误原因:输出中没有加入“\n”换行
改正方法:加入“\n"符合题意

7-2 计算平均成绩

一.设计思路

(1)描述算法

1.仔细阅读题目,了解题意
2.定义一个结构表变量命名为change 在结构变量中定义 学号为student_number[6] 姓名为name[11] 成绩grade
3.主函数定义 i n average num i为循环变量输入n average为平均值 num为成绩的和
4.利用for循环输入学号,姓名,成绩 将成绩累加sum=sum+s[i].grade
5.求出平均值 总成绩除以人数,并将其输出
6.利用for循环然后学生成绩逐个比较输出成绩和学号姓名

(2)流程图


二.实验代码

#include<stdio.h>
struct change{
  char student_number[6];
  char name[11];
  int grade;
};
int main()
{
  int n,i;
  float average=0;
  int sum=0;
  scanf("%d",&n);
  struct change s[n];
  for(i=0;i<n;i++){
    scanf("%s %s %d",s[i].student_number,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(average>s[i].grade){
      printf("%s %s\n",s[i].name,s[i].student_number);
  }
  }
}

三.调试过程中碰到的问题和解决办法

错误信息1

错误原因:姓名为10位 学号为5位 但是字符串中‘\0’占一个字符所以定义时加一
改正方法  char student_number[6];  char name[11]

错误信息2

错误原因:在输出平均成绩处没有加‘\n’
改正方法: printf("%.2f\n",average)

6-1 按等级统计学生成绩

一.设计思路

(1)描述算法

1.仔细阅读题目,了解题意
2.定义结构变量 结构变量中定义 num 姓名name[20] 成绩score 字符型grade
3.定义结变量名为stu[MAXN],*prt 定义整形i n count 循环输如每名学生的姓名学号成绩
4.调用函数set-grade 在函数中定义整形 i j利用循环调用结构体中的成绩依次判断,并记录不合格的学生返回j
5.最后输出学生的姓名学号成绩

(2)流程图


二.实验代码

int set_grade( struct student *p, int n ){
  int i;
  int j=0;
  for(i=0;i<n;i++){
    if((p+i)->score>=85 && (p+i)->score<=100){
      (p+i)->grade = 'A';
    }else if((p+i)->score>=70 && (p+i)->score<85){
      (p+i)->grade = 'B';
    }else if((p+i)->score>=60 && (p+i)->score<70 ){
      (p+i)->grade = 'C';
    }else{
      (p+i)->grade = 'D';
      j++;
    }
  }
  return (j);
}

三.调试过程中碰到的问题和解决办法

错误信息1

错误原因:if....else 的语法错误else后不用加条件
改正方法:if(条件)........else

6-2 结构体数组按总分排序

一.设计思路

(1)描述算法

1.定义一个结构体变量命名为student 定义整形num 数组串name 成绩score 学号sun
2.定义变量名,定义整形i,j, 浮点型fioat 利用for循环输入同学的学号 姓名 内层循环输入成绩
3.调用函数calc 函数中定义i 用for循环求出三门成绩的总和
4.调用函数sort 定义整形i j k 选择排序法比较将学生的成绩排序
5.输出学生的成绩

(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,k;
  k=0;
      struct student t;
    for(i=0;i<n-1;i++){
        k=i;
        for(j=i;j<n;j++){
            if(((p+k)->sum)<((p+j)->sum)){
                k=j;
            }
        }
        if(k!=i){
            t=*(p+i);*(p+i)=*(p+k);*(p+k)=t;
        }
    }
}

三.调试过程中碰到的问题和解决办法

错误信息1

错误原因:交换的时候也需要定义成结构变量体
改正方法:struct student t;

时间表

托管


链接
https://gitee.com/messi_beammessi6/second_pta_operation/tree/master

我评论的人

马卿辉 www.cnblogs.com/yeahbody
李伍壹 http://www.cnblogs.com/chenxidream/p/8654245.html
邓欣茹 http://www.cnblogs.com/dxfish/p/8747579.html

总结:

定义结构体的方法必须有struct标识符,在最后一定要有分号“;”,
在编译时对结构体类型是不分配内存的,只对变量分配内存。只能对结构体中的各个成员分别进行输入输出,不能够整体赋值,
“.”是成员(分量)运算法,优先级是最高的。
结构体变量既可以是数组也可以是指针变量。
(*p).name等价于p->name。->是指向运算符,p->name表示p指向结构体变量中的成员那么的值。