C语言博客作业04--数组
0.展示PTA总分
- 一维数组
- 二维数组
- 字符数组
1.本章学习总结
1.1 学习内容总结
- 查找数据:
1.遍历法查找:从头遍历数组找到对应数据即退出循环,否则为未找到。
2.二分法查找:(注意:本方法只适用于按顺序排列的整型数组。)
while 上限>=下限
中间值=(上限+下限)/2
如果 中间值等于所查找的数
找到数据,退出循环
如果 数>中间值
下限=中间值的前一位
否则 上限=中间值后一位
end while
- 插入数据:以7-3 简化的插入排序为例
输入数据
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
输出重构后的数组
-
数组做枚举:见例题:实验11-1-2-指针 输出月份英文名
-
我的函数代码如下:
-
哈希数组(其实我不懂):见例题7-5 有重复的数据I
-
我的代码如下:
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关联进行命令的判断。对于函数间的关联这也是老师强调,并且我更要学习的。