• 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!='';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] = '';)

    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!='
    ')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 != ' '就能使endPtr在扫到换行符时停止)
    2.段错误:endPtr扫描错方向循环无法退出(改为endPtr++)
    3.部分正确:输出格式不对,空格个数不是一个(判断输出时是否为第一个字符串)


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




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

  • 相关阅读:
    小w的喜糖(candy)
    亚瑟王(arthur)
    Bajtman i Okrągły Robin
    Bajtman i Okrągły Robin
    网络流模板
    网络流模板
    觉醒力量 (hidpower)
    觉醒力量 (hidpower)
    E-card
    E-card
  • 原文地址:https://www.cnblogs.com/sixiDL000/p/11963363.html
Copyright © 2020-2023  润新知