C语言博客作业--结构体
2017-12-24 22:51
323 查看
一、PTA实验作业
题目1(6-3)
(1).本题PTA提交列表
(2)设计思路
//定义student结构体变量stu; //定义循环变量i //遍历数组,对每一个编号变量进行匹配 for i=0 to N-1 stu=*std//把std的值赋给stu结构体变量 if stu.num==num //跳出循环 std++; end i if i大于等于N //把stu各项归0; //返回stu变量
(3)代码截图
(4)本题调试过程碰到问题及PTA提交列表情况说明
注意裁判程序里的num是一个字符数组,需要使用strcmp函数进行字符串比对。后来重新思考,这里不需要再定义一个结构体变量,只用std结构体指针即可,即
一样可以完成。
题目2(7-5)
(1).本题PTA提交列表
(2)设计思路
struct rational{ int a1; int b1; int a2; int b2; };//存放两个有理数的分子和分母(a/b的形式) //定义rational结构体变量num //输入两个有理数 //对a1*b2和a2*b1的值进行判断 if num.a1*num.b2等于num.a2*num.b1 //原样输出两个有理数,在这两个数之间加上等于号 else if num.a1*num.b2小于num.a2*num.b1 //原样输出两个有理数,在这两个数之间加上小于号 else //原样输出两个有理数,在这两个数之间加上大于号
(3)代码截图
(4)本题调试过程碰到问题及PTA提交列表情况说明
开始时把问题复杂化了,想着分别求两个有理数分子和分母的公约数及其最简式,再进行比较。发现这样写越写越复杂,可能要写一个自定义函数用来求分子和分母的最大公约数,还有一个函数用来求最简式,再要定义四个变量来存放两个有理数的初始值,再先比较分母:如果分母大、如果分母小:再比较分子:如果分子大、如果分子小:再分别输出不同结果。相当麻烦。
然后用了数学知识:a/b与c/d的运算关系。
然后只需要判断a乘d与c乘b的关系做不同输出即可,这样写只需要写三个输出。
题目3 (7-6)
(1).本题PTA提交列表
(2)设计思路
struct friends{ char name[20]; char birthday[20]; char sex; char fixedline[30]; char phone[30]; };//定义朋友的五个属性:姓名、生日、性别、固话、手机 //定义朋友的个数n、循环变量i、查询次数k; //输入n; //定义friends结构体数组fid //输入数组内容 for i=0 to n-1 //按顺序输入姓名、生日、性别、固话、手机 end i; //查询 for k to 1 //输入编号i; if i不在0~n内 //输出Not Found else //按顺序输出姓名、固话、手机、性别、生日 end k;
(3)代码截图
(4)本题调试过程碰到问题及PTA提交列表情况说明
错误原因在于我的画蛇添足:在k循环里多判断了k=1时的输出。然后就改掉了这个错误,并且把原来用整型变量存放的日期改成字符串形式。
二、截图本周题目集的PTA最后排名。
PTA排名
三、阅读代码
1)strcmp函数
int __cdecl strcmp ( const char * src, const char * dst ) { int ret = 0 ; while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)//先对src和dst字符串进行无符号转换,再取它们相减的值给ret,再对ret进行取非,当ret=0时继续比较 ++src, ++dst; //对ret不为0情况判断 if ( ret < 0 ) ret = -1 ; else if ( ret > 0 ) ret = 1 ; return( ret ); }
优点在于while语句的部分,先对两个字符串进行无符号化,扩大值的范围,再相减,避免出现问题。然后用前缀递增和逗号运算符使得一个语句执行两个指针的自增。
2)strrev函数
char * __cdecl _strrev ( char * string ) { char *start = string; char *left = string; char ch; while (*string++) ; /* find end of string */ //将string指到倒一位 string -= 2; // while (left < string) { ch = *left; *left++ = *string; *string-- = ch; } return(start); }
优点在于对指针、单目运算符、循环条件的熟练使用,因为 left++ = string, left不需要等于string。再进行字符交换,最后返回另一个指向首字符地址的字符指针。
四、本周学习总结(3分)
1.总结本周学习内容。下面两项内容必须查阅资料回答,有其他认识也可以放在这个总结中
结构体、共用体、枚举这种构造数据类型特点。
1)结构体
可以自定义该类型里的成员(不同或相同类型变量),对付大量相同数据时可能更为方便,灵活度很高结构体类型和系统提供的标准类型(如int、char、float、double) 一样,都可以用来定义变量,只不过结构体类型需要事先由自己声明
根据不同编译器,内存存储会有所不同,在存储该结构体时会按照内存对齐进行相关处理,系统默认对齐系数为4(即按int类型对齐,可以认为每相邻两个数据成员存储是大小是4的整数倍)
类型与变量是不同的概念。只能对结构体变量中的成员赋值,而不能对结构体类型赋值。在编译时,是不会为类型分配空间的,只为变量分配空间。
结构体中的成员名可以与程序中的变量名相同,但二者没有关系。
结构体的成员可以是另外一个结构体。
2)共用体
将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。同一个内存段可以用来存放几种不同类型的成员,但是在每一瞬间只能存放其中的一种,而不是同时存放几种。
共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有成员就失去作用。
共用体变量的地址和它的各成员的地址都是同一地址。
对于其中一个成员的赋值,会影响到另一个成员。
3)枚举
用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。通常(不特殊定义下)是将这组变量名定义为常量(不可修改)。
//例1:定义一星期编号 enum week{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}; //此时Monday的值为0,Tuesday的值为1,顺序递增一。 //例2:定义一星期工作日编号 enum week{Sunday=7, Monday=1, Tuesday, Wednesday, Thursday, Friday, Saturday}; //此时Tuesday值为2,即从下一位变量没有赋给值的变量开始递增一。 //特殊:不能赋给负数
递归函数原理
将一个问题分解成相同的众多小问题,再用同一种方式解决。分为递推和回归步骤。
递推即是分解的过程,所以必须有一个限制条件,使递推有边界
回归:递推到达边界之后,解决最小的问题并返回,然后逐步回归,逐步解决问题,最后返回结果
2.罗列本周一些错题。
没有在字符串的输入之前加入getchar()。(但是没有加这一句是可以运行的)。