一、PTA实验作业
题目1.统计大于等于平均分人数
1. 本题PTA提交列表
2. 设计思路
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
①第一次代码验证对后贴到pta上显示答案错误。
②加两个0分的成绩,发现人数变多,平均分不变。
③尝试改条件,发现答案更加离谱。
④在同学的帮助下循环条件修改,最后正确。
题目2.判断回文字符串
1. 本题PTA提交列表
2. 设计思路
定义i,j为循环变量,n存放字符串长度,flag为是否回文的标志
for i=0 to s[i]='\0'
字符串长度n++;
end for
for i=0,j=n-1 to i>j
if 是回文字符串
flag=1;
else
flag=0;跳出循环;
end for
if flag为1
是回文字符串
else
不是回文字符串
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
①初步代码,答案错误。
②验证发现问题。只要有一组字符相等,就有flag=1,因此判断到中间如果发现不是回文字符串应该令flag=0。
题目3.使用函数实现字符串部分复制
1. 本题PTA提交列表
2. 设计思路
定义循环变量i;
for i=1 to m
开始的位置t++;
end for
while(*t)
字符复制到字符串s中;
t递增;
结束符*s='\0';
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
①寻找开始复制的位置时,循环里的条件使用错误,导致输出答案错误。
①把i=0改为i=1后正确。
二、截图本周题目集的PTA最后排名。
PTA排名
PTA提交列表
三、阅读代码
1.删除字符串中的子串
分析:这段代码中采用了四种字符串操作函数:strcpy, strcat,strstr,strlen;利用strstr在字符串a中查找字符串b首次出现的地址,利用strcpy得到删除b字符串后得到的后面的字符串赋值到数组c中,再利用strcat把字符串c连接到a使a成为包含c和a的结果串。循环以上步骤。
优点:巧妙地运用了字符串操作函数,使原本复杂的代码变得较简单。2.字符串的冒泡排序
分析:通过strcmp函数比较前后两个字符串,利用了strcpy函数的复制功能做到了字符串冒泡的效果,输出扫描完第K遍后的中间结果序列。
优点:运用字符串操作函数来表现字符串冒泡的效果,比较巧妙。
四、本周学习总结
1.自己总结本周学习内容。
1.什么是结构?结构与数组有什么差别?
- 结构是C语言中一种新的构造数据类型,它能够把有内在联系的不同类型的数据统一成一个整体,使它们相互关联;又是一个变量的集合,可以按照对基本数据类型的操作方法 单独使用其成员变量。
- 结构与数组的比较:①都是构造类型,是多个变量的集合;②数组成员类型相同,结构成员类型不同。
2.结构类型的定义形式
2.1结构类型定义的一般形式
struct 结构名{
类型名 结构成员名 1 ;
类型名 结构成员名 2 ;
…
类型名 结构成员名 n ;
};
注:
①struct是定义结构类型的关键字。
②结构名是一个合法的C标识符。
③关键字和结构名组成结构类型名。
④大括号内的内容是结构所包括的结构成员,也叫结构分量。
⑤结构的定义以分号结束。
2.2结构的嵌套定义
struct address{ //定义地址结构
char city[10];
char street[20];
int code;
int zip;
};
struct nest_student{
int num;
char name[10];
struct address addr; //定义通信地址成员
int computer,english,math;
double average;
};
注:定义嵌套的结构类型时,必须先定义成员的结构类型,再定义主结构类型。
2.3.用typedef定义类型
- 方法一:先定义结构体类型,再使用typedef为之取一个别名。
struct student{
int num;
char name[10];
struct address addr;
int computer,english,math;
double average;
};
typedef struct student STU;
- 方法二:定义结构体类型的同时使用typedef为之取一个别名,并且不省略结构体标识名。
typedef struct student{
int num;
char name[10];
struct address addr;
int computer,english,math;
double average;
}STU;
- 方法三:定义结构体类型的同时使用typedef为之取一个别名,并且省略结构体标识名。
typedef struct {
int num;
char name[10];
struct address addr;
int computer,english,math;
double average;
}STU;
3.结构变量的定义
- 1.单独定义:先定义一个结构类型,再定义这种结构类型的变量。
struct 结构名{
类型名 结构成员名 1 ;
类型名 结构成员名 2 ;
…
类型名 结构成员名 n ;
};
- 2.混合定义:在定义结构类型的同时定义结构变量。
struct 结构名{
类型名 结构成员名 1 ;
类型名 结构成员名 2 ;
…
类型名 结构成员名 n ;
}结构变量名表;
- 3.无类型名定义:在定义结构变量时省略结构名。
struct {
类型名 结构成员名 1 ;
类型名 结构成员名 2 ;
…
类型名 结构成员名 n ;
}结构变量名表;
4.结构变量的使用
4.1.结构变量的成员的引用
- 格式:
结构变量名.结构成员名
例:
①strcpy(s1.name,"zhang");
②嵌套结构:nest_s1.add.zip=310015;//表示学生的通信地址的邮编
注:
①嵌套定义的结构变量中,每个成员按从左到右,从外到内的方式引用。
②结构成员成员运算符的优先级属最高级别,所以一般情况下都是优先执行,即和一般运算符混合运算时,结构成员运算符优先。
4.2.结构变量的整体赋值
注:只有相同结构类型的变量之间才可以直接赋值。
例:s2=s1;
等效于
s2.num=s1.sum;
strcpy(s2.name,s1.name);//数组
s2.math=s1.math;
s2.english=s1.english;
s2.computer=s1.computer;
s2.average=s1.average;
4.3.结构变量作为函数的参数特点
- 特点:可以传递多个数据且参数形式较简单。但是,对于成员较多的大型结构,参数传递时所进行的结构数据复制使得效率较低。、
5.结构数组操作
- 结构数组的每个数组元素都是一个结构类型的数据。
- 定义:
struct student students[50];
- 初始化:
struct student students[50]={{101,"zhang",76,85,78},{102,"wang",83,92,86} };
- 引用:
结构数组名 [下标].结构成员名
例:字符型数组:strcpy(students[i].name,"zhang");
6.结构指针概念
- 结构指针就是指向结构类型变量的指针。
- 结构指针的值实际上时结构变量的首地址,即第一个成员的地址。
struct student s1={101;"zhang",78,87,85},*p;
p=&s1;
- 访问结构成员
(1)用*p访问结构成员(*p).num=101;
注:括号不能少。因为“.”优先级高于“*”,若没有括号,*p.num等价于*(p.num),含义发生变化,会产生错误。
(2)用指向运算符->访问指针指向的结构成员p->num=101;
注:在使用结构指针访问结构成员时,通常使用指向运算符->。
7.常见的字符串操作函数
2.罗列本周一些错题。
应该在sum+=*s后加上‘0’才能将字符串中的数字字符转换成对应数值
图中圈出来的一处表示的应该是n所指向的内容递增,而不是地址自增,应该是(*n)++