C语言--结构体
一、PTA实验作业
题目1:结构体数组按总分排序
1. 本题PTA提交列表
2. 设计思路
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
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
排序函数一开始我用的和求和函数一个思路,就是数组处理,发现输出没变化,就对后面部分改动,改成指针操作,然后发现出现上述结果,看上去像是丢了一次排序过程,但是调试结果却是进行了四次循环排序。后来想到会不会因为if语句使用的是数组操作,而后面是指针操作,运行过程中对结果造成影响。统一成指针操作后答案正确。
题目2:时间换算
1. 本题PTA提交列表
2. 设计思路
struct time{
int hh;
int mm;
int ss;
}t1;//该结构体表示小时,分钟,时间
定义变量n表示增加的秒数,amount表示转化为秒后总秒数
输入小时数,分钟数,秒数
输入增加的秒数
计算总秒数amount
将总秒数转化为新的小时分钟秒数
秒数满60分钟数进一
分钟数满60小时数进一
小时数对24进行取余
输出新的小时,分钟,秒数
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
这一题一开始是想到用if判断是否总秒数大于23:59:59转化后总秒数,然后考虑零点问题,后来发现小时数对24取余就可以实现这一内容了。答案错误是因为不知道如何实现00这样的输出,在科委的帮助下,顺利得到了正确答案。
题目3:通讯录的录入与显示
1. 本题PTA提交列表
2. 设计思路
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
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
一开始是通过输出f(i)来输出相应信息,运行发现结果错了,想要输出的是第二条,但是输出的是第一条,想到的解决办法是把i改为i+1,这样结果就对了,因为测试的几组数据都有1这个编号,答案都符合预期结果,当时还没反应过来这样改算法都错了,果然PTA提交答案错误,仔细理了一遍发现f中的变量错了,应该是数组元素,而不是数组下标,我的算法会造成只要第一个测试编号是找的到结果的就会执行f(1),测试正好选择的编号是1,答案正好吻合了,所以一时没检查出错误,仔细读了一遍才发现问题
二、截图本周题目集的PTA最后排名。
三、阅读代码
(1)记录日常收支
该代码功能:记录流水号、发生日期、收支名称、发生金额、余额、登记人等信息,还能增加新纪录,查询记录
优点:结构体在做这些系统管理信息时比较方便,结构体代码借鉴的主要方面我觉得是整个程序框架的构建,比如有菜单栏输出,利用switch语句调用相应函数实现指定命令从而满足用户的需求。把一个个功能利用函数封装起来,整个思路会清楚很多,需要时就调用指定函数,也比较便于查错,另外改善程序也很方便,比如某些功能没考虑到,只要添加部分语句,完成函数调用就可以了,不然,你可能还需要写一遍函数
(2)实现矩阵转置
该代码功能::实现矩阵的转置运算,reverse函数完成转置,Input函数输出原函数,Output输出转置后的矩阵
优点:用指针做形参,调用函数所执行的操作后会传给主调函数。矩阵较大时,指针操作不需要像数组计算申请很大的内存空间,计算更快。
四、本周学习总结
1.总结本周学习内容。
(下面两项内容必须查阅资料回答,有其他认识也可以放在这个总结中)
1.结构体、共用体、枚举这种构造数据类型特点。
结构体:(1)可以把多种基本数据类型聚集在一起
(2)结构体所占内存空间是各成员变量所占内存之和
(3)结构体成员可以单独引用
(4)结构体不能整体输入输出,必须一个一个
(5)结构体每一位成员都用来表示一种具体事务的属性、
(6)结构体可以有结构函数
共用体:(1)多变量共享存储空间,允许几种不同的变量共用同一存储空间
(2)共用体成员可以表示多种属性(同一存储空间可以存储不同类型的数据)。
(3)共用体空间等于最大成员占据的空间
(4)共用体不能复制
枚举:(1)变量的值可以全部列出,定义一个枚举变量后,变量的值确定在定义之中
(2)枚举元素是常量,只能在定义阶段赋值
(3)枚举类型默认为是int类型,并默认为从0,1,2,3...递增排序,也可为属性赋值,也可改变枚举类型的int类型(如将其换成byte来减少内存的消耗)
(4)枚举类型内的都是同类型的属性变量
2.递归函数原理。
递归就是某个函数直接或间接地调用了自身,这种调用方式叫做递归调用。既然是函数调用,那么就有一个雷打不动的原则:所有被调用的函数都将创建一个副本,各自为调用者服务,而不受其他函数的影响。递归多少次,就有多少个副本,再利用内存的栈式管理,反向退出。凡是递归的函数,一定会在某一个地方存在能够返回上一层函数的代码,也就是递归出口,否则必定死递归,也就是说,某一个函数进入了无限调用自身的情况,永无止境地消耗内存等资源。
递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了,所以递归思想用递归用程序表达出来有三个要素:递 + 结束条件 + 归。
任何递归函数必须包含条件,来判断是否要递归下去,一旦结束条件成立,递归克隆不应该继续,以递归出口值作为函数结果,然后返回,结束一个递归克隆函数体,再通过一层层的返回,一层层计算,最终得到结果
3.结构体复习
(1)struct和它后面的结构名一起组成一个新的数据类型名
(2)结构的嵌套定义:先定义成员的结构类型再定义主结构类型
(3)结构变量的定义和初始化
i 单独定义、混合定义、无类型名定义
ii 结构变量的初始化采用初始化表的方法,大括号内各数据项间用逗号隔开,将大括号内的数据项按顺序对应的赋给结构变量内各个成员,且要求数据类型一致
(4)结构变量成员的引用
i 结构名.结构成员名 如 s1.sum
ii 嵌套结构成员引用类似 如 struct nest_student nest_s1
规则:从左到右 从外到内
(5)结构变量的整体赋值
允许将一个结构变量的值直接赋给另一个结构变量,但是必须是相同结构类型变量
(6)结构指针
访问结构成员 i 用*p访问
ii 用指向运算符->
4.递归
1.函数嵌套调用 先调用后返回
2.俩个要点:递归式子和递归出口
3.任何递归函数必须包含条件,来判断是否要递归下去,一旦结束条件成立,递归克隆不应该继续,以递归出口值作为函数结果,然后返回,结束一个递归克隆函数体,再通过一层层的返回,一层层计算,最终得到结果
2.罗列本周一些错题。
结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字符,所以char mouth被补充了3个字节。而指针变量的大小在64位的机器上永远是8,在32位上永远是4
比较字符串大小看错了。。。
根据题意 d=b 所以d.sno=2002
*p=&d 所以 p->name 为Shangxian