一、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[n]
//输入数组内容
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()。(但是没有加这一句是可以运行的)。