一、PTA实验作业
题目1:输出月份英文名
1. 本题PTA提交列表
2. 设计思路
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
选择这一题是因为这道题的通过率较低。为什么会这样定义呢“char *month[]”,当时只是随便尝试一下输入十二个月份,没想到可以,于是上网查找一下,这种用法叫指针数组,数组中的每一个都是指针,具体介绍我将写在总结中。
题目2:字符串串动变化
1. 本题PTA提交列表
2. 设计思路
Begin
定义整型变量max,i,j;定义字符型变量temp;
max→0;
for i→1 to *(p+i)!=‘\0‘
if *(p+max)小于*(p+i)
max→i;
temp→*(p+max);
for j→max to j←1
*(p+j)→*(p+j-1);
*p→temp;
End
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
一开始让j=i开始复制,导致错误,应该从max开始移动,后把i改成max
题目3:求子串在母串中最后一次出现的地址
1. 本题PTA提交列表
2. 设计思路
Begin
定义整型变量i,k,p,count;
for i=0 to s[i]!=‘\0‘
if s[i]←t[0]
then { k→i;
count→1;
for p=1 to t[p]!=‘\0‘
if s[i+p]!=t[p]
then { count 自减;
break;} }
if count!=0 then 返回 (s+k);
else 返回 NULL;
End
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
这是原来的部分代码
但是这样不能保存子串最后一次出现在s字符串中的首地址,而且不能做到在s字符串中多次判断子串是否存在,于是添加了k来保存i,当s[i]==t[0]时count=1,如果后面的字符串与子串不同,则令count自减,这里其实用flag也可以,最后如果count为0,则说明s字符串中不存在子串。
二、截图本周题目集的PTA最后排名。
三、阅读代码
判断合法字符
这篇是梦冰的代码。当时我怎么写也不对,梦冰利用自定义函数来做,代码看起来更加整齐简洁,判断是否是合法字符,先判断首字符是否符合条件,如果符合再进入循环判断是否全部符合,思路简单清晰。
输出GPLT
原本以为这道题很难,但是其实只要数出GPLT的个数然后按顺序输出就可以了,简单有效的方法!
四、本周学习总结
1.自己总结本周学习内容。
结构
结构是C语言中一种新的构造数据类型,能把有内在联系的不同类型的数据汇聚成一个整体,使它们相互关联。同时,结构又是一个变量的集合,可以按照对基本数据类型的操作方法单独使用其成员的变量。
(1)结构类型定义的一般形式:
struct 结构名{
类型名 结构成员名1;
类型名 结构成员名2;
...
类型名 结构成员名n;
};
(2)关键字struct和它后面的结构名一起组成一个新的数据类型名。C语言中把结构的定义看做一条语句,所以结构的定义以分号结束。
(3)在结构定义成员时所用的数据类型也可以是结构类型,例如:
struct address{
char city[10];
int code;
int zip;
};
struct nest_student{
char name[10];
struct address addr;
int computer,english,math;
double average;
};
(4)注意:在定义嵌套的结构类型时,必须先定义成员的结构类型,再定义主结构类型。
(5)无类型名定义变量的方式:
struct {
类型名 结构成员名1;
类型名 结构成员名2;
...
类型名 结构成员名n;
} 结构变量名表;
需要注意的是,由于没有给出结构名,在此定义语句后面无法再定义这个类型的其他变量,除非把定义过程再写一遍。
(6)一个结构类型变量所占的内存空间是其各个成员所占内存空间之和,可以直接用sizeof计算,如 sizeof(struct student),sizeof的运算对象可以是结构类型名,也可以是结构变量名,计算结果以字节为单位。
(7)如果两个结构变量具有相同的类型,则允许将一个结构变量的值直接赋给另一个结构变量,如 s1=s2 。
(8)结构成员操作符为“.”
(9)使用结构指针时,假如指针p=&s1,要用p访问的结构成员进行赋值,则 (p).num=100,另,注意“.”的优先级高于“*”的优先级;还可以用->进行访问,如 p->num=100。
(10)结构指针作为函数参数,如:
自定义函数 int update_score(struct student *p,int n,int course)
调用语句 pos=update_score(students,n,num) /*students为结构数组名*/
指针数组与数组指针
- 数组指针是指向数组地址的指针,其本质为指针
- 指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。
- 指针数组可以作为函数的参量使用,使用方式与普通数组类似。
- 指针函数与二维数组的对比
- 二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给它分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。可以通过指定下标对其元素进行修改。
- 指针数组:如char *str_B[5] 系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。
- 如这样定义:
char a[3][8]={"gain","much","strong"};
char *n[3]={"gain","much","strong"};
那么系统给数组a分配了3×8的空间,而给n分配的空间则取决于具体字符串的长度。此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。
由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。
(参考自百度百科)
2.罗列本周一些错题。
课堂派5.
应该选D. A中的“p++”也是地址,与p的用法相同。
课堂派2.
不能直接对*(p+2)全部赋值,改正:
*(p+2).num=102030;
*(p+2).name[80]="数据结构";
*(p+2).price=40;