您的位置:首页 > 编程语言 > C语言/C++

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()。(但是没有加这一句是可以运行的)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: