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

蹲街弑〆低调 提交于 2019-12-06 06:41:29

0.展示PTA总分


1.本章学习总结

1.1 学习内容总结

  • 指针变量的定义
    如果在程序中声明一个变量并使用地址作为该变量的值,那么这个变量就是指针变量。定义指针变量的一般形式为:类型名 *指针变量名,例如:int *p。指针变量名时指针变量的名称,必须是一个合法的标识符。
  • 指针的基本运算
    取地址运算符&用于取地址,间接访问运算符*用于取内容,例如:p=&a,p=*a.
    赋值运算符=可以在指针之间互相赋值,例如:p1=&a,p2=p1
  • 字符串处理函数
函数名 函数功能
getchar 从标准输入文件读入一个字符
putchar 输出一个字符
puts 把字符串s输出到标准输出文件,'\0'转换为'\n'输出
fgets 从fp所指文件中最多读n-1个字符(遇到'\0'.^z终止)到字符串s中
strcat 把字符串t连接到s,是s成为包含s和t的结果串
strcmp 逐个比较字符串s和t中的对应字符,直到对应字符不等或比较到串尾
strcpy 把字符串t复制到s中
strlen 计算字符串s的长度(不包括'\0')
strstr 在字符串s中查找字符串t首次出现的地址
  • 内存动态分配相关函数
函数名 函数功能
malloc 申请空间并返回首地址
calloc 申请空间并返回首地址,而且将存储块初始化为0
realloc 更改以前的存储分配
free 释放申请得来的空间
  • 指针做循环变量做法
    假设原来的指针为ptr,我们往往需要定义一个新的指针指向ptr,来作为循环变量使用。例如
char* pStr = str;
for (;*pStr;pStr++)
    {
        if (*pStr == ch) index =pStr;
    }
  • 字符指针如何表示字符串
    1.可以在定义指针的同时就对其进行初始化加以表示,例如char *sp=point
  1. 1.2 本章学习体会


2.PTA实验作业

2.1 6-9 合并两个有序数组(2)

2.1.1 伪代码

  • 数据处理
类型 变量名 由来
int* temp 开辟临时数组存放排序后的数组
int i 循环变量
int j 数组a下标
int k 数组b下标
  • 伪代码
定义void类型的merge函数(形参为int型指针a,int型m,int型指针b,int型n)

定义int型变量i作为循环变量
定义int型变量j作为数组a下标
定义int型变量k作为数组b下标
开辟临时数组temp存放排序后的数组

i,j,k初始化为0
for 循环条件为j < m && k < n do
    if a中元素小 then
        将a中元素放入temp数组
        a移动到下一个元素
    else 
        将b中元素放入temp数组
        b移动到下一个元素
    end if
end for
while j < m do
    将a中剩余元素放入temp数组
end while
while k < n do
    将b中剩余元素放入temp数组
end while
for i=0 to m+n do
    将temp数组的元素放入a数组
end for
释放temp的空间

2.1.2 代码截图

2.1.3 总结本题的知识点

1.使用malloc函数申请空间,使用free函数释放空间
2.使用for循环和while循环处理数组内的元素
3.运用数组法使用指针
4.分段处理数据的思维

2.1.4 PTA提交列表及说明

  • PTA提交列表

  • PTA提交列表说明

结果 原因
部分正确 初步思路是将数据都放入同一个数组再排序,耗时过长
部分正确 引入变量flag判断是否已经排序好,稍做优化,仍然运行超时
部分正确 b数组可能越界访问数组外的元素
部分正确 简化代码,仍然存在上述问题
答案正确 采取分阶段放入数据的方法,正确

2.2 7-4 说反话-加强版

2.2.1 伪代码

  • 数据处理
类型 变量名 由来
char* str 存放字符串
int len 记录字符串长度
int i,j 循环变量
int mark 控制输出格式
int begin 记录单词头
int end 记录单词尾
  • 伪代码
main函数
定义char*型变量str存放字符串
定义int型变量len记录字符串长度

为str开辟数组空间
输入并处理字符串
计算字符串长度
调用invert函数
释放str的空间
定义void型invert函数(形参为char*型str,int型len)
定义i,j作为循环变量
定义mark控制输出格式
定义begin记录单词头
定义end记录单词尾

for i=len-1 to 0 do
    if 找到单词 then
        记录单词尾
        for j=i-1 to 遇到空格或者字符串到首部 do
            寻找单词头
        end for
        记录下次开始寻找单词的位置以及单词头
        输出该单词(注意格式)
        mark自增
    else 
        i自减
    end if
end for

2.2.2 代码截图

2.2.3 总结本题的知识点

1.使用malloc函数申请空间,使用free函数释放空间
2.字符串的处理
3.单词头尾的判断,从哪儿寻找单词的判断
4.使用strlen函数计算字符串长度

2.2.4 PTA提交列表及说明

  • PTA提交列表

  • PTA提交列表说明

结果 原因
部分正确 使用指针数组存储配合scanf输入字符串,但无法判断单词数,单词长度
部分正确 给每个数组元素分配最大字符数的空间,内存超限
答案正确 用一个字符数组存放字符串,逆序寻找每个单词后输出,正确

2.3 7-6 A-B

2.3.1 伪代码

  • 数据处理
类型 变量名 由来
char strA[N] 存放字符串A
char strB[n] 存放字符串B
static int ascii ASCII码数组
int k 重构造数组下标
int i 循环变量
  • 伪代码
main函数
定义数组strA存放字符串A
定义数组strB存放字符串B

输入字符串A,B

调用函数Delete
定义void类型Delete函数(形参为char*型strA,char*型strB)

定义静态int型数组ascii
定义k作为重构造数组下标
定义i作为循环变量

for i=0 to strB结束 do
    strB元素为ascii数组下标,ascii数组对应元素自增
end for
for i=0 to strA结束 do
    if ascii中的对应位置为0 then
        记录到重构数组中
    end if
end for
为strA添加结束符
输出strA

2.3.2 代码截图

2.3.3 总结本题的知识点

1.使用fgets函数输入字符串
2.使用hash数组简化问题
3.注意重构数组后要在末尾添加结束符

2.3.4 PTA提交列表及说明

  • PTA提交列表

  • PTA提交列表说明

结果 原因
部分正确 这么多部分正确,总结起来就是三个问题
部分正确 1.数组空间不够大,无法输入所有的数据
部分正确 2.认为ascii数组太小,但显然想多了
部分正确 3.数组空间够大,但是使用fgets时却限制了输入的字符个数
答案正确 解决以上三个问题后,正确

3.阅读代码


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!