C博客作业05--2019-指针

0.展示PTA总分


1.本章学习总结

1.1 学习内容总结

1、指针与数组

数组求和
定义数组,指针
int a[N],*p;
给指针赋值//未赋值指针不能正常使用
sum=0
p=a//等价于p=&a[0]
for p=a to &a[N] do
p++;
sum+=*p//数值累加
end for

2、字符指针

指针表示字符串:
并不是将字符串放到字符指针变量中,而是占用一个存放地址的的内存单元储存值,值为字符串首字符的地址

char *s="string";//改变指针的值,可让它指向新的字符串s="hello"

指针字符串循环

定义字符指针char *s,str[20]//若指针无值可赋可先定义char *s=NULL
gets(str);//输入字符串遇回车结束(scanf("%s",数组名),遇空格或回车结束)
s=str
for(;*s!='\0';s++)

3、动态内存分配

根据运行时的实际存储需求分配适当的存储区
使指针指向获得的内存空间
使用完毕需释放free(获得分配的指针)

int *p;
p=(int*)malloc(n*sizeof(int))
free(p)

何时需要动态申请内存?

int *p;//定义了一个指向int类型的指针p
p是用来储存一个地址的值的,我们之所以要为p这个变量分配空间是让它有一个明确的指向
动态分配内存的方式来规定它的方向

4、二级指针、行指针

二级指针

行指针

数据类型:(*p)[m]
指向由m个元素组成的一维数组的行指针变量

5、指针数组及其应用

类型名 *数组名[数组长度]
若定义char *color[5]
则color[i]存放字符串首地址,分别指向一个字符串

若要交换指向单元

char *temp
temp=color[0];
color[4]=color[0];

6、指针做函数返回值及其注意

不能在实现函数返回在函数内部定义的局部数据对象的地址
因为所有的局部数据对象在函数返回时就会消亡

1.2 本章学习体会

1、对指针的定义和用法有了一定的了解
2、对于指针的使用大部分还是转为数组后再应用
3、对于指针指向问题,和指针指向内容的改变问题还是有点模糊
4、希望还能多讲讲指针方面的内容

代码量
13、14 627

2.PTA实验作业

2.1 7-5 删除字符串中的子串

2.1.1 伪代码

定义主串、子串char str[N],subStr[N]
fgets输入主串子串
调用分装函数

void DelSubStr(char *str,char *subStr)

定义位置指针locPtr//查找子串在主串中的位置
len//求出子串长度len=len-1
舍去子串中的换行符
while ((locPtr = strstr(str, subStr)) != NULL)//能够在主串中查找到子串
{ 
    将查找到的子串后的字符向前挪动len个位置
} 

2.1.2 代码截图


2.1.3 总结本题的知识点

1.strstr函数用法及作用

搜索"子串"在"指定字符串"中第一次出现的位置
(1) 成功找到,返回在"指定字符串"中第一次出现的位置的 char *指针
(2) 若未找到,也即不存在这样的子串,返回: "NULL"

2.注意插入指针移动到哪里停止
3.注意计算子串长度时要舍去换行符

2.1.4 PTA提交列表及说明


1.段错误:未给while循环加退出条件(添加语句(locPtr = strstr(str, subStr)) != NULL调用strstr函数判断何时退出循环)
2.部分正确:测试数据0,格式错误。0测试点输出问题,直接复制PTA解决。
3.部分正确:未将换行符舍去导致输入错误(加入len--;//舍去换行符)
4.部分正确:未在字符串末尾添加结束标志(subStr[len] = '\0';)

2.2 7-3 字符串的冒泡排序

2.2.1 伪代码

定义number字符串个数
定义times扫描次数
定义二维字符数组str[N][20]//存放所要排序的字符串字符串
定义一维字符数组temp[N]//将所要交换的字符串先储存
for i=0 to number do
   输入字符串str[i]
end for
for i=0 to times do
    for j=0 to number-i-1 do
        若前一个字符串大于后一个字符串strcmp(str[j],str[j+1])>0
                 交换两字符串strcpy
    end for
end for
输出排序后字符串

2.2.2 代码截图


2.2.3 总结本题的知识点

1、strcmp函数

strcmp(str1, str2)
如果返回值 < 0,则表示 str1 小于 str2
如果返回值 > 0,则表示 str2 小于 str1
如果返回值 = 0,则表示 str1 等于 str2

2、strcpy函数

strcpy(目的字符串,源字符串) 
会把源字符串指向的字符串复制到目的字符串
必须保证目的字符串足够大,能够容纳下源字符串,否则会导致溢出错误

3、注意冒泡排序法两层循环的停止位置

2.2.4 PTA提交列表及说明


1.多种错误:字符串比较直接用大于小于号导致比较错误(应用strcmp字符串比较函数strcmp(str[j],str[j+1])>0)
2.编译错误:调用函数时实参传递错误(改为二维字符数组)
3.部分正确:交换字符串内容出错(改用strcpy(temp, str[j]))

2.3 7-4 说反话-加强版

2.3.1 伪代码

定义一维字符指针str[N]
fgets输入字符串
调用函数

void ReverseOrderStr(char *beginPtr)

定义尾部指针endPtr=beginPtr
将endPtr指针定义到字符串尾部,且不收入换行符 while(*endPtr&&*endPtr!='\n')endPtr++;
遍历指针p=--endPtr
while(p!=beginPtr)指到第一个字符为止
{
   若*p不是空格,则统计单词长度len
   若*p不是空格但前一个字符是空格,则代表是一个单词,
        输出从p开始len长度的字符串
   p--
}
输出第一个单词

2.3.2 代码截图



2.3.3 总结本题的知识点

1、注意计算准确每个单词的长度
2、注意换行符的取舍
3、注意输出格式

2.3.4 PTA提交列表及说明

原来使用二维字符数组i++;a[i]存放一个单词后逆序输出
但是过不了最后一个测试点
最后还是用了超星上的方法

1.多种错误:第一个字符串的开头无法扫描进(多添加一个if语句继续扫描)
最后一个字符输出时换行(未把换行符排除,只需在循环语句中多添加一条*endPtr != '\n'就能使endPtr在扫到换行符时停止)
2.段错误:endPtr扫描错方向循环无法退出(改为endPtr++)
3.部分正确:输出格式不对,空格个数不是一个(判断输出时是否为第一个字符串)


3.阅读代码(-2--1分)




解题思路:
1、每次顺序读取两个值
2、如果前一个比后面小的话,就说明出现了上述六种特殊情况,用后一个值减去前一个值
3、如果前一个值大于后一个值,正常读取当前值即可
优点:
1、将特殊的六种情况分装另一个函数,增加了可读性,避免了代码重复

posted @ 2019-12-01 10:11  泗汐  阅读(297)  评论(0编辑  收藏  举报