C语言博客作业--结构体

一、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()。(但是没有加这一句是可以运行的)。
posted @ 2017-12-24 22:51  那就这个名字  阅读(452)  评论(1编辑  收藏  举报