C语言博客作业04--数组

0.展示PTA总分

  • 一维数组
  • 二维数组
  • 字符数组

1.本章学习总结

1.1 学习内容总结

  • 查找数据:
    1.遍历法查找:从头遍历数组找到对应数据即退出循环,否则为未找到。
    2.二分法查找:(注意:本方法只适用于按顺序排列的整型数组。)
while 上限>=下限
    中间值=(上限+下限)/2
    如果 中间值等于所查找的数
        找到数据,退出循环
    如果 数>中间值
        下限=中间值的前一位
    否则 上限=中间值后一位
end while
输入数据
for(遍历数组)
    如果 找到所插入数的位置
        该位置往后数据右移一位,该位置赋值为插入的数
end for
输出更改后的数组
  • 删除数据:

1.通过平移数组删除。


for(遍历数组)
    如果 找到所需删除的数据
        从该数据位置往后所有数据向前平移一位,数组长度减一
    否则 输出未找到,退出循环
end for
输出更改后的数组

2.通过定义第二个数组进行删除。

定义第二个数组b[]
for(遍历数组)
    如果 不是所需删除的数据
        b[K++]等于该数据
    否则 继续循环
end for
输出b数组
  • 数组排序:

1.选择法排序:

for(i=0;遍历数组)
    for(j=i+1;遍历数组)
        如果a[i]<a[j]
            交换a[i]a[j]
    end for
end for
输出重构的数组

2.冒泡法排序:每次排序将最大的数移至最后

for(i=1;i<=数组长度-1;i++)    //排序次数,全排列的次数为数组长度减一
    for(j=1;j<数组长度-i;j++)//每次排序完所需循环次数减一
        如果a[j-1]>a[j]
            交换a[j-1]a[j]
    end for
end for
输出重构后的数组

1.2 本章学习体会

  • 数组这部分知识点很多,跟其他内容关联性也很强,所以学起来确实有些磕磕碰碰。但遇到一个问题解决一个问题,所以总体来说到现在对数组有较好的把握了。之前许多看似较难的题目都能运用数组轻松解答,可见数组灵活强大之处。
  • 代码量
/ 11周 12周 总计
代码量 671 613 1284

2.PTA实验作业

2.1 7-10 出生年

2.1.1 伪代码

定义数组a[10]={0}
输入年份,不同数个数
while(1)
    对以年份的4个数字为下标的4个数赋值为1
    如果数组a中大于0的个数与输入的不同数个数相同
        则输出年份差及当前年份并退出循环
年份加一
end while

2.1.2 代码截图



2.1.3 造测试数据

输入数据 输出数据 说明
1988 4 25 2013 年份过1000,n为4
1 2 0 0001 最小边界
3000 4 12 3012 最大边界
2019 3 2 2021 n为3,4为不同的不算
233 2 67 0300 n为2,输出前补0

2.1.4 PTA提交列表及说明

1.部分正确:没有考虑到年份小于1000,千位的0无法记入数组。后续加上对年份小于1000 a[0]++的判断。
2.全部正确;

2.2 7-1 判断E-mail地址是否合法

2.2.1 伪代码

输入数据并找出“@”跟“.”所在下标及出现次数
如果 “@”跟“.”出现次数大于1或者“@”的下标大于“.”的下标
    则 输出NO结束程序
for(i=0;i<“@”下标;i++)
    如果 有一个元素不满足条件
        则 输出NO结束程序
end for
for(i=“@”下标+1;i<“.”下标;i++)
    如果 有一个元素不满足条件
        则 输出NO结束程序
end for
如果 从“.”往后三个元素如果不满足“com”或者com后仍有元素
    则 输出NO结束程序

若都满足 输出YES

2.2.2 代码截图



2.2.3 造测试数据

输入数据 输出数据 说明
adf12_@qw_213.com YES 正常地址
abc@123.comx NO com后面有字符
abc.@123.com NO @前出现.
abc@@123.com NO 多个@
abc@123..com NO 多个.
ab c@123.com NO 有空格
abc123.com NO 无@
abc@123com NO 无.

2.2.4 PTA提交列表及说明

1.段错误:不知道为什么在PTA使用while语句进行输入会报错,在VS却正常运行。后面改成scanf
2.部分正确:没有考虑到com后可能仍有字符的情况,随后加上了总字符长度跟m下标大小的判断
3.部分正确:由于scanf遇到空格会停止输入,所以导致数据不全。后面改成了gets
4.全部正确。

2.3 7-3 字符串转换成十进制整数

2.3.1 伪代码

定义数组b//用于储存符合条件的字符
输入数据
for(i=0;遍历数组)
    如果 数据符合条件
        则 b[k++]=该数据
    如果 b在被赋值之前出现'-'
        则 flag=1
end for
for(i=0;遍历数组b)
    如果 数据在0-9
        则 num=num*16+数据对应的十进制数
    否则如果 数据在a-z(大小写均一样)
        则 num=num*16+数据对应的十进制数
end for
如果flag等于1
    则num=-num
输出num

2.3.2 代码截图


2.3.3 造测试数据

输入数据 输出数据 说明
+-P-xf4+-1!# -3905 有两个'-'
a-bda-# 43994 '-'无效
-((^(*# 0 全部过滤

2.3.4 PTA提交列表及其说明

1.部分正确:起先定义num的类型为double,输出%.0f数值较大时会出现误差,导致结果错误。然后改成了int。
2.部分正确:用于判断结果是否为负数的flag1未赋初值。随后赋值为0.
3.全部正确。

3.阅读代码

zoj 1336 Mark-up

代码截图


其样例的输入跟输出

此代码功能类似于对文本进行编辑的语法代码。

  • 其中 '\b' 打开/关闭粗体字体(默认状态为OFF);'\i'打开/关闭斜体字体(默认状态为OFF)
  • 's'设置字体大小;'s'后面紧跟可选数字;如果缺少该数字,则命令将恢复以前的大小。
  • '*'切换标记的打开/关闭处理;如果关闭处理,则将标记视为文字文本(默认状态为ON)。
  • SPMamp&命令后面的数字可以有小数点。

值得学习的地方

  • 首先采用了枚举和bool,这是我还没涉及但需要学习的地方。
  • 其次他使用pos全局变量以及buf[SiZ]数组,将两个函数getNext跟putBack关联进行命令的判断。对于函数间的关联这也是老师强调,并且我更要学习的。
posted @ 2019-11-17 14:22  1911-黄荣煌  阅读(275)  评论(1编辑  收藏  举报