struct student { int num; char name[15]; float score[3]; float sum; };//该结构体表示学生的编号,姓名,得分和总分 struct student stu[5]; 定义循环变量 i,j; 定义浮点型变量 f,存放各学生各得分数; for i=0 to i=4 输入学生编号,姓名 for j=0 to j=2 输出得分 存放入数组score end for end for 调用函数calc求总分 调用函数sort对总分进行从高到低排序 排好序后按顺序输出编号和姓名和各项得分和总分 求总分函数: struct student stu[5]; 定义循环变量 i; for i=0 to n-1 调用结构体数据求和 i++,p++; end for 排序函数 struct student stu[5]; 定义循环变量 i,j; 定义结构体变量temp for i=0 to n-1 for j=i+1 to n-1 若是(*(p+j)).sum>(*(p+i)).sum) 利用item作中间量,实现互换 end for end for
排序函数一开始我用的和求和函数一个思路,就是数组处理,发现输出没变化,就对后面部分改动,改为指针操做,而后发现出现上述结果,看上去像是丢了一次排序过程,可是调试结果倒是进行了四次循环排序。后来想到会不会由于if语句使用的是数组操做,然后面是指针操做,运行过程当中对结果形成影响。统一成指针操做后答案正确。算法
struct time{ int hh; int mm; int ss; }t1;//该结构体表示小时,分钟,时间 定义变量n表示增长的秒数,amount表示转化为秒后总秒数 输入小时数,分钟数,秒数 输入增长的秒数 计算总秒数amount 将总秒数转化为新的小时分钟秒数 秒数满60分钟数进一 分钟数满60小时数进一 小时数对24进行取余 输出新的小时,分钟,秒数
这一题一开始是想到用if判断是否总秒数大于23:59:59转化后总秒数,而后考虑零点问题,后来发现小时数对24取余就能够实现这一内容了。答案错误是由于不知道如何实现00这样的输出,在科委的帮助下,顺利获得了正确答案。数组
struct friend{ char name[11]; char birthday[11]; char sex; char mobile[20]; char sta[20]; }f[100];//该结构体表示朋友的姓名,出生日期,性别,移动电话,座机号码 定义循环变量 i,k表示要查询个数,n表示通信录中人数,t用来存放要查询编号; 定义数组a[k]存放查询编号 输入总人数 for i=0 to n-1 输入姓名,出生日期,性别,移动电话,座机号 输入要查询的个数 for i=0 to k-1 输入查询编号数并存入数组a for i=0 to i<k 若是编号查询有结果 输出该编号对应姓名,座机号,移动电话,性别,出生日期 不然输出 Not Found
一开始是经过输出f(i)来输出相应信息,运行发现结果错了,想要输出的是第二条,可是输出的是第一条,想到的解决办法是把i改成i+1,这样结果就对了,由于测试的几组数据都有1这个编号,答案都符合预期结果,当时还没反应过来这样改算法都错了,果真PTA提交答案错误,仔细理了一遍发现f中的变量错了,应该是数组元素,而不是数组下标,个人算法会形成只要第一个测试编号是找的到结果的就会执行f(1),测试正好选择的编号是1,答案正好吻合了,因此一时没检查出错误,仔细读了一遍才发现问题框架
(下面两项内容必须查阅资料回答,有其余认识也能够放在这个总结中)函数
结构体:(1)能够把多种基本数据类型汇集在一块儿 (2)结构体所占内存空间是各成员变量所占内存之和 (3)结构体成员能够单独引用 (4)结构体不能总体输入输出,必须一个一个 (5)结构体每一位成员都用来表示一种具体事务的属性、 (6)结构体能够有结构函数
共用体:(1)多变量共享存储空间,容许几种不一样的变量共用同一存储空间 (2)共用体成员能够表示多种属性(同一存储空间能够存储不一样类型的数据)。 (3)共用体空间等于最大成员占据的空间 (4)共用体不能复制
枚举:(1)变量的值能够所有列出,定义一个枚举变量后,变量的值肯定在定义之中 (2)枚举元素是常量,只能在定义阶段赋值 (3)枚举类型默认为是int类型,并默认为从0,1,2,3...递增排序,也可为属性赋值,也可改变枚举类型的int类型(如将其换成byte来减小内存的消耗) (4)枚举类型内的都是同类型的属性变量
递归就是某个函数直接或间接地调用了自身,这种调用方式叫作递归调用。既然是函数调用,那么就有一个雷打不动的原则:全部被调用的函数都将建立一个副本,各自为调用者服务,而不受其余函数的影响。递归多少次,就有多少个副本,再利用内存的栈式管理,反向退出。凡是递归的函数,必定会在某一个地方存在可以返回上一层函数的代码,也就是递归出口,不然一定死递归,也就是说,某一个函数进入了无限调用自身的状况,永无止境地消耗内存等资源。 递归的基本思想是把规模大的问题转化为规模小的类似的子问题来解决。在函数实现时,由于解决大问题的方法和解决小问题的方法每每是同一个方法,因此就产生了函数调用它自身的状况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的状况了,因此递归思想用递归用程序表达出来有三个要素:递 + 结束条件 + 归。 任何递归函数必须包含条件,来判断是否要递归下去,一旦结束条件成立,递归克隆不该该继续,以递归出口值做为函数结果,而后返回,结束一个递归克隆函数体,再经过一层层的返回,一层层计算,最终获得结果
(1)struct和它后面的结构名一块儿组成一个新的数据类型名学习
(2)结构的嵌套定义:先定义成员的结构类型再定义主结构类型测试
(3)结构变量的定义和初始化
i 单独定义、混合定义、无类型名定义
ii 结构变量的初始化采用初始化表的方法,大括号内各数据项间用逗号隔开,将大括号内的数据项按顺序对应的赋给结构变量内各个成员,且要求数据类型一致设计
(4)结构变量成员的引用3d
i 结构名.结构成员名 如 s1.sum
ii 嵌套结构成员引用相似 如 struct nest_student nest_s1
规则:从左到右 从外到内指针
(5)结构变量的总体赋值
容许将一个结构变量的值直接赋给另外一个结构变量,可是必须是相同结构类型变量调试
(6)结构指针
访问结构成员 i 用*p访问
ii 用指向运算符->
###4.递归
1.函数嵌套调用 先调用后返回
2.俩个要点:递归式子和递归出口
3.任何递归函数必须包含条件,来判断是否要递归下去,一旦结束条件成立,递归克隆不该该继续,以递归出口值做为函数结果,而后返回,结束一个递归克隆函数体,再经过一层层的返回,一层层计算,最终获得结果
结构体每一个成员相对于结构体首地址的偏移量都是成员大小的整数倍,若有须要编译器会在成员之间加上填充字符,因此char mouth被补充了3个字节。而指针变量的大小在64位的机器上永远是8,在32位上永远是4
比较字符串大小看错了。。。 根据题意 d=b 因此d.sno=2002 *p=&d 因此 p->name 为Shangxian