结构体

Posted 喵口三三

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体相关的知识,希望对你有一定的参考价值。

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

1. 本题PTA提交列表:

2. 设计思路:

struct student					
{
int num;
char name[15];
float score[3];
float sum;
};//该结构体表示学生的学号,姓名,成绩和成绩总和
call void calc(struct student *p,int n)//进入函数
int  i,  j
for  i ←0 to n
  (p+i)->sum←0; 
      i++;
for  i←0 to n   i++,p++;
{
  for  j←0 to 3
      p->sum←p->sum+p->score[j] ;
           j++;   
}    
end  for
end
call void sort(struct student *p,int n)//进入函数
int i,k,index;
struct student temp;//定义新的结构体
for i←0 to n-1 , i++
{
  index←i;
  for k←i+1 to n , k++
        if((p+k)->sum>(p+index)->sum)index←k;
    end  for
  temp←*(p+i);
 *(p+i)←*(p+index);
 *(p+index)←temp;
}
  end for
end

3.代码截图:

4.本题调试过程碰到问题及PTA提交列表情况说明

  • 1.一开始不会使用指针访问结构体,后来看书知道了指针访问结构有多种表示方式,如(*p).num,或p->num,结构数组也有多种表示方式,如p.num[i]或p[i].num[i];
  • 2.另一个错误是把temp=*(p+i); (p+i)=(p+index); *(p+index)=temp;中的i写成k,后来发现这样写只会让它自己和自己交换,要多注意;

7-1 计算职工工资

1. 本题PTA提交列表:

2. 设计思路:

  struct staff{
      char name[10];
      float truth;
      float real;
      float imag;
      float pay;};//定义员工姓名 基本工资 浮动工资 支出
   int n,i;
  struct staff s1[1500];
  输入n;
for i←0 to n ,i++
   输入员工姓名,浮动工资 ,支出
      end for
for i←0 to n,i++
   s1[i].truth ←s1[i].real+s1[i].imag-s1[i].pay;//计算基本工资
      end for 
for i←0 to n,i++
   输出员工姓名和基本工资

3.代码截图:

4.本题调试过程碰到问题及PTA提交列表情况说明

  • 1.起名有问题,一开始把truth命名为true,到DVE上运行发现原来它是库函数;
  • 2.定义结构体后没加分号;
  • 3.在PTA过得去,但在DVE 运行不了,后来发现是因为scanf("%s %f %f %f\\n",s1[i].name,&s1[i].real,&s1[i].imag,&s1[i].pay);中的\\n影响,在同学建议下把\\n删除,将for后加大括号,在scanf后加上getchar(),大括号把getchar()括起来就解决了这一问题;

7-2 时间换算:

1. 本题PTA提交列表:

2. 设计思路:

struct time{
  int cloc;
  int minute;
  int second;
};//定义时,分,秒
int i,n;
 struct time t1;
输入时分秒和要加的秒数n
getchar();//吸收回车符
if(n!=0){
for i=1 to n,i自增
    t1.second自增;
    if(t1.second==60)
         t1.minute自增;
         t1.second=t1.second-60;
              if(t1.minute==60)
                  t1.cloc自增;//分钟等于60,时钟加1
                  t1.minute=t1.minute-60;
                       if(t1.cloc==24)
                           t1.cloc=t1.cloc-24;
}
输出加法运算过后的时分秒

4.本题调试过程碰到问题及PTA提交列表情况说明。

  • 1.忘记考虑时针满24时要归0;没有加条件n!=0;改过来就对了;
  • 2.发现getchar():很好用,可用于吸收多余的回车符;

二、截图本周题目集的PTA最后排名。(2分)

三、阅读代码:


这是宵莹6-3题结构体数组中查找指定编号人员的代码,此代码用flag判断是否返回员工的信息,当遇到一个员工的编号和输入的编号不同时,立即读取下一个员工的编号,flag的值也重置为1;直到读取最后一个员工编号仍不符合输入编号时,flag=0,因为题目输入的员工编号已知,可以在编号中找到,所以可以不返回空串的值,若找到编号,则将此员工的信息复制到另一个结构体上,返回那个结构体;

这是我的6-3代码,我是采取直接用指针指向原来结构体,用strcmp函数比较std->num和num,如果找到则返回std(因为std本身自增),否则令 std->num[0]=0,再返回*std;我的思路和很多同学思路相似,而宵莹的思路比较独特,不是采取调用strcmp直接比较两个字符串,而是用嵌套循环和flag来比较,一遇到不同字符即进入下个字符串判断,flag的值也在相应进行更新,最后来判断返回何值,值得学习!

这是林岳7-6题 通讯录的录入与显示的代码,我从中学会了循环k次的另一种写法,在寻找编号时我是用循环来查找,代码如下:

而林岳的代码是直接用条件判断如:if(i>=n||i<0)printf("Not Found\\n");即查找不到,这样会更简洁明了,不用一次次执行循环去判断,值得学习!

四、本周学习总结(1分)

1.总结本周学习内容。

结构体、共用体、枚举这种构造数据类型特点

  • 1.结构体和数组一样都是构造型数据类型,和数组不同的是,结构体可以处理不同类型的数据。如下定义一个学生信息的结构体:

  • 2.共用体是一种多变量共享存储空间的构造类型,它允许几种不同的变量共用同一存储空间。共用体和结构体的区别:

     1.结构体每一位成员都用来表示一种具体事务的属性,共用体成员可以表示多种属性(同一存储空间可以存储不同类型的数据)。
    
     2.结构体总空间大小,等于各成员总长度,共用体空间等于最大成员占据的空间。
    
     3.共用体不能赋初值。
    

递归函数原理:

  • 1.递归函数的实质就是不断调用自己本身,使问题得到简化,应抓住两个关键点:递归出口和递归式子;
  • 2.在编程语言中,把直接或间接地调用自身的函数称为递归函数。函数的构建通常需要一个函数或者一个过程来完成。

2.罗列本周一些错题。

  • 1.课堂派递归部分第二题,弄不清楚递归的流程;
  • 2.正解为:n<0;n= =0| |n= =1; f=fac(n-1)*n;
  • 3.这里就是所谓的自己调用自己 fac(n-1)是调用自己,n是为了计算f的值。
    我们假设你在主函数里面输入3,即y=fac(3);
    那么fac函数执行如下:
    n=3时进入函数,f=fac(2)
    3;此时程序会进入fac(2),传入的参数n变成了2,
    但是并不执行return(f),return(f)要等fac(2)执行完成之后才能执行。
    fac(2)中f=fac(2-1)2,即f=fac(1)2,此时程序会进入fac(1),传入的参数n变成了1,
    但是并不执行return(f),return(f)要等fac(1)执行完成之后才能执行。
    fac(1)中,符合 if(n= =0| |n= =1),所以f=1.
    fac(1)将结果f return给fac(2),fac(2)中的f=12=2;
    fac(2)再将自己的f return给fac(3),fac(3)中的f=2
    3=6;
    这样y=fac(3)=6.;

以上是关于结构体的主要内容,如果未能解决你的问题,请参考以下文章

在C代码中将结构体变量作为参数传递效率忒低

如何优化C ++代码的以下片段 - 卷中的零交叉

20160221.CCPP体系详解(0031天)

Golang PrintfSprintf Fprintf 格式化

Go 系列教程 —— 17. 方法

VSCode自定义代码片段5——HTML元素结构